Данные структурированного типа состоят из данных других типов. Переменные этих типов могут в каждый момент времени иметь только одно значение. К данным структурированного типа относятся:
o Строки;
o Массивы;
o Множества;
o Записи;
o Файлы;
o Классы.
Строки (строковые типы): представлены тремя физическими и одним общим типами.
Данные типа ShortString представляют собой строку, которая фактически является массивом из 256 элементов – array [0..255]. Нулевой байт этого массива указывает длину строки. Строка – это последовательность символов кодовой таблицы.
Данные типов AnsiString и Wide String представляют собой динамичсекие массивы, максимальная длина которых фактически ограничена размером основной памяти компьютера. Данные типа AnsiString м кодируются в коде ANSI, а типа Wide String – в коде Unicode.
Общим является тип String, который может соответствовать типу ShortString или AnsiString, что определяется директивой компилятора $H.
Так как строки фактически являются массивами, то для обращения к отдельному символу строки можно указать название строковой переменной и номер (позицию) этого символа в квадратных скобках.
Формат описания строкового типа:
Type <имя типа> = string [ max длина строки];
Иначе: var <имя переменной,... >: string [ max длина строки];
Если значение максимально допустимой длины строки не указано, по умолчанию длина 255 символов. При использовании в выражениях строка заключается в апострофы. Строковые данные можно использовать в качестве констант. Недопустимо использование строковых переменных в качестве селектора в операторе Case.
Пример: const Adres = ’ul. Korolenco, 5’;
type Stroka = string[100];
var Str: Stroka; St1: string; St2, St3: string[30];
Массивы: массив – это упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массивов могут быть данные любого типа, включая структурные. Каждый элемент массива однозначно определяется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обращения к отдельному элементу массива указывают имя этого массива и номер (номера) элемента, заключенный в квадратные скобки, например, arr1[3, 5] или arr2[7].
Количество индексных позиций определяет размерность массив (одномерный, двумерный и т.д.), при этом размерность массива не ограничивается. В математике аналогом одномерного массива является вектор, а двумерного массива – матрица. Индексы элементов массива должны принадлежать порядковому типу.
Различают массивы статические и динамические. Статический массив представляет собой массив, границы индексов и, соответственно, размеры которого задаются при объявлении, т.е. они известны до компиляции программы. Формат описания типа статического массива:
Type <имя типа> = Аггау [<тип индексов>] of <тип элементов >;
Иначе: var <имя переменной,...>: Аггау [<тип индексов>] of <тип элементов >;
Пример. type Matrix = a ггау [1..3, 1..2] of integer;
Znak = array[1..255] of char;
Day =(Mon, Tue, Wed, Thu, Fri, Sat, Sun);
var m1, m2: Matrix; a: Znak;
Week: array[1..7] of Day; r: array[1..10] of real;
Динамический массив представляет собой массив, для которого при объявлении указывается только тип его элементов, а размер массива определяете при выполнении программы. Формат описания типа динамического массива:
Type <имя типа> = Аггау of <тип элементов >;
Задание размера динамического массива во время выполнения программы производится процедурой SetLength (var S; NewLength:integer), которая для динамического массива S устанавливает новый размер, равный NewLength. Выполнять операции с динамическим массивом и его элементами можно только после задания размеров этого массива.
После задания размера динамического массива для определения его длины, минимального и максимального номеров элементов используются функции Length(), Low() и High() соответственно. Нумерация элементов динамического массива начинается с нуля, поэтому функция Low() для него всегда возвращает значение ноль.
Пример. Var n: integer;
m: array of real;
...
SetLength(m, 100);
for n:=0 to 99 do m[n]:=n;
SetLength (m, 200);
После описания динамического массива, состоящего из вещественных чисел, определяется размер этого массива, равный 100 элементам. Каждому элементу присваивается значение, равное его номеру в массиве. Так как нумерация элементов массива начинается с нуля, то номер последнего из них равен не 100, а 99. После цикла размер массива увеличивается до двухсот.
Для описания типа многомерного динамического массива (например, двумерного) используется конструкция:
Type <имя типа> = Аггау of Аггау of <тип элементов >;
Действия над массивом обычно выполняются поэлементно, в том числе операции ввода и вывода. Поэлементная обработка массивов производится, как правило, с использованием циклов. Массив в целом (как единый объект) может участвовать только в операциях отношения и в операторе присваивания, при этом массивы должны быть полностью идентичными по структуре, то есть иметь индексы одинаковых типов и элементы одинаковых типов.
Множества: множество представляет собой совокупность элементов, выбранных из предопределенного набора значений. Все элементы множества имеют порядковый тип; количество элементов множества не может превышать 256. Формат, описания множественного типа:
Type <имя типа> = Set of <тип элементов >;
Переменная множественного типа может содержать от нуля до максимального числа элементов своего множества. Значения множественного типа заключаются в квадратные скобки. Пустое множество обозначается [ ]. Операции, допустимые над множествами, приведены в таблице.
Кроме того, имеется операция in (проверка членства), которая определяет принадлежность выражения порядкового типа (первого операнда) множеству (второму операнду). Результат операции будет типа boolean и иметь значение True в случае соблюдения принадлежности значения множеству.
Записи: з аписи объединяют фиксированное число элементов данных других типов. Отдельные элементы записи имеют имена и называются полями. Имя поля должно быть уникальным в пределах записи. Различают фиксированные и вариантные записи. Фиксированная запись состоит из конечного числа полей, ее объявление имеет следующий формат:
Type <имя типа> = record;
<имя поля_1>: <Тип поля>;
...
<имя поля_ n >: <Тип поля>;
end;
Вариантная запись, так же как и фиксированная, имеет конечное число полей, однако предоставляет возможность по-разному интерпретировать области памяти, занимаемые полями. Все варианты записи располагаются в одном месте памяти и позволяют обращаться к ним по различным именам. Отметим, что термин «вариантная запись» не имеет ничего общего с термином «вариантный тип» (variant). Формат объявления вариантной записи:
Type <имя типа> = record;
Case <Признак>: <Тип признака> of;
<вариант_1>: (<описание варианта_1>)
...
<вариант_ n >: (<описание варианта_ n >);
end;
Для обращения к конкретному полю необходимо указывать имя записи и имя поля, разделенные точкой. Таким образом, имя поля является составным. С полем можно выполнять те же операции, что и с переменной этого типа.
Пример. var Man: record;
Name: string;
Salary: real;
Note: string;
end;
...
Man.Name:=’Ivanov M.A.’;
Man.Salary:=5000;
Переменная Man — фиксированная запись, которая содержит поля имени (Name), оклада (Salary) и примечания (Note), причем каждое поле имеет свой тип.
Файлы: Файл представляет собой имеющую имя последовательность однотипных элементов, размещенных на внешнем устройстве, чаще всего, на диске. Файл имеет много общего с одномерным динамическим массивом, но размещается не в оперативной, а во внешней памяти, и не требует предварительного указания размера.
Для выполнения операций с конкретным файлом, размещенным на диске, в программе обычно используется так называемая файловая переменная (логический файл). Файловая переменная после ее описания связывается с некоторым файлом, в результате чего операции, выполняемые над ней, приводят к соответствующим изменениям в этом файле. После завершения всех операций связь между файловой переменной и файлом разрывается. Теперь файловую переменную можно связать с другим файлом этого же типа.
В зависимости от типа элементов различают текстовые, типизированные и нетипизированные файлы. Текстовый файл содержит строки символов переменной длины, типизированный файл составляют элементы указанного типа (кроме файлового), в нетипизированном файле находятся элементы, тип которых не указан. Описание файловой переменной, предназначенной для работы с файлом, должно соответствовать типу элементов файла.
Пример. var f1: TextFile;
f2: File of integer;
f3: File of real;
f4: File;
здесь переменная f1 предназначена для работы с текстовыми файлами, переменные f2 и f3 – с типизированными файлами, содержащими целые и вещественные числа, соответственно, а переменная f4 – с нетипизированными файлами.