10
Balta B 1 15
Melyna M 2 15
Zalia Z 3 12
Raduona R 4 10
Geltona G 5 10
Violetine V 6 12
Pilka P 7 10
Oranzine O 8 12
Alyvuogiu A 9 12
Juoda J 10 10
3 5
Andrius B 4 P 7 R 4 B 1 V 6
Tomas V 6 A 9 B 6 O 8 P 2
Evelina R 4 P 7 R 4 P 7 B 1
program Spalvotos_korteles;
type Spalvos = record
SPav : string[15]; // SpalvosPavadinimas
SNr, SSk : integer; // SpalvosNumeris, SpalvosSkaicius
SI : char; // SpalvuIndeksas
end;
Mokiniai = record
V : string[15]; // Mokinio vardas
MI : char; // Mokinio istrauktas indeksas
Mnr, TR, NR : integer; // Mokinio uzrasytas numeris TeisingiRasymai, NeteisingiRasymai
end;
Mas = array[1..100] of Spalvos;
Mas1 = array[1..100] of Mokiniai;
Mas2 = array[1..100] of char;
Mas3 = array[1..100] of integer;
var n, Q, MokSk, MokT : integer;
S : Mas;
M : Mas1;
VI : Mas2; // Visi Indeksai
VNr, Istraukta, TeisingiRasymai, Nepanaudota : Mas3; // VNr - Visi Numeriai
procedure Nuskaitymas;
var df : text;
Qq, i, j, z, ii : integer;
begin
Qq:=1;
assign(df,'duom.txt');
reset(df);
readln(df, n);
for i:= 1 to n do
readln(df, S[i].SPav, S[i].SI, S[i].SNr, S[i].SSk);
readln(df, MokSk, MokT);
for j := 1 to MokSk do
begin
read(df,M[j].V);
for z := 1 to MokT do
begin
read(df, M[z].MI, M[z].Mnr);
VI[Qq] := M[z].MI;
VNr[Qq] := M[z].Mnr;
Qq:=Qq+1;
for ii := 1 to n do
if (M[z].MI = S[ii].SI) and (M[z].Mnr = S[ii].SNr) then M[j].TR := M[j].TR+1;
end;
end;
Q:=Qq-1;
close(df);
end;
procedure Uzrasymai_ant_korteliu;
var i, j : integer;
begin
for i:= 1 to n do
begin
for j:= 1 to Q do
begin
if S[i].SI = VI[j] then
Istraukta[i]:=Istraukta[i]+1;
if (S[i].SI = VI[j]) and (S[i].SNr = VNr[j]) then
TeisingiRasymai[i]:= TeisingiRasymai[i]+1;
end;
Nepanaudota[i]:= S[i].SSk - Istraukta[i];
end;
end;
procedure Rezultatas;
var i, j : integer;
Rf : text;
begin
assign(rf,'SpalvuRezultas.Txt');
rewrite(rf);
for i := 1 to MokSk do
writeln(rf,M[i].V, M[i].TR);
writeln(rf);
for j := 1 to n do
writeln(rf,S[j].SPav, Istraukta[j], TeisingiRasymai[j], Nepanaudota[j]);
close(rf);
end;
begin
Nuskaitymas;
Uzrasymai_ant_korteliu;
Rezultatas;
end.
我的目标是阅读最后3条道路并查看符号中有多少数字是正确的(正确的是符号和列中的第一个数字)但是当我尝试阅读时,我得到106错误的数字格式。我以某种方式理解问题是因为char符号,但我不知道如何解决它。有人能帮助我吗?
答案 0 :(得分:0)
主要想法是找出程序如何解释程序中的read
语句。
设ch,ch1,ch2 ......为char和int,int1,int2 ...为整数。
INPUT:
P 1 C 2
执行read(ch, int)
RESULT:
ch = P
int = 1
完美无缺。
让我们将其扩展为阅读四个元素。
INPUT:
P 1 C 2
执行read(ch1, int1, ch2, int2)
RESULT:
ch1 = P
int1 = 1
ch2 = C
int2 = 2
然而,
INPUT:
P 1 C 2
执行read(ch1, int1); read(ch2, int2);
RESULT:
ch1 = P
int1 = 1
ERROR 106 when execute read(ch2, int2);
为什么?
让我们看看下图。
reading ch1
1234567
P 1 C 2
^
第一个读取(ch1,int1)要求程序读取一个char,然后读取一个整数,由SPACE分隔。程序首先读取一个char并将指针移动到位置2,然后知道它是一个SPACE,所以继续读取下一个int,将指针移动到位置3。
reading int1
1234567
P 1 C 2
^
因此它将1读入int1。并将指针移动到下一个位置。然后第一个read
完成。
1234567
P 1 C 2
^
发生了什么?第二个read
将读取位置4上的字符,这是一个空格。它不会发出任何警告,因为它确实是一个角色。之后指针的位置应该在位置5上。
1234567
P 1 C 2
^
程序不会跳过位置5,因为它不是SPACE。因此,' C'被读入int2。作为' C'不是整数,程序发出RUNTIME ERROR 106。
似乎readln(df, S[i].SPav, S[i].SI, S[i].SNr, S[i].SSk);
和read(df,M[j].V);read(df, M[z].MI, M[z].Mnr);
具有相同的逻辑,但在执行中,它们没有。
此外,在您通过readln(df);
读取行中的所有元素后,您必须转到下一行。
仅供参考,以下是经过编辑的代码:
program post;
type
Spalvos = record
SPav: string[15]; // SpalvosPavadinimas
SNr, SSk: integer; // SpalvosNumeris, SpalvosSkaicius
SI: char; // SpalvuIndeksas
end;
Mokiniai = record
V: string[15]; // Mokinio vardas
MI: char; // Mokinio istrauktas indeksas
Mnr, TR, NR: integer;
// Mokinio uzrasytas numeris TeisingiRasymai, NeteisingiRasymai
end;
Mas = array[1..100] of Spalvos;
Mas1 = array[1..100] of Mokiniai;
Mas2 = array[1..100] of char;
Mas3 = array[1..100] of integer;
var
n, Q, MokSk, MokT: integer;
S: Mas;
M: Mas1;
VI: Mas2; // Visi Indeksai
VNr, Istraukta, TeisingiRasymai, Nepanaudota: Mas3; // VNr - Visi Numeriai
temp: char;
procedure Nuskaitymas;
var
df: Text;
Qq, i, j, z, ii: integer;
begin
Qq := 1;
Assign(df, 'duom.txt');
reset(df);
readln(df, n);
for i := 1 to n do
readln(df, S[i].SPav, S[i].SI, S[i].SNr, S[i].SSk);
readln(df, MokSk, MokT);
for j := 1 to MokSk do
begin
Read(df, M[j].V);
for z := 1 to MokT do
begin
Read(df, M[z].MI, M[z].Mnr, temp);
writeln(M[z].MI, M[z].Mnr);
VI[Qq] := M[z].MI;
VNr[Qq] := M[z].Mnr;
Qq := Qq + 1;
for ii := 1 to n do
if (M[z].MI = S[ii].SI) and (M[z].Mnr = S[ii].SNr) then
M[j].TR := M[j].TR + 1;
end;
readln(df);
end;
Q := Qq - 1;
Close(df);
end;
procedure Uzrasymai_ant_korteliu;
var
i, j: integer;
begin
for i := 1 to n do
begin
for j := 1 to Q do
begin
if S[i].SI = VI[j] then
Istraukta[i] := Istraukta[i] + 1;
if (S[i].SI = VI[j]) and (S[i].SNr = VNr[j]) then
TeisingiRasymai[i] := TeisingiRasymai[i] + 1;
end;
Nepanaudota[i] := S[i].SSk - Istraukta[i];
end;
end;
procedure Rezultatas;
var
i, j: integer;
Rf: Text;
begin
Assign(rf, 'SpalvuRezultas.Txt');
rewrite(rf);
for i := 1 to MokSk do
writeln(rf, M[i].V, M[i].TR);
writeln(rf);
for j := 1 to n do
writeln(rf, S[j].SPav, Istraukta[j], TeisingiRasymai[j], Nepanaudota[j]);
Close(rf);
end;
begin
Nuskaitymas;
Uzrasymai_ant_korteliu;
Rezultatas;
end.
答案 1 :(得分:0)
感谢您的回答,但我已经了解了char阅读空间并修复了它。不知道这是否是最好的方式,但它有效。
readln(df, MokSk, MokT);
for j := 1 to MokSk do
begin
read(df,M[j].V);
for z := 1 to MokT-1 do
begin
read(df, MI, Mnr, Tuscias); // M[z].MI P M[z].Mnr O
VI[Qq] := MI;
VNr[Qq] := Mnr;
Qq:=Qq+1;
for ii := 1 to n do
if (MI = S[ii].SI) and (Mnr = S[ii].SNr) then M[j].TR := M[j].TR+1;
end;
read(df, MI, Mnr);
VI[Qq] := MI;
VNr[Qq] := Mnr;
Qq:=Qq+1;
for ii := 1 to n do
if (MI = S[ii].SI) and (Mnr = S[ii].SNr) then M[j].TR := M[j].TR+1;
readln(df);
end;
Andrius B 4 P 7 R 4 B 1 V 6
Tomas V 6 A 9 B 6 O 8 P 2
Evelina R 4 P 7 R 4 P 7 B 1
我不知道其他任何阅读此程序的方法,所以我就是这样做的。
P.S。我之前尝试过你的方式,但它没有工作,因为在最后一对之后没有空间,程序会出错。但谢谢你的帮助,先生:)