2014-05-21 183 views
-1
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错误的错误数字格式。我以某种方式明白,因为字符符号的问题,但我不知道如何解决它。有人能帮助我吗?从文本文件中读取符号?

回答

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)要求程序读取一个字符,然后是由SPACE分隔的整数。该程序首先读出的炭和将指针移动到位置2,然后知道它是一个空间,以便移动上读取哪个移动指针的下一个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,因为它不是空格。因此,'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. 
0

谢谢您的回答,但我已经发现了烧焦的阅读空间也和我固定它。不知道它是否是最好的方式,但它的工作原理。

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.我尝试过你的方式,但它没有工作,因为在最后一对之后没有空间,程序出错了。但感谢您的帮助类先生:)