Запись в ТР является одним из самых общих и структурированных типов. Запись состоит из фиксированного числа компонент (полей), которые могут быть различных типов.
тип_запись::= "record"
[ список_полей ]
"end"
список_полей ::= ( фиксированная_часть
[";" вариантная_часть] [";"]) |
(вариантная_часть [";"])
фиксированная_часть::= список_ИД ":" тип
{ ";" список_ИД ":" тип }
Примеры определения типа запись с фиксированной частью:
type
Book=record {определяем тип записи - "Книга"}
Title:string[40]; {название книги}
Autor:string[50]; {автор}
Publ:string; {издательство}
Date:integer; {год издания}
end;
Date=record {определяем тип записи - "Дата"}
Year: integer; {год}
Month: 1..12; {месяц}
Day: 1..31; {день}
end;
Заметьте, что одно из полей записи Book имеет то же имя, что и запись Date. ТП не считает это ошибкой, так как одинаковые идентификаторы находятся, тем не менее на разных уровнях.
Для обращения к определенному полю переменной типа запись требуется указать имя переменной, точку и имя поля.
Например:
…
var A:Book;
begin
...
a.title:=’Кризис империи’;
a.Autor:=’Дэвид Дрейк’;
a.Publ:=’Армада’;
a.Date:=1997;
...
end.
В вариантной части ТП позволяет распределить одну и ту же область памяти компьютера между несколькими полями записи. Т.о. изменение одного поля сказывается на содержимом других. Объем распределенной памяти равен объему наибольшего поля.
вариантная_часть ::= "case" [ИД_поля_признака ":"]
тип_поля_признака "of"
вариант {";" вариант}
тип_поля_признака::= порядковый_тип.
Вариант::=
константа {"," константа} ":" "(" [список_полей] ")"
Например:
…
type
Person=record {определяем тип записи - "Человек"}
Name:string[40]; {Имя (фамилия, отчество)}
BirthDate: Date; {дата рождения}
case Citizen:Boolean of {гражданство в нашей стране}
true: (BirthPlace: string[40]); {если гражданин, то определяем место рождения }
false: (Country:string[20]; {иначе определяем страну, из которой прибыл …}
EntryDate,ExitDate:Date); {… даты въезда и выезда}
end;
Т.о. в зависимости от гражданства определено либо место рождения, либо страна, дата въезда и дата выезда.
К полям, указанным в вариантной части обращение производится точно так же, как и для фиксированной части. Для каждого варианта должен быть указан индивидуальный набор констант. Доступ к каждому варианту всегда разрешен вне зависимости от значения поля признака. Программа может использовать значение поля признака для определения, какой из вариантов является активным в данный момент. Если поле признака отсутствует, то определение должно происходить по другому критерию.
Для сокращения процесса обращения к полям записи служит оператор работы над записями.
Оператор_работы_над_записями::=
"with" ссылка {"," ссылка} "do" оператор
Ссылка::=ИД переменной типа запись или объект.
Внутри оператора позволяется манипулировать полями записи, ссылки на которые имеются в заголовке, без указания имени переменной типа запись.
Например:
var I: Date;
...
with I do begin
writeln("Год", Year);
writeln("Месяц", Month);
writeln("День", Day);
end;
...
Определение содержимого записи в разделе типированных констант.
Объявление константы типа запись содержит идентификатор и значение каждого поля, заключенное в скобки и разделенные точками с запятой.
Константа_запись::=
"(" ИД_поля ":" типированная_константа
{ ";" ИД_поля ":" типированная_константа } [";"] ")".
Например:
const Man:person=
(Name: 'Иванов Иван Иванович';
BirthDate: ( Year: 1970;
Month: 2;
Day: 23);
Citizen: true;
BirthPlace: 'Шадринск');
Jerry:Person=
(Name: 'Мышонок Джерри';
BirthDate: ( Year: 1970;
Month: 2;
Day: 23);
Citizen: false;
Country: 'США';
EntryDate: ( Year: 1990;
Month: 1;
Day: 1);
ExitDate: ( Year: 2090;
Month: 1;
Day: 1));