Очень часто в программах целое число используется не в качестве арифметической величины, а как указатель некоторого элемента сравнительно небольшого множества. В таких случаях в описании программы обычно приводится список всех возможных значений вместе с указанием предполагаемой интерпретацией каждого значения. Такую величину можно рассматривать как элемент специального типа, который в языке Паскаль называется перечисляемым типом данных. Перечисляемый тип определяется как упорядоченный набор идентификаторов, заданный путем их перечисления.
Пример. Type Colour = (Red , Orange , Green) ;
Перечисляемый тип задается списком значений (объектов), которые могут принимать переменные этого типа. При этом каждый объект есть имя. Перечислимый тип задается самим программистом, в зависимости от того, какую задачу он решает.
Перечислимый тип состоит из списка констант. Переменные этого типа могут принимать значения любой из этих констант. Числа, логические и символьные константы не могут являться объектами перечислимых типов. Применение перечислимого типа повышает наглядность программы и дает возможность автоматически контролировать допустимость значений переменных.
Язык Паскаль представляет программисту широкие возможности для задания дополнительных типов, характеристики которых программист может определить самостоятельно. Новые типы описываются в специальном разделе типов или определяются непосредственно при описании переменных.
Описание перечисляемого типа имеет вид:
Type Имя типа = (Список констант);
Var : Имя переменной: имя типа;
Здесь под константой понимается особый вид констант - констант, задаваемых пользователем. Под списком понимается перечень констант, разделенных запятыми. Сам список заключается в круглые скобки .
В общем виде:
Type T = (A1, A2,...,An);
Пример. Type Year = (Winter , Spring , Summer , Autumn);
Var A:Year;
Здесь Year - имя перечисляемого типа:
Зима, Весна, Лето, Осень - константы;
A - переменная, которая может принимать значение любой из констант.
Объект, указанный в списке ,может присутствовать только в одном описании.
Пример. Type T1 = (One , two , three);
T2 = (Tree , four , five);
Эти два задания типов несовместимы.
Имена объектов, указанных в описании перечисленного типа, являются константами этого типа. В языке Паскаль допускается указывать константы перечислимого типа непосредственно в разделе переменных без использования раздела Type.
Пример. Var A: (Winter , Sprihg , Summer , Autumn);
Но лучше использовать описание данных с использованием раздела Type.
Нельзя присваивать переменной одного типа значения из имени другого типа.
Пример .
Type Name =(Jon , Tom , Nick) ;
Color =(Red , Blue , Black);
Var X , Y , Z : Name ;
C1 , C2 : Color ;
Каждая из констант имеет порядковый номер, счет начинается с нуля. Упорядоченность констант позволяет применять к ним операции отношения (сравнения): < ,<= ,= , <>, >, >=. Результат операции будет логического типа (Type , False). Winter < Spring < Summer < Autumn (Зима < Весна< Лето< Осень)
Свойства перечисляемого типа:
1) Ai <> Aj, если i ><j (различимость).
2) Ai < Aj, если i < j (упорядоченность).
3) Значениями типа Т могут быть только А1, А2, ... Аn.
Упорядоченность определяется той последовательностью, в которой перечислены константные идентификаторы. Наличие упорядоченности позволяет применить стандартные функции:
Ord (x) - нахождение порядкового номера,
Pred (x) - нахождение предыдущего элемента,
Succ (x) - нахождение последующего элемента.
Succ (Ai) = Ai +1 для i= 1,2,...n-1 - последующий член .
Pred (Ai) = Ai- 1 для i = 1,2,3...n - предыдущий член .
Ord (Ai) = i -1 - функция определения порядкового номера Аi. Нумерация условно начинается с нуля.
Пример.
Имеется перечень зверей: лиса, волк, заяц, зубр, тигр, лев, медведь, косуля, олень, барс. Определить порядковый номер тигра (N1) и порядковый № зверя после косули (N2)
Program Zver;
Type Zver = (lisa,volk,zaiac,zubr,tigr,lev,medved,kosulia,olen,bars);
Var P1,P2: Zver;
N1,N2 : Integer;
Begin
P1 : = tigr;
P2 : = Succ (kosulia);
N1 : = Ord(P1)+1;
N2 : = Ord(P2)+1;
Writeln (‘N1 = ‘, N1:2);
writeln (‘N2 = ‘, N2 : 2);
End.
Так как счет перечислимых начинается с нуля, а не с единицы, для вычисления порядкового номера необходимо прибавить единицу.
Пример. Некто по средам и пятницам учится, в остальные будние дни работает. Составить программу, распечатывающую эти занятия последовательно по дням недели.
Program Den;
Type Week = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
Var Day: Week;
Begin
For Day : = Monday To Sunday Do
If (Day : = (Wednesday) Or (Day = Friday)
Then Writeln (‘Study’)
Else If (Day : = (Saturday) Or (Day = Sunday)
Then Writeln (‘Nothing’)
else Writeln (‘Work’)
End.
Результат будет такой: Work
Work
Study
Work
Study
Nothing
Nothing
В языке Paskal нельзя вводить и выводить данные перечислимого типа с помощью операторов Read и Write.