枚 举 类 型
枚 举 类 型
用计算机来解决世界客观世界的问题时,需要用计算机程序中的量来描述客观世界的问题。但有些问题很难用标准类型来描述, 一个星期的七天、一年的十二个月、颜色的类别等。
为了说明这些非数值量的特征,Pascal语言提供了枚举类型,用枚举方法将该种类型的所有取值用标识符一一列出。如用“Monday”代表“星期一”,用“Tuesday”代表“星期二”,这种处理方度既简单又直观。用枚举的方法所定义的数据类型就称为枚举类型。
枚举类型是用户自定义类型,因此在程序的说明部分必须对类型进行定义,只有经过定义后,这种类型才能被使用。类型说明的关键字是Type,类型标识符由用户自己决定,原则上以字母开头,后面跟以字母或数字,但注意不要使用Pascal 保留字或标准标识符。
一、格式:
type
类型名=(标识符1,标识符2,…,标识符n);
var
变量名:枚举类型;
或:
var
变量名: (标识符1,标识符2,…,标识符n);
如以“daytype”表示有关日期的数据类型名,可定义如下:
Type
daytype=(sun,mon,tue,wed,thu,fri,sat);
Var
today,yestoday,tomorrow:daytype;
或:
Var
today,yestoday,tomorrow: (sun,mon,tue,wed,thu,fri,sat);
二、注意事项
1、枚举无素只能是标识符,不能是数值常量、字符常量等其他任何数据类型。枚举元素是标识符,但不能把作为枚举元素的标识符视作变量名,枚举值是不能被赋值的。如:sun:=0;
下面定义是错误的:
Type
Monthtype=(1,2,3,4,5,6,7,8,9,10,11,12); {错在把数值常量做枚举值}
Colortype=(‘red’,’yillow’,’blue’); {错在把字符串常量作为枚举值}
2、在一个程序中,同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。
下列定义是错误的:
Type
Color1=(red,yellow,blue,white);
Color2=(black,blue,green); {blue 出现在了两个枚举例型中}
3、枚举类型属于顺序类型
枚举类型定义中通过列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序是一致的,且序号从0开始。
如开始题例中枚举值sun的序号为0,枚举值mon的序号为1,依次类推,枚举值sat的序号值为6。同时,枚举值是可以由大小来区别的,关系式sun<tue的值是true。
也可以用序号函数求出枚举值的序号:
ord(sun)=0 ord(mon)=1
用succ和 pred函数可以求出枚举值的后继和前趋,(第一个元素没有前趋,最后一个元素没有后继):
succ(sun)=mon pred(sat)=fri
4、对枚举类型只能进行赋值运算和关系运算
如:
Var
d1,d2:(sun,non,tue,wed,thu,fri,sat);
c:(red,yellow,blue,white);
此时,在程序中允许出现以下语句:
d1:=sun;
d2:=fri;
c:=blue;
if d1=d2 then write(‘the same day’) else write(‘the different day’);
下列语句是错误的:
mon:=1; {把枚举值当成了变量名}
c:=sun; {枚举值sun不属于枚举型变量c的值域}
read(d1,d2,c);
write(d1,d2,c);
writeln(blue); {枚举类型的变量不能用read或readln语句进行读值,也不能通过write输出,最后一句,blue只是用标识符表示的一个符号,并不会被writeln输出}
5、枚举类型的应用
pascal不允许直接读写枚举值,所以枚举值的输入、输出常用case语句间接地输入、输出。枚举值的输入一般读入序号,通过case语句将枚举值相应地赋给枚举变量,输出时通过case语句判断枚举类型变量的值,输出相应的字符串。
例:输入今天是星期几的序号(星期天的序号为0),输出明天是星期几的英文单词。
program week(input,output);
type
daytype=(sun,mon,tue,wed,thu,fri,sat);
var
k:integer;
today,tomorrow:daytype;
begin
readln(k);
case k of
0 :today:=sun;
1 :today:=mon;
2 :today:=tue;
3 :today:=wed;
4 :today:=thu;
5 :today:=fri;
6 :today:=sat;
end; {case}
if today<>sat then tomorrow:=sun else tomorrow:=succ(today);
write(‘tomorrow is’);
case tomorrow of
sun :writeln(‘Sunday’);
mon:writeln (‘Monday’);
tue :writeln(‘Tuesday’);
wed:writeln(‘wednesday’);
thu: writeln(‘Thursday’);
fri :writeln(‘Friday’);
sat:writeln(‘Saturday’);
end; {case]
end.
运行:
输入 2
输出 tomorrow is wednesday
\\teacher2