枚举类型和子界类型

枚举类型和子界类型

 一、类型定义

二、枚举型

 三、子界型

 四、类型相容和赋值相容

一、类型定义
  
1、类型定义的语法图
  类型定义的语法格式:

  type
  <标识符1>=<类型1>;
  <标识符2>=<类型2>;
  ……
  <标识符n>=<类型n>;

   2、格式说明:Type是保留字类型定义符。类型名必须遵循标识符的起名规则,“=”右边的类型就是用户描述的数据类型。执行此语句后我们就可以用“=”左边的标识符代表右边的集合了。

  用户自定义类型就是用户遵循pascal语言规则结合用户需要自己定义新的类型。前面的标准类型,系统已经定义好了,我们可以直接使用它说明变量,使用此类数据。而用户自定义类型要先定义类型,才能说明变量,使用此类数据。用户自定义类型有两类:枚举类型和子界类型。

二、枚举类型
 
 在程序设计中,程序员常常会发现用4种标准类型很难自然地描述所要处理的某种数据。例如,表示星期几,在程序设计中,我们一般用整型数0、1、2、3、4、5、6表示不是很直观,1既可表示数值1,又可以表示星期一,阅读者要根据实际情况进行区分。在pascal中提供了形象表示这类数据的类型既枚举类型。
  枚举类型顾名思义就是将需要的数据一一枚举出来,组成一个类型。

枚举类型的形式:(标识符1,……,标识符n);

  例如:

type

daystype=(sunday,monday,tuesday,wednesday,thursday,friday,saturday);

  枚举元素只能是标识符,而不能是数值常量或字符常量。例如以下的定义是错误的:

  type daystype=('sun','mon','tue','wed','thu','fri','sat');

  枚举元素是标识符,不要把作为枚举元素的标识符视作变量名,它不能被赋值。同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。例如以下的定义是错误的:

   type daytype1=(monday,tuesday);
        daytype2=(monday,wednesday);

  可以将枚举类型的定义和变量的定义结合在一起。例如:

var    a:(monday,tuesday,sunday)

  枚举类型属于顺序类型。根据定义类型时各枚举元素的排列顺序确定它们的序列,序列号从0开始

  例如:已经定义daystype


   ord(sunday)=0,succ(sunday)=monday,pred(friday)=Thursday;

  但是枚举类型中的第一个元素没有前趋,最后一个元素没有后继。Pascal不允许直接读写枚举值,所以枚举值的输出常用case语句间接的输出。枚举值的输入,则要一一判断读入字符是否是枚举类型的标识符。若是才能赋给枚举变量,否则就会出错。

  例如:枚举值的输出

  case day of
  sunday:write('sunday');
  monday:write('monday');
  tuesday:write('tuesday');
  wednesday:write('wednesday');
  thursday:write('thursday');
  friday:write('friday');
  saturday:write('saturday');
 end;

三、子界类型

  子界类型是由整型、字符型、枚举型、布尔型的两个常量指定该类型的值域区间。子界类型的形式:

    常量1..常量n

两个常量必须是同一种顺序类型。例如:a..b,要求a<=b

  例如:

   type

a=1..3;
         b='a'..'d';

   一个子界类型继承它的常量类型的运算符和标准函数,常量类型相容的不同子界类型可以混合运算,可以赋值。可以将子界类型的定义和变量的定义结合在一起。例如:

var a:1..9;

 例 按月、日、年顺序读入一日期,输出该日期是这一年中的第几天

 program date;
  var year:0..2010;
    month,i:1..12;
    day:1..31;
    dayth:integer;
 begin
  read(month,day,year);
  dayth:=0;
  for i:=1 to month-1 do
   case i of
    1,3,5,7,8,10,12:dayth:=dayth+31;
    2:if ((year mod 4=0)and(year mod 100<>0)or(year mod 400 =0)
     then dayth:=dayth+29
     else dayth=:=dayth+28;
    4,6,9,11:dayth:=dayth+30;
   end;
  dayth:=dayth+day;
  writeln(dayth)
 end.

四、类型相容和赋值相容

  
1.类型相容性

  类型相容是对参加同一运算的两个对象的类型要求。设有两个变量,如果满足下列条件之一,就说这两个变量的类型相容。

  (1)两个变量的类型相同
     a.两个变量被同一类型说明。

      例如:var a,b:1..30;

     b.两个变量的类型是同一类型标识符。

      例如:var a:1..30; b:1..30;
     c.两个变量的类型是不同的类型标识符,但在类型定义中已经说明两个标识符相同。

      例如:type  date=1..100;

  range=date;
            var  m:data;n:range;
  

(2)一个变量的类型是另一个变量的子界。
  (3)两个变量的类型都是同一基类型的子界。
  (4)两个变量的类型是基类型相容的集合类型。
  (5)两个变量的类型是成分相同的串类型。

  2.赋值相容性

  赋值相容是对赋值操作的两个对象的类型要求。设赋值语句“:=”左边的变量类型为T,右边表达式的类型为E,若类型T和类型E满足下列条件之一,则称他们是赋值相容的。

  (1)T和E是相同的类型,而且类型不是文件类型,也不是具有文件类成分的构造类型。
  (2)T是实型,而E是整型或整型的子界。
  (3)T和E是类型相容的顺序类型,并且E的值不超出T所定义的值的范围
  (4)T和E是类型相容的集合类型,并且E的值不超出T所定义的值的范围
  (5)T和E是类型相容的串类型。

  当T和E是顺序类型或都是集合类型时,不仅要求这两个类型是相容的,而且要求E的值不超出T所定义的值的范围;否则将产生类型溢出,而这种错误只能在你运行程序时进行检查,因此你必须要避免不发生这种错误。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值