【问题标题】:Pascal and NSDs?帕斯卡和 NSD?
【发布时间】:2025-12-23 05:10:11
【问题描述】:

我必须为 Programming Logic 做一个作业(用荷兰语)。我们必须使用 Structizer,然后将其转换/导出为 Pascal 代码(是的,我知道,史前的!但他们说这就像学习“拉丁语”,如果你学会了它,你就有了一个基础。)

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

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

而不是因为'STOP'而跳出while循环并打印出底线?

在其他代码中,检查 {} 并逐步监控它是相当容易的。但是在这里,我完全迷失了这段代码。在 read naam 之后我已经使用了一个 IF 语句来使“停止”工作,但是它仍然再次打印出来 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

【问题讨论】:

    标签: pascal


    【解决方案1】:

    WHILE...DO 循环中的条件错误 - 无论您输入什么,这两个条件中至少有一个为真,并且循环将执行(因为 A OR BTRUE 如果或者 ATRUE 或者 BTRUE):

    如果你输入stop,那么条件(naam &lt;&gt; 'STOP')就会为真,循环就会执行。

    如果您输入STOP,则条件(naam &lt;&gt; 'stop') 为真,循环将执行。

    您要做的是以不区分大小写的方式与'STOP' 进行比较,这样无论您输入什么 - STOPstopStop、@987654336 @ 等 - 测试将是 TRUE。或者,或者,如果您输入的不是 stop 的一些变体,测试将是 FALSE

    【讨论】:

    • 感谢您的帮助,但仍未解决。我认为这与我的 .nsd 结构有关。
    • 我帮不了你;我熟悉的是原始帕斯卡。但是,如果您可以保证输入STOPstop,只需将WHILE...DO 循环条件中的OR 更改为AND
    • 我做了,但没有任何改变。让我问另一个可能对我有帮助的问题,因为您对 Pascal 很有经验。在循环内部有一个 readln(naam);如果我在我的程序中输入停止。通常,while 循环会检查 readln(naam); '停止'不?
    • WHILE...DO 循环在循环的每次迭代中仅在开始时检查一次。因此,如果READLN(...) 后面有代码,在它和循环的BEGIN...END 块的末尾之间,则无论提供给READLN(...) 的值如何,都将执行该代码。只有当循环的下一次迭代开始时,才会再次检查条件,此时,如果条件的计算结果为FALSE,则循环将终止。
    • 我想通了。您对不区分大小写的方式是正确的。将 Nassi-Shneiderman 图编译为 Pascal 代码的构造器编译器在该问题上犯了一些错误。我比较了这些值,现在它可以工作了。非常感谢!
    【解决方案2】:

    我知道,史前……

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

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

    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 in ”。

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

    【讨论】:

    • 不是 Pascal 代码错了。它使用 Structorizer 的编译器将 NSD 转换为 Pascal/Delphi 代码。我跟着你的第一行代码,它与不区分大小写的方式有关。你最后一行的条件是 TRUE 尽管人们不再使用它肯定是有原因的。但我不是专家,我当然不想卷入宗教战争。
    • @Sebastiaan 好吧:您问题中的代码完全符合您的抱怨。更正代码,程序就会做你想做的事。关于区分大小写,“stop”“STOP”“StoP”在区分大小写时都不同,在不区分大小写时都相等。我建议的测试区分大小写。如果你愿意,你可以写if lowercase(naam)='stop' then break;(不区分大小写),它也会捕获“StoP”。由于现在很少使用 pascal,这就是为什么我写了“许多程序员必须学习 [about it]”。但我和你一样,不想挑起宗教战争。
    • @Sebastiaan 我看了你发布的图片。测试&lt;&gt;'stop' OR &lt;&gt;'STOP' 已经存在。这是原罪... :-)
    • 让我这样说:我喜欢用任何语言编程。但我还有很多东西要学;-)