版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章Delphi高级数据类型Delphi程序设计教程(第3版)清华大学出版社杨长春主编5.1.1枚举类型的定义与变量声明1.枚举类型的定义枚举类型使用一组有限的标识符来表示一组连续的整数常数,它的值是有限的。枚举类型的定义格式如下:type<类型名称>=(<标识符1>,<标识符2>,…<标识符n>);5.1枚举类型说明:(1)type是系统的保留字,表示定义高级数据类型的开始。(2)<标识符>表示该类型数据中的元素,圆括号中列出了该类型数据的所有取值,这些取值又称为枚举常量。(3)同一个枚举常量不允许重复出现在同一个枚举类型定义中,也不允许同时出现在不同的枚举类型定义中。2.枚举类型变量的声明其声明的格式与其他类型变量的声明完全相同例如:VarC:Color;该语句声明了一个枚举类型Color的变量C。5.1.2枚举类型的运算1.使用函数ObjectPascal为枚举类型定义了5个枚举函数,可以进行特殊的运算。说明:(1)枚举类型定义语句中列出的每一个枚举常量都对应一个唯一的序数(整数),称为枚举序数,在缺省情况下,列出的第一个枚举常量对应枚举系数0,以后依次为1、2、3…。枚举函数
功能
调用格式
Ord求枚举序数Ord(枚举常量或枚举变量)Pred求前趋值Pred(枚举常量或枚举变量)Succ求后继值Succ(枚举常量或枚举变量)Low求第1个枚举常量Low(枚举类型名)High求最后1个枚举常量High(枚举类型名)(2)在定义枚举类型时,排在某枚举常量前一位的枚举常量称为该枚举常量的前趋值,后一位的称为后继值。第一个枚举常量没有前趋值,最末一个枚举常量没有后继值。(3)由于每个枚举常量都对应一个枚举系数,所以枚举常量的序数可以进行算术运算,结果类型为整型。但枚举常量之间不能直接进行算术运算,需要先转换为枚举序数。2.关系运算由于每个枚举常量对应一个唯一的序数,因此可以在枚举常量之间进行关系运算。如在上述定义中,sun<wed的值为真(true),fri>sat的值为假(false)。5.2.1子界类型的定义子界类型的定义格式如下:type<类型名称>=<常量1>..<常量2>;说明:(1)<常量1>表示子界类型的下界,即最小值,<常量2>表示子界类型的上界,即最大值。子界的上下界必须属于相同的顺序类型,即它们应同时为整型、布尔型、字符型或同一个枚举类型。(2)子界的上界必须不小于下界。5.2子界类型(3)子界的上下界所属的数据类型即为子界的基类型,若子界的基类型为标准数据类型(整型、布尔型、字符型),则子界的上、下界可以直接使用该类型常量,若子界的基类型为枚举类型,则必须先定义基类型(枚举类型),再定义子界类型。5.2.2子界类型变量的声明其声明格式与其他类型变量的声明完全相同,如下面的代码声明了一个上述子界类型month的变量ml和workday类型的变量wl:varml:month:wl:workday:5.2.3子界类型的运算子界类型所允许的运算与其基类型所允许的运算相同,如基类型为整型子界类型变量可以进行算术、关系等运算,而基类型为枚举类型的子界类型变量仅能进行关系运算。集合结构是指具有相同性质的对象的全体,构成集合的每个对象称为集合的元素。注意:(1)集合中的元素是互异的、无序的。(2)集合元素个数不能超过256个。(3)元素与集合的关系是“属于”或“不属于”,二者必取其一且仅取其一。5.3.1集合类型的定义其定义格式如下:type<类型名称>=setof<基类型>;
5.3集合类型说明:(1)<基类型>表示集合中各元素的类型,可以是字符型、布尔型、枚举型和子界等顺序类型,不能是整型、实型和其他的构造类型。(2)若<基类型>为枚举类型或子界类型,则必须先定义该基类型,再定义集合类型。(3)一个集合最多只能有256个元素。另外,只有有序的类型才能跟关键字setof.5.3.2集合变量的声明其声明格式与其他类型变量的声明完全相同。5.3.3变量集合的取值集合变量不同其他变量,它不是一个单独元素,而是一系列元素的一集合。集合变量的取值称为集合值,其一般表现形式如下:[<元素1>,<元素2>,…,<元素n>]如果集合类型的基类型有n个元素,则该集合类型变量的取值有2n个,包括一个空集合([])。5.3.4集合类型的运算集合类型的数据可以进行3大类运算:一类是集合对集合的并、交、差运算,其结果为集合值;一类是集合的关系运算,其结果是逻辑值;一类是元素对集合的“属于”运算,其结果也是逻辑值。运算名称
表示方式
运算结果
是否满足交换律
并运算S1+S2两个集合中所有不重复元素组成的新集合是交运算S1*S2两个集合所共有的元素组成的新集合是差运算S1-S2所有属于S1但不属于S2的元素的集合否相等运算S1=S2如果S1与S2所包含的元素完全相同,则结果为True,否则为False是不等运算S1<>S2如果S1与S2所包含的元素完全不同,则结果为True,否则为False是包含运算S1>=S2如果S2中的元素都在S1中,则结果为True,否则为False否被包含运算S1<=S2如果S1中的元素都在S2中,则结果为True,否则为False否属于运算XinS1如果元素X与集合S1的基类型相同,且被包含在S1中,则结果为True,否则为False.否集合运算符具有不同的优先级,如表所示:优先级运算符操作数类型结果值类型高*集合集合中+集合集合低=、<>、>=、<=集合逻辑最低in左操作数为元素,右操作数为集合逻辑数组类型(Array)是一些具有相同类型的元素按一定顺序组成的序列。数组中的每一个数据元素都可以通过数组名来存取,它们被顺序安排在内存中的一段连续的区域中。ObjectPascal提供的数组分为静态数组和动态数组。而记录类型可以将不同的数据集中在一起,并作为一个整体进行操作。
5.4.1静态数组静态数组在程序初始化时必须分配内存单元,明确其固定的大小和元素的数据类型。5.4数组与记录类型1.一维静态数组数组通常分为为一维、二维和多维数组,定义一维静态数组类型的格式为:type<数组类型名>=array[<下标类型>]of<基类型>;
ObjectPascal允许的下标的类型为整数类型、字符类型、布尔类型、子界类型、枚举类型等,而元素的类型可以是任意的数据类型,并且在同一数组中,所有元素的数据类型必须相同。对于用户定义的数据类型作为下标类型,在使用之前必须声明。
要访问数组中元素,可以用数组名加方括号,方括号内是元素的下标值,方括号内的下标值必须符合数组类型中下标类型的定义,其类型必须与下标类型一致,其值在下标取值范围内。而且下标也可以是表达式。使用ObjectPascal提供的标准函数Low和high,可以返回一个数组的最小下标值和最大下标值,而函数Length可以返回数组的长度。2.二维静态数组二维数组是指一个一维数组中的元素类型又是一个一维数组,其一般形式为:type<数组标识符>=Array[<下标类型1>]ofArray[<下标类型2>]of<基类型>;也可以把上述形式写成下面的形式:type<数组标识符>=Array[<下标类型1>,<下标类型2>]of<基类型>;3.多维静态数组多维静态数组的一般格式:type<数组标识符>=Array[<下标类型1>,<下标类型2>,…<下标类型n>]of<基类型>;5.4.2动态数组动态数组在定义和声明时仅指定数组的类型,而不指定数组的大小,只是在程序设计中为程序动态地开辟存储空间。1.一维动态数组一维动态数组的定义格式如下:type<数组类型名>=arrayof<基类型>也可以在变量声明中直接声明动态数组,其格式为:var<变量名>:arrayof<基类型>;动态数组的声明中没有给出数组的下标类型,因此具有不确定的大小。动态数组的大小通过调用标准过程Setlength来明确。2.多维动态数组声明多维动态数组采用递归定义的方式,如下:type<数组类型名>=arrayofarrayof…arrayof<基类型>;var<变量名>:<数组类型名>或者采用如下方式定义多维动态数组变量:
var<变量名>:arrayofarrayof…arrayof<基类型>;多维动态数组声明后,使用Setlength过程设置动态数组的大小。5.4.3记录类型1.记录类型的定义记录类型定义的格式如下:type<记录类型名>=Record<域名表1>:<类型1>;<域名表2>:<类型2>;...<域名表n>:<类型n>;end;其中,<域名表>可以是多个合法的域名标识符,域名又称为字段名,<类型>可以是任意数据类型。同一个记录类型中不能有同名的字段,而因为作用域的不同,记录内的字段名与记录外的标识符可以相同。2.记录域的访问由于记录类型中各字段的类型不同,所以不能同时访问记录的多个字段,而只能对记录的单个字段进行访问。有两种方法:(1)记录变量名限定为了标识记录字段所属的记录变量,使用记录变量名进行限定,格式如下:<记录变量名>.<字段名>则为记录的单个字段赋值可以使用如下语句:C1.Custid:=1;C2.IfPay:=True;(2)使用With语句如果需要经常访问记录的字段,每次都用记录变量名进行限定非常麻烦,可以使用With语句加以简化。With语句格式如下:With<记录变量名>DO<语句>其中,<语句>可以是简单语句,也可以是复合语句。在<语句>中字段的访问不需要加记录变量名进行限定。3.记录的变体部分带有变体部分的记录类型的声明格式为:type<记录类型名>=Record<域名表1>:<类型1>;<域名表2>:<类型2>;...<域名表n>:<类型n>;Case<识别字段标识符>:<识别字段类型>of<常量表1>:<字段列表1>;<常量表2>:<字段列表2>;…<常量表n>:<字段列表n>;end;注意:(1)Case前面的声明部分同平常的记录类型声明一样,但如果记录域中含有变体部分,则变体部分应位于记录域的最后。(2)变体部分总识别字段标识符是可选的,省略时连同“:”号一起省略,在同一记录域中必须是唯一的。识别字段类型必须是顺序类型,如果是枚举或子界类型,则必须事先声明。其中的字段列表i同普通的记录类型中域名表的声明相同。其功能应用类似于选择结构中的Case语句。指针是一种特殊的数据类型,指针类型(Pointer)的变量称为指针变量。指针变量具有一般变量的三个基本要素,即变量名、变量类型、变量值,它与一般变量的不同,它是用来存放其他变量内存地址的一种变量。5.5.1指针变量的声明定义指针类型的语法如下:type<指针类型名>=^<基类型>其中,<基类型>可以是基本数据类型,如整型、实型、字节型等,也可以是高级数据类型,如集合、数组、集合等类型。5.5指针类型5.5.2指针变量的赋值为指针变量赋值的格式如下:<指针变量名>:=@<标识符>其中,“@”操作符是个一元操作符,用于获取操作数的内存地址,@后面的操作数可以是变量、过程和函数等。5.5.3无类型指针变量无类型的指针是指指针变量在声明时没有指明基类型,无类型指针在声明中只使用Pointer,其声明格式如下:var<指针变量名>:Pointer;无类型的指针的作用是它可以指向任何类型,对于无类型指针,不能用指针变量符号后加^的形式来引用它的动态变量。5.5.4字符指针类型字符指针类型即Pchar数据类型,是一个指向以NULL字符结尾的字符串的指针。主要用于与外部函数如在WindowsAPI中所用的函数兼容。在DelphiXE8中,可以把一个字符串直接赋值给一个Pchar类型的变量。5.5.5指针变量的动态使用1.New过程和Dispose过程如果不使用@运算符为指针变量赋值,则指针变量称为动态指针变量,动态变量在访问之前必须首先分配内存单元。ObjectPascal提供了标准过程New,用来为动态变量分配内存单元,并把该单元的地址赋给指针变量,所分配单元的大小由指针所指的类型决定。如果应用程序的堆栈中已没有足够的空间,将触发EoutOfMemory异常。
调用New过程的格式如下:
New(<指针变量名>);调用过程New(p)之后,可以用“p^”表示一个整型的动态变量,对其进行操作。当程序不再需要使用动态变量时,就调用标准过程Dispose删除New所创建的动态变量,并释放所分配的内存单元。
调用Dispose过程的格式如下:
Dispose(<指针变量名>);2.GetMem过程和FreeMem过程标准过程GetMem用于为动态变量申请一块指定大小的内存区域,并把该区域的起始地址赋给指针变量。如果应用程序的堆栈中已没有足够的空间,将触发EoutOfMemory异常。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理工作如何创新
- 大班社会活动叠被子
- 二零二四年股权投资合同
- 2024年度影视制作合同:含剧本创作、拍摄及后期制作的全方位影视生产协议
- 二零二四年度企业宣传产品摄影合同
- 2024年度茶叶品牌故事创作合同
- 二零二四年度电子商务平台建设运营合同2篇
- 2024年度二手住宅与商业物业买卖协议
- 2024年度融资租赁:医疗设备融资租赁合同
- 2024年度数据中心电缆桥架安装合同3篇
- 《建筑工程设计文件编制深度规定》(2022年版)
- 2024年版的企业绩效评价标准
- 2024年共青团入团积极分子考试题库(附答案)
- MOOC 职场英语-西南交通大学 中国大学慕课答案
- JTG C10-2007 公路勘测规范
- (高清版)DZT 0216-2020 煤层气储量估算规范
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
- 底栏栅坝水力学计算
- JJG 162-2019饮用冷水水表 检定规程(高清版)
- (完整版)水质原始记录
- 生产过程控制程序文件
评论
0/150
提交评论