Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ещё одна методичка по ЛО.doc
Скачиваний:
18
Добавлен:
23.03.2016
Размер:
433.15 Кб
Скачать

2.2.2. Перечислимые типы

Простейший способ введения нового типа данных перечисление его значений, что и реализовано в перечислимых типах, которые описываются следующим образом:

type имя-типа is (значение1, значение2,... );

С новым типом связываются, конечно, операции сравнения на равенство (=) и неравенство (/=).

Кроме этого, во многих языках программирования можно выполнять и другие операции сравнения значений (<, >, <=, >=) по порядку их перечисления в определении типа, хотя это и не всегда соответствует смыслу типа данных. Например, для обработки типа данных

type АЛФАВИТ is (БУКВЫ, ЦИФРЫ, СПЕЦ СИМВ);

следует использовать только операции = и /=, так как никакой упорядоченности между значениями этого типа не должно быть. Поэтому в этом случае наличие операций сравнения снижает надежность. С другой стороны, для типа

type ДНИ_НЕДЕЛИ is (ПН, ВТ, СР, ЧТ, ПТ , СБ, ВС);

упорядоченность в соответствии с порядком перечисления значений соответствует общепринятой, поэтому здесь наличие операций сравнения вполне оправдано.

С перечислимыми типами связаны следующие атрибуты типа:

имя_типа' POS -- функция с одним параметром перечислимого типа, значением которой является порядковый номер значения параметра

имя_типа' VAL -- функция с одним параметром любого целого типа, значением которой является значение перечислимого типа, чьим порядковым номером является значение параметра

имя_типа'FIRST-- минимальное значение указанного типа

имя_типа'LAST -- максимальное значение указанного типа

имя_типа'SUCC -- функция с одним параметром перечислимого типа, значением которой является следующее по порядку значение этого перечислимого типа

имя_типа' PRED -- функция с одним параметром перечислимого типа, значением которой является предыдущее по порядку значение этого перечислимого типа ( вместо имени типа можно указывать имя переменной).

Если при вычислении этих атрибутов значение выходит за границу возможных значений, то возникает исключение CONSTRAINT_ERROR например:

ДНИ_НЕДЕЛИ' POS(ВТ) равно 2

ДНИ_НЕДЕЛИ' VAL(2) равно ВТ

ДНИ_НЕДЕЛИ' FIRST равно ПН

ДНИ_НЕДЕЛИ' SUCC(СР) равно ЧТ

ДНИ_НЕДЕЛИ' PRED(ЧТ) равно СР

Конечно, эти атрибуты можно использовать и для целых типов.

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

──────────────────

П р и м е р 2.4. Описание типа ДНИ_НЕДЕЛИ через

целый тип:

ПН: constant integer:= 1;

ВТ: constant integer:= 2;

СР: constant integer:= 3;

ЧТ: constant integer:= 4;

ПТ: constant integer:= 5;

СБ: constant integer:= 6;

ВС: constant integer:= 7;

type ДНИ_НЕДЕЛИ is integer range ПН.. ВС;

Множество значений типа включает числа от 1 до 7.

──────────

Недостатки этого подхода состоят в необходимости подробного выписывания значений, а главное, здесь отсутствует надежность, присущая настоящему перечислимому типу. Предположим, что тип МЕСЯЦ, аналогично типу ДНИ_НЕДЕЛИ из примера 2.4, определен целым в диапазоне от 1 до 12. Тогда, имея

М: МЕСЯЦ;

компилятор не может обнаружить ошибку в операторе

М:=СР;

так как целая константа СР обозначает только целое значение. Эту ошибку можно было бы обнаружить лишь тогда, когда описание констант было бы как-то связано с типом ДНИ НЕДЕЛИ.

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

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

type ЦВЕТ is (КРАСНЫЙ,ГОЛУБОЙ,БЕЛЫЙ, ЧЕРНЫЙ),

ЯЗЫК is (КРАСНЫЙ, ЗЕЛЕНЫЙ,ЖЕЛТЫЙ,ГОЛУБОЙ);

Именная эквивалентность типов обеспечивает решение этой проблемы, связывая перечисленные идентификаторы с указанным именем типа. В большинстве случаев по контексту можно определить, какой тип имеет константа КРАСНЫЙ. Но иногда тип придется указать явно с помощью функции преобразования типа,

например ЦВЕТ(КРАСНЫЙ).

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

Большинство языков программирования содержит предопределенный символьный тип, который может быть описан следующим образом:

type character is ( перечисление символов )

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

type ШЕСТН_ЦИФРЫ is

('0', ' 1', ' 2', '3', '4', '5', '6', '7', '8', '9',

'A','B','C','D','E','F').

Использование определяемых пользователем типов повышает надежность, мобильность и удобочитаемость программ.

Логический тип определяется следующим образом:

type boolean is (false, true);

Три стандартные логические операции применяются к операндам логического типа, давая в результате логическое значение: логическое дополнение (not), логическое И (and), логическое ИЛИ (or).

Операции сравнения значений всех рассмотренных ранее типов данных возвращают логические значения. Так. как логический тип перечислимый, то к нему также применимы операции сравнения. Операция сравнения на равенство реализует функцию логической эквивалентности, а операция сравнения на неравенство -- функцию Исключающее ИЛИ, операция <= исполняет функцию импликации.

Основное назначение логического типа состоит в реализации условий для условного оператора и оператора цикла.