尝试遍历 for 循环,除非"i"在排除列表中



我正在Karel编写一个程序,这基本上是Pascal Plus Motion命令的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

现在,我知道为什么我会得到堆栈溢出,我跳出来循环。但是,我无法想出如何解决问题的方法。我可以单独检查数组的5个成员,但是我试图使我的代码保持简短而甜美,尤其是因为我有第二个(第三个(循环,我必须再次添加同一件事。

任何帮助将不胜感激!

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

这使您可以在exclude[]数组中找到匹配时立即退出REPEAT UNTIL循环。然后测试新的Excluded: boolean变量,您知道是否运行bunch of code

ps。我的代码示例使用了部分Delphi Pascal语法,希望您可以确定它。

PS2。仅通过纯粹的好奇心,我下载了一份手册,KAREL Reference Manual v. 6.3.1,看着A.6.3 FOR...ENDFOR Statement的一颗子弹说:永远不要在循环中发表语句。如果转到语句导致该程序退出for循环,则该程序可能会被"运行时间堆栈溢出"错误中止。,我想您也会在其他情况下受益。

PS3。还要查看上述手册第4.2.2段,它也描述了第三种循环-WHILE...ENDWHILE

汤姆对"去"是正确的。应该不惜一切代价避免。

如果我正确理解...这是一个简单的解决方案,但实际上不是优雅:

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

最新更新