我正在用Karel编写程序,它基本上是Pascal加上Fanuc机器人的运动命令。我的代码有效,包括使用for循环将其循环200次。
现在我想添加一个排除列表,以便使用伪代码” “除非我不在排除列表中,否则我的I = 1至200”
列表为:“数组排除整数[5]” 我的代码是:
for I=1 to 200 DO
FOR j =1 TO 5 DO
IF exclude[j]=i THEN
GO TO end_it
ENDFOR
bunch of code
endit::
ENDFOR
现在我知道为什么我会出现堆栈溢出,我跳出了for循环。但是,我无法提出解决问题的方法。我可以单独检查数组的5个成员,但是我试图使代码简短而优美,特别是因为我有第二个(第三个)for循环,必须再次添加相同的内容。
任何帮助将不胜感激!
答案 0 :(得分:0)
GoTo()
语句通常被视为万恶之源。这似乎是一件方便的事,但它产生的问题比任何人都需要解决的问题更多。实际上,要做的第一件事就是在这里也摆脱它。
在某些Pascal版本中,一种可能性是BREAK
语句,它会跳出循环。如果 KAREL 不支持,即使支持,我认为最好使用另一种循环。您可以改用REPEAT .. UNTIL condition
循环,它自然地提供了循环的有序退出,如下所示:
for I=1 to 200 DO
Excluded := False
j := 0
REPEAT
J := J + 1
IF exclude[j]=i THEN
Excluded := True
UNTIL (J = 5) or Excluded
if not excluded then
begin
bunch of code
end
ENDFOR
这使您可以在REPEAT UNTIL
数组中找到匹配项时立即退出exclude[]
循环。然后测试新的Excluded: boolean
变量,就知道是否运行bunch of code
。
PS。我的代码示例部分使用了Delphi pascal语法,希望您可以对此进行解码。
PS2。出于纯粹的好奇心,我下载了手册KAREL Reference Manual v. 6.3.1
,看着A.6.3 FOR...ENDFOR Statement
的项目符号之一说:切勿在FOR循环中发出GO TO语句。如果GO TO语句导致程序退出FOR循环,则该程序可能会因“运行时堆栈溢出”错误而中止。我想您在其他情况下也将从本手册中受益。
PS3。还请参见上述手册的第4.2.2段,其中也描述了第三种循环-WHILE...ENDWHILE
。
答案 1 :(得分:0)
Tom关于“转到”是正确的。不惜一切代价避免。
如果我正确理解...这是一个简单的解决方案,但实际上并不优雅:
FOR i=1 to 200 DO
FOR j =1 TO 5 DO
IF exclude[j]=i THEN
-- DO nothing, but if you want to break here just set j= 5
ELSE
-- DO a bunch of things here
ENDIF
ENDFOR
ENDFOR