Перечислимые типы
Часто возникает ситуация когда необходим небольшой набор значений, где каждое значение имеет мнемоническое имя. Вместо использования символьных констант, Паскаль-программисты могут использовать произвольные идентификаторы для обозначения таких констант.
Любой список идентификаторов Паскаля может быть описан как тип данных с одним ограничением, что в данной области видимости каждый идентификатор появится не чаще одного раза. Например, объявления:
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.