- •Тема 16. Структурированные типы данных
- •16.1. Строки и средства их обработки
- •16.1.1. Процедуры и функции типа String
- •16.2. Записи
- •16.2.1. Записи с вариантами
- •16.2.2. Оператор присоединения
- •16.3. Множества
- •16.4.Файлы
- •16.4.1. Текстовые файлы
- •16.4.2. Компонентные файлы
- •16.4.3. Бестиповые файлы
- •16.4.4. Последовательный и прямой доступ
- •16.4.5. Основные задачи обработки файлов
- •16.4.6. Сортировка файлов
- •16.4.7. Задача корректировки файла
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 – метка пустого варианта}