




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章第四章 高级数据类型高级数据类型2类型定义语句类型定义语句v前面我们学习了前面我们学习了pascal语言的语言的5种标准数据类型:整型、实种标准数据类型:整型、实型、字符型、字符串型以及布尔型,这些数据类型无需声明型、字符型、字符串型以及布尔型,这些数据类型无需声明定义即可在程序中直接使用。而解决实际问题,还需要其他定义即可在程序中直接使用。而解决实际问题,还需要其他数据类型,这些都属于用户自定义的数据类型,属于高级数数据类型,这些都属于用户自定义的数据类型,属于高级数据类型。这些数据类型必须在据类型。这些数据类型必须在使用之前使用之前用语句进行用语句进行定义定义。v高级数据类型主要有:
2、枚举类型、子界类型、集合类型、数高级数据类型主要有:枚举类型、子界类型、集合类型、数组、记录类型、指针类型组、记录类型、指针类型2类型定义语句类型定义语句v类型定义语句的语法格式为:类型定义语句的语法格式为:type =; =; =;其中保留字其中保留字type表示类型定义段的开始。表示类型定义段的开始。是用是用户为自定义类型取的名称,户为自定义类型取的名称,是用户定义的数据类型名,是用户定义的数据类型名,既可以是既可以是object pascal语言的标准数据类型,也可以是语言的标准数据类型,也可以是object pascal语言的高级数据类型。语言的高级数据类型。2枚举类型枚举类型v在处理
3、诸如物体的颜色、人的职业、教师的职称等非数值数在处理诸如物体的颜色、人的职业、教师的职称等非数值数据时,可以用数值或字符串来表示,比如用据时,可以用数值或字符串来表示,比如用1表示红色,表示红色,2表表示黄色;或用示黄色;或用“red”表示红色,表示红色,“yellow”表示黄色。但这表示黄色。但这样的表示都存在一些缺点:使用数值表示很样的表示都存在一些缺点:使用数值表示很不直观不直观,特别当,特别当表示的种类较多时容易引起混乱和错误,使用字符串则需要表示的种类较多时容易引起混乱和错误,使用字符串则需要占用较多的内存占用较多的内存。v仔细分析这些数据,可知这些数据的个数总是有限的,而且仔细分析
4、这些数据,可知这些数据的个数总是有限的,而且可以一一列举。为此,可以一一列举。为此,object pascal提供的用户自定义数提供的用户自定义数据类型据类型枚举枚举类型,可以很方便地处理这类数据。类型,可以很方便地处理这类数据。2枚举类型枚举类型vtype 枚举类型标识符枚举类型标识符(标识符标识符1,标识符,标识符n);例如:例如:type daytype=(sun,mon,tue,wed,thu,fri,sat);注意:注意:1、括号内为枚举元素,是该类型数据的所有取值,又称、括号内为枚举元素,是该类型数据的所有取值,又称枚枚举常量举常量。但枚举元素只能是。但枚举元素只能是标识符标识符(
5、字母开头的字母数据(字母开头的字母数据串),而不能是数值常量或字符常量。串),而不能是数值常量或字符常量。例如以下的定义是错误的:例如以下的定义是错误的:type daytype1=(sun,mon,tue,wed,thu,fri,sat);2、不要把作为枚举元素的标识符视作变量名,它、不要把作为枚举元素的标识符视作变量名,它不能被赋不能被赋值值。例如以下的语句是错误的:。例如以下的语句是错误的:sunday:=sun; monday:=mon;2枚举类型枚举类型3、枚举常量不允许在同一枚举类型定义中重复出现,同一个、枚举常量不允许在同一枚举类型定义中重复出现,同一个枚举常量也不能出现在不同的
6、枚举类型定义中。枚举常量也不能出现在不同的枚举类型定义中。例如以下的定义是错误的:例如以下的定义是错误的:type daytype1=(monday,tuesday);daytype2=(monday,wednesday);4、pascal不允许直接读写不允许直接读写枚举值(如枚举值(如 write(pred(mon)),),所以枚举值的输出常用所以枚举值的输出常用case语句间接的输出。语句间接的输出。case succ(sun) ofsun:write(sunday);mon:write(monday);.sat:write(saturday);end; 2枚举类型枚举类型v枚举类型变量的
7、声明枚举类型变量的声明var x,y:daytype;注意:此时的注意:此时的daytype必须是已定义好的枚举类型。必须是已定义好的枚举类型。也可以将枚举类型的定义和变量的定义结合在一起。也可以将枚举类型的定义和变量的定义结合在一起。例如:例如:var a:(sun,mon,tue); v枚举类型的运算枚举类型的运算顺序运算:顺序运算:枚举类型属于顺序类型枚举类型属于顺序类型。根据定义类型时各枚举。根据定义类型时各枚举元素的排列顺序确定它们的序列,序列号从元素的排列顺序确定它们的序列,序列号从0开始,如果类开始,如果类型说明中有型说明中有n个元素,那么,每个元素对应的序号从左到右个元素,那么
8、,每个元素对应的序号从左到右依次为依次为0(n-1),如上面如上面daytype中,中,sun的序号为的序号为0,sat的序号为的序号为6,即,即ord(sun)=0,succ(sun)=mon,pred(fri)=thu注意:枚举类型中的第一个元素没有前趋,最后一个元注意:枚举类型中的第一个元素没有前趋,最后一个元素没有后继。素没有后继。枚举类型枚举类型关系运算:例如,关系运算:例如,sunmon为真为真,thutue为假为假例例4-1:显示系统日期,并返回昨天、今天和明天的星期:显示系统日期,并返回昨天、今天和明天的星期分析:分析:法一:如教材法一:如教材法二:利用日期型数据本质的特点,建
9、立法二:利用日期型数据本质的特点,建立dayofweek返回值与返回值与星期几文字的对应函数即可。星期几文字的对应函数即可。2子界类型子界类型v有确定的数据类型(称为有确定的数据类型(称为基类型基类型),且其取值范围确定的数),且其取值范围确定的数据可以定义为据可以定义为“子界类型子界类型”。其中的基类型,必须为顺序类。其中的基类型,必须为顺序类型。子界类型具有便于查错、节省内存的优点。型。子界类型具有便于查错、节省内存的优点。v type 子界类型标识符常量子界类型标识符常量.常量常量;例如:例如:type a=1.3; b=a.d;注意:注意:1、子界的两个常量必须是同一种顺序类型,如:、
10、子界的两个常量必须是同一种顺序类型,如:a.b,要,要求求a=b。这里的。这里的“顺序顺序”不是指大小,而是指子界中的每不是指大小,而是指子界中的每个元素都有后继元素或前趋元素。如个元素都有后继元素或前趋元素。如type x0.2.0.8是错是错误的。误的。2子界类型子界类型2、子界的上、下界所属的数据类型即子界的基类型。若子界、子界的上、下界所属的数据类型即子界的基类型。若子界的基类型为标准数据类型(整型、布尔型、字符型),则子的基类型为标准数据类型(整型、布尔型、字符型),则子界的上、下界可以直接使用该类型常量,若子界的基类型为界的上、下界可以直接使用该类型常量,若子界的基类型为枚举类型,
11、则必须先定义基类型(枚举类型),再定义子界枚举类型,则必须先定义基类型(枚举类型),再定义子界类型。例如:类型。例如:type week=(sun,mon,tue,wed,thu,fri,sat);subweek=mon.thu;v子界变量的声明子界变量的声明var num1,num2:a;str1,str2:b;可以将子界类型的定义和变量的定义结合在一起,例如:可以将子界类型的定义和变量的定义结合在一起,例如:var a:1.92子界类型子界类型v子界类型变量的运算子界类型变量的运算子界类型的运算与其基类型的运算一致。子界类型的运算与其基类型的运算一致。例例4-2:十进制到其他进制的转换:十
12、进制到其他进制的转换例:按月、日、年顺序读入一日期,输出该日期是这一年中的例:按月、日、年顺序读入一日期,输出该日期是这一年中的第几天。第几天。 2集合类型集合类型v集合是指具有相同性质且可以相互区分的对象的全体。构成集合是指具有相同性质且可以相互区分的对象的全体。构成集合的各个对象,称为集合的元素。例如一组学生的姓名,集合的各个对象,称为集合的元素。例如一组学生的姓名,小于小于10的自然数等。的自然数等。v集合表示方法集合表示方法(1)穷举法:把集合中所有元素列举出来。例如穷举法:把集合中所有元素列举出来。例如小于小于20的素数的素数2,3,5,7,11,17,19(2)描述法:列出集合元素
13、的共同特征。例如描述法:列出集合元素的共同特征。例如1100之间的自然数之间的自然数=n | 1n100,且,且n属于属于n 2集合类型集合类型v在理解集合的概念时,要注意以下几点:在理解集合的概念时,要注意以下几点:1、集合中的元素是互异的,即相同的元素视为是同一个元素、集合中的元素是互异的,即相同的元素视为是同一个元素。2、集合中的元素是无序的,即、集合中的元素是无序的,即1,2,3,4与与2,3,1,4是同一个集合。是同一个集合。3、集合中的元素个数可以是有限的,、集合中的元素个数可以是有限的,也可以是无限的也可以是无限的。4、元素与集合的关系是、元素与集合的关系是“属于属于”或或“不属
14、于不属于”,二者必取其,二者必取其一且仅取其一。一且仅取其一。为了表示集合,在为了表示集合,在pascal中引入了集合类型。集合类型属于构中引入了集合类型。集合类型属于构造类型,是由其他的数据类型按照一定的规则构造而成。造类型,是由其他的数据类型按照一定的规则构造而成。v集合类型的定义集合类型的定义type 集合类型标识符集合类型标识符set of基类型基类型限定基类型为枚举类型、字符型、布尔型以及它们的子限定基类型为枚举类型、字符型、布尔型以及它们的子界和界和整型子界整型子界。由于基类型中不能超过。由于基类型中不能超过256个可能值,且它个可能值,且它们的序数值应在们的序数值应在0.255之
15、间,因此基类型不能是短整型、整之间,因此基类型不能是短整型、整型、长整型。型、长整型。表示一个集合值的最通用的方法是逐个枚举集合的元素,表示一个集合值的最通用的方法是逐个枚举集合的元素,下面是集合值标记的例子:下面是集合值标记的例子:3,9,15,20 由由3,9,15,20组成的集合组成的集合 空集空集l.p,z 由字符由字符l,m,n,o,p,z组成的集合组成的集合例如:例如:typetype numbers=1.100 numbers=1.100; prime=set of numbers prime=set of numbers; caps=set of a.z caps=set of
16、 a.zvarvar p1 p1,p2p2,p3:primep3:prime c1 c1,c3c3,c5:capsc5:caps;2集合类型集合类型v集合变量的取值集合变量的取值集合变量的取值范围是包括空集合在内的所有子集。集合值用集合变量的取值范围是包括空集合在内的所有子集。集合值用方括号作为分隔符,内为元素序列,元素之间用逗号隔开。方括号作为分隔符,内为元素序列,元素之间用逗号隔开。赋值语句同样适用于集合类型数据。利用赋值语句,可以将赋值语句同样适用于集合类型数据。利用赋值语句,可以将计算集合表达式所得结果的值赋给集合变量。计算集合表达式所得结果的值赋给集合变量。集合的值不能直接以其书写的
17、形式输出集合的值不能直接以其书写的形式输出, ,还需要增加一些必要还需要增加一些必要的语句,如利用选择语句和保留字的语句,如利用选择语句和保留字inin等。等。例例 集合变量说明集合变量说明var a,b,c,d,e,f:setvar a,b,c,d,e,f:set of 1.7;i:integer; of 1.7;i:integer;赋值语句赋值语句d:=1,3,5,7;e:=2,4,6;f:=1,2,3;d:=1,3,5,7;e:=2,4,6;f:=1,2,3;输出输出e e的集合值的集合值for i:=1 to 9 dofor i:=1 to 9 do if i in e then wr
18、ite(i:2); if i in e then write(i:2);输出结果为输出结果为:2 4 6 :2 4 6 2集合类型集合类型v集合的运算集合的运算2集合类型集合类型例例4-34-3:筛选求素数:筛选求素数例:输入一系列字符,对其中的数字字符、字母字符和其它字符分别计数。例:输入一系列字符,对其中的数字字符、字母字符和其它字符分别计数。输入输入 ? 后结束。后结束。 var ch:char;var ch:char; letter:set of char; letter:set of char; digit:set digit:set of 0.9; of 0.9; i,j,k:in
19、teger i,j,k:integer; ;beginbeginletter:=a.z,a.zletter:=a.z,a.z; digit:=0.9; digit:=0.9;i:=0; j:=0; k:=0;i:=0; j:=0; k:=0;repeatrepeatreadln(chreadln(ch););if chif ch in letter in letter then i:=i+1then i:=i+1 else if chelse if ch in digit then j:=j+1 else k:=k+1; in digit then j:=j+1 else k:=k+1;unt
20、il chuntil ch=?;=?; writeln(letter:,i,digit:,j,other:,kwriteln(letter:,i,digit:,j,other:,k););readlnreadln; ; end. end. 2数组数组数组是一些具有数组是一些具有相同类型相同类型的元素按一定的元素按一定顺序顺序组成的序列。组成的序列。数组中的每一个数据元素都可以通过数组名和唯一的数组中的每一个数据元素都可以通过数组名和唯一的索引号索引号来存取,它们被顺序地安排在内存中的一段来存取,它们被顺序地安排在内存中的一段连续连续的存储区中。的存储区中。在在object pascal中数组可
21、分为中数组可分为静态静态数组和数组和动态动态数组两数组两种类型。根据数组的结构,可分为一维数组、二维数组和多种类型。根据数组的结构,可分为一维数组、二维数组和多维数组。维数组。v数组的定义:数组的定义:type 类型标识符类型标识符=array下标类型下标类型1,下标类型下标类型2,下标类型下标类型n of 元素类型元素类型; 其中下标类型必须是其中下标类型必须是有序有序的(整型、字符型、布尔型、的(整型、字符型、布尔型、枚举型、子界型等)枚举型、子界型等) ,而元素类型可以是,而元素类型可以是任意任意的。在同一的。在同一数组中,所有元素的数据类型必须数组中,所有元素的数据类型必须一致一致。2
22、静态数组静态数组v静态数组在程序初始化时必须分配内存单元,明确其固定的静态数组在程序初始化时必须分配内存单元,明确其固定的大小大小和元素的数据类型。和元素的数据类型。v静态一维数组:静态一维数组:type 类型标识符类型标识符=array下标类型下标类型 of 元素类型元素类型; var 数组变量名:类型标识符;数组变量名:类型标识符; 如如: type data=array1.50 of integer; var a,b:data; 类型和变量是两个不同概念,不能混淆。就数组而言,类型和变量是两个不同概念,不能混淆。就数组而言,程序的执行部分使用的不是数组类型(标识符)而是数组变程序的执行部
23、分使用的不是数组类型(标识符)而是数组变量。如上定义,在程序中量。如上定义,在程序中data不能在执行部分出现。不能在执行部分出现。type axcolor=(red,green,blue);var color:arrayaxcolor of integer;/结构类型做下标结构类型做下标需先声明。需先声明。 2数组数组也可以将数组类型定义和变量定义合并。也可以将数组类型定义和变量定义合并。 如:如:var a,b:array1.50of integer;v数组元素的操作:数组元素的操作:数组元素的访问:数组名数组元素的访问:数组名下标值下标值如:如:data3,colorblue。对于静态数
24、组的下标,其范围已。对于静态数组的下标,其范围已在定义时给定,在定义时给定,不得不得在程序执行过程中改变。在程序执行过程中改变。数组元素的赋值:数组元素与简单变量一样,直接赋值即可,数组元素的赋值:数组元素与简单变量一样,直接赋值即可,如如data3:=23+63,colorblue=255。由于数组的下标为顺序类型构成,故可用顺序函数由于数组的下标为顺序类型构成,故可用顺序函数low、high分别返回数组的最小下标值和最大下标值,可用分别返回数组的最小下标值和最大下标值,可用length返回数组的长度。返回数组的长度。2数组数组例例1:教材例题(随机数的产生、线性查找):教材例题(随机数的产
25、生、线性查找)例例2:读入个学生的学号和成绩,计算他们的平均分,若比:读入个学生的学号和成绩,计算他们的平均分,若比平均分高分的等级为平均分高分的等级为a,比平均分高小于分的等级,比平均分高小于分的等级为为b,低于平均分的等级为,低于平均分的等级为c,输出他们的成绩和等级。,输出他们的成绩和等级。例例3:将一个十进制自然数转换成二进制数。:将一个十进制自然数转换成二进制数。例例4:随机产生:随机产生10个两位数,按从小到大排序。个两位数,按从小到大排序。 2数组数组v静态二维数组:静态二维数组:type 类型标识符类型标识符=array下标类型下标类型1, 下标类型下标类型2 of 元素类型元
26、素类型; 例如:例如:var a:array1.4,1.3of integer; 则表示则表示a是二维数组,共有是二维数组,共有4*3=12个元素,它们是:个元素,它们是:a1,1a1,2a1,3a2,1a2,2a2,3a3,1a3,2a3,3a4,1a4,2a4,3因此可以看成一个矩阵,因此可以看成一个矩阵,a4,2即表示第即表示第4行、第行、第2列的元素。列的元素。 2数组数组虽然逻辑上可以把二维数组看作是一张表格或一个矩阵,虽然逻辑上可以把二维数组看作是一张表格或一个矩阵,但在计算机内部,二维数组的所有元素对应的存储单元是连但在计算机内部,二维数组的所有元素对应的存储单元是连续的,与一维
27、数组的续的,与一维数组的存储方式存储方式在本质上是相同的。在本质上是相同的。 对于整个二维数组的元素引用时对于整个二维数组的元素引用时,大多采用二重循环来实大多采用二重循环来实现。如给上例定义的二维数组现。如给上例定义的二维数组a进行赋值进行赋值: for i:=1 to 9 do for j:=1 to i do ai,j:=i*j;同样用二重循环来实现二维数组的输入与输出同样用二重循环来实现二维数组的输入与输出: for i:=1 to 4 do for j:=1 to 3 doread(ai,j); for i:=1 to 4 dobegin for j:=1 to 3 do write
28、(ai,j:5); writeln;end; 2数组数组例例1:已知数组:已知数组a中,每个元素中,每个元素a(i,j)在存贮时要占)在存贮时要占3个字个字节,设节,设i从从1变化到变化到8,j从从1变化到变化到10,分配内存时是从地址,分配内存时是从地址sa开始连续按行存贮分配的。试问:开始连续按行存贮分配的。试问:a(5,8)的起始地)的起始地址为(址为(a)。)。 a) sa+141 b) sa+180 c) sa+222 d) sa+225例例2:仔细阅读下列程序段:仔细阅读下列程序段: var a:array1.3,1.4 of integer; b:array1.4,1.3 of
29、integer; x,y:integer; 2数组数组 beginfor x:=1 to 3 do for y:=1 to 4 doax,y:=x-y;for x:=4 downto 1 do for y:=1 to 3 do bx,y:=ay,x;writeln(b3,2);end. 上列程序段的正确输出是(上列程序段的正确输出是( )。)。 a) -1b) -2c) -3d) 4 例例3:教材例题(二维数组的输入输出):教材例题(二维数组的输入输出)例例4:输入:输入4名学生数学、物理、英语、化学、名学生数学、物理、英语、化学、pascal五门课的五门课的考试成绩,求出每名学生的总分、平均
30、分,打印出表格。考试成绩,求出每名学生的总分、平均分,打印出表格。 2数组数组v多维静态数组:允许定义任意维,但一般不超过三维。多维静态数组:允许定义任意维,但一般不超过三维。v静态数组的注意问题:静态数组的注意问题:1、零基准数组:即下标从、零基准数组:即下标从0开始的数组开始的数组如:如:array0.5 of char零基准数组主要用于存贮零基准数组主要用于存贮null字符结束的字符串,元字符结束的字符串,元素类型为素类型为char的零基准数组与的零基准数组与pchar类型赋值兼容。类型赋值兼容。在调用在调用windows的的api需要用到以需要用到以null字符结束的字符串。字符结束的
31、字符串。2、数组的整体赋值、数组的整体赋值可以让一数组元素逐个给另一数组元素赋值,达到整体可以让一数组元素逐个给另一数组元素赋值,达到整体赋值的目的,也可数组直接整体赋值,但数组的整体赋值仅赋值的目的,也可数组直接整体赋值,但数组的整体赋值仅限于限于类型相容类型相容的数组,因为类型相容是赋值相容的前提条件,的数组,因为类型相容是赋值相容的前提条件,只有类型相容的变量才可以进行关系运算。只有类型相容的变量才可以进行关系运算。2数组数组当满足下列两个条件之一时,可以认为类型当满足下列两个条件之一时,可以认为类型t1t1和类型和类型t2t2是类型是类型一致的:一致的:t1t1和和t2t2有完全相同的
32、类型标识符。有完全相同的类型标识符。t1t1被声明为与被声明为与t2t2等价的类型。等价的类型。例如下面例如下面3 3种类型是一致的:种类型是一致的:type t1=integer;type t1=integer; t2=integer; t2=integer;t3=t1;t3=t1;t1t1和和t2t2类型一致,是因为它们有完全相同的类型标识符,类型一致,是因为它们有完全相同的类型标识符,t3t3和和t1t1类型一致,是因为类型一致,是因为t3t3被声明与被声明与t1t1等价的类型。等价的类型。注意:下面的两个类型不是一致的,尽管它们的类型描述完全注意:下面的两个类型不是一致的,尽管它们的类
33、型描述完全相同:相同:t1:array1.100 of integer; t1:array1.100 of integer; t2:array1.100 of integer;t2:array1.100 of integer;要使要使t2t2成为与成为与t1t1一致的类型,应该这么写:一致的类型,应该这么写:t1,t2:array1.100 of integer;t1,t2:array1.100 of integer;4、把数组作为过程或函数的形参、把数组作为过程或函数的形参5、开放式数组、开放式数组指数组作为形参传递给过程或函数时,其长度是不确定指数组作为形参传递给过程或函数时,其长度是不确
34、定的,这样在调用这个过程或函数时,可以传递不同长度的数的,这样在调用这个过程或函数时,可以传递不同长度的数组实参。详见组实参。详见p73。2动态数组动态数组v动态数组不必定义数组的长度,而在程序中动态地分配数组动态数组不必定义数组的长度,而在程序中动态地分配数组的存储空间,以便更灵活地使用数组的特性。的存储空间,以便更灵活地使用数组的特性。v一维动态数组一维动态数组声明格式:声明格式:type 类型标识符类型标识符=array of 元素类型元素类型; 如如: type data=array of integer; var bank:data;可见定义时不必声明数组的长度,但在程序中使用动态可
35、见定义时不必声明数组的长度,但在程序中使用动态数组之前,需要调用数组之前,需要调用setlength过程指定:过程指定:setlength(数组变量名,数组元素个数数组变量名,数组元素个数),如,如setlength(bank,30)最需要注意的一点是,动态数组是一个最需要注意的一点是,动态数组是一个零基准数组零基准数组,第,第一个元素的下标应该为一个元素的下标应该为0。v多维动态数组多维动态数组声明格式:声明格式: type 类型标识符类型标识符=array of array of array of 元素类型元素类型; 如:如:type score= array of array of in
36、teger;var fs:score;beginsetlenght(fs,4,7);end;动态数组还允许对每行单独设置长度,即每行的长度可动态数组还允许对每行单独设置长度,即每行的长度可以不等,这也是静态数组做不到的。以不等,这也是静态数组做不到的。如:如: setlenght(fs,4); setlenght(fs0,4); setlenght(fs1,3); setlenght(fs2,10); 2数组数组例:改写教材例题,使之显示九九乘法表。例:改写教材例题,使之显示九九乘法表。2记录类型记录类型在在delphi编程中对于组织和处理成批的数据来说,数组编程中对于组织和处理成批的数据来说
37、,数组是一种十分方便、灵活的数据类型,但数组在使用中有一个是一种十分方便、灵活的数据类型,但数组在使用中有一个基本限制,这就是一个数组中的所有元素都必须具有相同的基本限制,这就是一个数组中的所有元素都必须具有相同的类型。但在实际问题中可能会遇到另一类数据,它是由性质类型。但在实际问题中可能会遇到另一类数据,它是由性质各不相同的成份组成的,即它的各个成份可能具有不同的类各不相同的成份组成的,即它的各个成份可能具有不同的类型。例如,有关一个学生的数据包含下列项目:型。例如,有关一个学生的数据包含下列项目:学号字符串类型学号字符串类型姓名字符串类型姓名字符串类型年龄整型年龄整型性别字符型性别字符型成
38、绩实型数成绩实型数pascal给我们提供了一种叫做给我们提供了一种叫做记录记录的结构类型。在一个的结构类型。在一个记录中,可以包含不同类型的并且互相相关的一些数据。记录中,可以包含不同类型的并且互相相关的一些数据。 v记录类型的定义记录类型的定义记录由一组称为记录由一组称为“域域”的分量组成,每个域可以具有不的分量组成,每个域可以具有不同的类型。同的类型。记录类型定义的一般形式:记录类型定义的一般形式: type 类型标识符类型标识符=record 域名域名1:类型类型1; 域名域名2:类型类型2; : : : : 域名域名n:类型类型n; end; 以上学生的数据可定义为:以上学生的数据可定
39、义为: type studata=record num : string6; name : string8; age : 10.25; sex : char; chinese:real; maths:real; english:real; end;注意:注意: 1、域名也称域变量标识符。在同一个记录类型中,不能有相、域名也称域变量标识符。在同一个记录类型中,不能有相同的域名,但在不同的记录类型中可以有相同的域名(访问同的域名,但在不同的记录类型中可以有相同的域名(访问时须在域名前冠以记录变量名)。时须在域名前冠以记录变量名)。2、各个域的类型可以是简单的数据类型,也可以是数组等构、各个域的类型
40、可以是简单的数据类型,也可以是数组等构造类型。造类型。 如:在定义学生记录前先定义一个数组类型来存放成绩:如:在定义学生记录前先定义一个数组类型来存放成绩: s:array1.3 of real; 用用s1、s2、s3存放一个学生的存放一个学生的chinese、maths 、english成绩。成绩。2记录记录记录类型的定义和变量可合并定义,如:记录类型的定义和变量可合并定义,如:type date=recordtype date=recordyear:1900.1999;year:1900.1999;month:1.12;month:1.12;day:1.31day:1.31end;end;
41、var x:datevar x:date; ;可以合并成可以合并成: :varvar x: record x: recordyear:1900.1999;year:1900.1999;month:1.12;month:1.12;day:1.31day:1.31 endend;不过由于记录类型的描述稍复杂,建议分开声明。不过由于记录类型的描述稍复杂,建议分开声明。2记录记录v记录域的访问记录域的访问记录域的访问有两种方法:直接引用和开域引用。记录域的访问有两种方法:直接引用和开域引用。1、直接引用方式为:、直接引用方式为: 记录变量名记录变量名.域名域名如前面定义的记录如前面定义的记录x,其其3
42、个分量分别为个分量分别为:x.year ,x.month ,x.day。对域变量的赋值可以用。对域变量的赋值可以用read语句或赋值语句或赋值语句:语句: read(x.year,x.month,x.day); x.year:=2003; x.month:=12; x.day:=18;如域类型是数组类型,则引用方式为:如域类型是数组类型,则引用方式为: 记录变量名记录变量名.数组名数组名i for i:=1 to 3 do read(studata.si); 记录域可进行其基类型的各种运算,但记录作为一个整记录域可进行其基类型的各种运算,但记录作为一个整体,只有赋值这一个运算,即把一个记录整体
43、赋给另一个类体,只有赋值这一个运算,即把一个记录整体赋给另一个类型一致的记录。型一致的记录。如:如:var jsj1,jsj2:student;jsj2:=jsj1; /把把jsj1中的记录值赋给中的记录值赋给jsj22、开域引用:、开域引用:开域语句一般形式开域语句一般形式:with do1 1、在、在dodo后的语句中使用后的语句中使用withwith后的记录的域时后的记录的域时, , 只要直接写出只要直接写出域名即可,即可以省略记录变量名和域名即可,即可以省略记录变量名和.。例如:例如:write(input year:);readln(x.yearwrite(input year:);
44、readln(x.year););write(input month:);readln(x.monthwrite(input month:);readln(x.month););write(input day:);readln(x.daywrite(input day:);readln(x.day););可以改写成可以改写成: : (在(在withwith后只使用一个记录变量名)后只使用一个记录变量名)with x dowith x dobeginbeginwrite(input year:);readln(yearwrite(input year:);readln(year););write
45、(input month:);readln(monthwrite(input month:);readln(month););write(input day:);readln(daywrite(input day:);readln(day););end;end;2、当一个记录类型的某个域类型也是记录类型时,即记录的、当一个记录类型的某个域类型也是记录类型时,即记录的嵌套。如嵌套。如 记录定义记录定义 var x:record i:integer; y:record j:0.5; k:real; end; m:realend;如使用如使用with开域语句输入数据,则开域语句输入数据,则:with
46、 x do beginread(i);with y doread(j,k);readln(m);end;或简写为或简写为:with x,y do readln(i,j,k,m);注意,这要求两个记录内的域名不能相同。注意,这要求两个记录内的域名不能相同。v记录与数组记录与数组记录与数组是两种即有区别又有联系的构造类型。记录与数组是两种即有区别又有联系的构造类型。数组中的元素其类型是相同的,但元素的个数在一定范数组中的元素其类型是相同的,但元素的个数在一定范围内是可变的。而记录中的字段可以是不类型,但字段围内是可变的。而记录中的字段可以是不类型,但字段的数量是固定的。的数量是固定的。数组的元素是
47、通过数组变量名加方括号和下标来访问的,数组的元素是通过数组变量名加方括号和下标来访问的,而记录中的字段是通过记录变量名加一个小圆点和字而记录中的字段是通过记录变量名加一个小圆点和字段名来访问的。段名来访问的。在描述复杂的总是时,往往把数组和记录结合起来使用,在描述复杂的总是时,往往把数组和记录结合起来使用,例如一个班级有若干名同学,每个同学的情况用一个例如一个班级有若干名同学,每个同学的情况用一个记录来描述,这就需要构造一个元素类型为记录的数组类型。记录来描述,这就需要构造一个元素类型为记录的数组类型。这就是数据库表的雏型。这就是数据库表的雏型。v记录数组记录数组上面用上面用 var stu:
48、studata; 定义一个记录型变量存放一个定义一个记录型变量存放一个学生的数据,如学生的数据,如 全班学生的数据的处理要用全班学生的数据的处理要用“记录数组记录数组”。 var students:array1.45 of studata; 数组的每个元素数组的每个元素studentsi又都是记录类型。又都是记录类型。 记录数组的引用形式为:记录数组的引用形式为: 数组名数组名i.域名域名 如如: students5.age v变体记录(详见教材)变体记录(详见教材)2指针类型指针类型有些变量在程序运行前已确定必须使用的,我们称为静有些变量在程序运行前已确定必须使用的,我们称为静态变量。还有些
49、变量,只有在程序运行后才能知道是否使用,态变量。还有些变量,只有在程序运行后才能知道是否使用,这样的变量称为动态变量。这样的变量称为动态变量。例如,从文件中读入一批整型数据,只知道数据间用空例如,从文件中读入一批整型数据,只知道数据间用空格分隔,但不知道有多少个。这样如果用数组来存储这些数格分隔,但不知道有多少个。这样如果用数组来存储这些数据,数组定义多大就是一个问题。太少存储不下,太多浪费据,数组定义多大就是一个问题。太少存储不下,太多浪费空间。这就要用到动态变量。在空间。这就要用到动态变量。在pascal中的动态变量不在中的动态变量不在变量说明中出现,而是通过变量说明中出现,而是通过“指针
50、指针”来建立的。来建立的。2指针指针指针是通过地址来访问变量的一种特殊的数据类型,属指针是通过地址来访问变量的一种特殊的数据类型,属于动态的数据结构,它可以在需要时产生,用完后则又可以于动态的数据结构,它可以在需要时产生,用完后则又可以取消或回收,以减少占用的内存空间。指针变量与其他类型取消或回收,以减少占用的内存空间。指针变量与其他类型的变量不同,它占有的不是数据,而是地址。的变量不同,它占有的不是数据,而是地址。由于动态数据结构的变量是在程序执行过程中动态生成由于动态数据结构的变量是在程序执行过程中动态生成的,所以不能预先予以说明,无法预先给这些变量起名字,的,所以不能预先予以说明,无法预
51、先给这些变量起名字,访问时也无法通过名字直接输出或显示,而只能用指针得到访问时也无法通过名字直接输出或显示,而只能用指针得到其地址,然后间接访问。其地址,然后间接访问。声明格式:声明格式: typetype指针类型名指针类型名=基类型;基类型; 其中其中“”为指针符为指针符 varvar变量名变量名1 1,变量名,变量名2 2 :指针类型名;:指针类型名;例如:例如:typetypestudrecstudrec=record=record name : string20;name : string20; score : integerscore : integer; end end; stup
52、tr=studrecstuptr=studrec; varvarp,p1,p2p,p1,p2:stuptrstuptr; ;变量变量p1,p2是指针变量,它存储另一个变量是指针变量,它存储另一个变量学生记学生记录录(studrec)的地址。而学生记录在说明部分只有类型说明,的地址。而学生记录在说明部分只有类型说明,没有变量定义。也就是说,当程序刚开始执行时,学生记录没有变量定义。也就是说,当程序刚开始执行时,学生记录没有占用存储空间。没有占用存储空间。v2、动态变量、动态变量应用一个指针指向动态存储单元即动态变量的形式如下:应用一个指针指向动态存储单元即动态变量的形式如下:指针变量名指针变量名
53、例如:例如:p、q、r指针变量指针变量p和它所指向的动态变量和它所指向的动态变量p之间有如下关系:之间有如下关系: p是指向该动态变量的指针变量名,是指向该动态变量的指针变量名,p则称为动态变量则称为动态变量或标志变量。或标志变量。p的值是的值是p的首地址,的首地址,p的值为与基类型相同的值为与基类型相同的一个值。语句的一个值。语句p:=5;把整数把整数5存放到存放到p所指向的动态变量所指向的动态变量p中;语句中;语句i:=p;把把p所指向的所指向的p中的值赋给整型变量中的值赋给整型变量i。如果指针变量如果指针变量p并未指向任何存储单元,则可用赋值语并未指向任何存储单元,则可用赋值语句:句:p:=nil;其中其中nil是保留字,表示是保留字,表示“空空”(c语言里面用语言里面用null)。)。v对指针的操作对指针的操作指针主要有指针主要有4种用法:建立种用法:建立(new),使用,运算,撤销,使用,运算,撤销(dispose)。1建立建立new(p)在在turob pascal程序中,动态变量不能由程序中,动态变量不能由var直接定义直接定义而是通过调用标准过程而是通过调用标准过程new建立的。过程形式为:建立的。过程形式为:new(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿户外游戏安全教育
- 学前教育课程改革回顾与展望
- 2025河南省企业劳动合同样本
- 2025电子产品买卖贸易合同
- 版2025私人借款合同范本汇编
- 2025合同编码准则
- 现代教职工心理健康教育
- 2025年上海市股权转让合同范本
- 2025物流配送合同模板
- 家乡旅游文化节庆策划方案
- 《工程科学与技术》论文投稿模板
- 精美乒乓球运动活动策划方案PPT
- GB/T 18050-2000潜油电泵电缆试验方法
- GB 7793-2010中小学校教室采光和照明卫生标准
- FZ/T 24011-2019羊绒机织围巾、披肩
- 金螳螂企业管理课件
- 炊事机械安全操作规程
- 最新版教育心理学课件3-成就动机
- 离合器-汽车毕业设计-设计说明书
- 中国民间美术年画-完整版PPT
- 2022年《趣味接力跑》教案
评论
0/150
提交评论