Pascal 帕斯卡和NSD?

Pascal 帕斯卡和NSD?,pascal,Pascal,我必须用荷兰语做一个编程逻辑作业。我们必须使用Structorizer,然后将其转换/导出为Pascal代码是的,我知道,史前的!但他们说这就像学习拉丁语,如果你学了,你就有了基础 现在,在转换var时,我已经找出了几个bug。但我想问的主要问题是: 如果我在代码中输入STOP where,它会说:Read naam,while循环实际上会继续并打印出下一行:write naam'moet',lidgeld:0:2',euro lidgeld betalen' 而不是因为“停止”而跳出while

我必须用荷兰语做一个编程逻辑作业。我们必须使用Structorizer,然后将其转换/导出为Pascal代码是的,我知道,史前的!但他们说这就像学习拉丁语,如果你学了,你就有了基础

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

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

而不是因为“停止”而跳出while循环并打印出底线

在其他代码中,检查{}并逐步监视它相当容易。但是有了这个密码,我完全迷路了。在读了naam之后,我已经使用了一个IF语句来让“停止”起作用,但它仍然会再次打印出来,写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. 
WHILE…DO循环中的条件是错误的-无论键入什么,这两个条件中至少有一个是真的,并且如果A为真或B为真,则循环将执行,因为A或B为真:

如果您输入stop,那么条件naam'stop'将为true,循环将执行

如果您输入STOP,那么条件naam'STOP'将为true,并且将执行循环

您要做的是以不区分大小写的方式将“STOP”与“STOP”进行比较,这样无论您键入什么-STOP、STOP、STOP、STOP等等-测试都将为真。或者,如果在单词stop上键入除某些变体以外的任何内容,则测试将为FALSE

我知道,史前的

即使是史前语言,许多编程语言仍然需要从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幼儿园、Geef het jaarinkomen加入


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

谢谢您的帮助,但问题仍未解决。我想这与我的.nsd结构有关,我帮不了你;我熟悉原始帕斯卡语。但是如果你能保证你会键入STOP或STOP,只要在你的WHILE上改变or的条件…做循环到AND。我做了,但没有做任何改变。让我问另一个问题,可能会帮助我,因为你有帕斯卡的经验。在循环内部有一个readlnaam;如果我在程序中输入stop。通常,while循环检查readlnnaam;对于“停止”否?WHILE…DO循环在循环的每次迭代中仅在开始时检查一次。所以,如果READLN。。。在它后面有代码,在它和循环的BEGIN…end块的末尾之间,该代码将被执行,而不管提供给READLN…的值是多少。。。。只有在循环的下一次迭代开始时,才会再次检查该条件,并且在该点上,如果条件的计算结果为FALSE,则循环将终止。我发现了这一点。你不区分大小写的方式是对的。structorizer的编译器将Nassi-Shneiderman图表编译成Pascal代码,在这个问题上犯了一些错误。我比较了这些值,现在它起作用了。非常感谢你!与其说Pascal代码是错的,还不如说它是错的。它使用Structorizer编译器将NSD转换为Pascal/Delphi代码。我遵循了您的第一行代码,它与不区分大小写的方式有关。你最后一行的情况是正确的,尽管人们不再那么多地使用它肯定是有原因的。但我不是专家,我当然不想卷入宗教战争。@Sebastiaan好吧:你问题中的代码正是你所抱怨的。更正代码,程序将执行您想要的操作。关于区分大小写,在区分大小写时,停止都是不同的,而在非区分大小写时,停止都是相同的。我建议的测试是区分大小写的。如果您愿意,您可以写If lowercasenaam='stop',然后break;不区分大小写,它还将捕获StoP。由于pascal现在很少使用,这就是为什么我写了许多程序员必须学习它的原因。但我和你一样,不想发动宗教战争。@Sebastiaan我看了你贴的照片。测试“停止”或“停止”已经存在。这是原罪…:-让我这么说吧:我喜欢任何语言的编程。但我还有很多东西要学-