Pascal 为什么我的程序不输出所有数据? 程序ZZX1; {$mode objfpc}{$H+} 使用 crt, 温克特, {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} 班级 {您可以在此之后添加单位}; 类型 伪装者=记录 名称,CountyCode:string; 付款方式:不动产; 结束; 变量 申请人:伪装器阵列[1..10]; DemList:字符串的数组[1..10]; BerList:字符串的数组[1..10]; EsqList:字符串的数组[1..10]; x:整数; Y:整数; DemCounter:整数; 计数器:整数; EsqCounter:整数; 德马蒙特:真实; 数量:真实; 埃斯卡蒙特:真实; 程序加载数据; 开始 clrsc; X:=0; DemCounter:=0; 计数器:=0; ESQ计数器:=0; 数据量:=0; 金额:=0; EsqAmount:=0; 重复 X:=X+1; 重复 写('输入您的县代码DemM或BerM或EsqM:'); readln(申请人[x].国家代码); 直到(申请人[x].CountyCode='DemM')或(申请人[x].CountyCode='BerM')或(申请人[x].CountyCode='EsqM'); 如果申请人[x].CountyCode='DemM',则 开始 写('输入您的姓名:'); readln(申请人[x].姓名); 填写('输入您的总付款:'); readln(申请人[x]。付款); clrsc; DemCounter:=DemCounter+1; DemAmount:=DemAmount+申请人[x]。付款; DemList[DemCounter]:=申请人[x]。姓名; 结束; 如果申请人[x].CountyCode='BerM',则 开始 写('输入您的姓名:'); readln(申请人[x].姓名); 填写('输入您的总付款:'); readln(申请人[x]。付款); clrsc; BerCounter:=BerCounter+1; BerAmount:=BerAmount+申请人[x]。付款; BerList[BerCounter]:=申请人[x]。姓名; 结束; 如果申请人[x].CountyCode='EsqM',则 开始 写('输入您的姓名:'); readln(申请人[x].姓名); 填写('输入您的总付款:'); readln(申请人[x]。付款); clrsc; EsqCounter:=EsqCounter+1; EsqAmount:=EsqAmount+申请人[x]。付款; EsqList[EsqCounter]:=申请人[x]。姓名; 结束; 直到x=6; 结束; 程序打印数据; 开始 Y:=0; 对于y:=1到6 do 开始 writeln('Name:',申请人[y].姓名); writeln('CountyCode:',申请人[y]。CountyCode); 书面通知('付款:',申请人[y]。付款:0:2); 书面语; 结束; 对于Y:=1到DemCounter do 开始 书面(德姆利斯特[Y]); 书面记录(DemCounter,,“人员在Demerara登记”); 书面语; writeln('DemTotal:$',DemAmount:0:2); 结束; 对于Y:=1,以进行计数 开始 writeln(BerList[Y]); 书面形式(BerCounter,,“人员在Berbice注册”); 书面语; writeln('BerTotal:$',BerAmount:0:2); 结束; 对于Y:=1到EsqCounter do 开始 writeln(EsqList[Y]); 书面形式(EsqCounter,,“人员在埃塞奎博注册”); 书面语; writeln('EsqTotal:$',EsqAmount:0:2); 结束; 结束; 程序退出; 开始 writeln(“按退出”); readln; 结束; 开始 负荷数据; 打印数据; 退出 结束。

