我将某个变量I
的布尔表达式传递给操作I
的TI-BASIC程序,但布尔表达式只计算一次 - 在程序执行开始时
以下是一个示例程序:
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)
的内容。
答案 0 :(得分:2)
您的更新中的假设是正确的; J正在被数值取代。
你的改写问题的答案是肯定的,你可以传递一个表达式,但你必须使用函数变量而不是实变量:
Prompt Y1
每当调用Y1
时,它都会重新评估,因此如果您将I=5
存储到Y1
,那么每当I≠5时,Y1
将返回0 I = 5。
答案 1 :(得分:0)
DelVar IPrompt J
是的,我的意思是不要在那里添加换行符。你不需要一个。相信我。
While not(J
I+1->I
Disp I
End
这是您的程序,已经过优化。你的问题是在原始提示之后J永远不会改变,所以循环将永远四处转转。是的,您可以在每次迭代中重新评估J,但如果您希望程序正常工作,则需要实际执行此操作。
答案 2 :(得分:0)
我不知道为什么你在这里使用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
将输出FALSE,而J
的任何其他值则输出为TRUE。
此外,您在程序结束时不需要End
;在TI-BASIC中,End
命令指示代码块的结束,例如If:Then
条件和For
/ While
/ Repeat
循环。
我建议你在这里阅读:http://tibasicdev.wikidot.com