i信息学奥赛

加入QQ群:1025629106,或关注微信公众号:i信息学奥赛,获取更多学习资源。

导航

记录

Posted on 2016-12-10 17:00  shnoip  阅读(264)  评论(0编辑  收藏  举报
为反映现实世界对象的数据信息,将反映该对象各方面属性的数据值列表是最通用的方法。
 
例如:一个简化了的学生信息可能包括以下项目:
姓名(name):
学号(number):
性别(sex):
年级(class):
地址(address):
 
描述学生各项信息的数据结构显然是不完全相同的,不能用数组来描述一个学生的全部信息,但可用记录类型描述如下:
type
  stype=record
    name : string[20];
    number : integer;
    sex : (name,female);
    class : integer;
    address : string[30];
  end;
 
由上看出,定义记录类型的一般形式为:
记录类型名=record
  域名1 : 类型1;
  域名2 : 类型2;
  ……
  域名n : 类型n;
end;
 
域为记录类型的元素,记录的每个域都有名称,不同域的数据类型可以不相同,这一点是数组所不能及的,因为数组的元素不单独命名,所有元素的数据类型都相同。
 
引用记录变量的元素采用以下标记法:
1、直接引用
形式为:记录变量名.域名
 
例如:var str1,str2:stype; {stype前面已定义}
则str1.name表示学生str1的名字,str2.sex表示学生str2的性别
 
2、开域语句
形式为:with 记录变量名 do 语句;
 
在with语句中,引用记录变量的各个域不再冠以记录变量名,以简化引用时的写法。例如为描述100个学生的数据信息,引入元素类型为stype的数组students,下面是一段统计一年级男生人数和女生人数的程序。
var
  students:array[1..100] fo stype;
  mc,fc,k:integer;  {mc:男生人数,fc:女生人数}
begin
  mc:=0;fc:=0;
  for k:=1 to 100 do
    with students[k] do
      if class="1" then
        if sex=male then mc:=mc+1
                    else fc:=fc+1;
end.
 
由此可见,记录可以方便地用来描述复杂个体的数据特性,当处理同一类这样的个体时,常用记录数组。
 
由于可以引用记录变量的某个域,所以可以对记录变量赋值,例如:
with str1 do begin
  name:='wang';
  number:=100;
  sex:=male;
  address:='Peking';
end;
 
两个类型相同的记录变量之间也可以赋值。例如:
str2:=str1;
将记录变量str1的每个域值赋给同类型记录变量str2的相应域,即等价于下面的语句:
str2.name:=str1.name;
str2.number:=str1.number;
str2.sex:=str1.sex;
str2.address:=str1.address;
 
记录常量可以通过常量说明语句
const
  记录常量名:类型名=(域名1:域值1;……域名m:域值m;);来指定每一个域的标识符和值,这些标识符和值用括号括起来,并用分号分开。
例如:
type
  point=record
    x,y:real;
  end;
const
  origin:point=(x:0.0;y:0.0);
上例有两个部分组成:type用来定义point是一个记录类型(record),它包含两个域x、y,且x、y是实数类型。第二部分由const定义一个名叫origin的记录常量,它具有point类型的结构,且域x、y分别被赋初值0.0。
 
例1:输入N个学生的记录(N由键盘读入),每项记录包含编号、姓名、性别、年龄和成绩五项,按成绩排序后从高到低地个输出。
 
type
  stype=record
    num : integer;
    name : string[10];
    sex : char;
    age : 5..30;
    score : byte;
  end;
var
  students:array[1..50] of stype;
  temp:stype;
  i,j,n:byte;
begin
  write('Input N=');readln(n);
  writeln('Input records:');
  for i:=1 to n do 
    with student[i] do begin
      writeln('No.',i,':');
      write('Number: ');readln(num);
      write('Name: ');readln(name);
      write('Sex(m/f): ');readln(sex);
      write('Age: ');readln(age);
      write('Score: ');readln(score);
    end;
  for i:=1 to n-1 do
    for j:=i+1 to n do
      if students[i].score<students[j].score then begin
        temp:=students[i];students[i]=students[j];students[j]:=temp;
      end;
  writeln('No.':10,'Name':10,'Sex':10,'Age':10,'Score':10,);
  for i:=1 to n do
    with students[i] do begin
      write(num:10,name:10);
      if sex='m' then write('Male':10)
                 else write('Female':10);
      writeln(age:10,score:10);
    end;
end.
 
例2:编制一个模拟发扑克牌的程序,将一付去掉大、小怪的扑克牌随机排列后,分发给四个人。(用C表示梅花、用D表示方块、用H表示红桃、用S表示黑桃,红桃K用H13表示,梅花5用C5表示,其余类推)
 
const
  d:string[4]='CDHS';
type
  atype=record
    style:char;
    pip:byte;
  end;
var
  a:array[1..52] of atype;
  b:array[1..4,1..13] of boolean;
  i,j,x,y:byte;
begin
  randomize;
  fillchar(b,sizeof(b),true);
  for i:=1 to 52 do begin
    repeat
      x:=random(4)+1;
      y:=random(13)+1;
    until b[x,y];
    b[x,y]:=false;
    a[i].style:=d[x];
    a[i].pip:=y;
  end;
  for i:=1 to 4 do begin
    write('No',i,' : ');
    j:=i;
    repeat
      write(a[j].style,a[j].pip,' ');
      j:=j+4;
    until j>52;
    writeln;
  end;
end.
 
作业:
1、改进例题2,牌到手以后理一下牌。