Pascal 为什么我的程序不输出所有数据? 程序ZZX1; {$mode objfpc}{$H+} 使用 crt, 温克特, {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} 班级 {您可以在此之后添加单位}; 类型 伪装者=记录 名称,CountyCode:string; 付款方式:不动产; 结束; 变量 申请人:伪装器阵列[1..10]; DemList:字符串的数组[1..10]; BerList:字符串的数组[1..10]; EsqList:字符串的数组[1..10]; x:整数; Y:整数; DemCounter:整数; 计数器:整数; EsqCounter:整数; 德马蒙特:真实; 数量:真实; 埃斯卡蒙特:真实; 程序加载数据; 开始 clrsc; X:=0; DemCounter:=0; 计数器:=0; ESQ计数器:=0; 数据量:=0; 金额:=0; EsqAmount:=0; 重复 X:=X+1; 重复 写('输入您的县代码DemM或BerM或EsqM:'); readln(申请人[x].国家代码); 直到(申请人[x].CountyCode='DemM')或(申请人[x].CountyCode='BerM')或(申请人[x].CountyCode='EsqM'); 如果申请人[x].CountyCode='DemM',则 开始 写('输入您的姓名:'); readln(申请人[x].姓名); 填写('输入您的总付款:'); readln(申请人[x]。付款); clrsc; DemCounter:=DemCounter+1; DemAmount:=DemAmount+申请人[x]。付款; DemList[DemCounter]:=申请人[x]。姓名; 结束; 如果申请人[x].CountyCode='BerM',则 开始 写('输入您的姓名:'); readln(申请人[x].姓名); 填写('输入您的总付款:'); readln(申请人[x]。付款); clrsc; BerCounter:=BerCounter+1; BerAmount:=BerAmount+申请人[x]。付款; BerList[BerCounter]:=申请人[x]。姓名; 结束; 如果申请人[x].CountyCode='EsqM',则 开始 写('输入您的姓名:'); readln(申请人[x].姓名); 填写('输入您的总付款:'); readln(申请人[x]。付款); clrsc; EsqCounter:=EsqCounter+1; EsqAmount:=EsqAmount+申请人[x]。付款; EsqList[EsqCounter]:=申请人[x]。姓名; 结束; 直到x=6; 结束; 程序打印数据; 开始 Y:=0; 对于y:=1到6 do 开始 writeln('Name:',申请人[y].姓名); writeln('CountyCode:',申请人[y]。CountyCode); 书面通知('付款:',申请人[y]。付款:0:2); 书面语; 结束; 对于Y:=1到DemCounter do 开始 书面(德姆利斯特[Y]); 书面记录(DemCounter,,“人员在Demerara登记”); 书面语; writeln('DemTotal:$',DemAmount:0:2); 结束; 对于Y:=1,以进行计数 开始 writeln(BerList[Y]); 书面形式(BerCounter,,“人员在Berbice注册”); 书面语; writeln('BerTotal:$',BerAmount:0:2); 结束; 对于Y:=1到EsqCounter do 开始 writeln(EsqList[Y]); 书面形式(EsqCounter,,“人员在埃塞奎博注册”); 书面语; writeln('EsqTotal:$',EsqAmount:0:2); 结束; 结束; 程序退出; 开始 writeln(“按退出”); readln; 结束; 开始 负荷数据; 打印数据; 退出 结束。,pascal,output,lazarus,Pascal,Output,Lazarus,该计划目前收集6人,并按其国家代码对他们进行分组,计算每个县收集的总人数和资金。 当我运行程序时,我的预期输出在屏幕上出现几秒钟,然后它消失,只留下预期输出的一部分(结束部分)。请帮忙 当程序到达readln时,如果键盘缓冲区中有字符语句中,readln将读取这些字符并继续,而不是等待进一步的输入再继续 要检查这一点,请尝试将字符变量作为参数添加到readln,并写出字符的ASCII值(或在调试器中检查其值),以查看readln之后该变量中是否有任何内容 (编辑) 经过进一步思考,我想知道代码是

该计划目前收集6人,并按其国家代码对他们进行分组,计算每个县收集的总人数和资金。
当我运行程序时,我的预期输出在屏幕上出现几秒钟,然后它消失,只留下预期输出的一部分(结束部分)。请帮忙

当程序到达
readln时,如果键盘缓冲区中有字符quit
中的code>语句中,
readln
将读取这些字符并继续,而不是等待进一步的输入再继续

要检查这一点,请尝试将字符变量作为参数添加到
readln
,并写出字符的ASCII值(或在调试器中检查其值),以查看
readln
之后该变量中是否有任何内容

(编辑)

经过进一步思考,我想知道代码是否如下:

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.
。。。实际上应该阅读如下内容:

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

。。。因为否则,
EsqCounter
EsqTotal
的相同值将被输出
EsqCounter
次,这似乎是不必要的;两次。现在我不能再模拟了。所有其他的尝试都成功了。不幸的是,我在没有检查反汇编的情况下粗略地使用了调试器,但我知道这是在我使用
DemCounter
迭代器在循环中跳过
PrintData
过程中的行时发生的,其中只有
WriteLn
调用,因此我认为问题将出现在其他地方。当在循环中调用
WriteLn
时,行不知何故从屏幕缓冲区中向上滚动。奇怪……你能建议如何模拟这个问题吗?@TLama:不幸的是,我的电脑上目前没有运行的Pascal编译器,所以我自己无法测试代码。不过,您的评论让我想到了循环,我编辑了我的回答,建议从循环中取出裸
writeln
调用,以及计数器和总值输出,这些似乎都是不必要的重复。谢谢您的编辑部分。我太担心得到全部输出,所以犯了那个愚蠢的错误。我应该注意到,在删除所有CLRSC后,在进行了一些更改后,整个输出被投影到屏幕上,例如如上所述重新构造循环,以及重命名一些变量,例如,
申请人
现在是Reverer,
打印数据
现在是PrintRevererData。由于不确定上述问题的确切原因,我决定使用另一个名为Dev pascal的pascal编译器测试代码。在使用此编译器实现代码后,我没有遇到与使用Lazarus I.D.E.N.B.时出现的屏幕输出相同的问题。我在上文中指出,删除所有
CLRSC
会投影整个输出。我很清楚
For Y:= 1 to EsqCounter do
  begin
    writeln(EsqList[Y]);
  end;
writeln(EsqCounter,'',' persons are registered in Essequibo');
writeln;
writeln('EsqTotal:$ ', EsqAmount:0:2);