Прежде чем описывать перечисляемый тип данных, рассмотрим способы задания допустимых значений для ординальных типов byte, char и boolean.
В типе byte допустимыми значениями являются числа 0, 1, ..., 255; в типе char - символы таблицы ASCII с номерами #0, #1, ..., #255. Внутримашинным представлением типа char являются однобайтные числа от 0 до 255, т.е. на машинном уровне значения типов byte и char ничем друг от друга не отличаются.
Допустимыми значениями типа boolean являются предописанные слова false и true, причем считается, что false < true. Внутримашинным представлением этих слов являются числа 0 и 1 длиной один байт.
Следовательно, значениями типа byte на уровне Паскаль-программы являются числовые константы, типа char - символьные константы, а типа boolean - имена логических констант. Другими словами, типу boolean ставятся в соответствие имена констант, а типам byte и char - значения констант. На машинном уровне всем им соответствуют однобайтные числа.
Способ, аналогичный по отношению к типу boolean, когда допустимый набор значений определяется путем перечисления имен констант, используется в перечисляемом типе данных для объявления новых ординальных типов.
Перечисляемый тип задает упорядоченное множество значений путем перечисления имен констант, которые обозначают эти значения.
Синтаксическая диаграмма:
Пример 1.
Type Color = (White,Red,Blue,Yellow,Green,Gray,
Orange,Brown,Black);
Operator = (Plus,Minus,Times,Divide);
Metall = (Fe,Cu,Al,Sn,Pb,Ni,Mo,Zn,Ag,Au,Pt,Na);
На машинном уровне константы White, Red, ..., Black имеют значения 0, 1, ... , 8, константы Plus .. Divide - значения 0 .. 3, константы Fe .. Na - значения 0 .. 11 .
Если мы объявим
Var R,C : Color;
то переменные R и C могут принимать в программе лишь одно из перечисленных в разделе Typeзначений. Например:
C:=Blue; R:=Black.
Это в основном аналогично следующему:
Const White = 0; Red = 1;
Blue = 2; Yellow = 3;
Green = 4; Gray = 5;
Orange = 6; Brown = 7;
Black = 8;
VarR,C : byte;
Begin C:=Blue; R:=Black .
Другими словами, значения перечисляемого типа - это синонимы констант.
В последнем примере можно было бы написать
C:=2; R:=8.
В предыдущем примере это считалось бы ошибкой.
Неверные определения:
TypeWeek = (Mon,Tue,Wed,Thu,Fri,Sat,Sun);
FreeDay = (Sat,Sun);
Здесь одна и та же константа с именем Sat должна иметь в программе различные значения (на машинном уровне 5 и 0); такое же замечание относится к константе Sun.
Это аналогично тому, что было бы в разделе констант при таком объявлении:
Const Sat = 5;
Sat = 0;
Тип boolean также можно объявить перечисляемым:
Type boolean = (false,true) .
Следовательно, false и true - это имена констант, но они предопределены в Паскаль-программе.
Ко всем перечисляемым типам применимы операции отношения, а также предописанные функции pred, succ, ord.
Пример 2.
false < true
Plus >= Minus
pred(Blue) = Red
ord(Blue) = 2
Могут быть операторы вида
For c:=White to Black do S .
Это эквивалентно операторам
For i:=ord(White) to ord(Black) do S
или
Fori:=0 to6 do S .
Здесь S - произвольный оператор.
Как уже было отмечено, между значениями перечисляемого типа и порядковыми номерами этих значений установлено однозначное соответствие: первое значение в списке получает порядковый номер 0, второе - 1 и т.д. Максимальная мощность перечисляемого типа - 256 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа byte.
Пусть нам заданы следующие типы:
TypeColors = (Black,Red,White);
Ordinal =(One,Two,Three);
Days = (Monday,Tuesday,Wednesday);
С точки зрения мощности и внутреннего представления все три типа эквивалентны:
ord(Black)=0; ord(Red)=1; ord(White)=2;
ord(One)=0; ord(Two)=1; ord(Three)=2;
ord(Monday)=0; ord(Tuesday)=1; ord(Wednesday)=2.
Однако, если определены переменные
VarCol : Colors;
Num : Ordinal;
Day : Days;
то допустимы операторы
Col:=Black; Num:=Two; Day:=Wednesday;
но недопустимы
Col:=One; Num:=Tuesday; Day:=White.
Применение перечисляемых типов делает программу более наглядной и одновременно повышает ее надежность, так как можно контролировать значения, которые получают переменные перечисляемых типов в процессе выполнения программы (частный случай контроля ординальных типов с помощью директивы компилятора R).
Непосредственно вводить и выводить значения переменных перечисляемого типа нельзя. Это связано с тем, что в машинной программе отсутствует связь между именем перечисляемой константы и ее численным значением (в машинной программе значения перечисляемых переменных - это числа, в Паскаль-программе - имена констант). Однако ввод указанного типа переменных возможен, если использовать аппарат приведения типов переменных. Вывод также можно организовать косвенным образом.