记录类型 在程序中对于组织和处理大批量的数据来说,数组是一种十分方便而又灵活的工具,但是数组在使用中有一个基本限制,这就是:一个数组中的所有元素都必须具有相同的类型。但在实际问题中可能会遇到另一类数据,它是由性质各不相同的成份组成的,即它的各个成 份可能具有不同的类型。例如,有关一个学生的数据包含下列项目: 学号 字符串类型 姓名 字符串类型 年龄 整型 性别 字符型 成绩 实型数组 Pascal给我们提供了一种叫做记录的结构类型;在一个记录中,可以包含不同类型的并且互相相关的一些数据。 (一)记录类型的定义 在pascal中,记录由一组称为“域”的分量组成,每个域可以具有不同的类型,记录类型定义的一般形式: record <域名1>:<类型1>; <域名2>:<类型2>; :: :: <域名n>:<类型n>; end; 说明:①域名也称域变量标识符, 应符合标识符的语法规则;在同一个记录中类型中,各个域不能取相同的名,但在不同的记录类型中,两个类型中的域名 可以相同 ②记录类型的定义和记录变量可以合并为一个定义,如: typedate=record year:1900..1999; month:1..12; day:1..31 end; varx:date; 可以合并成: varx: record year:1900..1999; month:1..12; day:1..31 end; ③对记录的操作,除了可以进行整体赋值, 只能对记录的分量──域变量进行。 ④域变量的表示方法如下: 记录变量名.域名 如前面定义的记录X,其3个分量分别为:x.year;x.month;x.day ⑤域变量的使用和一般的变量一样, 即域变量是属于什么数据类型,便可以进行那种数据类型所允许的操作。 (二)记录的嵌套 当一个记录类型的某一个域类型也是记录类型的时候,我们说发生了记录的嵌套,看下面的例子: 【例6】某人事登记表可用一个记录表示,其中各项数据具有不同的类型,分别命名一个标识符。而其中的“出生年月日”又包括三项数据,还可以用一个嵌套在内层的记录表示。 具体定义如下: type sexs=(male,female); date=record year:1900..1999; month:1..12; day:1..31; end; personal=record name:string[15]; sex:sexs; birthdate:date; home:string[40]; end; 【例7】设计一个函数比较两个dates日期类型记录变量的迟早。 设函数名、形参及函数类型定义为: AearlyB(A,B:dates):boolean; 函数的形参为两个dates类型的值参数。当函数值为true时表示日期A早于日期B,否则日期A迟于日期B或等于日期B。显然不能对A、B两个记录变量直接进行比较,而要依具体的意义逐域处理。 源程序如下: program ex6_7; type dates=record year:1900.1999; month:1..12; day:1..31 end; var x,y:dates; function AearlyB(A,B:dates):boolean; var earln:boolean; begin early:=false; if(A.year<B.year) then early:=true; if(A.year=B.year)and(A.month<B.month) then early:=true; if(A.year=B.year)and(A.month=B.month)and(A.day<B.day) then early:=true; AearlyB:=early; end;{of AearlyB} begin write("Input DATE X(mm-dd-yy):")readln(X.month,X.day,X.year); write("Input DATE Y(mm-dd-yy):")readln(Y.month,Y.day,Y.year); ifAearlyB(X,Y) then writeln(Date X early!") else writeln("Date X not early!"); end.
|