第6章自定义类型 本章要点: 区枚举类型的定义及使用 回子界类型的定义及使用 区集合类型的定义及使用 区记录类型的定义及使用 区面向对象程序设计
本章要点: 枚举类型的定义及使用 子界类型的定义及使用 集合类型的定义及使用 记录类型的定义及使用 面向对象程序设计 第6章 自定义类型
61枚举类型 Object Pasca有五种标准数据类型:整型( Integer)、实型 (Rea)、字符型( Character)、字符串型( String)和布尔型 ( Boolean)。这些数据类型无需声明,即可在程序中直接使用。为了满 足用户的需要, Object Pascal还允许用户使用自定义的数据类型。自定 义的数据类型,属于高级数据类型 Object Pascal高级数据类型在使用之前必须首先使用类型定义语句 进行定义。经过定义后的高级数据类型就可在程序代码中使用。其用法 与常用的整型、字符串型用法相同。 常用的高级数据类型有枚举类型、子界类型、集合类型及记录类型 6.1.1枚举类型的定义 在处理实际问题过程中常用到的数据取值可能总是有限的几个值, 例如学生成绩等级有优秀、良好、及格、不及格;处理这一类数据时 可以用数值或字符串来表示,比如用“1”表示优秀,“2”表示良好。利 用数值表示此类数据不直观,容易出错,利用字符串表示不方便处理, 占用内存较多。为此, Object Pascal提供了枚举类型用于处理这一类 数据。 Inprise Dephi
6.1 枚举类型 Object Pascal有五种标准数据类型:整型(Integer)、实型 (Real)、字符型(Character)、字符串型(String)和布尔型 (Boolean)。这些数据类型无需声明,即可在程序中直接使用。为了满 足用户的需要,Object Pascal还允许用户使用自定义的数据类型。自定 义的数据类型,属于高级数据类型。 Object Pascal高级数据类型在使用之前必须首先使用类型定义语句 进行定义。经过定义后的高级数据类型就可在程序代码中使用。其用法 与常用的整型、字符串型用法相同。 常用的高级数据类型有枚举类型、子界类型、集合类型及记录类型。 6.1.1 枚举类型的定义 在处理实际问题过程中常用到的数据取值可能总是有限的几个值, 例如学生成绩等级有优秀、良好、及格、不及格;处理这一类数据时 可以用数值或字符串来表示,比如用“1”表示优秀,“2”表示良好。利 用数值表示此类数据不直观,容易出错,利用字符串表示不方便处理, 占用内存较多。为此,Object Pascal提供了枚举类型用于处理这一类 数据
6.1.1枚举类型的定义 枚举类型的定义格式如下: type =(,,…,); 枚举类型名称>是用户自定义的枚举类型的名称。表示该 类型数据中的元素,圆括号中列出了该类型数据的所有取值,这些取值 又称为枚举常量。每个枚举常量必须是标识符,不能是其他任何数据类 型。枚举常量不允许在同一数据类型定义中重复出现,也不允许同时在 不同的枚举类型定义中出现。 例如可以定义一个Colo枚举类型: ype color=(Red, Yellow, Blue, White, Black) 该枚举类型名为 color,其中包括五个枚举常量:Red、 Yellow Blue、 White、Back。 枚举类型变量的声明与其他类型变量的声明完全相同。如下面的代 码声明了一个枚举类型 color的变量c1,c2: var c1, C2: color; 声明了一个枚举类型变量后可以给它赋值,但必须注意的是只能将 枚举类型中定义的枚举常量赋值给它 则会出现错误 Inprise Dephi
6.1.1 枚举类型的定义 枚举类型的定义格式如下: type =(,,…,); 是用户自定义的枚举类型的名称。表示该 类型数据中的元素,圆括号中列出了该类型数据的所有取值,这些取值 又称为枚举常量。每个枚举常量必须是标识符,不能是其他任何数据类 型。枚举常量不允许在同一数据类型定义中重复出现,也不允许同时在 不同的枚举类型定义中出现。 例如可以定义一个Color枚举类型: type color=(Red,Yellow,Blue,White,Black); 该枚举类型名为color,其中包括五个枚举常量:Red、Yellow、 Blue、White、Black。 枚举类型变量的声明与其他类型变量的声明完全相同。如下面的代 码声明了一个枚举类型color的变量c1,c2: var c1,c2 : color; 声明了一个枚举类型变量后可以给它赋值,但必须注意的是只能将 枚举类型中定义的枚举常量赋值给它, 则会出现错误
612枚举类型的运算(1) 从本质上分析,枚举类型实际上就是一个数据取值结果的集合。用枚举 常量表示使程序可理解性加强,但与集合不同的是每个枚举常量对应一个序 数(整数),利用序数可以方便地对枚举类型数据进行计算 1.使用序数函数 Object Pasca规定,在枚举类型定义语句中的每一个枚举常量都与唯 的一个序数相对应。对于一个有n个枚举常量的枚举类型,其中的枚举常 量从左到右依次对应序数为Q~n-1。2使屈廢墩数函数Ord可以得到每个枚举 常量所对应的序数,使用前趋函数 Predo返回数据的前趋值,使用后继函 数SucO返回数据的后继值,使用首序数函数LoWQ返回序数类型的数据 中序数最小的一个数据,使用末序数函数Hgh0返回序数类型的数据中序 数最大的一个数据。 Inprise Dephi
6.1.2 枚举类型的运算(1) 从本质上分析,枚举类型实际上就是一个数据取值结果的集合。用枚举 常量表示使程序可理解性加强,但与集合不同的是每个枚举常量对应一个序 数(整数),利用序数可以方便地对枚举类型数据进行计算。 1. 使用序数函数 Object Pascal规定,在枚举类型定义语句中的每一个枚举常量都与唯一 的一个序数相对应。对于一个有n个枚举常量的枚举类型,其中的枚举常 量从左到右依次对应序数为0~n-1。使用序数函数Ord可以得到每个枚举 常量所对应的序数,使用前趋函数Pred()返回数据的前趋值,使用后继函 数Succ()返回数据的后继值,使用首序数函数Low()返回序数类型的数据 中序数最小的一个数据,使用末序数函数High()返回序数类型的数据中序 数最大的一个数据。 0 1 2 3 4
612枚举类型的运算(2) 在下面的定义中:tYpe color=(red Yellow, blue White black)i 234 枚举常量的序数依次为0~4,Oro(Red)的值为0, Pred(blue)的值为 Yellow, Succ(Blue)的值为 White, LoW(Color)的值为Red, High(Color))的值为BaK 注意:不要对第一个序数的求前趋和对最后一个序数求后继 2关系运算 由于每个枚举常量对应唯一一个序数,因此可以在枚举常量之间 进行比较。 比较规则是:按枚举值的序数进行比较,序数大者较大。对应上 述Colo类型定义中,Bue> Yellow的值为True。 Inprise Dephi
6.1.2 枚举类型的运算(2) type color=(Red, Yellow,Blue,White,Black); 0 1 2 3 4 在下面的定义中: 枚举常量的序数依次为0~4,Ord(Red)的值为0,Pred(Blue)的值为Yellow, Succ(Blue) 的值为White,Low(Color) 的值为Red,High(Color) 的值为Black。 注意:不要对第一个序数的求前趋和对最后一个序数求后继。 2. 关系运算 由于每个枚举常量对应唯一一个序数,因此可以在枚举常量之间 进行比较。 比较规则是:按枚举值的序数进行比较,序数大者较大。对应上 述Color类型定义中,Blue>Yellow的值为True
613枚举类型的使用(1) 枚举类型在定义后方可在程序中使用,枚举类型的使用与基本数据类型 有相似之处,但对枚举类型的使用有以下几点说明。 (1)对各枚举常量按常量进行处理,不能对它们进行赋值,也不能 再把它定义为其他类型的变量。 (2)定义了一个枚举类型的变量后,可以将枚举常量赋值给该变量, 不能将枚举常量之外的任何值赋予该枚举变量,也不能利用序数来赋 值 (3)可以指定枚举常量的序数。缺省情况下,枚举值的序号从0开始, 并且接下来的序列对应类型声明中相应的标识符。可以通过对部分或 全部枚举值明确指定序号来忽略缺省序号。 【例6-1】口袋中有红、黄、蓝、黑、白五种颜色的小球若干(各种颜色小 球数大于1),每次从口袋中依次取出三个小球,利用枚举类型编写程序, 求出取得三种不同颜色小球的可能取法。 Inprise Dephi
6.1.3 枚举类型的使用(1) (1)对各枚举常量按常量进行处理,不能对它们进行赋值,也不能 再把它定义为其他类型的变量。 (2)定义了一个枚举类型的变量后,可以将枚举常量赋值给该变量, 不能将枚举常量之外的任何值赋予该枚举变量,也不能利用序数来赋 值。 (3)可以指定枚举常量的序数。缺省情况下,枚举值的序号从0开始, 并且接下来的序列对应类型声明中相应的标识符。可以通过对部分或 全部枚举值明确指定序号来忽略缺省序号。 枚举类型在定义后方可在程序中使用,枚举类型的使用与基本数据类型 有相似之处,但对枚举类型的使用有以下几点说明。 【例6-1】口袋中有红、黄、蓝、黑、白五种颜色的小球若干(各种颜色小 球数大于1),每次从口袋中依次取出三个小球,利用枚举类型编写程序, 求出取得三种不同颜色小球的可能取法
613枚举类型的使用(2) 分析:该程序要用到枚举类型,在编程中可以声明一个包括五种颜色的 枚举类型。从若干小球中取三个小球,三个小球的颜色可能分别是五种颜色 中的一种,而且取得三个小球的颜色不同,各种可能取法可以利用循环语句 实现,直到取得三种颜色不同的小球。对于各种取法要用字符串的形式显示 出来,所以可以编写一个枚举类型转换为字符串类型的子程序。 启动 Delph7.0,新建一个工程,在窗体中添加一个标签、一个列表 框和一个按钮,设置标签的标题属性( Caption)为“红、黄、蓝、黑、白五 个五种颜色的小球,取三个小球可能取法:”,设置按钮的标题属性 ( Caption)为“列举”。 ③在实现部分关键字 Implementation之后声明枚举类型,然后声明 个枚举类型转换为字符串的函数,代码如下 implementation ISR* dfm] type bal=(Red, Yellow,Blue, White,Back);∥声明枚举类型 Inprise Dephi
6.1.3 枚举类型的使用(2) 分析:该程序要用到枚举类型,在编程中可以声明一个包括五种颜色的 枚举类型。从若干小球中取三个小球,三个小球的颜色可能分别是五种颜色 中的一种,而且取得三个小球的颜色不同,各种可能取法可以利用循环语句 实现,直到取得三种颜色不同的小球。对于各种取法要用字符串的形式显示 出来,所以可以编写一个枚举类型转换为字符串类型的子程序。 启动Delphi 7.0,新建一个工程,在窗体中添加一个标签、一个列表 框和一个按钮,设置标签的标题属性(Caption)为“红、黄、蓝、黑、白五 个五种颜色的小球,取三个小球可能取法:”,设置按钮的标题属性 (Caption)为“列举”。 在实现部分关键字Implementation之后声明枚举类型,然后声明一 个 枚举类型转换为字符串的函数,代码如下: implementation {$R *.dfm} type ball=(Red,Yellow,Blue,White,Black); //声明枚举类型
613枚举类型的使用(3) function balltostr( onera|ba) string;∥枚举类型变量转换为字符串 begin case oneball of Red result: =Red Yellow: result: = Yellow' 小最三界小哥最色 Blue: result =Blue White: result =White Black result: =Black end end 图6-1列举不同颜色小球的可 能取法 ③单击“列举”按钮,运行结果如图6-1所示 Inprise Dephi
6.1.3 枚举类型的使用(3) function balltostr(oneball:ball):string; //枚举类型变量转换为字符串 begin case oneball of Red: result:='Red'; Yellow: result:='Yellow'; Blue: result:='Blue'; White: result:='White'; Black: result:='Black'; end; end; 单击“列举”按钮,运行结果如图6-1所示。 图6-1 列举不同颜色小球的可 能取法
62子界类型 在实际应用中,许多变量的取值都有一定范围的限制,如学生学习成绩 在0~100之间,月份的取值在1~12之间。在这种情况下,数据的取值是某 个数据类型取值的一部分,在 Object Pascal中这种具有确定范围的数据类型 称为基类型,且取值范围确定的数据可定义为“子界类型”,其中基类型必 须为顺序类型。 62.1子界类型的定义 子界类型的定义格式如下: ty pe 子界类型名称>; 子界类型名称>是用户定义的子界类型的名称。表示子界类 型的下界,表示子界类型的上界,子界类型的上下界必须属于相 同的顺序类型。 注意: Object Pascal子界类型的下界必须小于上界。 Inprise Dephi
6.2 子界类型 在实际应用中,许多变量的取值都有一定范围的限制,如学生学习成绩 在0~100之间,月份的取值在1~12之间。在这种情况下,数据的取值是某 个数据类型取值的一部分,在Object Pascal 中这种具有确定范围的数据类型 称为基类型,且取值范围确定的数据可定义为“子界类型” ,其中基类型必 须为顺序类型。 6.2.1 子界类型的定义 子界类型的定义格式如下: type =…; 是用户定义的子界类型的名称。表示子界类 型的下界,表示子界类型的上界,子界类型的上下界必须属于相 同的顺序类型。 注意:Object Pascal子界类型的下界必须小于上界
622子界类型的使用(1) 子界类型的运算与其基类型所允许的运算完全一致,如基类型为整型的 子界变量可以进行算术、关系等运算。 【例6-2】编写一个程序,输入年份月份,输出该月有多少天。 分析:年份、月份的取值范围都是有限的,可以将它们声明为子界类 型。根据年份可以判断是否闰年,然后从一月至十二月依次判断天数。 ③启动 Delphi7.0,新建一个工程,在窗体中添加一个按钮、两个编辑框和 三个标签,将按钮的标题属性( Caption)设置为判断,将标签的标题属性 ( Caption)分别设置为“年”、“月”、“”,将两个编辑框的文本属性 (Text)设置为“2000”和“1” ③双击按钮,添加事件代码如下 procedure TForm1.Button 1Click(Sender: TObject var year:1.3000; month: 1.12 days:28.31; Inprise Dephi
6.2.2 子界类型的使用(1) 子界类型的运算与其基类型所允许的运算完全一致,如基类型为整型的 子界变量可以进行算术、关系等运算。 启动Delphi 7.0,新建一个工程,在窗体中添加一个按钮、两个编辑框和 三个标签,将按钮的标题属性(Caption)设置为判断,将标签的标题属性 (Caption)分别设置为“年”、“月”、“ ”,将两个编辑框的文本属性 (Text)设置为“2000”和“1”。 双击按钮,添加事件代码如下: procedure TForm1.Button1Click(Sender: TObject); var year:1..3000; month:1..12; days:28..31; 【例6-2】编写一个程序,输入年份月份,输出该月有多少天。 分析:年份、月份的取值范围都是有限的,可以将它们声明为子界类 型。根据年份可以判断是否闰年,然后从一月至十二月依次判断天数