高级数据类型.ppt

上传人:本田雅阁 文档编号:3165743 上传时间:2019-07-18 格式:PPT 页数:34 大小:333.02KB
返回 下载 相关 举报
高级数据类型.ppt_第1页
第1页 / 共34页
高级数据类型.ppt_第2页
第2页 / 共34页
高级数据类型.ppt_第3页
第3页 / 共34页
高级数据类型.ppt_第4页
第4页 / 共34页
高级数据类型.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《高级数据类型.ppt》由会员分享,可在线阅读,更多相关《高级数据类型.ppt(34页珍藏版)》请在三一文库上搜索。

1、第4章 高级数据类型,4.1 枚举类型 4.1.1 枚举类型的定义与变量声明 1.枚举类型的定义 枚举类型使用一组有限的标识符来表示一组连续的整数常数,它的值是有限的。枚举类型的定义格式如下: type =(,); 说明:(1)type是系统的保留字,表示定义高级数据类型的开始。,(2)表示该类型数据中的元素,圆括号中列出了该类型数据的所有取值,这些取值又称为枚举常量。 (3) 同一个枚举常量不允许重复出现在同一个枚举类型定义中,也不允许同时出现在不同的枚举类型定义中。 2.枚举类型变量的声明 其声明的格式与其他类型变量的声明完全相同 例如:Var C: Color; 该语句声明了一个枚举类型

2、Color的变量C。 4.1.2枚举类型的运算,1使用函数 Object Pascal为枚举类型定义了5个枚举函数,可以进行特殊的运算 。 说明: (1)枚举类型定义语句中列出的每一个枚举常量都对应一个唯一的序数(整数),称为枚举序数,在缺省情况下,列出的第一个枚举常量对应枚举系数0,以后依次为1、2、3。,(2)在定义枚举类型时,排在某枚举常量前一位的枚举常量称为该枚举常量的前趋值,后一位的称为后继值。第一个枚举常量没有前趋值,最末一个枚举常量没有后继值。 (3)由于每个枚举常量都对应一个枚举系数,所以枚举常量的序数可以进行算术运算,结果类型为整型。但枚举常量之间不能直接进行算术运算,需要先

3、转换为枚举序数。 2.关系运算 由于每个枚举常量对应一个唯一的序数,因此可以在枚举常量之间进行关系运算。如在上述定义中,sunsat的值为假(false)。,4.2 子界类型 4.2.1子界类型的定义 子界类型的定义格式如下: type =; 说明: (1)表示子界类型的下界,即最小值,表示子界类型的上界,即最大值。子界的上下界必须属于相同的顺序类型,即它们应同时为整型、布尔型、字符型 或同一个枚举类型。 (3)子界的上下界所属的数据类型即为子界的基类型,若子界的基类型为标准数据类型 (整型,、布尔型 、字符型),则子界的上、下界可以直接使用该类型常量,若子界的基类型为枚举类型,则必须先定义基

4、类型(枚举类型),再定义子界类型。 (4)子界的上界必须不小于下界。 4.2.2子界类型变量的声明 其声明格式与其他类型变量的声明完全相同,如下面的代码声明了一个上述子界类型month的变量ml和workday类型的变量wl: var ml:month: wl:workday:,4.2.3 子界类型的运算 子界类型所允许的运算与其基类型所允许的运算相同,如基类型为整型子界类型变量可以进行算术、关系等运算,而基类型为枚举类型的子界类型变量仅能进行关系运算。 4.3 集合类型 集合结构是指具有相同性质的对象的全体,构成集合的每个对象称为集合的元素 。 注意:(1)集合中的元素是互异的 、无序的 。

5、 (2)集合元素个数不能超过256个。 (3)元素与集合的关系是“属于”或“不属于”,二者必取其一且仅取其一。,4.3.1 集合类型的定义 其定义格式如下: type = set of; 说明: (1)表示集合中各元素的类型,可以是字符型、布尔型、枚举型和子界等顺序类型,不能是整型、实型和其他的构造类型。 (3)若为枚举类型或子界类型,则必须先定义该基类型,再定义集合类型。 (4)一个集合最多只能有256 个元素。另外,只有有序的类型才能跟关键字set of .,4.3.2集合变量的声明 其声明格式与其他类型变量的声明完全相同 。 4.3.3变量集合的取值 集合变量不同其他变量,它不是一个单独

6、元素,而是一系列元素的一集合。集合变量的取值称为集合值,其一般表现形式如下: , 如果集合类型的基类型有n个元素,则该集合类型变量的取值有2n个,包括一个空集合( )。 4.3.4集合类型的运算 集合类型的数据可以进行3大类运算:一类是集合对集合的并、交、差运算,其结果为集合值;一类是集合的关系运算, 其结果是,逻辑值;一类是元素对集合的“属于”运算,其结果也是逻辑值。,【例4.3】 输入年份,判断该年是否闰年,并根据选择的月份来判断是什么季节和该月有多少天。 (1)界面设计 使用Button、Edit、Label和ComboBox框组件即可设计界面,如图所示。 (2)属性设置,(3)程序设计

