ОБЪЕДИНЕНИЕ (ЗАПИСЬ С ВАРИАНТАМИ)

Меняю двухкомнатную квартиру на две однокомнатные. Возможны варианты.

Газетное объявление

Понятие записи допускает удобное и естественное расширение в том случае, когда в пределах одной записи требуется иметь различную информацию в зависимости от некоторого параметра (например, таким параметром может служить значение того или иного поля записи).

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

type

жи вотно t-record

название: string[30]

ареал: (Европа, Азия, Африка, Америка, Австралия);

класс: (млекопитающее, птица, рыба); жизнь: byte

end,

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

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

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

В нашем примере запись с вариантами может быть, например, такой:

type

класс=(млекопитающее, птица, рыба); страна=(Россия, Англия, США, Франция, Польша, Египет, Индия); животно e=record

название: string[30;

ареал: (Европа, Азия, Африка, Америка, Австралия); жизнь: byte, case класс of

млекопитающее: (детеныши: 1..30; способ питания: (травоядное, хищное)); птица: (зимовка: страна; полет: Boolean)-, рыба: (промысел: Boolean);

end;

В языке Паскаль вариантная часть начинается со служебного слова case, затем идут определение поля — признака выбора и служебное слово of. Заканчивается вариантная часть вместе с завершением описания всей записи служебным словом end. Это, в частности, означает, что в определении записи может быть только одна вариантная часть, причем она задается в конце записи.

Альтернативы выбора помечаются допустимыми значениями поля-признака (его называют дискриминантом записи), а его определение помещается в заголовке вариантной части.

Таким образом, записи с вариантами — это весьма удобный и гибкий инструмент представления информации, структура которой частично различается. Это тем более верно, что любой вариант, в свою очередь, может иметь свою вариантную часть. Тем не менее необходимо пользоваться этим инструментом с осторожностью, так как контроль правильности работы с вариантами целиком возложен на программиста, а доступ ко всем полям возможен при любом значении дискриминанта. Это означает, что, например, оператор окунь.полет=1гие будет выполнен и ошибка не будет зафиксирована.

Для представления сведений об отдельных категориях обобщенного объекта используется набор атрибутов (признаков), соответствующий именно данной категории. Если после объединения сохраняется возможность определения принадлежности обобщенного объекта каждой категории, такое объединение называют размеченным. Удобно ввести единичные (не наборы) признаки принадлежности объединяемым множествам.

Тогда, если Г,, Т2, ... , Тп типы данных объединяемых множеств, то объединение Т типов определяется так:

type

Т = union

hТ

t2: Т2 ;

К : Тп

end;

Г,, Т2, ..., Тп будем называть компонентами Т.

Например, в декартовой системе координат на плоскости точка определяется парой (х, у). Однако в некоторых случаях применяются полярные координаты, где точке соответствует радиус г — расстояние от центра и угол ср.

Если данные существуют (например, поступают от измерительных приборов) в двух системах координат, то можно определить тип координаты как объединение типов декартовы и полярные и задать следующее определение обобщенного типа:

type

координаты = union;

декартовы: record; х, у: real; end;

полярные: record; г. real;

<р: угол; end;

end;

Оператор варианта. Если при объединении d = tt, : d{, то способ обработки d (т.е. d,) зависит от значения признака tr Иными словами, для обработки d необходимо вычислить признак ti и соответственно ему обработать значение dr Это делается так: var х Т; with х do

statementХ(х) t2: statement2(x)

end;

Другими словами, проверяется значение признака х: если оно равно то выбирается и выполняется оператор statement(х).

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >