Запись в ТР является одним из самых общих и структурированных типов. Запись состоит из фиксированного числа компонент (полей), которые могут быть различных типов.

тип_запись::= "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));

<- Предыдущая страница | Следующая страница ->
Последнее изменение: Вторник 1 Март 2011, 17:10