Повторное вычисление или сохранение логического значения в необработанной форме в программе TI-BASIC

Я передаю логическое выражение в терминах некоторой переменной I в программу на TI-BASIC, которая манипулирует I, но логическое выражение вычисляется только один раз — в начале выполнения программы.

Вот пример программы:

Prompt J
0 -> I

Lbl 1
1 + I -> I
Disp I

If J
Then
Goto 2

Else
Goto 1
End

Lbl 2
End

(Это не та программа, которую я пишу, она более сложна и, следовательно, не может использовать цикл for; приведенную выше программу, очевидно, можно было бы написать более элегантно с помощью цикла for.)

Увеличиваем I на 1, начиная с числа 0. После каждого приращения проверяем, верно ли J, и если да, то останавливаемся.

Если я пропущу J=I≠5, программа остановится после печати 1.

Если я пройду в J=I=5, результат не ожидается. Я хочу, чтобы программа останавливалась, когда I=5 истинно, но вместо этого программа продолжается бесконечно. Это означает, что J оценивается только в начале программы.

Можно ли пересчитывать J при каждом выполнении этого цикла?


Я предполагаю, что J заменяется на 0 и 1, как только он передается. Перефразируя мой вопрос, можно ли вводить/сохранять логическое выражение как неоцененную строку/литерал? Тогда я бы просто вызвал что-то вроде eval(J) внутри программы.


person Maxim Zaslavsky    schedule 03.12.2012    source источник


Ответы (3)


Предположение в вашем обновлении верно; J заменяется числовым значением.

Ответ на ваш перефразированный вопрос: да, вы можете передать выражение, но вам нужно использовать функциональную переменную вместо реальной переменной:

Prompt Y1

Всякий раз, когда вызывается Y1, он будет переоценивать, поэтому, если вы сохраните I=5 в Y1, тогда Y1 вернет 0, когда I ≠ 5, и 1, когда I = 5.

person Vaelus    schedule 02.05.2014

DelVar IPrompt J

Да, я хотел не ставить там новую строку. Вам это не нужно. Поверьте мне.

While not(J
I+1->I
Disp I
End

Это ваша программа, оптимизированная. Ваша проблема в том, что J никогда не меняется после вашего исходного приглашения, поэтому цикл будет продолжаться вечно. Да, вы можете переоценивать J на ​​каждой итерации, но вам действительно нужно СДЕЛАТЬ это, если вы хотите, чтобы ваша программа работала.

person Roguebantha    schedule 18.06.2013

Я не знаю, почему вы используете здесь циклы Lbl/Goto; Я бы посоветовал, если цикл For не работает для вас, попробуйте вместо этого использовать циклы While или Repeat. Они аккуратнее и быстрее.

Помимо этого,

Вы увеличиваете I на 1 и каждый раз проверяете J≠0. I и J — совершенно разные переменные, и они не будут взаимодействовать друг с другом, пока вы не заставите их взаимодействовать. Если ваш начальный ввод J=0, то программа будет работать вечно.

Я намереваюсь, чтобы программа остановилась, когда I=5 истинно, но вместо этого программа продолжается бесконечно.

Но в коде нет ничего, что бы проверяло I=5. Вы должны поставить где-нибудь If I=5, если хотите, чтобы это произошло.

Можно ли пересчитывать J при каждом выполнении этого цикла?

Да, но вам нужно вручную указать калькулятору сделать это.

Я предполагаю, что J заменяется на 0 и 1, как только он передается.

Это не вариант. Скорее, If J в вашем коде выведет ЛОЖЬ, если J=0, и ИСТИНА для любого другого значения J.

Кроме того, вам не нужен End в конце вашей программы; в TI-BASIC команда End указывает конец блоков кода, таких как If:Then условные операторы и For/While/Repeat циклы.

Я предлагаю вам прочитать здесь: http://tibasicdev.wikidot.com

person user3932000    schedule 02.12.2014