Структурированные типы данных
Данные структурированного типа состоят из данных других типов. Переменные этих типов могут в каждый момент времени иметь только одно значение. К данным структурированного типа относятся:
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 – с нетипизированными файлами.