记录数组中字段的初始化(Pascal)

时间:2018-10-07 06:54:06

标签: arrays record pascal

我有一个小代码,我想按字段初始化记录数组,然后在屏幕上输出该记录。

数据类型:

type
  grade = 1..5;
  Person = record
    Name: string[16];
    isMale: boolean;
    grades: array [1..6] of grade;
  end;
var
  Table: array [1..10] of Person;
  R: Person;
  N,J,I: Integer;

具有初始化和输出的部分代码:

  readln(n);
  if N>10 then N:=10;    if N<1 then N:=1;
  for I:=1 to N do begin
    R:=Table[I];
    //write('Gender?'); readln(j); R.isMale:=j>=0; <= This works just fine
    write('Name? ');  readln(R.Name);
    write('Gender? '); readln(j);  R.isMale:=j>=0;
    write('Grades? ');  for j:=1 to 6 do read(R.grades[J]);  writeln;
  end;
  for I:=1 to N do begin
    R:=Table[I];
    write(I,' ', R.Name,' ',R.isMale);
  end;

当我输入有关第一人称的信息时,它可以正常工作,但是随后跳过每个其他人的名字输入(输出为“ Name?Gender?”。)如果我切换为输入布尔值和字符串,则代码可以正确运行,但这不是逻辑订购。 为什么会这样?

1 个答案:

答案 0 :(得分:0)

在循环结束时,应将记录分配给数组。请注意,与类不同,为记录分配复制记录中的数据,它不会引用该记录。因此,请执行以下操作:

for I := 1 to N do 
begin
  //write('Gender?'); readln(j); R.isMale:=j>=0; <= This works just fine
  write('Name? ');  
  readln(R.Name);
  write('Gender? '); 
  readln(j);  
  R.isMale := j >= 0;
  write('Grades? ');
  for j := 1 to 5 do 
    read(R.grades[J]);
  readln(R.grades[6]); // readln reads the end-of-line too.
  writeln;
  Table[I] := R; // copy the data from R into the table
end;

这样,记录R中的数据将被复制到表中。循环开始时无需从表中复制R,因为表始终为空。

与类不同,对于类似这样的记录,您也可以执行以下操作:

  write('Name? ');
  readln(Table[I].Name);
  write('Gender? '); 
  readln(j);  
  Table[I].isMale := j >= 0;
  // etc...

在最后一个循环中:

  Writeln(I, ' ', Table[I].Name, ' ', Table[I].IsMale);

完全不使用R