Еще раз о типах данных в Турбо Паскале
Любые данные, то есть константы, переменные, значения функций или выражения, в Турбо Паскале характеризуются своими типами. Тип определяет множество допустимых значений, которые может иметь тот или иной объект, а также множество допустимых операций, которые применимы к нему. Кроме того, тип определяет также и формат внутреннего представления данных в памяти ПК.
Турбо Паскаль характеризуется разветвленной структурой типов данных.
Порядковый тип еще называют ординальным [3].
В Турбо Паскале предусмотрен механизм создания новых типов данных, благодаря чему общее количество типов, используемых в программе, может быть сколь угодно большим. Все данные, используемые программой, должны принадлежать к какому-либо заранее известному типу данных – стандартному или пользовательскому. Исключение составляют лишь константы, типы которых компилятор устанавливает, исходя из формата записи их значений.
Пользовательский тип данных – это тип данных, определяемый программистом в программе. Объявление пользовательских типов данных происходит в разделе объявления типов, который открывается зарезервированным словом TYPE. За словом TYPE следуют разделенные знаком равенства имя нового пользовательского типа и конструкция, определяющая этот тип.
Синтаксическая диаграмма для раздела определения типов представлена на рис. 1.
Рис. 1
type
day = (mon, tue, wed); color = (white, red, blue)
В данном случае слова day и color представляют собой имена новых типов, при этом пользовательский тип day определен тремя элементами: mon, tue, wed; пользовательский тип color элементами: white, red, blue.
Процедурные и объектные типы данных, данные типа “указатели” и “файлы” рассматриваются в юнитах 3, 4. Простые типы данных были рассмотрены в юните 1.
К простым типам относятся порядковые и вещественные типы.
Порядковые типыотличаются тем, что каждый из них имеет конечное число возможных значений. Эти значения можно определенным образом упорядочить (отсюда – название типов) и, следовательно, с каждым из них можно сопоставить некоторое целое число – порядковый номер значения.
Вещественные типы, строго говоря, тоже имеют конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественных типов настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным.
К порядковым типам относятся целые, логический, символьный, перечисляемый и тип–диапазон. К любому из них применима функция ORD(X), которая возвращает порядковый номер значения выражения Х. Для целых типов функция ORD(X) возвращает само значение Х. Для логического типа функция ORD(X) дает 0 для значения false и 1 для значения true. Для символьного типа функция ORD(X) дает значение в диапазоне от 0 до 255.
К порядковым типам можно также применить функции PRED(X) и SUCC(X). PRED(X) – возвращает предыдущее значение порядкового типа. SUCC(X) – возвращает следующее значение порядкового типа.
Целый тип
Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два или четыре байта.
Название типа Длина, байт Диапазон значений
BYTE 1 0 ... 255
SHORTINT 1 –128 ... 127
WORD 2 0 ... 65535
INTEGER 2 –32768 ... 32767
LONGINT 4 –2147483648 ... 2147483647
Логический тип
Значениями логического типа может быть одна из предварительно объявленных констант FALSE или TRUE. Для них справедливы правила:
ORD (FALSE) = 0;
ORD (TRUE) = 1;
FALSE < TRUE;
SUCC (FALSE) = TRUE;
PRED (TRUE) = FALSE.
Символьный тип
Значениями символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне 0 ... 255. Это число служит кодом внутреннего представления символа, его возвращает функция ORD. Для кодировки используется код ASСII (American Standard Code for Information Interchange – американский стандартный код для обмена информацией). Это 7–битный код, т. е. с его помощью можно закодировать лишь 128 символов в диапазоне от 0 до 127. В то же время в 8–битном байте, отведенном для хранения символа в Турбо Паскале, можно закодировать в два раза больше символов в диапазоне от 0 до 255. Первая половина символов ПК с кодами 0 ... 127 соответствует стандарту ASCII. Вторая половина символов с кодами 128 ... 255 не ограничена жесткими рамками стандарта и может меняться на ПК разных типов. С кодировкой символов в соответствии с кодом ASCII можно ознакомиться в литературе [1-4].
К типу CHAR применимы операции отношения, а также встроенные функции:
CHR(B) – преобразует выражение В типа BYTE в символ;
UPCASE(CH) – возвращает символ в верхнем регистре, если он определен для аргумента CH типа CHAR; в противном случае возвращает сам символ CH.
Все множество символов считается упорядоченным. Латинские буквы идут друг за другом в алфавитном порядке. Выполнение оператора цикла
for c := ‘a‘ to ‘z’ do write(c),
где с – переменная типа char, приведет к выводу всех малых букв латинского алфавита:
abcdefghijklmnopqrstuvwxyz.
У символа малая буква а – код 97, заглавная буква А имеет код 65. Символы с кодами 0 ... 31 относятся к служебным кодам. Коды 32 ... 64 отводятся под специальные знаки и цифры.
Кроме классической записи символьной переменной в одинарных кавычках, Турбо Паскаль вводит еще две формы. Одна из них – представление символа его кодом ASCII с помощью специального префикса #:
#97 = chr(97) = ‘a’ (символ ‘a’),
#0 = chr(0) = ‘’ (нулевой символ),
#32 = chr(32) = ‘ ’ (пробел).
Символы, имеющие коды от 1 до 31 (управляющие), могут быть представлены их “клавиатурными” обозначениями – значком ^ и буквой алфавита с тем же номером (для диапазона кодов 1 ... 26) или служебным знаком (для диапазона 27... 31):
^A = #1 = chr(1) – код 1.
^B = #2 = chr(2) – код 2,
^[ = #27 = chr(27) – код 27,
в том числе ^G – звонок (код 7), ^I – ТАВ (код 9), ^J – забой (код 10), ^M – возврат каретки (код 13).
Вещественный тип
В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа.
Доступ к типам single, double и extended возможен только при особых режимах компиляции.
Вещественное число в Турбо Паскале занимает от 4 до 10 смежных байт и имеет следующую структуру в памяти ПК:
Здесь s – знаковый разряд числа; е – экспоненциальная часть (содержит двоичный порядок); m – мантисса числа.
Мантисса m имеет длину от 23 (для single) до 63 (для extended) двоичных разрядов, что и обеспечивает точность 7 ... 8 для single и 19 ... 20 для extended десятичных цифр. Десятичная точка подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой.
Типизированные константы
Напомним еще раз, что константа – идентификатор, обозначающий некоторую неизменную величину определенного типа. Константы, так же как и переменные, объявляются в описательной части программы (или процедуры) до момента своего использования в процессе вычислений.
Объявления констант начинаются зарезервированным словом const. Затем следует имя константы, символ равенства (=) и значение этой константы. Например:
const m = 14.0.
В таком случае оператор присваивания m := 1 недопустим, как недопустимо и действие 14.0 := 1.
В отличие от констант типизированные константы представляют собой инициализированные переменные, которые могут использоваться в программах наравне с обычными переменными. Каждой типизированной константе ставится в соответствие имя, тип и начальное значение. Они задаются в разделе объявления констант следующим образом:
<идентификатор> : <тип> = <значение>
Здесь <идентификатор> – идентификатор константы; <тип> – тип константы; <значение> – значение константы.
Например:
year : integer = 1995;
Имя константы – year, тип константы integer, значение константы 1995.
Типизированные константы обладают всеми преимуществами переменных, в частности, они могут использоваться в левой части оператора присваивания. Они инициализируются только один раз – в начале выполнения программы. При использовании в процедурах или функциях необходимо иметь в виду, что при каждом новом обращении к процедуре или функции типизированные константы не инициируются заново.
Типизированные константы не могут использоваться при описании других констант или типов.
Типизированные константы могут быть любого типа, кроме файлов.
Примеры правильного объявления констант:
const
year : word =1989;
x : real = 0.01;
min : integer = 0;
Примеры неправильного объявления констант:
const
mass : array [min..max] of real; {Нельзя использовать типизированные константы в качестве границ диапазона}
a, b, c : byte = 0; {Нельзя использовать список идентификаторов}
x : real = pi; {Нельзя использовать в качестве значения вызов функции}
var namef : string [22] = ‘prog.pas’; {Нельзя объявлять типизированную константу в разделе переменных}
Перечисляемый тип
Перечисляемый тип задается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками. Перечисляемый тип относится к типам данных, определяемым пользователем, поэтому объявление этого типа начинается со служебного слова TYPE, например:
type color = (White, Red, Blue, Yellow, Purple, Green, Orange, Black);
sex = (male, female);
workday = (mon, tues, wed, thur, fri, sat);
Вы уже познакомились с предопределенным типом boolean, который можно было бы определить следующим образом:
type boolean = (false, true);
Синтаксическая диаграмма для перечисляемого типа представлена на рис. 2.
Рис. 2
Пример неверного определения:
type workday = (mon, tues, wed, thur, fri, sat);
free = (sat, sun);
Описание неверно из-за того, что тип константы sat – двусмыслен. В области действия описания перечисляемого типа запрещено использование другого описания перечисляемого типа с ранее уже использованными константами.
Использование перечисляемых типов повышает надежность программ благодаря возможности контроля тех значений, которые получают соответствующие переменные. Эти значения могут быть использованы в качестве параметра в операторе цикла FOR, в качестве селектора в операторе CASE. Константы, входящие в определение перечисляемого типа, считаются упорядоченными, т. е. им ставится в соответствие последовательность целых чисел, начинающихся с нуля. Порядковые номера компилятор использует для представления констант в памяти ЭВМ. Перечисляемые типы имеют компактное машинное представление. Перечисляемые данные должны иметь синтаксис идентификатора, и поэтому не могут перечисляться цифры, символы, строки. Над перечисляемыми данными не производятся арифметические действия. Пусть, например, заданы такие перечисляемые типы:
type
colors = (blaсk, red, white);
ordenal = (one, two, three);
days = (monday, tuesday);
и определены переменные
var
col : colors;
num : ordenal;
day : days;
Порядковые номера: ORD(black) = 0, ORD(white) = 2, ORD(one) = 0.
Допустимы операторы:
col := black; num := succ(two); day := pred(tuesday);
Недопустимыми являются операторы:
col := one; day := black;
Переменные любого перечисляемого типа можно объявлять без предварительного описания этого типа, например:
var
col : (black, white, green);
К сожалению, перечисляемые типы данных не лишены существенного недостатка, ограничивающего их применение в широких масштабах. Значения переменных этих типов не могут вводиться оператором read и выводиться оператором write. Бороться с этим недостатком можно, но посредством не очень красивых приемов. Обычно, чтобы все-таки иметь возможность вывода на экран, вводят проиндексированные массивы. Каждый их элемент есть строковое написание соответствующего перечисленного значения.
Задача 1. Составить программу, которая выводит все дни недели, оставшиеся до конца недели, и день, предшествующий заданному дню.
Данный пример иллюстрирует работу с перечисляемыми типами. В качестве нового типа данных используем тип days, состоящий из семи констант, соответствующих дням недели.
program zadacha1; {Заголовок программы}
uses crt; {uses – фраза}
type {Определение нового типа}
days = (mon, tue, wed, thu, fri, sat, sun);
var
day, today : days; {Описание переменных}
begin {Начало исполняемой части программы}
clrscr; {Стандартная процедура гашения экрана}
today:=tue; {Ввод исходной информации}
writeln(‘До конца недели’);
for day:= today to sun do {Цикл от заданного дня недели до }
begin {последнего дня недели - sun}
case day of {Оператор выбора}
mon:writeln(‘понедельник’);
tue:writeln(‘вторник’);
wed:writeln(‘среда’);
thu:writeln(‘четверг’);
fri:writeln(‘пятница’);
sat:writeln(‘суббота’);
sun:writeln(‘воскресенье’)
end;
end;
write(‘Вчерашний день – ‘);
if ord(today) = 0 then day:=sun {Расчет предыдущего дня}
else day:=pred(today);
case day of
mon:writeln(‘понедельник’);
tue:writeln(‘вторник’);
wed:writeln(‘среда’);
thu:writeln(‘четверг’);
fri:writeln(‘пятница’);
sat:writeln(‘суббота’);
sun:writeln(‘воскресенье’)
end;
end.
За заголовком программы следует uses – фраза. Такая фраза указывает на используемые в программе, но описанные в другом месте объекты. Это связано с важнейшим понятием модуля, рассматриваемом в следующей юните. В данном примере uses crt; говорит о том, что в программе может использоваться процедура clrscr (очистить экран), описанная в модуле crt.
Оператор присваивания today := tue заменяет оператор ввода, так как для read и write недопустимо использование переменных и значений перечисляемого типа.
3. Тип – диапазон
Еще одним определяемым типом языка является диапазон. Используя его, мы можем определить тип, который будет содержать значения только из ограниченного поддиапазона некоего базового типа. Базовым типом, из которого вычленяются диапазоны, может быть любой целочисленный тип, тип char и любой из введенных программистом перечисляемых типов.
Тип–диапазон есть подмножество своего базового типа, в качестве которого может выступать любой порядковый тип, кроме типа-диапазона.
Тип–диапазон еще называют ограниченным типом или интервальным типом.
Для введения нового типа–диапазона – надо в блоке описания типов type указать имя этого типа и границы диапазона через две точки подряд (рис. 3).
Рис. 3
Первая константа задает наименьшее, а вторая наибольшее значение переменной этого типа. Вторая константа не может быть меньше первой. Например:
type
digit = ‘0’ .. ‘9’;
dig2 = 48 .. 57;
Такая декларация типа указывает компилятору, что для переменных этого типа (которые будут объявлены в программе далее) допустимы в качестве значений только числа из указанного интервала. При выполнении программы попытка присвоить такой переменной значение, не входящее в интервал допустимых значений, квалифицируется как ошибка и приводит к прекращению работы программы и выдаче соответствующего сообщения.
Тип–диапазон необязательно описывать в разделе TYPE, его можно указывать непосредственно при объявлении переменной:
var
date : 1 .. 31;
month : 1 .. 12;
Переменные date и month могут принимать значения только из заданного интервала. Два символа “..” рассматриваются как один символ, поэтому между ними не допустимы пробелы.
Тип–диапазон наследует все свойства своего базового типа, но с ограничениями, связанными с его меньшей мощностью. Если определена переменная
type
days = (mo, tu,th, fr, sa, su);
weekend = sa .. su;
var
w : weekend;
. . . . . . . .
w := sa;
то ord(w) вернет значение 5, в то время как pred(w) приведет к ошибке.
Диапазонные типы позволяют формулировать проблему в более наглядной форме. Для реализаторов языка появляется возможность экономить память и проводить во время выполнения программы контроль присваиваний.
Задача 2. Используя диапазонный тип данных, написать программу генерирования чисел спортлото “6 из 49”.
program sportlotto;
{Программа задания чисел для игры в лото “6 из 49”}
type
num = 1 .. 49;
var
i: 1..6; loto: num;
begin
randomize;
for i:=1 to 6 do
begin
loto :=random(49)+1;
writeln(‘Nr.’,i:2,loto:6)
end
end.
В программе объявлен новый тип данных num. Возможные значения переменной типа num ограничены и находятся в интервале от 1 до 49. Далее переменная loto объявляется как переменная типа num. Переменная i также является переменной диапазонного типа. Как известно, переменные диапазонного типа могут задаваться в разделе описания переменных. Randomize – встроенная математическая функция инициации датчика псевдослучайных чисел.
Эта программа имеет тот недостаток, что не все шесть выпавших в лото чисел могут оказаться различными. Этот недостаток легко устранить, воспользовавшись описанным в главе 7 типом данных “множество” (см. задачу 23).
В этой маленькой программе еще не совсем ясна необходимость в переменных ограниченного типа, хотя в больших программах такая необходимость есть. Когда мы имеем дело с программой в две дюжины строк, очень неудобно помнить, какие именно значения могут иметь отдельные переменные. Например, сообщение, что i имеет тип integer, мало что нам говорит, в то время как переменная, имеющая диапазонный тип 1 .. 6, дает намного больше информации. Это не всегда удобно для пользователя, но зато делает программиста более уверенным в программе. Если только из-за ошибки в программе значение вычисленной переменной выйдет за допустимый интервал, то последует сообщение об ошибке. Таким способом можно получать дополнительный контроль. Переменные интервального типа в языке Паскаль используются, в частности, тогда, когда заранее известно, что значение переменной может находиться только в определенном интервале.
Задача 3. Рассчитать продолжительность рабочей недели в часах.
Задача носит чисто иллюстративный характер, так как мы сумеем в уме сосчитать количество часов при восьмичасовом рабочем дне и пятидневной рабочей неделе.
program rabweek;
type
day = (mo,tu,we,th,fr,sa,su);
workday = mo..fr;
var
den: workday;
time: integer;
begin
time := 0;
for den := mo to fr do time := time + 8;
write (time)
end.
Тип day объявляется путем перечисления всех значений (здесь перечислены сокращенные английские названия всех дней недели). Новый тип workday является типом–диапазоном и все возможные значения переменной типа workday ограничены и находятся в интервале от mo до fr. Из предыдущей (базовой) строки ЭВМ может определить, что здесь возможными значениями будут mo, tu, we, th, fr. Переменная den имеет тип workday. Если этой переменной захотят присвоить значение, отличающееся от перечисленных в списке от mo до fr включительно, например su, то в этом случае появится сообщение об ошибке. Целая переменная time с каждым рабочим днем недели увеличивается на 8. Таким образом, мы найдем продолжительность рабочей недели, равную 40 часам.
Массивы
В Турбо Паскале четыре типа структурированных данных: массивы, записи, множества и файлы. Переменная или константа структурированного типа всегда имеет несколько компонентов. Каждый компонент, в свою очередь, может принадлежать структурированному типу, что позволяет говорить о возможной вложенности типов.
Массивовый тип –это одномерная или многомерная совокупность фиксированного числа однотипных элементов.
Массивы (регулярные типы данных) представляют собой упорядоченную последовательность переменных одного типа. Элементы массива являются его компонентами. Все компоненты относятся к одному типу, его называют типом компонент. Каждая компонента может быть явно обозначена с помощью имени переменной массива, за которым в квадратных скобках следует индекс. Индекс – это величина, характеризующая положение элемента относительно начала массива. Индексом может быть произвольное выражение порядкового типа, заключенное в квадратные скобки. Время, требуемое для доступа к любой компоненте, не зависит от значения индекса. Поэтому о массивах можно говорить как об объектах, структура которых допускает прямой доступ.
Переменные b[1], b[2], ..., b[40] являются элементами массива b; с[1], c[2], ..., c[40] – элементы массива с. b[12] – двенадцатый элемент массива b, c[39] – тридцать девятый элемент массива с. Если массив состоит только из 40 элементов, то нельзя использовать переменную b[41], так как такой переменной нет в массиве. В качестве индекса может использоваться выражение, например:
a [ i + 2 ], b [2 * ( i + 1) + 1].
Каждому массиву, используемому в программе, выделяется место в памяти. Но в отличие от простых переменных массиву отводится не одна ячейка, а последовательность расположенных друг за другом ячеек, в каждую из которых записывается значение соответствующего элемента.
Массивы, как и простые переменные, подлежат описанию в разделе переменных. Например,
var
a : array [1 .. 40] of real;
b,c : array [1 .. n] of real;
d : array [5 .. 20] of integer;
p : real;
В приведенном примере описаны четыре массива: a, b, c, d и простая переменная р. Ключевое слово array означает, что описываемый объект является массивом. В описании массива содержатся следующие сведения: 1) сведения о типе элементов массива (элементы массивов a, b, c – вещественные, массива d – целые); 2) диапазон изменения индексов, определяемый граничной парой, например: 1.. 40, 1 .. n, 5 .. 20. Нижняя граница отделяется от верхней двумя точками. Нижняя граница показывает наименьшее возможное значение индекса, верхняя – наибольшее. Очевидно, что нижняя граница не может превосходить верхнюю.
В описании массивов df и cf
df : array [1 .. 10] of real;
cf : array [1 .. 10] of real
указаны один и тот же тип элементов и одинаковая граничная пара, поэтому такое описание может быть заменено более коротким:
df,cf : array [1 .. 10] of real.
Если несколько массивов имеют один и тот же тип и одинаковые граничные пары, то их описания можно объединить, разделив имена массивов запятыми.
Каждому из массивов df и cf выделяется по 10 последовательно расположенных друг за другом ячеек памяти. О том, какое количество ячеек памяти нужно выделить массиву, машина “узнает” из описания.
Пусть массив К описан следующим образом:
var K : array [n .. m] of integer.
Какое количество ячеек должно быть выделено для хранения элементов массива К? Это зависит от значений n и m. Выделение памяти для переменных и массивов производится раньше, чем выполняется какой-либо оператор программы. n и m должны получить значение прежде, чем начнется процесс выделения памяти для переменных. Определить значения n и m можно в разделе констант, который помещается в программе между разделом меток и переменных.
Пример.Программа чтения элементов массива и вывода элементов этого массва, помноженных на число .
program pri;
const n = 1; m = 10;
var
i : integer;
k : array [n .. m] of integer;
begin
for i:= n to m do read (k[i]);
for i:= n to m do write (k[i] * pi)
end.
Использование раздела констант позволяет сгруппировать в начале программы величины, характерные для конкретного примера. Здесь их легче изменить. Например, если программу pri нужно выполнить для массива, состоящего из сорока элементов, то достаточно изменить лишь раздел констант. В случае когда константы записаны в программе явно, изменения приходится вносить в различные части программы, при этом некоторые части, требующие изменения, могут остаться не замеченными. Особенно часто это бывает, если программа достаточно велика. Использование констант не только облегчает процесс изменения программы, но и делает его более надежным.
Массивовый тип является типом, определяемым пользователем, его можно определить в разделе описания типов:
type
ar = array [n .. m] of integer.
Тогда в разделе переменных необходимо указать
k : ar.
Синтаксис описания типа массива:
<имя типа> = array [<сп. инд. типов>] of < тип>
Здесь <имя типа> – правильный идентификатор; array, of – зарезервированные слова (массив, из); <сп. инд. типов> – список из одного или нескольких индексных (порядковых) типов, разделенных запятыми; квадратные скобки, обрамляющие список, – требование синтаксиса; < тип> – любой тип Турбо Паскаля.
В качестве индексных типов в Турбо Паскале можно использовать любые порядковые типы, кроме longint.
Так как тип <тип>, идущий за словом of, – любой тип Турбо Паскаля, то он может быть и другим массивом, например:
type
mat = array [0 .. 5] of array [–2 .. 2] of real,
или более компактно:
type
mat = array [0 .. 5, –2 .. 2] of real.
Еще пример описания:
type
color = (red, green, blue);
truthtable = array [boolean] of boolean;
height = 0..200;
var
square : array [color] of height;
matrix : array [2..8] of array [2..8] of integer;
table : truthtable;
Тип truthtable связан с набором массивов с индексами и элементами типа boolean. Переменная square является массивом с индексами типа color и элементами типа heigth. Переменная matrix является массивом с индексами в диапазоне 2 .. 8 и элементами, являющимися, в свою очередь, массивами с индексами 2 .. 8 и элементами целого типа. Переменная table является массивом типа truthtable, то есть с индексами и элементами типа boolean.
Значения индексных выражений должны находиться в диапазоне, установленном типом индексов в описании массива.
Глубина вложенности структурированных типов вообще, а следовательно, и массивов – произвольная, поэтому количество элементов в списке индексных типов (размерность массива) не ограничено, однако суммарная длина внутреннего представления любого массива не может быть больше 65520 байт.
Синтаксическая диаграмма для массивового типа представлена на рис.4.
Рис. 4
В целях совместимости со стандартным Паскалем в Турбо Паскале разрешается перед описанием структурированного типа ставить зарезервированное слово packed, предписывающее компилятору, по возможности, экономить память, отводимую под объекты структурированного типа; но компилятор фактически игнорирует это указание: “упаковка” данных в Турбо Паскале осуществляется автоматически везде, где это возможно.
В приведенном выше примере через mat [i][j] обозначается j–я компонента i–й компоненты массива mat. Обычно для многомерных массивов удобнее пользоваться такой сокращенной формой как mat [i,j]. Массив mat можно рассматривать как матрицу и говорить, что mat [i,j] относится к компоненте, находящейся в j–ом cтолбце i–й строки этой матрицы. Дело не ограничивается двумерными массивами. Если задано n типов индексов, то массив называется n–мерным, а его компоненты обозначаются с помощью n индексных выражений.
Если есть переменные – массивы А и В одного типа, то присваивание:
А := В
возможно, если массивы допускают покомпонентное присваивание
A [ i ] := B [ i ]
(для всех i, относящихся к типу индекса), и представляет собою сокращенную запись такого покомпонентного присваивания.
Однако над массивами не определены операции отношения. Нельзя, например, записать
if a = b then ...
Сравнить два массива можно поэлементно, например:
for i := 1 to 5 do
if a[i] <> b[i] then ...
При работе с массивами часто используется поэлементная обработка массива в рамках цикла for ... to ... do. Так, с помощью фрагмента программы for i := 2 to 7 do index[i] := 0; всем элементам массива index присваивается значение 0.
В качестве начального значения типизированной константы–массива используется список констант, отделенных друг от друга запятыми; список заключается в круглые скобки, например:
type
colors = (white, red, black);
const
colst : array [colors] of string[5] = (‘white’, ‘red’, ‘blaсk’);
vector : array [1..5] of byte = (0, 0, 0, 0, 0);
При объявлении многомерных констант–массивов множество констант, соответствующих каждому измерению, заключается в дополнительные круглые скобки и отделяется от соседнего множества запятыми. Зададим двумерный массив из трех строк и пяти столбцов с монотонно увеличивающимися целыми числами:
const
matr : array [1..3, 1..5] of byte = ((0, 1, 2, 3, 4),
(5, 6, 7, 8, 9),
(10, 11, 12, 13, 14))