记录类型

[复制链接]
发表于 2023-12-30 10:12:43 | 显示全部楼层 |阅读模式
记录类型
  在程序中对于组织和处理大批量的数据来说,数组是一种十分方便而又灵活的工具,但是数组在使用中有一个基本限制,这就是:一个数组中的所有元素都必须具有相同的类型。但在实际问题中可能会遇到另一类数据,它是由性质各不相同的成份组成的,即它的各个成 份可能具有不同的类型。例如,有关一个学生的数据包含下列项目:
     学号  字符串类型
     姓名  字符串类型
     年龄  整型
     性别  字符型
     成绩  实型数组
  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.

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表