我必须为编程逻辑做一个作业(荷兰语)。我们必须使用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.
答案 0 :(得分:1)
WHILE...DO
循环上的条件错误 - 无论您输入什么内容,这两个条件中的至少一个都将为真,并且循环将执行(因为{{ 1}} A OR B
如果 TRUE
为A
或 TRUE
为B
):
如果输入TRUE
,则条件stop
将为真,循环将执行。
如果您输入(naam <> 'STOP')
,则条件STOP
将为真,并且循环将被执行。
您想要做的是与不区分大小写的方式中的(naam <> 'stop')
进行比较,以便无论您输入什么内容,都可以'STOP'
,STOP
, stop
,Stop
等 - 测试结果为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语言。