我想出了TI-BASIC中用于我的计算器的解释器。但是,我对使用所有四个变量
ABCD
感到内gui。我想知道是否有更好的方法?也许带有列表(数组)。我刚刚开始了解它们,所以我还没有信心进行切换。任何指导将不胜感激。此外,为了不将任何东西推送到屏幕上,直到有东西掉到栈外,我不得不将变量初始化为
-2
。这是我尚未转换为数组的主要原因。我看不到他们如何解决这个问题。 (甚至可能引发DOMAIN
错误)。:ClrHome
:Disp "FISHSTACKS IDSP","INTERPRETER"
:0->I
:-2->A
:A->B
:B->C
:C->D
:Input Str1
:While I<length(Str1)
:I+1->I
:sub(Str1,I,1)->Str2
:If Str2="I"
:A+1->A
:If Str2="D"
:A-1->A
:If Str2="S"
:A^2->A
:If Str2="P" and D>-1
:Then
:Disp D
:C->D
:B->C
:A->B
:0->A
:End
:If A=256 or A=-1
:0->A
:If A=-2
:Stop
:End
按照惯例,我用
STO→
代表了→
字符->
#1 楼
@Timtech要求我加入+发布改进。使用数组更容易理解,并且有太多的优化使我决定完全重写代码。我肯定可以通过像我这样的其他高级程序员来改善它,因为我在这里使用了几个长表达式...请注意,L1
代表列表#1(计算器上的2nd
+ 1
),而~
是负标记。 br /> :ClrHome
:Disp "FISHSTACKS IDSP","INTERPRETER
:DelVar IInput Str1
:DelVar L1~{2,2,2,2→L1
:While I<length(Str1
:I+1→I
:sub(Str1,I,1→Str2
:(Str2="I")-(Str2="D
:Ans+L1(4→L1(4
:If Str2="S
:L1(4)²→L1(4
:If Str2="P
:Then
:L1(1
:If 2+Ans
:Disp Ans
:ΔList(cumSum(L1->L1
:0->L1(4
:End
:L1(4
:If Ans=256 or Ans<0
:0->L1(4
:End
改进
通过删除一些不需要的结尾括号和引号来保存字节
使用了
DelVar
,因为它不需要随后的冒号使用数组而不是四个变量
使用复杂的表达式
:(Str2="I")-(Str2="D
保存到Ans
以节省空间使用
ΔList(cumSum(L1->L1
得到L1
减去其第一个元素其他几个我由于他们的小巧而没有上市;主要使用
Ans
来节省空间和速度#2 楼
除了您已经知道的错误名称之外,我还看到了一些可以改进的地方。str1
和str2
也是错误的变量名称。它们应该分别是str
和chr
。这些名称将正确表示数据,并使此代码更易于理解。对任何查看代码的人来说,您在用户输入的字符串的每个字符中循环浏览都将立即清楚。这部分代码没有意义。
:If Str2="P" and D>-1
:Then
:Disp D
:C->D
:B->C
:A->C
:0->A
:End
译成“普通”基本语言,看起来像这样。
If char = "P" And d > -1 Then
Print d
d = c
c = b
c = a
a = 0
End If
显而易见,您只需要对
c
进行一次分配。:If Str2="P" and D>-1
:Then
:Disp D
:C->D
:A->C
:0->A
:End
我在这里可以看到的另一个改进是,我认为这很有意义在这里使用For循环而不是While循环。这样,您不必在循环的每次迭代中手动增加
I
。这会使这个小程序更干净。评论
\ $ \ begingroup \ $
不幸的是,您似乎不熟悉该语言。除了抓错字之外,真的没有任何改善。字符串无法重命名,For(循环占用更多空间,依此类推。
\ $ \ endgroup \ $
– Timtech
2014年12月16日19:34
\ $ \ begingroup \ $
tibasicdev.wikidot.com/for
\ $ \ endgroup \ $
– Timtech
2014年12月16日19:38在
\ $ \ begingroup \ $
我也是这样!赏金又开放了一个星期,所以也许有人在这里引起注意。 =)
\ $ \ endgroup \ $
–RubberDuck
2014年12月16日19:46在
\ $ \ begingroup \ $
是的,我的一位朋友说他现在正在写一个。
\ $ \ endgroup \ $
– Timtech
2014年12月16日19:48在
\ $ \ begingroup \ $
好吧,关于字符串名称的评论仍然没有意义:您不能在TI-BASIC中命名变量。有一串名为Str1,Str2,Str3 ...的字符串变量,您对此无能为力。您必须使用这些神秘名称。
\ $ \ endgroup \ $
–莫文
2014年12月19日下午0:29
#3 楼
:ClrHome
:Disp "FISHSTACKS IDSP","INTERPRETER"
:-{2,2,2,0->L1
:Input Str1
:For(I,1,length(Str1
:sub(Str1,I,1
:If Ans≠"P"
:Then
:(Ans="I")-(Ans="D")+L1(4)^int(e^(Ans="S"->L1(4
:If Ans≥0 and Ans≠256
:Else
:L1(1
:If 2+Ans
:Disp Ans
:augment(ΔList(cumSum(L1)),{0->L1
:End
:End
我可以通过组合一些表达式,更早地移动溢出检查以利用Ans,将L1设置为更少的字节,使用For循环以及其他几个方法,来进一步缩短FlyAwayBirdie的答案。东西。此外,我将变量初始化为-1而不是-2,除了初始累加器按照规范从0开始。
您可以删除行尾的右引号。
编辑:通过不将子字符串保存到Str2,节省了更多的字节。但是,未定义的命令现在将被识别为“ P”。
评论
\ $ \ begingroup \ $
太好了!通常,当他发布信息时,很难对其进行改进:P
\ $ \ endgroup \ $
– Timtech
15年5月25日在1:07
评论
\ $ \ begingroup \ $
哇,太好了,很高兴您能做到!入住愉快。
\ $ \ endgroup \ $
– Timtech
2014年12月16日20:05
\ $ \ begingroup \ $
感谢@Timtech,只要有时间,我可能会在不久的将来回答您的其他问题。
\ $ \ endgroup \ $
–FlyAwayBirdie
2014年12月16日20:07
\ $ \ begingroup \ $
欢迎使用代码审查!
\ $ \ endgroup \ $
–RubberDuck
2014年12月17日在2:09
\ $ \ begingroup \ $
哈哈,那个很好的老TI-BASIC,其中不关闭括号和字符串是常态:D
\ $ \ endgroup \ $
–莫文
2014年12月19日,0:26