7、 /*闰年函数*/ function leapyear(y:integer):string; begin if (y mod 4=0) and (y mod 1000)or(y mod 4=0) then leapyear:=是 else leapyear:=不是; end; /*窗体创建事件*/ procedure TForm1.FormCreate(Sender: TObject); /关键分析1 var year,month,day:word; begin decodedate(date,year,month,day); edit1.Text:=inttostr(year); combo

8、box1.Text:=inttostr(month); end;,/*季节函数*/ function ji(m:word):string; type jijie=set of 112; var spring,summer,autumn,winter:jijie; begin spring:=3,4,5 ; summer:=6,7,8; autumn:=9,10,11; winter:=12,1,2; if m in spring then ji:=春天; if m in summer then ji:=夏天; if m in autumn then ji:=秋天; if m in winter

9、 then ji:=冬天; end ;,/*“判断”按钮Button1的OnClick事件*/ procedure TForm1.Button1Click(Sender: TObject); var y,m,d:word; begin y:=strtoint(edit1.Text); edit2.text:=format(%s ,leapyear(y); m:=strtoint(combobox1.Text); edit3.text:=format(%s ,jijie(m); if m=2 then if leapyear(y)=是 then d:=29 else d:=28; /关键分析2

10、if m in1,3,5,7,8,10,12then d:=31; if m in4,6,9,11 then d:=30; /关键分析3 edit4.text:=format(%d ,d); end;,/*“清除”按钮Button2的OnClick事件*/ procedure TForm1.Button2Click(Sender: TObject); begin edit2.text:=; edit3.text:=; edit4.text:=; end; /*编写编辑框Edit1的OnMouseMove事件*/ procedure TForm1.Edit1MouseMove(Sender: T

11、Object; Shift: TShiftState; X, Y: Integer); begin (sender as tedit).SetFocus; end; /*编写编辑框Edit1的OnKeyPress事件*/ procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var j:set of char; begin j:=09,#8; if not(key in j)then key:=#0; end;,4.4 数组与记录类型 数组类型(Array)是一些具有相同类型的元素按一定顺序组成的序列。数组中的每一个数据

12、元素都可以通过数组名来存取,它们被顺序安排在内存中的一段连续的区域中。Object Pascal提供的数组分为静态数组和动态数组。而记录类型可以将不同 的数据集中在一起,并作为一个整体进行操作。,4.4.1 静态数组 静态数组在程序初始化时必须分配内存单元,明确其固定的大小和元素的数据类型。 1一维静态数组 数组通常分为为一维、二维和多维数组, 定义一维静态数组类型的格式为: type =arrayof; Object Pascal允许的下标的类型为整数类型、字符类型、布尔类型、子界类型、枚举类型等,而元素的类型可以 是任意的数据类,型,并且在同一数组中,所有元素的数据类型必须相同。对于用户定

13、义的数据类型作为下标类型,在使用之前必须声明。 要访问数组中元素,可以用数组名加方括号,方括号内是元素的下标值 ,方括号内的下标值必须符合数组类型中下标类型的定义,其类型必须与下标类型一致,其值在下标取值范围内。而且下标也可以是表达式。 使用Object Pascal 提供的标准函数Low 和high ,可以返回一个数组的最小下标值和最大下标值,而函数Length可以返回数组的长度。,2二维静态数组 二维数组是指一个一维数组中的元素类型又是一个一维数组,其一般形式为: type =Arrayof Arrayof ; 也可以把上述形式写成下面的形式: type =Array,of ; 3多维静态

14、数组 多维静态数组的一般格式: type =Array,of ;,4.4.2 动态数组 动态数组在定义和声明时仅指定数组的类型,而不指定数组的大小,只是在程序设计中为程序动态地开辟存储空间。 1一维动态数组 一维动态数组的定义格式如下: type =array of 也可以在变量声明中直接声明动态数组,其格式为: var :array of ;,动态数组的声明中没有给出数组的下标类型,因此具有不确定的大小。动态数组的大小通过调用标准过程Setlength来明确。 2多维动态数组 声明多维动态数组采用递归定义的方式,如下: type =array of array of array of ; v

15、ar : 或者采用如下方式定义多维动态数组变量: var : array of array of array of ;,多维动态数组声明后,使用Setlength过程设置动态数组的大小 。 4.4.3记录类型 1记录类型的定义 记录类型定义的格式如下: type =Record :; :; . :; end;,其中,可以是多个合法的域名标识符,域名又称为字段名,可以是任意数据类型。同一个记录类型中不能有同名的字段,而因为作用域的不同,记录内的字段名与记录外的标识符可以相同。 2记录域的访问 由于记录类型中各字段的类型不同,所以不能同时访问记录的多个字段,而只能对记录的单个字段进行访问。有两种方

16、法: (1)记录变量名限定 为了标识记录字段所属的记录变量,使用记录变量名进行限定,格式如下:,. 则为记录的单个字段赋值可以使用如下语句: C1.Custid:=1; C2.IfPay:=True; (2)使用With语句 如果需要经常访问记录的字段,每次都用记录变量名进行限定非常麻烦,可以使用With语句加以简化。With语句格式如下: With DO 其中,可以是简单语句,也可以是复合语句。在中字段的访问不需要加记录变量名进行限定 。,3记录的变体部分 带有变体部分的记录类型的声明格式为: type =Record :; :; . :; Case : of :; :; :; end;,注

17、意: (1)Case前面的声明部分同平常的记录类型声明一样,但如果记录域中含有变体部分,则变体部分应位于记录域的最后。 (2)变体部分总识别字段标识符是可选的,省略时连同“:”号一起省略,在同一记录域中必须是唯一的。识别字段类型必须是顺序类型,如果是枚举或子界类型,则必须事先声明。其中的字段列表i同普通的记录类型中域名表的声明相同。其功能应用类似于选择结构中的Case语句。,4.5 指针类型 指针是一种特殊的数据类型,指针类型(Pointer)的变量称为指针变量。指针变量具有一般变量的三个基本要素,即变量名、变量类型、变量值,它与一般变量的不同,它是用来存放其他变量内存地址的一种变量。 4.5

18、.1指针变量的声明 定义指针类型的语法如下: type = 其中,可以是基本数据类型,如整型、实型、字节型等,也可以是高级数据类型,如集合、数组、集合等类型。,4.5.2指针变量的赋值 为指针变量赋值的格式如下: := 其中,“”操作符是个一元操作符,用于获取操作数的内存地址,后面的操作数可以是变量、过程和函数等。 4.5.3无类型指针变量 无类型的指针是指指针变量在声明时没有指明基类型,无类型指针在声明中只使用Pointer,其声明格式如下: var :Pointer;,无类型的指针的作用是它可以指向任何类型 ,对于无类型指针,不能用指针变量符号后加的形式来引用它的动态变量。 4.5.4字符

19、指针类型 字符指针类型即Pchar数据类型,是一个指向以NULL字符结尾的字符串的指针。主要用于与外部函数如在Windows API中所用的函数兼容。在Delphi 7中,可以把一个字符串直接赋值给一个Pchar类型的变量。 4.5.5指针变量的动态使用 1New过程和Dispose过程,如果不使用运算符为指针变量赋值,则指针变量称为动态指针变量,动态变量在访问之前必须首先分配内存单元。Object Pascal提供了标准过程New,用来为动态变量分配内存单元,并把该单元的地址赋给指针变量,所分配单元的大小由指针所指的类型决定。如果应用程序的堆栈中已没有足够的空间,将触发EoutOfMemor

20、y异常。调用New过程的格式如下: New(); 调用过程New(p)之后,可以用“p”表示一个整型的动态变量,对其进行操作。,当程序不再需要使用动态变量时,就调用标准过程Dispose删除New所创建的动态变量,并释放所分配的内存单元。调用Dispose过程的格式如下: Dispose(); 2GetMem过程和FreeMem过程 标准过程GetMem用于为动态变量申请一块指定大小的内存区域,并把该区域的起始地址赋给指针变量。如果应用程序的堆栈中已没有足够的空间,将触发EoutOfMemory异常。调用GetMem过程的格式如下: GetMem(,);,如果程序不再需要使用动态变量时,就调用

21、标准过程FreeMem删除GetMem创建的动态变量,并释放所分配的内存单元。调用FreeMem过程的格式如下: FreeMem(); 3动态指针的应用举例 链表是一组元素的序列,在这个序列中,每个元素总是与它前面的元素相链接(第一个元素除外)。这种链接关系可通过指针来实现。,链表中的元素通常称为节点,第一个节点称为表头,最后一个节点称为表尾。指向表头的指针称为头指针,在这个头指针中存放着表头的地址。节点一般用记录来描述,描述节点的记录至少含有两个域,一个域用来存放数据,该域的类型根据要存放的数据类型而定,称为值域;另一个域用来存放下一个节点的地址,称为指针域。表尾不指向任何节点,其指针的值为Nil。 节点可以通过记录类型来描述,并且记录类型里包含一个指针域,链表节点的声明如下:,type Node=record data:string; next:Node end; var Head:Node; /定义头节点变量Head; 或者采用如下方式: type Link=Node Node=record data:string; next:Node end; var Head:Link;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1