Лабораторная работа №12

Основы работы с массивами

Цель работы: получение практических навыков работы с массивами средствами языка С.

Содержание

Краткие теоретические сведения. 1

Префиксные и постфиксные операторы инкремента и декремента. 1

Операторы присваивания. 2

Массивы.. 2

Рабочее задание. 3

Краткие теоретические сведения

Префиксная форма:

++ унарное-выражение

-- унарное-выражение

Постфиксная форма:

унарное-выражение ++

унарное-выражение --

Префиксный оператор инкремента (++) прибавляет единицу своему операнду, эта увеличенная на единицу величина является результатом выражения. Операнд не должен иметь константный тип. Результат имеет тот же Тим, что и операнд.

Префиксный оператор декремента (––) аналогичен оператору инкремента, но выполняет уменьшение операнда на единицу.

Префиксные и постфиксные операторы инкремента и декремента изменяют значения операндов. Отличие заключается в том, когда выполняется инкремент или декремент в ходе вычисления выражения. В префиксной форме инкремент или декремент выполняется до того, как величина операнда будет использована в выражении, то есть в выражении используется уже модифицированная величина. В постфиксной форме инкремент или декремент выполняется после того, как величина операнда была использована в выражении (но не немедленно!), то есть в выражении используется еще неизмененная величина. Например, следующая программа

int a, b, x = 6;

a = ++x;

b = x++;

printf(“a = %d\n”, a);

printf(“b = %d\n”, b);

printf(“a = %d\n”, x);

НЕ нашли? Не то? Что вы ищете?

печатает:

a = 7

b = 7

x = 8

Операция присваивания назначает значение правого операнда левому операнду. Поэтому левый операнд должен быть модифицируемой величиной.

Операторы присваивания в С могут в одной операции выполнять также и преобразования величин

Оператор

Операция

=

Простое присваивание

*=

Присваивание с умножением

/=

Присваивание с делением

%=

Присваивание остатка от целочисленного деления

+=

Присваивание с прибавлением

–=

Присваивание с вычитанием

<<=

Присваивание со сдвигом влево

>>=

Присваивание со сдвигом вправо

&=

Присваивание с побитовым И

^=

Присваивание с побитовым исключающим ИЛИ

|=

Присваивание с побитовым ИЛИ

type-specifier declarator [constant-expression] [constant-expression] ...

Каждое constant-expression в квадратных скобках задает количество элементов в определенной размерности. Первое константное выражение может быть опущено, если массив был проинициализирован или объявлен как параметр.

Массивы хранятся по строкам. Например, такой массив

char A[2][3];

состоит из двух строк по три колонки каждая. Сначала хранятся первые три колонки первой строки, затем три колонки второй строки.

Примеры:

float matrix[10][15];

Двумерный массив matrix имеет 150 элементов типа float.

Переменная, декларирующая массив, считается указателем на тип элементов массива.

int rand( void );

Функция rand возвращает псевдослучайное целое число в диапазоне от 0 до RAND_MAX (32767). Используйте функцию srand для лучшей инициализации генератора перед вызовом rand.

Требуется заголовочный файл <stdlib.h>.

Пример.

// crt_rand. c

// This program seeds the random-number generator

// with the time, then displays 10 random integers.

//

#include <stdlib. h>

#include <stdio. h>

#include <time. h>

int main( void )

