Попытка войти в цикл по циклу for, если «i» не находится в списке исключений - PullRequest
0 голосов
/ 22 мая 2019

Я пишу программу в Кареле, которая в основном состоит из команд Pascal и движения для роботов Fanuc.Мой код работает, включая его повторение 200 раз с помощью цикла for.

Теперь я хочу добавить список исключений, поэтому в псевдокоде "" для 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 элементов массива по отдельности, но я стараюсь, чтобы мой код был коротким и приятным, особенно если у меня есть второй (третий) для цикла, где я должен добавить то же самое снова.

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 22 мая 2019

Заявление GoTo() обычно рассматривается как корень всего зла. Это может показаться удобным, но создает больше проблем, чем нужно решать. И действительно, первое, что нужно сделать, это избавиться от этого и здесь.

Одна возможность в некоторых выпусках Паскаля - это выражение 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 одну из пуль, говорит: Никогда не вводите оператор GO TO в цикле FOR. Если оператор GO TO заставляет программу выходить из цикла FOR, программа может быть прервана с ошибкой «Переполнение стека во время выполнения». Полагаю, это руководство будет полезно и в других ситуациях.

PS3. Взгляните также на упомянутое выше руководство, пункт 4.2.2, в котором также описывается третий тип цикла - WHILE...ENDWHILE.

...