Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по программированию.doc
Скачиваний:
11
Добавлен:
13.11.2019
Размер:
1.2 Mб
Скачать

Массивы

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

Итак, массивом называется совокупность переменных с одинаковым именем и снабженных индексами. Сразу уточним, что все компоненты массива имеют один и тот же тип. Сами же массивы могут быть любых типов, как и простые переменные. Проиллюстрируем способ опи­сания массивов и методы работы с массивами в языке С на программе, вычисляющей скалярное произведение двух векторов. Вектор является типичным представите­лем массивов. В трехмерном пространстве, например де­картовом, вектор R есть совокупность трех компонентов: Rx,Ry,Rz. Ничто не мешает нам заменить буквенные обозначения индексов на числовые. Для того чтобы бли­же подойти к правилам описания и использования масси­вов в С, обозначим компоненты вектора как R0,R1,R2.

Как известно читателю, скалярное произведение двух векторов c = ab есть сумма произведений соответствую­щих компонентов:

a0b0+a1b1+a2b2.

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

Void main()

{

int i;

double c=0.,a[3],b[3];

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

{

printf("a[%d]="); scanf(“lf”,&a[i]);

printf("b[%d]="); scanf("&lf".&b[i]);

}

for(i=0; i<3; i++) c+=a[i]*b[i];

printf(“c=%lf”,c);

}

Описание массива аналогично описанию переменной, с той лишь разницей, что после имени массива следуют прямые скобки, в которых указывается число элементов в массиве. В данном случае описаны два массива: а и b, элементы которых есть вещественные числа типа double. Каждый массив состоит из трех чисел. Теперь подчерк­нем важнейший момент, который начинающие, как пра­вило, упускают из вида, что приводит к серьезным не­приятностям при выполнении программы. Автор насто­ятельно советует читателю несколько раз повторить про себя, что ЭЛЕМЕНТЫ МАССИВОВ НУМЕРУЮТСЯ, НАЧИНАЯ С 0, а не с 1, хотя последнее, возможно, более привычно. В нашем примере массив а состоит из трех элементов: а[0], а[1], а[2]. Уясните себе, что если массив описан, например, как Р[5], то в нем последним элементом является Р[4] и вовсе нет элемента Р[5] , за­то есть элемент Р[0]. Автору не хотелось бы показаться занудой, но он вынужден вновь и вновь возвращать чита­теля на несколько строчек назад, к выделенному заглав­ными буквами тексту. Основная беда здесь заключается в том, что компилятор (по крайней мере, в Builder) спо­койно пропускает ситуацию, когда программист допус­кает "выход за границы массива" - система ошибки не обнаруживает. При этом во время выполнения програм­мы возникает конфликт в оперативной памяти компью­тера, который довольно трудно распознать. Очень часто именно по этой причине возникает фатальное "зависание" системы, и единственным выходом из такой ситуа­ции является перезагрузка компьютера.

Последняя программа показывает, как следует обра­щаться к отдельным элементам массива: пишется имя массива, а в прямых скобках его индекс. Очевидно, что использование массивов в сочетании с циклами позволя­ет реализовывать однотипные операции над большими объемами данных.

В предыдущей программе заполнение массивов кон­кретными значениями - инициализация массивов де­лалось через ввод значений каждого из элементов с кон­соли с использованием приглашения и функции scanf. Однако аналогично тому, как начальная инициализация простых переменных может быть выполнена непосред­ственно в описаниях, точно так и массивы можно иници­ализировать в описаниях. Следующая программа, также выполняющая скалярное произведение векторов, демон­стрирует начальную инициализацию массивов: