2
program ZZX1;

{$mode objfpc}{$H+}

uses
  crt,
  wincrt,
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this  };
type
  Masquerader = record
    Name, CountyCode: string;
    Payment: real;
   end;
var
  Applicant: array[1..10] of Masquerader;
  DemList: array[1..10] of string;
  BerList: array[1..10] of string;
  EsqList: array[1..10] of string;
  x:integer;
  Y:integer;
  DemCounter:integer;
  BerCounter:integer;
  EsqCounter:integer;
  DemAmount:real;
  BerAmount:real;
  EsqAmount:real;

 procedure LoadData;
 begin
    clrscr;
X:=0;
DemCounter:=0;
BerCounter:=0;
EsqCounter:=0;
DemAmount:=0;
BerAmount:=0;
EsqAmount:=0;
repeat
X:= x+1;
repeat
write('Enter Your County Code DemM or BerM or EsqM: ');
readln(Applicant[x].CountyCode);
until (Applicant[x].CountyCode= 'DemM') or (Applicant[x].CountyCode= 'BerM') or (Applicant[x].CountyCode= 'EsqM');
If Applicant[x].CountyCode = 'DemM' then
  begin
    write('Enter Your Name: ');
    readln(Applicant[x].Name);
    write('Enter Your Total Payment: ');
    readln(Applicant[x].Payment);
    clrscr;
    DemCounter:= DemCounter + 1;
    DemAmount:= DemAmount + Applicant[x].Payment;
    DemList[DemCounter]:= Applicant[x].Name;
  end;
If Applicant[x].CountyCode = 'BerM' then
  begin
    write('Enter Your Name: ');
    readln(Applicant[x].Name);
    write('Enter Your Total Payment: ');
    readln(Applicant[x].Payment);
    clrscr;
    BerCounter:= BerCounter + 1;
    BerAmount:= BerAmount + Applicant[x].Payment;
    BerList[BerCounter]:= Applicant[x].Name;
  end;
If Applicant[x].CountyCode = 'EsqM' then
  begin
    write('Enter Your Name: ');
    readln(Applicant[x].Name);
    write('Enter Your Total Payment: ');
    readln(Applicant[x].Payment);
    clrscr;
    EsqCounter:= EsqCounter + 1;
    EsqAmount:= EsqAmount + Applicant[x].Payment;
    EsqList[EsqCounter]:= Applicant[x].Name;
  end;
until x=6 ;

 end;

Procedure PrintData;
  begin
    Y:= 0;
    for y := 1 to 6 do
    begin
      writeln('Name: ', Applicant[y].Name);
      writeln('CountyCode: ', Applicant[y].CountyCode);
      writeln('Payment: ', Applicant[y].Payment:0:2);
      writeln;
    end;
    For Y:= 1 to DemCounter do
      begin
        writeln(DemList[Y]);
        writeln(DemCounter,'',' persons are registered in Demerara');
        writeln;
        writeln('DemTotal:$ ', DemAmount:0:2);
      end;
    For Y:= 1 to BerCounter do
      begin
        writeln(BerList[Y]);
        writeln(BerCounter,'',' persons are registered in Berbice');
        writeln;
        writeln('BerTotal:$ ', BerAmount:0:2);
      end;
    For Y:= 1 to EsqCounter do
      begin
        writeln(EsqList[Y]);
        writeln(EsqCounter,'',' persons are registered in Essequibo');
        writeln;
        writeln('EsqTotal:$ ', EsqAmount:0:2);
      end;
 end;
Procedure quit;
  begin
    writeln('Press <Enter> To Quit');
    readln;
  end;

begin
  LoadData;
  PrintData;
  quit;
end.

このプログラムは現在、6 人を収集し、郡コードでグループ化し、各郡で収集された人数と金額の合計を計算します。プログラムを実行すると、予想される出力が画面に数秒間表示された後、予想される出力の一部 (最後の部分) だけを残して消えます。手伝ってください。

4

1 に答える 1

2

readln;プログラムがプロシージャ内のステートメントに到達したときにキーボード バッファに文字がある場合quitreadlnはそれらの文字を読み取り、続行する前にさらなる入力を待つのではなく、先に進みます。

これを確認するには、文字変数をパラメーターとして に追加し、文字readlnの ASCII 値を書き込んで (またはデバッガーでその値を確認して)、その変数にreadln.

(編集)

さらに考えてみると、コードは次のようになっているのではないでしょうか。

For Y:= 1 to EsqCounter do
  begin
    writeln(EsqList[Y]);
    writeln(EsqCounter,'',' persons are registered in Essequibo');
    writeln;
    writeln('EsqTotal:$ ', EsqAmount:0:2);
  end;

...実際には次のように読む必要があります。

For Y:= 1 to EsqCounter do
  begin
    writeln(EsqList[Y]);
  end;
writeln(EsqCounter,'',' persons are registered in Essequibo');
writeln;
writeln('EsqTotal:$ ', EsqAmount:0:2);

...そうしないと、との同じ値が出力時間になるEsqCounterため、不要に思われます。EsqTotalEsqCounter

于 2013-03-22T00:41:30.890 に答える