枚 举 类 型

枚 举 类 型

用计算机来解决世界客观世界的问题时,需要用计算机程序中的量来描述客观世界的问题。但有些问题很难用标准类型来描述, 一个星期的七天、一年的十二个月、颜色的类别等。

为了说明这些非数值量的特征,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);       {枚举类型的变量不能用readreadln语句进行读值,也不能通过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

转载于:https://www.cnblogs.com/lj_cherish/archive/2010/10/11/1848256.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值