Под массивом понимается упорядоченный набор однотипных элементов (компонент), число которых фиксировано (ТП не поддерживает массивов с переменными границами). Доступ к каждому элементу массива осуществляется с помощью набора индексов, количество которых называется размерностью массива. Индексами могут служить значения любого порядкового типа.
Тип_массив::=
"array" "[" тип_индекса {"," тип_индекса"} "]" "of" тип_компонент.
тип_индекса::= порядковый тип.
тип_компонент::=тип
Массивы содержат фиксированное количество компонент одного типа. На каждый тип индекса приходится по одной размерности массива.
Чаще всего для типа индекса используют тип поддиапазона, однако нет никаких ограничений на применение любого другого порядкового типа. Основная причина использования типа поддиапазона состоит в том, что объем занимаемой массивом памяти рассчитывается как произведение мощности индексов друг на друга и на размер памяти одного элемента массива. Мощность (диапазон значений) любого порядкового типа, кроме типа поддиапазона и перечислимого типа, фиксирована и не может быть изменена. Т.о., если весь диапазон значений не используется, происходит бессмысленный расход оперативной памяти компьютера.
Например:
Определение типа массива:
Type FirstArray=array[shortint] of byte;
по объему занимаемой памяти и обращению к элементам массива эквивалентно:
Type SecondArray=array[-128..127] of byte;
Для получения значения элемента массива требуется указать переменную массива со следующим за ней индексом.
Индекс::= "[" выражение {"," выражение"} "]"
Например:
type MyArray1=array[boolean,1..10] of integer;
var A:MyArray1;
B:array[-1..3] of boolean;
begin
...
writeln(A[true,3], A[false,1], B[2])
…
end.
ТП имеет 3 предопределенных одномерных массива для прямого доступа к памяти: Mem - для доступа к байтам, MemW - для доступа к словам, MemL - для доступа к значениям типа longint. Индексация массивов памяти производится стандартным методом построения адреса памяти с помощью значений сегмента и смещения, разделенных двоеточием (см. параграф 1.7.3).
Например:
var a:longint absolute $40:$6C; {абсолютная переменная, которая соответствует области оперативной памяти с адресом $40:$6C (дневной счетчик времени)}
b: longint;
begin
b:=a; {присваиваем переменной b текущее время}
…
b:=memL[$40:$6C]; {делаем то же самое с помощью прямого обращения к памяти}
…
end.
Для прямого доступа к портам ввода-вывода ТП имеет 2 предопределенных одномерных массива: Port - для доступа к байтам, PortW - для доступа к словам.
Заполнение и обработка массивов
В программировании массивы используются для обработки больших объемов однотипных данных. Перед использованием любого массива его следует заполнить, что производится обычно с помощью цикла, или, для многомерных массивов, с помощью вложенных циклов. Обработка массива также ведется с помощью циклов.
Задача 26. Дано натуральное число N. Получить N случайных чисел и вывести их на экран сначала в прямом, а потом - в обратном порядке.
var a:array[1..100] of word; {т.к. ТП не позволяет определять массивы переменной длины, мы рассчитываем, что количество получаемых чисел будет не более 100}
i,N:integer;
begin
readln;
randomize; {инициализируем счетчик случайных чисел}
for i:=1 to N do begin {заполняем и одновременно выводим массив на экран}
a[i]:=random(23);
write(a[i]:3);
end;
writeln;
for i:=N downto 1 do begin {выводим на экран массив в обратном порядке}
write(a[i]:3);
end;
writeln;
readln;
end.
Задача 27[1, № 377]. Дана натуральная квадратная матрица M*M. Заменить нулями все ее элементы, лежащие на главной диагонали и выше ее.
var i,j,m:integer;
a:array[1..10,1..10]of integer; {двумерный массив для хранения матрицы}
begin
repeat {простейший фильтр ввода}
readln(m);
until (m>0)and(m<=10);
{с помощью двух вложенных циклов заполняем матрицу случайными числами и выводим ее на экран}
randomize;
for i:=1 to m do begin
for j:=1 to m do begin
a[i,j]:=random(100);
write(a[i,j]:3);
end;
writeln; {производим перевод строки для разделения строк матрицы}
end;
writeln; {производим перевод строки для разделения исходной и результирующей матриц}
{с помощью двух вложенных циклов преобразуем матрицу в соответствии с условием задачи и выводим ее на экран}
for i:=1 to m do begin
for j:=1 to m do begin
if i<=j then a[i,j]:=0; {если номер строки меньше или равен номеру столбца (условие для главной диагонали и всех вышележащих ее элементов), то обнуляем данный элемент массива}
write(a[i,j]:3);
end;
writeln;
end;
readln
end.
Если в результате запроса после запуска программы ввести число 5, то на экране можем получить примерно следующее:
0 3 86 20 27
67 31 16 37 42
8 47 7 84 5
29 91 36 77 32
69 84 71 30 16
0 0 0 0 0
67 0 0 0 0
8 47 0 0 0
29 91 36 0 0
69 84 71 30 0
Благодаря применению процедуры randomize следующий запуск программы построит новую последовательность случайных чисел.
Задача 28. Найти максимальный элемент одномерного массива.
var a:array[1..10] of byte;
i,max:byte;
begin
randomize;
for i:= 1 to 10 do begin {заполняем и выводим на экран массив}
a[i]:=random(100); write(a[i]:4)
end;
writeln;
max:=a[1]; {предполагаем, что максимальным является первый элемент массива }
for i:=2 to 10 do {перебираем все остальные элементы массива}
if max<a[i] then max:=a[i]; {если предположение оказалось неверным, то будем считать, что максимальным является текущий элемент массива}
writeln(max);{выводим на экран максимальный элемент}
readln;
end.
Определение содержимого массива в разделе типированных констант
Объявление константы с типом массив содержит значения элементов массива, разделенных запятыми и заключенными в скобки.
Константа-массив::="(" типированная_константа
{"," типированная_константа} ")".
Например:
Const A: array[1..3] of integer=(-4,5,21);
B: array[1..3,1..2] of char=( ('A','f'),
('1','2'),
('x','y'));