
** сpp1 ** 10.06.2004
Лекция 7 МАССИВЫ В ПОДПРОГРАММАХ.
ФОРМАТИРОВАНИЕ. ПОДПРОГРАММЫ.
7.1 Одномерный и двумерный массивы
В лекциях 4 – 6 по С++ рассматривались скалярные переменные.
Значение скалярной переменной - это одно число (или символ).
Если нужно работать с большими группами значений, то неудобно
использовать большое количество имен. Целесообразно иметь одно имя для всей
группы, а элементы группы различать по их порядковым номерам. Это
соответствует переходу от отдельных значений к структурам из них.
Например, группа Р-21 - это структура из отдельных студентов, т.е.
студент-это скаляр, а группа - это структура или "массив".
Массив является простейшей структурой данных.
Определение массива рассматривалось в лекции по Math CAD в разделе 2.4.
Напомним, что массив - это совокупность индексированных переменных
одного типа, занимающих последовательные ячейки памяти.
Массив с одним индексом называется одномерным, а если индексов несколько,
то имеем многомерный массив.
Любой массив в С++ имеет следующие атрибуты:
1) имя,
2) тип,
3) Количество индексов,
4) Границы индексов,
5) Значения его элементов.
В отличие от массива, скалярная переменная имеет только три атрибута:
имя, тип, значение.
Индексы элементов массива записываются в квадратных скобках, например,
m[0], m [ 1], m [ k], m [i++], m [ i+j ], A[2][3], A[i][j]
Нумерация индексов всегда начинается с нуля,
т.е. отрицательных индексов нет.
Обычно при работе с одномерным массивом используют дополнительно две
целых скалярных переменных, например, k, N. Имя k служит для текущего
индекса, N - это количество элементов в массиве. Произвольный элемент
записывается как
mas[k], где k=0,1, 2, 3, . . , N-1,
и это изменение k задается оператором цикла для k<N .
Рассмотрим применение массива для ввода N чисел. Пусть N=200. Если не
использовать массив, то необходимо иметь имя для каждого числа, например,
V1, V2, V3, V4, ..., V200. Оператор ввода тогда следует записать как
cin>> V1>>V2>>V3 >> . . . . и далее все остальные 197 имен,
что вряд ли осилит обычный человек. Если же использовать массив V , то
можно написать цикл по k и тот же ввод будет иметь вид
for ( k=0; k<200; k++) cin >> V[k] ; (7.1)
При ответе на экране можно вводить все числа последовательно, разделяя
пробелами. Можно переходить при этом на новую строку, нажав <ENTER>.
Для массива должна выделяться память в соответствии с возможными
значениями индексов. Память выделяется при объявлении массива.
Тип указывается как обычно и характеризует все элементы массива:
int array [15], V [200]; float mas[25] ; double D[6]; (7.2)
Тип определяет размер памяти для каждого элемента, а число в квадратных
скобках – количество элементов. Например, для массива array будет выделено
60 байт, для массива V - 800 байт, для массива D - 48 байт.
Так как нумерация индексов начинается с нуля, то номер элемента из
объявления массива и все последующие номера использовать нельзя.
При объявлении типа и размера массива его можно инициализировать, т.е.
присвоить всем или части элементов начальные значения.
Для инициализации используется список в фигурных скобках , например,
int Va [4]={ 7, 8, 9, 10} ;
int Va [ ]={ 7, 8, 9, 10} ; (7.3)
float mas [25] = { 0., 2., 4.} ;
Здесь во втором операторе список определяет как значения элементов,
так и длину массива, т.е. два первых оператора эквивалентны.
В последнем операторе начальные значения присваиваются только трем
первым элементам: mas[0], mas[1], mas[2].
После списка точка с запятой ставится.
Отметим здесь ещё очень важный момент.
На первых этапах обучения в простых программах не будем использовать
имена переменных для границ индексов при выделении памяти,
т.к. для этого нужны новые средства. Пример:
void main ( ) { int N=12; int arr [ N] ; . . . . } / / ошибка!
Этот фрагмент неправилен, т.к. при компиляции должно быть выделено
конкретное количество ячеек памяти, а значение N станет известным лишь
после выполнения оператора присваивания. В этом случае обычно
выделяют память с запасом и указывают на ограничение значений N,
например, при вводе. Поэтому в простых программах
при выделении памяти используйте в квадратных скобках числа.
Но желающие для описания массива длины N как int arr[N]; могут
применить модификатор const или команду препроцессора #define:
const int N=12 ; #define N 12
Для двумерного массива рассмотрим пример сложения
двух матриц (C=A+B).
. . . . . .