自定义数据类型
Pascal语言允许用户按语法规则自己定义一些数据类型。
jq字符串转数组数据类型定义的一般形式为:
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型由加、减、乘、除四个成份组成。接下来的变
量说明中,today、holiday被说明为days类型,即这两个变量只能在组成days的七种成份中取值。f被说明为colors型,p1、p2、p3被说明为operator型。
枚举型的定义可以不预先在类型定义中定义类型标识符,而在说明中直接定义枚举类型,如上例中,可省去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或write语句直接读写。
如: read (p1);  或 write (p2);  都是错误的。
但枚举变量可以赋值,如:
f := blue;
p1:= plus;
p2:= p1;
4.枚举类型是有序类型,即在类型定义中列出的值是有序的。
它的序号从0开始,按自左至右,从小到大的顺序编排。如在days类型中,sun的序号为0,mon为1,……,satur为6。
因此枚举类型的量可以进行关系比较运算,如mon < wed 。
可用于枚举类型的标准函数有:pred、succ、ord。
如:  pred (green) = blue;  { green 的前驱元素为blue}
succ (red) = yellow;  {red的后继元素为yellow}
ord (Wed) = 3;  {Wed对应的序号为3}
【例1】取球问题
黑箱中有红、黄、蓝、白、黑五种颜的球(数量均有多个),现从箱中依次取三个球,求取出三种颜的球的所有可能。
思路分析:
我们穷举出所有的可能,从中输出符合条件的方案,并统计方案总数。
设每次取出的球依次为i,j,k,它们分别是五种球之一。当第2次取出的球与第1次取出的球颜不同时,才看第3次取出的球,若三次取出的球颜互不相同,则输出该方案。但枚举变量不能直接输出,我们利用case语句来输出“red”、“yellow”等字符串。为了避免重复写三个结构相似的case语句(分别用
来输出i、j、k),设一中间变量p来存放某一球的颜,循环三次,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  <;子界类型标识符> = <;下界> . . <;上界>;
其中下界必须小于等于上界,且属于同一有序类型的常量(可以是整型、布尔型、字符型、枚举型,但不能是实型)。
2.子界类型变量说明:
VAR  <;变量表> : <;子界类型标识符>;
例如:
type  month = 1 . . 12;
letter = ‘A’ . . ‘Z’;
var  m1 , m2 : month;
c1 , c2 , d1 , d2 : letter;
我们对子界类型变量(如m1,c1等)的赋值和运算必须在子界类型所定义的范围内,否则程序运行时会出错。
子界类型是有序的,其元素序号是该元素在宿主类型中的序号。如对枚举子界变量求序数,得到的是相应枚举型数据本身的序号;而字符子界变量的序数是对应的ASCII码(十进制数)。
【例2】字符判别。
输入一字符,判别属于数字、大写字符、小写字符或其它字符。
Program  zf;
var  c : char;
begin
readln (c);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。