Способы работы с массивами
Многомерные массивы
Для определения позиции элемента в двумерном массиве необходимы два индекса. Любой двумерный массив есть матрица, а матрица есть таблица. Поэтому удобно описывать двумерные массивы путем указания границ изменения индексов (номеров) строк и столбцов.
Например, таблица символов M x N, где M - число строк и N - число столбцов, может быть описана:
var TAB : array[1..M, 1..N] of char
Общая форма записи: |
VAR <имя>:ARRAY [тип индекса строки, тип индекса столбца] |
OF <тип компонент>; |
Однако, двумерный массив можно интерпретировать как вектор-столбец, каждый элемент которого в свою очередь является одномерным массивом (вектор - строка). Этот подход к определению двумерного массива влечет его описание с помощью двух строк, где первая содержит описание строки, а вторая - описание столбца:
type LINE = array[1..N] of char;
STOLB = array[1..M] of LINE ;
var TAB : STOLB.
Здесь TAB[I] - переменная типа LINE, а TAB[I][J] – переменная типа CHAR.
Общая форма записи: |
TYPE <тип строки>=ARRAY [тип индекса] OF <тип компонент>; |
<тип столбца> = ARRAY[тип индекса] OF <тип строки>; |
VAR <переменная массива> : <тип столбца>; |
Эти два вида определения массивов задают и два способа обращения к элементам массива: TAB[I,J] - в первом случае и TAB[I][J] - во втором. Вполне очевидно, что сказанное выше для двумерного массива распространяется и на массивы большей размерности. Например, описание VAR CUBE : ARRAY[1..M, 1..N, 1..K] OF INTEGER определяет задание трехмерного массива целых чисел.
Обработка массивов включает в себя, как правило, следующие компоненты: ввод массива (с клавиатуры или с помощью датчика случайных чисел), вывод полученного массива на экран и собственно его обработка. Все эти компоненты рекомендуется оформлять в виде отдельных процедур. При этом надо учитывать следующий фактор: если процедуре (или функции) будет передаваться массив, то надо объявить в ней этот массив как параметр с атрибутом VAR даже в том случае, если значение массива внутри процедуры не изменяется. Это нужно для того, чтобы не тратить времени и памяти на размещение внутри процедуры копии массива. Заметим, что параметр обязательно должен относиться к типу, имеющему имя.
Пример 3. Сумма элементов таблицы над верхней диагональю
program SUMMA;
const M = 10; {число строк таблицы}
N = 10; {число столбцов таблицы}
type LINE = array[1..n] of integer;
TAB = array[1..m] of LINE;
var s,i,j:integer; MAS:TAB;
procedure VVODMASSIV(var MAS:TAB);
begin
¦ for i:=1 to M do
¦ for j:=1 to N do
¦ readln(MAS[i][j]);
end;
procedure VIVODMASSIV(var MAS:TAB);
begin
¦ for i:=1 to M do
¦ begin
¦ ¦ for j:=1 to N do
¦ ¦ write(MAS[i][j]:4,' '); writeln;
¦ end;
end;
procedure OBRABOTKA( MAS:TAB; var SUM:integer);
begin
¦ SUM := 0;
¦ for i:=1 to M do
¦ for j:=1 to N do
¦ if j > i then SUM := SUM+MAS[i][j];
end;
begin
| VVODMASSIV(MAS);
| writeln('исходный массив'); VIVODMASSIV(MAS);
| OBRABOTKA(MAS,s);writeln;
| writeln('сумма элементов = ',s);
end.