尝试通过for循环循环,除非“ i”不在排他列表中

时间:2019-05-22 17:45:20

标签: karel

我正在用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循环,必须再次添加相同的内容。

任何帮助将不胜感激!

2 个答案:

答案 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