我有一个小代码,我想按字段初始化记录数组,然后在屏幕上输出该记录。
数据类型:
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?”。)如果我切换为输入布尔值和字符串,则代码可以正确运行,但这不是逻辑订购。 为什么会这样?
答案 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
。