Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на ПАСКАЛЕ.doc
Скачиваний:
12
Добавлен:
04.09.2019
Размер:
2.98 Mб
Скачать

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

Записи, описанные ранее, – это записи с фиксированными частями. Они имеют в различных ситуациях строго определенную структуру. Однако бывают ситуации, когда нужно отказаться от этой строгой определенности. Поэтому появляются записи с вариантами.

Рассмотрим пример создания программ для введения списка библиографических ссылок. Например, научные работы могут быть оформлены в виде монографий, т.е. книг, а могут быть и журнальные публикации. Если известно, что все публикации есть книги, то это можно задать в виде следующего описания:

const MAXNOMBRE = ...

type ENTRY = record

AUTOR, TITLE, PUBLISHER, SITY : STRING [100];

YEAR : 1..9999;

end;

var REFLIST : array [1..MAXNOMBRE] of ENTRY;

Здесь ENTRY – вход, т.е. данные о какой-либо научной работе. Если же некоторые работы входят в журналы, то нужно создавать новый массив данных только для журналов и работать с этими двумя массивами, что не очень удобно. В Паскале есть возможность образовать структуру с вариантами, каждый вход которой соответствует содержанию записи. Это достигается путем введения в описание записи специального оператора CASE – переключателя, который в чем-то похож на ранее введенный, но имеет свои синтаксические и семантические отличия.

В нашем примере помимо описанного уже типа ENTRY вводим еще один переменный тип:

ENTRYTYPE = (BOOK, MAGAZINE).

Теперь можно скорректировать раннюю запись:

type ENTRY = record

AUTOR, TITLE : string [100];

YEAR : 1..9999;

case TAG : ENTRYTYPE of

BOOK : (PUBLISHER, SITY : STRING [100]);

MAGAZINE : (MAGNAME : STRING; VOLUME, ISSUE : integer)

END;

Это описание делится на две части: фиксированную и вариантную. Поля AUTOR, TITLE и YEAR – фиксированная часть. Остальная часть – вариантная, структура которой может меняться в пределах двух вариантов. Вариантная часть записи начинается со строки CASE, где в качестве селектора выступает не выражение, а идентификатор некоторого перечислимого типа. Элементы (компоненты) этого перечислимого типа (в нашем случае ENTRYTYPE) используются в качестве альтернативного определения записи: BOOK и MAGAZINE. В каждой альтернативе имеется свой набор полей:

BOOK: MAGAZINE:

AUTOR AUTOR

TITLE TITLE

YEAR YEAR

PUBLISHER MAGNAME

CITY VOLUME

ISSUE

Для того чтобы различать, какую из ветвей нужно выбрать для работы, в такую запись вводится так называемое поле ТЕГА (tag fild), или узловое поле. Это дополнительное поле с именем TAG имеет тип ENTRYTYPE и помещается в качестве селектора в оператор CASE-OF:

ENTRY = record

AUT, TIT : string [100];

YEAR : 1..9999;

case TAG : ENTRYTYPE of

BOOK : (PUB, CYTY : string [100]);

MAGAZINE : (MAGNAME : string [100]; VOL, ISSU : integer);

end;

Здесь поле с именем TAG имеет тип ENTRYTYPE и принимает два значения. Если это поле имеет значение BOOK, то это ссылка на книгу, в противном случае – на журнал. Для определения составления записи с вариантами достаточно проверить значение поля TAG.

П р и м е р. Процедура печати значений записей типа ENTRY.

procedure PRINTREF (CITATION : ENTRY);

begin

with CITATION do begin

writeln (AUTOR); writeln (TITLE); writeln (YEAR);

if TAG = BOOK then

writeln (PUB,',',CITY)

else

begin writeln (MAGNAME);

writeln (VOL,',',ISSUE)

end;

end;

end;

Примечания.

1. Вариантная часть может содержать произвольное число аргументов, которые задействуются или перечислимыми типами, или произвольными порядковыми типами (интервалами).

2. Любая запись имеет только одну вариантную часть, которая должна всегда располагаться в конце описания, поэтому END оператора CASE совпадает с END всего описания.

3. Имя поля не может встречаться в двух вариантах одной записи.

4. В вариантной части могут встречаться другие новые вариантные части.