Pascal 和 NSD?

Pascal and NSDs?

我必须为编程逻辑分配作业(荷兰语)。我们必须使用 Structorizer 然后 convert/export 将其转化为 Pascal 代码(是的,我知道,史前!但他们说这就像学习 "latin",如果你学习它,你就像一个基础。)

现在,我在转换 var 时已经不得不找出几个错误。但我想问的主要问题是:

如果我输入 STOP(在代码中说:Read naam),while 循环实际上会继续并打印出下一行:write naam 'moet', lidgeld:0:2, 'euro lidgeld betalen .'

而不是因为 'STOP' 而跳出 while 循环并打印出最后几行?

在其他代码中,检查 {} 并逐步监控它相当容易。但是在这里,有了这段代码,我完全迷路了。在 read naam 之后我已经使用了一个 IF 语句来使 'stop' 工作,但它仍然再次打印出来 write naam 'moet', lidgeld:0:2, 'euro lidgeld betalen.'

帕斯卡代码:

    { Generated by Structorizer 3.26-05 }
program Vereniging;

var
  { TODO: check and accomplish variable declarations }

  leeftijd: integer ; kinderen : integer ; leden : integer ; inkomen : real ; totaal : real ; lidgeld : real ; gemiddelde : real ; naam : string;


begin
  lidgeld := 0;
  leden := 0;
  totaal := 0;
  gemiddelde := 0;
  writeln('Geef naam en voornaam in: ');
  readln(naam);
  writeln;
  writeln('Geef de leeftijd in: ');
  readln(leeftijd);
  writeln;
  writeln('Geef het aantal kinderen ten laste in: ');
  readln(kinderen);
  writeln;
  writeln('Geef het jaarinkomen in: ');
  readln(inkomen);
  while (naam <> 'stop') or (naam <> 'STOP') do
  begin
    lidgeld := 10;
    if (leeftijd > 50) then
    begin
      lidgeld := lidgeld - 2;
      leden := leden + 1;
      totaal := totaal + lidgeld;
      gemiddelde := totaal / leden;
    end;
    if (kinderen > 0) and (kinderen < 6) then
    begin
      lidgeld := lidgeld - kinderen;
      leden := leden + 1;
      totaal := totaal + lidgeld;
      gemiddelde := totaal / leden;
    end
    else
    begin
      lidgeld := lidgeld - 5;
      leden := leden + 1;
      totaal := totaal + lidgeld;
      gemiddelde := totaal / leden;
    end;
    if (inkomen < 12500) then
    begin
      lidgeld := lidgeld - 2.5;
      leden := leden + 1;
      totaal := totaal + lidgeld;
      gemiddelde := totaal / leden;
    end;
    if (leeftijd > 50) and (kinderen >= 5) and (inkomen < 12500) then
    begin
      lidgeld := lidgeld - 8.5;
      leden := leden + 1;
      totaal := totaal + lidgeld;
      gemiddelde := totaal / leden;
    end;
    writeln;
    writeln(naam, ' moet ', lidgeld:0:2, ' euro lidgeld betalen.');
    writeln;
    writeln('Geef naam en voornaam in: ');
    readln(naam);
    writeln;
    writeln('Geef de leeftijd in: ');
    readln(leeftijd);
    writeln;
    writeln('Geef het aantal kinderen ten laste in: ');
    readln(kinderen);
    writeln;
    writeln('Geef het jaarinkomen in: ');
    readln(inkomen);
    writeln;
  end;
  writeln;
  writeln('Het totaal aantal leden : ', leden);
  writeln;
  writeln('Het totaal aantal lidgeld : ', totaal:0:2, ' euro.');
  writeln;
  writeln('Het gemiddelde : ', gemiddelde:0:2, ' euro.');
  writeln;
  writeln('Druk op <ENTER> om het programma af te sluiten');
  readln();
end. 

NSD picture

您的 WHILE...DO 循环条件是错误的 - 无论您输入什么,这两个条件中至少有一个 为真,并且循环将执行(因为 A OR BTRUE if either A is TRUE or BTRUE):

如果输入stop,则条件(naam <> 'STOP')为真,循环将执行。

如果输入STOP,则条件(naam <> 'stop')为真,循环将执行。

您要做的是以 不区分大小写 的方式与 'STOP' 进行比较,这样无论您键入什么 - STOPstopStopStOp 等 - 测试将是 TRUE。或者,如果您输入的不是单词 stop 的某些变体,则测试将是 FALSE.

I know, prehistoric...

即使是史前时代,很多编程语言仍然要向pascal学习一些东西。还有很多程序员。

如果你真的想要这样,在输入 "STOP" 回复程序提示 "Geef naam en voornaam in: " 后,程序停止提问,那么你必须添加以下行:

if (naam='stop') or (naam='STOP') then break;

正好 在你编程的这一行之后:

readln(naam);

否则,如前一个答案所说,你必须像这样更改循环序言:

while (naam<>'stop') AND (naam<>'STOP') do begin...

但这不会阻止程序继续请求 "Geef de leeftijd", "Geef het aantal kinderen", “Geef het jaarinkomen ”。

清楚了吗?您问题中描述的主要错误是您对编程的理解,而不是 pascal 语言。