{

int i;

// Seed the random-number generator with current time so that

// the numbers will be different every time we run.

//

srand( (unsigned)time( NULL ) );

// Display 10 numbers.

for( i = 0; i < 10;i++ )

printf( " %6d\n", rand() );

printf("\n");

// Usually, you will want to generate a number in a specific range,

// such as 0 to 100, like this:

{

int RANGE_MIN = 0;

int RANGE_MAX = 100;

for (i = 0; i < 10; i++ )

{

int rand100 = (((double) rand() /

(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);

printf( " %6d\n", rand100);

}

}

}

Рабочее задание

Написать программу, в которой:

Задать массив целых чисел длиной согласно варианту. Элементы массива задать случайным образом в пределах заданных диапазонов*. Вывести исходный массив на экран. Выполнить обработку массива согласно варианту, вывести обработанный массив на экран.

* Для целей отладки можно пользоваться наперед проинициализированным массивом.

Номер варианта

Длина массива

Диапазон значений элементов массива (целые величины)

Задание

1

20

-310

Для каждого положительного элемента массива найти, есть ли в массиве элементы, равные ему по модулю, но противоположные по знаку. Если есть, то заменить изменить знак отрицательного элемента. Вывести элементы массива на экран.

2

22

-5…10

Определить, какое абсолютное значение чаще всего встречается в массиве и вывести его на экран.

3

25

-10…20

Найти максимальный и минимальный элементы массива и поменять их местами. Вывести элементы массива на экран.

ПРИМЕЧАНИЕ. Если в массиве есть несколько элементов, соответствующих минимальному или максимальному значению, то меняются местами первые из них.

4

17

-10…20

Подсчитать количество пар соседних элементов, которые имеют противоположные знаки, и вывести эти пары на экран (с указанием индекса каждого выведенного элемента).

ПРИМЕЧАНИЕ. Считать ноль положительным числом.

5

20

-11…20

Найти сумму чисел, находящихся между максимальным и минимальным элементами массива (в сумму включить эти элементы). Вывести сумму на экран.

ПРИМЕЧАНИЕ. Если в массиве есть несколько элементов, соответствующих минимальному или максимальному значению, то использовать первые из них.

6

23

-5…10

Элемент вектора называется локальным максимумом, если он строго больше двух своих соседей. Найти все локальные максимумы в пределах массива и вывести на экран номера локальных максимумов, индексы массива им соответствующие, а также значения соответствующих элементов массива.

7

25

-5…15

Вывести на экран индексы всех четных элементов массива и сами значения этих элементов.

ПРИМЕЧАНИЕ. Считать ноль четным числом.

8

24

-8…15

Поменять местами 1-й положительный элемент с последним положительным элементом, 2-й - предпоследним и т. д. Вывести элементы массива на экран.

ПРИМЕЧАНИЕ. Считать ноль положительным числом.

9

25

-1025

Вывести на экран индексы всех нечетных элементов массива и сами значения этих элементов.

ПРИМЕЧАНИЕ. Считать ноль четным числом.

10

22

-515

Для каждого положительного элемента массива найти есть ли в массиве элементы, равные ему по модулю, но противоположные по знаку. Если есть, то изменить знак и положительных, и отрицательных элементов на противоположный. Вывести элементы массива на экран.

11

19

-10…20

Найти среднеарифметическое чисел, находящихся между максимальным и минимальным элементами массива (включая эти элементы в вычисление среднеарифметического), и вывести это значение на экран.

ПРИМЕЧАНИЕ 1. Если в массиве есть несколько элементов, соответствующих минимальному или максимальному значению, то выполнять расчеты для первых из них.

ПРИМЕЧАНИЕ 2. Среднеарифметическое рассчитывать в вещественном формате.

12

24

1…30

Вывести на экран элементы и индексы элементов, значения которых лежат в пределах хотя бы в 1,5 раза больше наименьшего элемента массива, но не больше, чем 0,5 наибольшего элемента массива.

13

25

-1025

Поменять местами 1-й отрицательный элемент с последним отрицательным элементом, 2-й - предпоследним и т. д. Вывести элементы массива на экран.

ПРИМЕЧАНИЕ. Считать ноль положительным числом.

14

22

-10…20

Вывести на экран элементы и индексы элементов, которые меньше среднего значения всех элементов массива.

15

20

-6…26

Определить сумму элементов массива, кратных пяти. Вывести эту сумму на экран.

16

17

-10…20

Найти сумму чисел, находящихся между максимальным и минимальным по модулю элементами массива (в сумму включить эти элементы). Вывести полученную сумму на экран.

ПРИМЕЧАНИЕ 1. Если в массиве есть несколько элементов, соответствующих минимальному по модулю или максимальному по модулю значению, то выполнять расчеты для первые из их.

17

23

0…18

Вывести на экран значения и индексы элементов, которые являются степенями 2.

18

25

0…16

Определить сумму элементов массива, кратных трем. Вывести полученную сумму на экран.

19

24

-10…20

Заменить каждый элемент массива на среднеарифметическое между им и его соседями справа и слева (). Первый и последний элементы массива не изменять. Вывести элементы массива на экран.

20

25

-15…32

Найти сумму уникальных (встречающихся только один раз в массиве) элементов массива.

21

20

-7…15

Элемент вектора называется локальным минимумом, если он строго меньше двух своих соседей. Найти все локальные минимумы в пределах массива и вывести на экран номера локальных минимумов, индексы массива им соответствующие, а также значения соответствующих элементов массива.