Массив — это структурированный тип данных, состоящий из фиксированного числа элементов одного типа. Тип элементов массива называется базовым. Число элементов массива фиксируется при описании и в процессе выполнения программы не меняется (можно использовать часть массива).
Доступ к элементу массива реализуется указанием имени массива и в квадратных скобках индекса(ов). Индексы элементов массива — это выражения любого скалярного типа за исключением вещественных.
Определять массивы можно двумя способами:
1-ый способ:
Var
имя_массива: array [ индексный_тип ] of базовый_тип;
2-ой способ:
Type
имя_типа_массива = array [ индексный_тип ] of базовый_тип;
Var
имя_массива: имя_типа_массива;
Индексный тип (это тип-диапазон) определяет границы изменения значений индекса(ов). Если задан один индекс, то массив называется одномерным, если два — двумерным, если n — n -мерным. Одномерные массивы используются для представления векторов, двумерные — для представления матриц.
Пример 4.1 (описания массивов):
1-ый способ:
Var
A, B: array [ 1..10 ] of Real; { одномерные массивы }
С: array [ 1..5, 1..10 ] of Integer; { двумерный массив }
2-ой способ:
Type
Mas1 = array [ 1..10 ] of Real;
Mas2 = array [ 1..5, 1..10 ] of Integer;
Var
A, B: Mas1;
C: Mas2;
Тогда обращаться к элементам массивов можно по индексам: A [ I ], B [ j ], C [ i, j ] и т.д.
Пример 4.2 (индексный тип можно задать с использованием констант, которые описаны в разделе описания констант):
Const
maxN = 5;
maxM = 10;
Var
С: array [ 1.. maxN, 1.. maxM ] of Integer;
Примеры 4.3 (другие способы описания многомерных массивов):
Двумерные массивы:
Var
С: array [ 1.. 5 ] of array [ 1..10 ] of Integer;
«Правильное» обращение к элементам массива: C [ I ][ j ].
Трехмерные массивы:
1. Var
A: array [ инд_тип_1 ] of array [ инд_тип_2 ] of array [ инд_тип_3 ] of баз_тип;
Обращение к элементам: A [ I ][ j ][ k ];
2. Var
A: array [ инд_тип_1 ] of array [ инд_тип_2, инд_тип_3 ] of баз_тип;
Обращение к элементам: A [ I ][ j, k ];
3. Var
A: array [ инд_тип_1, инд_тип_2 ] of array [ инд_тип_3 ] of баз_тип;
Обращение к элементам: A [ i, j ][ k ];
4. Var
A: array [ инд_тип_1, инд_тип_2, инд_тип_3 ] of баз_тип;
Обращение к элементам: A [ i, j, k ].
Массив можно описать и с помощью типизированных констант:
Const
Vect: array [ 1..5 ] of Byte = (1, 6, 3, 8, 5);
Matr: array [ 1..4, 1..6 ] of Integer =
((1, 6, 3, 5, 2, 4),
(7, 2, 5, 4, 3, 2),
(3, 1, 6, 3, 8, 5),
(5, 2, 8, 5, 5, 4));
Элементы массива располагаются в памяти последовательно. Многомерные массивы располагаются таким образом, что самый правый индекс возрастает самым первым. Например, массив A [ 3, 3 ] будем располагаться следующим образом: A [ 1, 1 ], A [ 1, 2 ], A [ 1, 3 ], A [ 2, 1 ], A [ 2, 2 ], A [ 2, 3 ], A [ 3, 1 ], A [ 3, 2 ], A [ 3, 3 ].
Действия над массивами
Действия над массивами в целом
Для работы с массивом как единым целым, используется идентификатор массива без указания индекса в квадратных скобках. Массивы, участвующие в этих действиях должны иметь одинаковые типы индексов и одинаковые типы компонент. Над массивом как единым целым можно произвести следующие действия:
1. A = B (проверить массивы на равенство).
2. A <> В (проверить массивы на неравенство).
3. A:= В.
Действия над элементами массива
1. Инициализация массива (заключается в присвоении каждому элементу массива одного и того же значения)
§ одномерного
For i:= 1 to N do
A [ i ]:= 0;
§ двумерного
For i:= 1 to N do
For j:= 1 to M do
B [ i, j ]:= 0;
2. Ввод элементов массива
§ одномерного
Write (‘Введите размерность массива N=’);
ReadLn (N);
WriteLn (‘Введите элементы массива’);
For i:= 1 to N do
Begin
Write (‘A[’, i, ‘]= ’);
ReadLn (A [ i ])
End;
§ двумерного
Write (‘Введите размерность массива N, M’);
ReadLn (N, M);
WriteLn (‘Введите элементы массива’);
For i:= 1 to N do
For j:= 1 to M do
Begin
Write (‘B[’, i, ‘,’, j, ‘]=’);
ReadLn (B[ i, j ])
End;
3. Вывод элементов массива
§ одномерного
WriteLn (‘Вектор А: ’);
For i:= 1 to N do
Write (A [ i ]: 5);
WriteLn;
§ двумерного
WriteLn (‘Матрица В: ’);
For i:= 1 to N do
Begin
For j:= 1 to M do
Write (B [ i, j ]: 5);
WriteLn
End;
4. Поиск нулевых элементов (их количества) в массиве
§ в одномерном
k:= 0;
For i:= 1 to N do
If A [ I ] = 0 then k:= k + 1;
§ двумерном
k:= 0;
For i:= 1 to N do
For j:= 1 to M do
If B [ i, j] = 0 then k:= k + 1;
5. Нахождение минимального элемента массива и его места
§ одномерного
min:= A [ 1 ];
i_min:= 1;
For i:= 1 to N do
If A [ i ] < min then
Begin
min:= A [ i ];
i _min:= i
End;
§ двумерного
min:= B [ 1, 1 ];
i_min:= 1;
j_min:= 1;
For i:= 1 to N do
For j:= 1 to M do
If B [ i, j ] < min then
Begin
min:= B [ i, j ];
i_min:= i;
j_min:= j
End;
6. Перестановка минимального и первого элементов в массиве
§ одномерном
r:= A [ 1 ];
A [ 1 ]:= A [ i_min ];
A [ i_min ]:= r;
§ двумерном
r:= B [ 1, 1 ];
B [ 1, 1 ]:= B [ i_min, j_min ];
B [ i_min, j_min ]:= r;
7. Нахождение суммы положительных элементов массива
§ одномерного
sum:= 0;
For i:= 1 to N do
If A [ i ] > 0 then sum:= sum + A [ i ];
§ двумерного
sum:= 0;
For i:= 1 to N do
For j:= 1 to M do
If B [ i, j ] > 0 then sum:= sum + B [ i, j ];
8. Нахождение произведения нечетных элементов
§ одномерного
pr:= 1;
For i:= 1 to N do
If (A [ i ] mod 2) <> 0 then
pr:= pr * A [ i ];
§ двумерного
pr:= 1;
For i:= 1 to N do {Функция Odd(X) возвращает значение}
For j:= 1 to M do {истина, если X - нечетно }
If Odd(B [ i, j ]) then
pr:= pr * B [ i, j ];
9. Нахождение суммы положительных элементов выше главной диагонали (включая элементы диагоналей).
Элементы на главной диагонали характеризуются тем, что индекс i = j. Для элементов побочной диагонали для любого i индекс столбца j = n – i + 1. Элементы областей выше, ниже главной или побочной диагоналей можно задать или порядком изменения индексов или условиями, накладываемыми на индексы:
i = 1, 2, …, n; j = 1, 2, …, i; i = 1, 2, …, n; j = i, i+ 1, …, n
или i >= j или i <= j
i = 1, 2, …, n; j = 1,2,…, n-i+ 1; i = 1, 2, …, n; j = n-i +1, …, n
или n – i + 1 >= j или n – i + 1 <= j
sum:= 0;
For i:= 1 to n do
For j:= i to n do
If B [ i, j ] > 0 then sum:= sum + B [ i, j ];
10. Поменять местами максимальный элемент на главной диагонали и минимальный элемент ниже побочной.
Max:= B [ 1, 1 ];
I_max:= 1;
For i:= 1 to n do
If B [ i, i ] > Max then
Begin
Max:= B [ i, i ];
I_max:= i
End;
Min:= B [ 1, n ];
I_min:= 1;
J_min:= n;
For i:= 1 to n do
For j:= n – i + 1 to n do
If B [ i, i ] < Min then
Begin
Min:= B [ i, i ];
I_min:= i;
J_min:= j
End;
R:= B [ I_max, I_max ];
B [ I_max, I_max ]:= B[ I_min, J_min ];
B[ I_min, J_min ]:= R;
11. Дана квадратная матрица В размерности nxn. Построить вектор А, где аi — сумма положительных элементов i-ой строки матрицы.
For i:= 1 to n do
Begin
S:= 0;
For j:= 1 to n do
If B [ i, j ] > 0 then S:= S + B [ i, j ];
A [ i ]:= S
End;
12. Дана квадратная матрица В размерности nxn. В каждом столбце оставить без изменения максимальный элемент столбца, остальные элементы заменить нулями.
For j:= 1 to n do
Begin
Max:= B [ 1, j ];
I_max:= 1;
For i:= 1 to n do
If B [ i, j ] > Max then
Begin
Max:= B [ i, j ];
I_max:= i
End;
For i:= 1 to n do
If I_max <> i then B [ i, j ]:= 0
End;
Пример: Дан целочисленный вектор A (n), поменять местами максимальный и минимальный элементы вектора. На печать выдавать исходный вектор, максимальный, минимальный элементы, полученный вектор.
Program Example_Vect;
Uses Crt;
Const
N_max = 10;
Var
N, max, i_max, min, i_min, r: Integer;
A: array [ 1.. N_max ] of Integer;
Begin
Clrscr;
Write(‘Введите размерность массива N (<=’, N_max, ’): ’);
ReadLn (N);
WriteLn (‘Введите элементы массива’);
For i:= 1 to n do { ввод элементов вектора}
Begin
Write (‘A[‘, i, ’]=’);
ReadLn (A [ i ])
End;
WriteLn (‘Исходный вектор А:’);
For i:= 1 to n do { вывод вектора}
Write (A [ i ]: 5);
WriteLn;
min:= A [ 1 ]; {нахождение минимального элемента}
i_min:= 1; {и его индекса}
For i:= 1 to n do
If A [ i ] < min then
Begin
min:= A [ i ];
i_min:= i
End;
max:= A [ 1 ]; {нахождение максимального элемента}
i_max:= 1; {и его индекса}
For i:= 1 to n do
If A [ i ] > max then
Begin
max:= A [ i ];
i_max:= i
End;
WriteLn (‘Минимальный элемент A[‘, i_min, ‘]=‘, min);
WriteLn (‘Максимальный элемент A[‘, i_max, ‘]=‘, max);
r:= A [ i_min ]; {перестановка}
A [ i_min ]:= A [ i_max ];
A [ i_max ]:= r;
WriteLn (‘Полученный вектор А: ‘);
For i:= 1 to n do {вывод полученного вектора}
Write (A [ i ]: 5);
WriteLn;
End.