§4 自定义数据类型
Pascal语言允许用户按语法规则自己定义一些数据类型。数据类型定义的一般形式为:
TYPE <类型标识符> = <类型>;
§4.1 枚举类型
在程序设计中常用到一些非数值的数据,如:月份、星期、颜色、科目等。在程序中直接用自然语言来代表这些数据,将使程序易读易理解。
枚举类型是用户自定义类型,值。
1.枚举类型定义的一般形式为:
TYPE <类型标识符> = (标识符表);
其中标识符表是一串用逗号隔开的标识符,它列举了枚举类型所有可取的值。2.上面仅仅是类型的定义,使用枚举类型的变量还需进行类型说明: VAR <
变量名> : <类型标识符>;
用户能够直接用标识符来依次列举枚举类型的每一种可取
例如: type days = (sun , mon , tue , wed , thur , fri , satur); colors = (red , yellow , blue , green , black , white); operator = (plus , minus , times , divide)
var today , holiday : days; f : colors;
p1 , p2 , p3 : operator; 上例中,首先进行类型定义,
days定义了一星期中的各天,由星期日、一、二、…、
六共七各成份组成;命名为colors的枚举类型由红、黄、蓝、绿、黑、白六种颜色;operator型由加、减、乘、除四个成份组成。接下来的变量说明中,类型,即这两个变量只能在组成p3被说明为operator
型。
days的七种成份中取值。
today、holiday
被说明为days
f被说明为colors型,p1、p2、
枚举型的定义可以不预先在类型定义中定义类型标识符,而在说明中直接定义枚举类型,如上例中,可省去
type类型定义,将变量说明改为:
var p1 , p2 , p3 : (plus , minus , times , divide) 【注意】
①每个枚举类型所允许的枚举值,必须全部列在其后的括号中;
②枚举值只能是标识符(单个字符或以字母开头的字母数字组合);
③每个枚举值只能出现在一个枚举类型定义中,并且只能在该定义中出现一次;④枚举变量只能在该枚举类型定义的值中取,即变量的取值受变量的类型限制;如下列枚举类型定义都是错误:
type
zm = (‘a’ , ‘b’ , ‘c’ , ‘d’ ); sz = ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 );
t1 = (sum , mon , tue , wed , sun ); t2 = ( wed , thu , fri , sat ); 3.枚举类型的变量不能用
如: read (p1);
③
②
②
read或write语句直接读写。或 write (p2);
都是错误的。
但枚举变量可以赋值,如: f := blue; p1:= plus; p2:= p1;
4.枚举类型是有序类型,即在类型定义中列出的值是有序的。
它的序号从0开始,按自左至右,从小到大的顺序编排。如在号为0,mon为1,……,satur为6。
因此枚举类型的量可以进行关系比较运算,如可用于枚举类型的标准函数有:
mon < wed 。
days类型中, sun的序
pred、succ、ord。
的前驱元素为的后继元素为
对应的序号为
3}
blue}
如: pred (green) = blue; { green succ (red) = yellow; {red ord (Wed) = 3; {Wed【例1】取球问题
yellow}
黑箱中有红、黄、蓝、白、黑五种颜色的球(数量均有多个)求取出三种颜色的球的所有可能。思路分析:
,现从箱中依次取三个球,
我们穷举出所有的可能,从中输出符合条件的方案,并统计方案总数。设每次取出的球依次为次取出的球颜色不同时,
i,j,k,它们分别是五种色球之一。当第
2次取出的球与第
则输出该方
1
才看第3次取出的球,若三次取出的球颜色互不相同,
案。但枚举变量不能直接输出,我们利用了避免重复写三个结构相似的
case语句来输出“red”、“yellow”等字符串。为
i、j、k),设一中间变量
p来存放
case语句(分别用来输出
某一球的颜色,循环三次,p依次代表i、j、k的颜色,每次根据p值来输出相应的字符串。
program type
color = ( red , yellow , blue , while , black );
var
i , j , k , pri : clolor; loop , n : integer; begin n:=0;
for i := red to black do {列举第1次取球的所有可能
}
for j := red to black do {
列举第2次取球的所有可能
}
if (i<>j) then
for k:=red to black do {
列举第3次取球的所有可能
}
if (k<>i) and (k<>j) then begin
n:=n+1;
write(n ,
’ :
’);
for loop :=1 to 3 do begin
case loop of
1 : pri:=i; 2 : pri:=j; 3 : pri:=k; end; case pri of {
根据pri的值输出对应字符串
}
red : write (‘red’) ;yellow : write (‘yellow’);blue
: write (
‘blue’);white : write (‘white’);black : write (‘black’);
end; end; {for} writeln;
end; {if} writeln (‘total: ’,n); {
输出方案总数}
end.
§4.2 子界类型
Pascal语言允许说明变量的范围,通过定义子界类型来限定数据的取值范围。.子界类型定义的一般形式为:子界类型标识符> = <下界> . . <
上界>;
其中下界必须小于等于上界,且属于同一有序类型的常量(可以是整型、布尔型、字
1 TYPE <