6. Структурированные типы данных
Структурированные типы данных определяют наборы однотипных или разнотипных компонент. Типы компонент образуются из других типов (простых, структурированных, указателей и т. д.) данных.
В языке Паскаль существуют следующие структурированные типы.
- тип-массив;
- тип-запись;
- тип-множество;
- тип-файл.
В Turbo Pascal имеется еще два структурированных типа - тип-строка string и тип-строка PChar, являющиеся разновидностями массива.
В дальнейшем объекты структурированных типов для краткости будут называться теми же именами, что и их типы, без указания слова "тип": массив, запись, множество, файл, строка.
В стандарте языка существуют упакованные (packed) и неупакованные структурированные типы. В Turbo Pascal слово packed, характеризующее упакованный тип, не оказывает никакого влияния; в случае, когда это возможно, упаковку данных осуществляется автоматически.
6.1. Массив
Тип-массив представляет собой фиксированное количество упорядоченных однотипных компонент, снабженных индексами. Он может быть, одномерным и многомерным. Чтобы задать тип-массив, используется зарезервированное слово array, после которого следует указать тип индекса (индексов) компонент (в квадратных скобках) и далее после слова of - тип самих компонент.
type
<имя типа> = аггау[<тип индекса(индексов)>] of <тип компонент>;
Пример.
type
Arr = array[1..3] of Real;
{тип-массив из 3 вещественных чисел}
Matrix = array[1..3, 1..2] of Integer;
{тип - двумерный массив целых чисел, состоящий из 3 строк и 2 столбцов}
Введя тип-массив, можно затем задать переменные или типизированные константы этого типа.
Размерность массива может быть любой, компоненты массива могут быть любого, в том числе и структурированного, типа, индекс (индексы) может быть любого порядкового типа, кроме типа Longint.
При задании значений константе-массиву компоненты указываются в круглых скобках и разделяются запятыми, причем, если массив многомерный, внешние круглые скобки соответствуют левому индексу, вложенные в них круглые скобки - следующему индексу и т. д.
Так, для введенных выше типов можно задать, например, следующие переменные и константы:
var
M1, M2: Arr;
Matr: Matrix;
const
М3: Arr = (1 , 2, 3) ;
Mat: Matrix = ((1, 2), (3, 4), (5, 6));
Последняя константа соответствует следующей структуре:
Примечание. Тип-массив можно вводить непосредственно и при определении соответствующих переменных или типизированных констант. Например:
var
Ml, M2: array[1..3] of Real;
Matr: array[1..3, 1..2] of Integer;
Здесь определены те же массивы, что и в предыдущем примере.
При таком объявлении массивов следует помнить, что их типы не будут идентичными никаким другим типам, даже если они имеют одинаковую структуру. Поэтому передавать их как параметры в подпрограмму нельзя (см. п. 10.3), нельзя также присваивать им значения других массивов (и наоборот), даже если их структуры совпадают.
Доступ к компонентам массива осуществляется указанием имени массива, за которым в квадратных скобках помещается значение индекса (индексов) компоненты. В общем случае каждый индекс компоненты может быть задан выражением соответствующего типа, например:
М1[2] ,
Matr[X, Y],
M2[Succ(I) ] и т. д.
Одному массиву можно присвоить значение другого массива, но только идентичного типа. Так, если заданы следующие массивы:
var А, В: array[1..5] of Integer;
С: array[1..5] of Integer;
то допустим следующий оператор:
A := В;
С другой стороны, оператор
С := А;
недопустим, т. к. массивы А и С - не идентичных типов.
Имеются некоторые отличия в.работе с одномерными массивами символов (не путать с величинами типа string - см. п. 6.2). Так, типизированным константам этого вида можно присвоить значение как обычным строковым константам, указав строку символов в апострофах, например
const
A: array[1..5] of Char='aaaaa';
В: array[1..3] of Char='bbb';
Для таких массивов, как и для строк, можно использовать операции сравнения (даже если они не идентичных типов и даже если имеют различный размер) и конкатенации (объединения) - см. п. 6.2. Их можно использовать в операторах вывода Write и WriteLn. Например, для введенных выше массивов можно написать
if A > В then
WriteLn(A)
else
WriteLn(B);
|