Перейти к основному содержимому

13.10. Не работает многострочный код. Как исправить?

В: Не работает многострочный код. Как исправить?

Пишу такой код:

if яблоки_созрели=1:
"На берёзе созрело несколько яблок."
act "Сорвать яблоко":
яблоко=яблоко+1
"Я сорвал яблоко и положил в консервную банку."
else яблоко>3:
"Мне больше не нужны яблоки"
end
end

Плеер выдаёт ошибку.

О:

Перепутаны назначения ключевых слов, очевидно от того, что вы не понимаете порядка работы оператора условия и оператора, создающего действие.

Многострочная форма записи конструкции условия имеет три вида.

Первый вид, это "простое" условие:

IF [#выражение]:
[команда 1]
[команда 2]
[команда 3]
END

За ключевым словом IF следует выражение [#выражение], и если это выражение верно, плеер выполняет команды в последующих строках после двоеточия до ключевого слова END. Если выражение не верно, эти команды просто игнорируются плеером.

Второй вид, это "сложное" условие. Эта запись позволяет нам задать наборы команд на случай, если выражение верно, и на случай, если выражение неверно:

IF [#выражение]:
[команда 1]
[команда 2]
[команда 3]
ELSE
[команда 4]
[команда 5]
[команда 6]
END

В этом случае, если выражение [#выражение] верно, выполняются команды, записанные в последующих строках после двоеточия и до ключевого слова ELSE. Т.е. команды [команда 1], [команда 2] и [команда 3]. А если выражение [#выражение] не верно, выполняются команды, записанные в последующих строках после ключевого слова ELSE и до ключевого слова END. Т.е. команды [команда 4], [команда 5] и [команда 6]. При этом после ELSE не ставится двоеточие, и указать дополнительное условие проверки нельзя.

Чтобы указать дополнительное условие, предусмотрен третий вид, это "расширенное" условие, и выглядит он так:

IF [#выражение 1]:
[команда 1]
[команда 2]
[команда 3]
ELSEIF [#выражение 2]:
[команда 4]
[команда 5]
[команда 6]
ELSE
[команда 7]
[команда 8]
[команда 9]
END

Теперь мы можем в одну конструкцию уместить несколько условий и для каждого написать свой набор команд. Если верно выражение [#выражение 1], плеер выполнит команды в последующих строках после двоеточия и до первого ELSEIF, т.е. команды [команда 1], [команда 2] и [команда 3]. Все остальные команды в конструкции условия будет проигнорированы.

Однако, если выражение [#выражение 1] неверно, тогда проверяется выражение [#выражение 2], и если оно верно, то выполняются команды в последующих строках до ELSE, т.е. комнады [команда 4], [команда 5] и [команда 6]. И так далее.

Как видно, когда мы пишем ключевое слово ELSEIF, к нему нужно указать и выражение, истинность которого следует проверить, и после выражения поставить двоеточие.

Так выглядят три вида многострочной формы записи конструкции условий, но для многострочной записи действия предусмотрен только один вид.

ACT "Название действия":
[команда 1]
[команда 2]
END

В многострочной форме записи действия нельзя использовать ключевое слово ELSE, или ELSEIF. Они относятся только к конструкциям условий.

Тем не менее можно комбинировать различные конструкции, чтобы добиться правильной работы данного кода:

! открываем общее условие

if яблоки_созрели=1:
! если значение переменной яблоки_созрели равно 1

! выводим на экран текст

"На берёзе созрело несколько яблок."
! выводим на экран соответствующее действие

act "Сорвать яблоко":
! далее следует код действия

! открываем внутри действия условие,

! проверяющее, сколько мы сорвали яблок

if яблоко>3:
! если мы сорвали больше трёх яблок

! выводим текст, что нам больше не нужны яблоки

"Мне больше не нужны яблоки"
else
! иначе, если мы сорвали три или меньше яблок

! увеличиваем число сорванных яблок

яблоко=яблоко+1
! выводим текст, что сорвали ещё яблоко

"Я сорвал яблоко и положил в консервную банку."
! закрываем условие внутри действия

end
! закрываем действие

end
! закрываем общее условие

end

От себя могу порекомендовать комментировать каждую строчку кода, если вы только начали изучать язык QSP. Это поможет более чётко и ясно понимать, как и что работает. Если вы не можете объяснить назначение той или иной строчки кода, то с ней следует разобраться. Она может быть банально лишней, а может вам ещё недостаёт знаний, чтобы правильно её применить.