0

我正在用 Karel 编写一个程序,它基本上是用于 Fanuc 机器人的 Pascal 加上运动命令。我的代码有效,包括使用 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 循环,我必须再次添加相同的东西。

任何帮助将不胜感激!

4

2 回答 2

0

汤姆关于“去”是对的。应该不惜一切代价避免它。

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

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
于 2020-02-24T22:24:46.560 回答
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

于 2019-05-22T19:30:57.983 回答