帕斯卡和NSD?

时间:2017-05-26 11:23:45

标签: pascal

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

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

如果我键入STOP(在代码中它说:读取naam),为什么while循环实际上继续并打印出下一行:写naam'moet',lidgeld:0:2,'euro lidgeld betalen。'

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

在其他代码中,检查{}并逐步监控它是相当容易的。但是这里有这个代码,我完全迷失了。我在阅读naam之后已经使用了一个IF语句来“停止”工作,但它仍然打印出来再写下naam'moet',lidgeld:0:2,'euro lidgeld betalen。'

Pascal代码:

    { 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

2 个答案:

答案 0 :(得分:1)

WHILE...DO循环上的条件错误 - 无论您输入什么内容,这两个条件中的至少一个都将为真,并且循环将执行(因为{{ 1}} A OR B如果 TRUEA TRUEB):

如果输入TRUE,则条件stop将为真,循环将执行。

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

您想要做的是与不区分大小写的方式中的(naam <> 'stop')进行比较,以便无论您输入什么内容,都可以'STOP'STOPstopStop等 - 测试结果为StOp。或者,如果您在单词TRUE上输入除变体之外的任何内容,则测试将为stop

答案 1 :(得分:0)

  

我知道,史前......

即使是史前,许多编程语言仍然需要从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 in ”。

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