Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 16.doc
Скачиваний:
17
Добавлен:
20.11.2019
Размер:
336.38 Кб
Скачать

16.2.1. Записи с вариантами

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

Фиксированная часть

Фамилия Имя Отчество

{автора}

Название

{книги}

Издательство

{его атрибуты}

Шифр

{библиотеки}

Состояние

(выдана, в фонде, в архиве)

Вариантная часть

Значение признака

выдана

в фонде

в архиве

Поля

вариантной

части

Фамилия И.О

№ {чит.билета}

Дата {выдачи}

адрес {хранения}

имя {хранения}

адрес {хранения}

дата {хранения}

Вариантная часть задается с помощью конструкции

case p of,

где p – имя поля из общей части записи. Возможные значения, принимаемые этим полем, перечисляются так же, как и в операторе варианта. Однако вместо указания выполняемого действия, как это делается в операторе варианта, указываются поля варианта, заключенные в круглые скобки. Описание вариантной части завершается служебным словом end.

Синтаксис вариантной части:

<вариантная часть >::= case <поле признака> <имя типа> of < вариант >{; <вариант>}

<вариант>::=<список меток варианта>:(<список полей>) | <пусто>

<список меток варианта>::=<метка варианта>{; <метка варианта>}

<метка варианта>::=<константа>

<поле признака>::=<имя>:<пусто>

Соответствующие синтаксические диаграммы:

Вариантная Часть

Поле признака Вариант

Описание типа записи в рассмотренном примере может иметь вид:

Пример 5.

Book = record

Author : FullName; {фиксированная часть}

BookName: String;

BookCode: Code;

Station : (Readed, inFile, inArchive);

case Station of {поле признака}

Readed: Reader : FullName; {вариантная часть}

ReadCode : Integer;

ReadDate : Date;

inFile: FilAdress : Adress;

inArc : ArcName : Srting;

ArcAdress: Adress

end

end;

В нашем примере на варианты указывает поле Station. В зависимости от значения этого поля запись имеет ту или иную структуру. Это частая ситуация. Обычно на вариант записи указы­вает одно из полей фиксированной части этой записи. Поэтому синтаксисом допускается сокра­щение: описание определяющей вариант компоненты, называемой полем признака (дискри­­минантом), включается в сам заголовок варианта. В нашем примере 5 это выглядит так:

Type BookStation = (Readed, inFile, inArc);

Book = record

 Author : FullName;

 BookName : String;

 BookCode : Code;

 case Station : BookStation of

Readed : Reader : FullName;

ReadCode : Integer;

ReadDate : Date;

inFile : FilAdress: Adress;

inArc : ArcName : String;

ArcAdress: Adress

end

end;

Все имена полей должны быть различными, даже если они встречаются в различных вари­антах. Например, Author, Reader – имена людей, а FilAdress и ArcAdress – адреса, указывающие на местонахождение книги на полках хранилища. В случае, когда один из вариантов не содержит вариантной части, он должен быть оформлен следующим образом:

EmptyVariant :( ) {EmptyVariant – метка пустого варианта}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]