Массив – структура данных, задающая в памяти ЭВМ определенное количество однотипных записей. Тип данных массив в классификации типов данных языка Паскаль относят к базовым структурам и называют регулярным типом данных.
Описатель массиваARRAY[<индексный тип>] OF <базовый тип>
<индексный тип> – имя или описатель индексного типа,
<базовый тип> – имя или описатель базового типа.
В качестве базового типа можно использовать любой тип данных. Индексный тип – любой ординальный тип данных, кроме LONGINT. Индексный тип задает количество элементов массива (размер массива) и тип значений индексов.
Вот примеры описателей массивов:
ARRAY[1..10] OF REAL – массивы этого типа будут состоять из 10 элементов действительного типа, индексы – целые числа от 1 до 10.
ARRAY[CHAR] OF INTEGER – массивы этого типа будут состоять из 256 целочисленных элементов, индексы – символы кодовой таблицы от #0 до #255.
ARRAY[’A’..’Z’] OF INTEGER – массивы этого типа будут состоять из 26 целочисленных элементов, индексы – заглавные буквы латинского алфавита.
В качестве описателя базового типа может быть использован описатель массива. Вот пример описаний:
TYPE
I1=<индексный тип 1>;
I2=<индексный тип 2>;
Ik=<индексный тип k>;
BAZ=<базовый тип>;
MASS=ARRAY[I1] OF ARRAY[I2] OF BAZ
В Паскале предусмотрена более компактная запись последнего оператора:
MASS=ARRAY[I1,I2] OF BAZ
Переменная типа MASS будет представлять собой двумерный массив (массив массивов). В описании VAR M:ARRAY[I1,I2, …, Ik] OF BAZ массив М объявлен как многомерный (k – мерный) массив. Количество индексных типов в описании массива – размерность массива.
Доступ к элементам массива осуществляется с помощью селектора [ ] – квадратные скобки. В квадратных скобках указывают значение (выражение) индексного типа. Если переменные x1,x2, …, xk описаны так: var x1:I1; x2:I2; …; xk:Ik, то
M – массив ARRAY[I1,I2, …, Ik] OF BAZ,
M[x1] – массив ARRAY[I2, …, Ik] OF BAZ,
M[x1][x2] – массив ARRAY[ …, Ik] OF BAZ,
…
M[x1][x2] … [xk] – данное базового типа BAZ,
Допустимы сокращенные формы записи: M[x1,x2],…, M[x1,x2, …, xk], соответственно.
Приведем примеры описаний и использования массивов
TYPE M10=ARRAY[1..10] OF REAL;
IND=-5..5;
MIND=ARRAY[IND] OF REAL; {тип - массив из 11 элементов}
MINDM10=ARRAY[IND] OF M10; {тип - двумерный массив}
week_day=(Monday,Tuesday,Wednesday,Thursday,
Friday,Saturday,Sunday);
dat=1..31;
month=(January,Fabruary,March,April,May,June,July,
August,September,October,November,December);
VAR X:M10;{массив}
K:IND;{переменная}
Y:ARRAY[1..10] OF REAL;
V:MIND;
MM:MINDM10;{двумерный массив}
Mdat:ARRAY[month] OF dat;
Mweek_day:ARRAY[month, dat] OF week_day;
В этих условиях доступ к элементам иллюстрируется операторами:
K:=0;
V[K]:=17.0;
X[1]:= 22.5;
Y[5]:=X[1];
MM[-3, 1]:= 0;{то же самое, что MM[-3][1]:= 0;}
Mdat[January]:=31;
Mweek_day[October, 9]:= Monday;
В TP можно выполнить такое присваивание MM[0]:=X, если все компоненты массива V инициализированы (одинаковые типы данных). Нельзя выполнить присваивание X:=Y, поскольку переменные относятся к несовместимым по присваиванию типам данных.
6.4 Для работы с массивами – шаблоны
Шаблон 1. Ввод-вывод одномерного массива.
program …;
const NN=100;{Максимальное число элементов}
…
type MM=array [1..NN]of real; {Новый тип данных - массив}
…
var M:MM; k,i:integer;
…
begin
{Ввод массива}
writeln(‘Введите кол-во элементов (не более ',NN:1,’)’);
readln(k);
writeln(‘Введите ’,k:1,’ элементов массива‘);
for i:=1 to k do read(M[i]); readln;
…
{Вывод массива на экран}
writeln(‘Вот результат:’); {Заголовок вывода}
for i:=1 to k do write(‘M[‘,i:2,’]=’,M[i]:7:3); writeln;
…
end.
Шаблон 2. Ввод-вывод двумерного массива.
program …;
const NN=100; MM=100;{Максимальное число строк и столбцов}
…
type AA=array [1..NN,1..MM]of real;{Новый тип данных – двумерный массив}
…
var A:AA; n,m,i.j:integer;
…
begin
{Ввод двумерного массива}
writeln(‘Введите кол-во строк (не более ’,NN:1,
’) и столбцов (не более ’,MM:1,’)');
readln(n,m);
for i:=1 to n do
begin
writeln(‘Введите ’,i:1,’-ю троку‘);
for j:=1 to m do read(M[i,j]);
readln
end;
…
{Вывод двумерного массива на экран}
writeln(‘Вот результат:’);{Заголовок вывода}
for i:=1 to n do
begin
for j:=1 to m do write(M[i,j]);
writeln
end;
…
end.