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

Initialization of field in array of records (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;

当我输入有关第一个人的信息时,它工作正常,但随后跳过其他每个人的姓名输入(输出是“姓名?性别?”)。如果我切换输入布尔值和字符串,代码工作正常,但事实并非如此一个逻辑顺序。 为什么会这样?

在循环结束时,您应该将记录分配给数组。请注意,与 类 不同,分配记录 复制 记录中的数据,它不会 引用 记录。因此,与其拥有,不如做:

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 中的数据被复制到 table 中。无需在循环开始时从 table 复制 R,因为 table 无论如何都是空的。

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

  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