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

 

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

 

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

TYPE

DayOfWeek = (Monday, Tuesday, Wednesday, Thursday,

Friday, Saturday, Sunday);

VAR

Day : DayOfWeek;

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

Monday < Tuesday < ... < Sunday

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

IF Day < Saturday

THEN {не weekend}

...

В объявлении:

TYPE

DayOfWeek = (Sunday, Monday, Tuesday, Wednesday, Thursday,

Friday, Saturday);

WeekEndDay = (Saturday, Sunday); {недопустимо}

VAR

Friday : CHAR; {недопустимо}

идентификаторы типа WeekEndDay и переменная Friday являются недопустимыми дубликатами идентификаторов Friday, Saturday и Sunday, которые ранее появились в объявлении типа DayOfWeek. То есть идентификаторы должны быть уникальными для всех их возможных вариантов использования в качестве имен типов, переменных, процедур, или констант в перечислимом типе.

Перечислимые типы являются “суперсимволами” Паскаля. Они могут быть использованы также как и обычные символы Паскаля и к ним применимы те же операции, но программист может изобрести любое их количество, желательно, чтобы идентификаторы соответствовали значению. Ранее мы использовали для таких целей символьные константы, но перечислимые типы лучше. Например, вместо возвращения значений Y или N для обозначения успеха, может быть использован перечислимый тип с идентификаторами Yes и No или даже Success и Failure.

Поскольку буквы алфавита идентификаторы, они могут быть использованы для задания типа данных:

 

TYPE

Alphabet = (A, B, C, D, E, F, G, H, I, J, K, L, M,

N, O, P, Q, R, S, T, U, V, W, X, Y, Z);

VAR

Letter: Alphabet;

Что позволяет следующие выражения:

IF Letter = A

THEN

Letter := E;

но при этом недопустимо:

IF Letter = ‘A’

THEN

Letter := ‘E’;

Поскольку A и E – константы типа Alphabet и соответствуют типу Letter, но ‘A’ и ‘E’ типа CHAR и это другой тип, чем у Letter.

 

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

Apr, Aug, Dec, Feb, Jan, Jul, Jun, Mar, May, Nov, Oct, Sep

который бесполезен в календарном смысле. Однако следующий перечислимы тип:

TYPE

Month = (Jan, Feb, Mar, Apr, May, Jun,

Jul, Aug, Sep, Oct, Nov, Dec);

Предоставляет автоматически способ сравнения значений переменных в соотвествии с календарем, если они заданы типом Month.