Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_po_programmirovaniyu.doc
Скачиваний:
23
Добавлен:
09.12.2018
Размер:
2.5 Mб
Скачать

7.2. Вложенные записи

Поля записей могут в свою очередь быть тоже записями. В этом случае мы имеем дело с вложенными записями. Например, рассмотренную раннее запись можно расширить так:

type

wed = record

nomer: 1..100;

fio: record

fam: string[20];

name: string[10];

forname: string[10];

end;

gr: 1900.2007;

zp: real;

end;

var spisok: wed;

mspisok: array[1..100] of wed;

Для того, чтобы обратиться к какому-либо полю вложенной записи, необходимо через точку указать имя основной записи, имя вложенной записи и название

соответствующего поля: например, оператор writeln(spisok.fio.name) выведет на экран имя сотрудника.

Для вложенных записей можно использовать вложенный оператор with.

111

7.3. Записи с вариантами (вариантные записи)

Основная идея вариантной записи состоит в том, что находясь в рамках единой записи (структуры), определить в ней сразу несколько различных (альтернативных) записей. В самом общем случае такая запись может состоять из фиксированной и вариантной частей. Структура фиксированной части остается постоянной для всех экземпляров записей данного типа. Структура же вариантной части не постоянна, она меняется в зависимости от значения особого поля – поля селектора.

Рассмотрим пример базы данных прокатного пункта автомобилей. Общая характеристика базы данных представлена следующей схемой:

Автомобиль

Общая хар-ка Хар-ка пробега Прокат

Марка Пробег до проката Стоимость проката

Цвет Пробег после проката В прокате:

Год выпуска ФИО

Дата начала проката.

В ремонте:

Причина поступления

Дата поступления.

На месте:

Пустая запись.

Определим тип запись, соответствующий заданной схеме.

{Определяем значения селектора}

type st (в прокате, в ремонте, на месте);

{Определяем тип первой вложенной записи}

общая хар-ка = record

112

марка :string;

цвет :string;

год выпуска :1990..2006;

end;

{Определяем тип второй вложенной записи}

хар-ка пробега = record

пробег до проката : integer;

пробег после проката : integer;

end;

{Определяем третью вложенную запись, содержащую} {вариантную часть}

прокат = record

{Начало фиксированной части}

стоимость проката: real;

{Начало вариантной части}

case признак: st of

в прокате: (фио: string[20];

дата начала проката: string[10]);

в ремонте: (причина поступления : string[30];

(дата поступления : string[6]);

на месте: ( );

end;

автомобиль = record

d : общая хар-ка;

m : хар-ка пробега;

p : прокат

end;

var base1, base2: array[1..10] of автомобиль;

Отметим особенности определения вариантной записи:

- описание всех полей, относящихся к определенному значению селектора, заключено в круглые скобки; скобки играют роль ограничителей, указывающих начало и конец соответствующей группы полей;

113

- вариантная часть не завершается словом end, парным слову case, как это делается при обычном использовании case; это возможно, так как вариантная часть всегда должна размещаться в самом конце записи и слово end завершает одновременно и всю запись и ее вариантную часть.

Планируя размещение вариантной записи в памяти компьютера, компилятор всегда резервирует пространство для самого из протяженных из возможных вариантов полей. То есть, запись занимает максимальную область памяти, даже, если в какой-то момент она использует ее частично. При размещении в вариантной части записи нового варианта записи, старый вариант автоматически стирается.

Для рассматриваемого примера под вариантную запись отводится 36 байт. В зависимости от того, какой вариант используется, этот объем памяти может быть использован полностью (поле – в ремонте), частично (30 байт для поля – в прокате) и совсем не использоваться (поле – на месте).