Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНСПЕКТ 2.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
241.66 Кб
Скачать

Массивы

До сих пор мы рассматривали так называемые простые типа данных, у которых отсутствует внутренняя структура. Перейдем теперь к рассмотрению так называемых структурированных типов. Первым из таких типов является массив. Массив – это упорядоченный набор величин одного типа, например, вещественного или целого. Элементы массива обозначаются индексами.

int mas[10];

double arr[106];

Это описание показывает, что массив с именем mas имеет 10 элементов целого типа int, причем эти элементы имеют номера от 0 до 9. Присвоить значение любому элементу массива можно указав его номер – индекс, например:

mas[0]=100; mas[1]=101; mas[2]=102; mas[5]=103...

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

Индексы в массивах на С всегда начинаются с нуля. Следовательно, в первом из указанных выше массивов индекс изменяется от 0 до 9, а во втором – от 0 до 105.

Элемент массива может участвовать в любом арифметическом или логическом выражении, на том месте, на котором может стоять соответствующая простая константа или переменная, например:

i=mas[5];

j=2*mas[3]+mas[4];

if (mas[1]<mas[2]) goto 1;

В роли индекса массива может выступать не только целочисленная константа, но и переменная целого типа, а также арифметическое выражение целого типа, например:

mas[2*i-3]=mas[i+5];

Рассмотрим некоторые примеры программ с использованием массивов.

Пример 1. Поиск максимального и минимального элементов массива.

Программа на С:

int mas[5];

int i,max,min;

...

max=min=mas[0];

for(i=1;i<=4;i++)

{

if (mas[i]>max) max=mas[i];

if (mas[i]<min) min=mas[i];

}

Способ инициализации массивов пока что несущественен; для начала можно присвоить значения элементам массива при помощи операторов присваивания, например,

mas[0]=3; mas[1]=5; mas[2]=-1; mas[3]=7; mas[4]=-9;

Далее в цикле все элементы массива сравниваются с переменными max и min соответственно, которые вначале равны первому элементу массива; если очередной элемент массива больше max, то его значение передает этой переменной, а если меньше min, то этой переменной.

Пример 2. Вычисление скалярного произведения двух векторов.

Напомним, что скалярным произведением двух векторов a и b называется величина, равная:

и на С:

x=0;

for(i=0;i<n;i++)x+=a[i]*b[i];

Пример 3. Сортировка. Требуется расставить элементы массива в возрастающем порядке.

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

Если нужно поменять местами элементы массива a[i] и a[i+1], то это делается следующим образом:

j=a[i]; a[i]=a[i+1]; a[i+1]=j;

Вначале значение элемента массива a[i] передается вспомогательной переменной j или, как говорят, помещается в буфер. Затем элемент a[i] получает значение a[i+1], а старое его значение стирается. Если бы мы не сохранили его в буфере, оно бы полностью исчезло. Далее элемент a[i+1] получает первоначальное значение элемента a[i], которое хранится в буфере j (но не значение a[i], которое уже изменилось!).

Поменяв местами два элемента массива, мы можем обнаружить, что теперь стоят не в должном порядке предыдущие элементы. Например, в массиве:

1, 3, 0

после перестановки элементов 3 и 0 получится:

1, 0, 3

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

Запишем, для наглядности, последовательность действий при реализации описанной процедуры на примере, выделяя те два элемента, которые сравниваются на данном шаге:

4, 3, 2, 1

3, 4, 2, 1

3, 2, 4, 1

2, 3, 4, 1

2, 3, 4, 1

2, 3, 1, 4

2, 1, 3, 4

1, 2, 3, 4

1, 2, 3, 4

Программа на С будет:

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

{

m: if (a[i]>a[i+1])

{

j=a[i]; a[i]=a[i+1]; a[i+1]=j;

if (i!=0) {i--; goto m;}

}

}

На С использован оператор for, для которого, в данном языке, нет ограничений на изменение переменной цикла внутри цикла.