Pascal语言提供了数值型、字符型、布尔型等标准数据类型,可用于表示姓名、年龄、价格、数量、真假等数据。在现实世界中,有一些特殊的数据,例如人的性别“男”和“女”,一个星期的七天“星期一”到“星期日”,一年的四季“春”“夏”“秋”“冬”,某型号汽车可供选择的颜色“红”“黄”“蓝”“黑”等,每种数据都有一个确定的数值范围,并且其取值可以逐一列举出来,形成一个取值列表。为了在程序中表示这样的数据,我们可以用整型数据给取值列表中的每个值分配一个编号,例如,汽车颜色可以编号为:红=0,黄=1,蓝=2,黑=3,之后,在程序中用编号来代表实际的值;我们也可以使用字符串,例如,可以定义一个字符串变量,用Red、Yellow、Blue、Black这4个值来表示4种颜色。但是,以上两种做法都有缺陷。整型变量不够直观,无法形象地表明每个值的含义,而字符串又无法体现出确定的取值列表,也无法用于控制循环。
Pascal语言提供了枚举类型,专门用来表示这种类型的数据。“枚举”的意思就是“逐一列举”,我们将现实数据中的每一个取值定义成一个枚举值,并将这些枚举值排成一个有序的列表,就构成了一个枚举类型。枚举类型的变量可以取它所属类型的取值列表中的任意一个值。
一、枚举类型的定义
枚举类型的定义格式为:
type
枚举类型名=(枚举值1,枚举值2,枚举值3,…,枚举值n);
其中,枚举类型名和枚举值都应使用合法的标识符。
定义了枚举类型之后,就可以用枚举类型名来定义枚举变量了,其格式与定义普通变量的格式一样:
var
枚举变量名:枚举类型名;
例如:可以这样来定义汽车颜色类型和相应的枚举变量:
type
tcolor=(red,yellow,blue,black);
var
carcolor:tcolor;
其中,tcolor是我们定义的一种枚举类型,这种类型的数据可以取red、yellow、blue、black这4个值中的任意一个,正如integer类型数据可以取-32768到32767中任意一个一样;carcolor是一个tcolor类型的枚举变量。
定义枚举类型的另一种方法是直接定义枚举类型的变量,格式为:
var
枚举变量名:(枚举值1,枚举值2,枚举值3,…,枚举值n);
例如:
var
carcolor:(red,yellow,blue,black);
类似地,我们可以这样定义人的性别、一星期中的7天、一年中的四季:
type
tsex=(male,female);
tweekday=(mon,tue,wed,thu,fri,sat,sun);
tseason=(spring,summer,autumn,winter);
二、枚举类型的特点和用法
1、枚举类型是有序类型,枚举类型中的每个枚举值都有确定的序号。Pascal语言规定,枚举值的序号按照它们定义时的书写顺序从0开始排列。因此,在tcolor类型中,red的序号是0,即ord(red)的值是0,yellow的序号是1,blue的序号是2,black的序号是3。
可以用pred函数求枚举型数据的前趋,用succ函数求枚举型数据的后继,例如:
pred(yellow)的值为red,succ(blue)的值为black。
显然,枚举序列中的第一个枚举值没有前趋,最后一个枚举值没有后继,如果对第一个枚举值求前趋或对最后一个枚举值求后继,会产生越界错误。
2、枚举类型的变量可以进行赋值操作,例如:
carcolor:=yellow;
carcolor:=succ(blue);
3、枚举类型是有序类型,因此可以用作循环控制变量:
for carcolor:=red to black do write(ord(carcolor));
上述代码将依次显示4个枚举值的序号:0、1、2、3。
4、枚举类型可以用作case语句的选择表达式,例如:
case carcolor of
red: writeln('The car is red.');
yellow: writeln('The car is yellow.');
blue: writeln('The car is blue.');
black: writeln('The car is black.');
end;
5、枚举类型可以参加关系运算,构成关系表达式。枚举值的大小关系定义为它们的序号的大小关系,例如:
表达式red<yellow为真,因为ord(red)=0,ord(yellow)=1;
表达式red<=yellow为真;
表达式blue>black为假;
表达式red=blue为假;
6、枚举类型的数据不能直接进行输入输出操作,例如不能这样写:
readln(carcolor);
writeln(carcolor);
如果要通过键盘输入来为枚举变量赋值,可以这样写:
var
carcolor:(red,yellow,blue);
c:char;
begin
read(c);
case c of
'r': carcolor:=red;
'y': carcolor:=yellow;
'b': carcolor:=blue;
end;
end.
如果要向屏幕输出枚举类型的值,可以这样写:
case carcolor of
red: writeln('red');
yellow: writeln('yellow');
blue: writeln('blue');
end;
7、使用枚举类型时要注意以下几点:
枚举值只能是标识符,而不能是数值或字符串;例如下面的定义是错误的
type
days=('sun','mon','tue','wed','thu','fri','sat');
number=(1,2,3,4,5);
同一个枚举值标识符不能出现在多个枚举类型定义中;
不同类型的枚举值不能相互赋值或进行运算。
例1:一家水果店出售四种水果,每公斤价格是苹果1.5元,桔子1.4元,香蕉1.48元,菠萝1.08元。编写一个程序,使售货员只要在键盘上输入货品的代码及重量,计算机显示输出货品名、单位价、重量和总价。
const
priapple=1.5;
priorange=1.4;
pribanana=1.48;
pripineapple=1.08;
type
fruittype=(apple,orange,banana,pineapple);
var
code:integer;
weight:real;
fruit:fruittype;
begin
repeat
writeln('1.apple;2.orange;3.banana;4.pineapple;');
writeln('input code and weight:');
readln(code,weight);
until (weight>0) and ((code=1) or (code=2) or(code=3) or (code=4));
case code of
1: fruit:=apple;
2: fruit:=orange;
3: fruit:=banana;
4: fruit:=pineapple;
end;
case fruit of
apple: writeln('apple',priapple:6:2,'*',weight:6:2,'=',priapple*weight:8:2);
orange: writeln('orange',priorange:6:2,'*',weight:6:2,'=',priorange*weight:8:2);
banana: writeln('banana',pribanana:6:2,'*',weight:6:2,'=',pribanana*weight:8:2);
pineapple: writeln('pineapple',pripineapple:6:2,'*',weight:6:2,'=',pripineapple*weight:8:2);
end;
end.
例2:从红、黄、兰、白、黑五个球中任取三个球,求所有可能的颜色。
type
colour=(red,yellow,blue,white,black);
var
i,j,k,pri:colour;
loop,n:integer;
begin
n:=0;
for i:=red to black do
for j:=red to black do
if i<>j then
for k:=red to black do
if (k<>i) and (k<>j) then begin
n:=n+1;
write(n:4);
for loop:=1 to 3 do begin
case loop of
1: pri:=i;
2: pri:=j;
3: pri:=k;
end;
case pri of
red: write(' red');
yellow: write(' yellow');
blue: write(' blue');
white: write(' white');
black: write(' black');
end;
end;
writeln;
end;
writeln('TOTAL NUM: ',n);
end.
作业:
编写一个程序,从键盘读入今天是星期几,输出明天是星期几。