Тип-массив представляет собой фиксированное количество упорядоченных однотипных компонент, снабженных индексами. Он может быть однономерным и многомерным. Чтобы задать тип-массив, используется зарезервированное слово array, после которого следует в квадратных скобках указать тип индекса (индексов) компонент и далее после слова of - тип самих компонент:
type <имя типа> = аггау[<тип индекса(индексов)>] of <тип компонент>;
Пример 1. Объявление типов-массивов
type
Arr = array[1..3] of Real; {Тип-массив из трех вещественных чисел}
Matrix = array[1..3, 1..2] of Integer;
{Тип - двумерный массив целых чисел, состоящий из 3 строк и 2 столбцов}
Вместо квадратных скобок можно использовать круглые скобки с точками:
type
Arr = array(. 1 ..3.) of Real; {Тип-массив из трех вещественных чисел}
Matrix = array(.1..3, 1..2.) of Integer;
{Тип - двумерный массив целых чисел, состоящий из 3 строк и 2 столбцов}
После описания типа-массив можно задать переменные или типизированные константы этого типа.
Размерность массива может быть любой, компоненты массива могут быть любого (в том числе и структурированного) типа, индекс (индексы) может (могут) быть любого порядкового типа, кроме типа Longint. При употреблении в качестве типа индекса типа Integer или Word можно использовать только его диапазон.
Пример 2. Объявление типов-массивов
type
Arr = array[1..n] of Real; {Тип-массив из n вещественных чисел}
Matrix = array[1..2] of Arr;
{Тип - двумерный массив целых чисел, состоящий из 3 строк и 2 столбцов}
В данном случае массив Arr описан с использованием константы n, которая должна быть определена до определения типа. Попытки использовать ввод для задания значеия n будут ошибочны.
При задании значений константе-массиву компоненты указываются в круглых скобках и разделяются запятыми, причем, если массив многомерный, внешние круглые скобки соответствуют левому индексу, вложенные в них круглые скобки - следующему индексу и т. д. При этом все компоненты массива должны быть заполнены.
Пример. Задание переменных-массивов
Для введенных выше типов можно задать, например, следующие переменные и константы:
var
М1, М2: Arr; Matr: Matrix; const
M3: Arr = (1,2,3);
Mat: Matrix = ((1, 2), (3, 4), (5, 6));
Последняя константа соответствует следующей структуре:
1 2
3 4
5 6
Примечание. Тип-массив можно вводить непосредственно и при определении соответствующих переменных или типизированных констант.
Пример. Другое задание переменных-массивов
var
М1, М2: array[1..3] of Real; Matr: array[1..3, 1..2] of Integer;
Здесь определены те же массивы, что и в предыдущем примере.
При таком объявлении массивов следует помнить, что их типы не будут идентичными никаким другим типам, даже если они имеют одинаковую структуру. Поэтому передавать их как параметры в подпрограмму нельзя, нельзя также присваивать им значения других массивов (и наоборот), даже если их структуры совпадают - в таком случае допустимо лишь покомпонентное присваивание.
Доступ к компонентам массива осуществляется указанием имени массива, за которым в квадратных скобках помещается значение индекса (индексов) компоненты. В общем случае каждый индекс компоненты может быть задан выражением соответствующего типа.
Пример обращения к элементам массива:
М1[2], Matr[X, Y], и т. д.
Одному массиву можно присвоить значение другого массива, но только идентичного типа. Так, если заданы следующие массивы:
var А, В: array[1..5] of Integer, С: array[1..5] of Integer,
то допустим оператор
А:=В; С другой стороны, оператор
С:=А; недопустим, так как массивы А и С - неидентичных типов.
Действия над массивами:
Для работы с массивом как с единым целым используется идентификатор массива без указания индексов в квадратных скобках.
Массив может участвовать только в операциях отношения («=», «<>») и в операторе присваивания.
Массивы, участвующие в этих действиях, должны быть идентичны по структуре, то есть иметь одинаковые базовые типы и типы индексов.
Имеются некоторые отличия в работе с одномерными массивами символов. Так, типизированным константам этого вида можно присвоить значение, как обычным строковым константам, указав строку символов в одинарных кавычках, например:
const
A: array[1..5] of Char='aaaaa'
В: array[1..3] of Сhаг=’BBB';
При этом совершенно необязательно, чтобы размер строковой константы совпадал с размером массива - константа может быть меньшего размера.
Для таких массивов, как и для строк, можно использовать операции сравнения (даже если они неидентичных типов, и даже если имеют различный размер) и объединения. Их можно использовать в операторах вывода Write и WriteLn. Например, для введенных выше массивов можно написать:
if A > В then
WriteLn(A) else
WriteLn(B);
Пример. Создание массива значений функции sin(x) с заданным шагом
Напишем программу, которая вычисляет 101 значение функции sin(x) и выводит первое отрицательное значение синуса. Заметим, что для работы с массивами обычно удобно использовать какой-либо из циклов, чаще всего цикл FOR. Программа будет выглядеть следующим образом:
program EXAMPLE27; {Заголовок программы}
{Вычисление функции sin(x)} label 1; var
Si: array[0..100] of Real; {Массив вещественных чисел}
Step: Real; {Шаг}
X: Real; {Значение аргумента}
i: Integer, {Параметр цикла}
begin
Write('Введите шаг вычисления: '); {Запрос на ввод шага вычисления}
ReadLn[Slep); {Чтение значения шага вычисления}
X := 0; {Начальный аргумент}
for i := 0 to 100 do {Цикл расчета значений синуса}
begin
Si[i]:=Sin(X); X := X + Step; end;
for i := 0 to 100 do {Проверка знака значения}
if Si[i] < 0 then {Если число отрицательное...}
begin Writeln('Первое отрицательное значение синуса:', Si[i],' Номер элемента:', i);
{Вывод сообщения}
goto 1; {На завершение программы}
end; WriteLn('HeT отрицательного значения");
{Сообщение, что нет отрицательного значения}
1: ReadLn; {Приостановка программы}
end.
|