记录数组中字段的初始化 (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
。
我有一个小代码,我想按字段初始化一个记录数组,然后将这些记录输出到屏幕上。
数据类型:
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
。