Z

开发计算器

终于可以用jack这门“相对”高级的语言写代码了,它是nand2tetris中的高级语言,具有与现在市面上高级语言类似的语法,同时它还是面向对象的,但与主流语言相比还是很简陋的。

作为课程实验性质语言,开发、调试过程都特别麻烦,只能依赖VMEmulator运行,调试只能用print。即使如此,我还是用它开发了一个简单的计算器,可以进行包含计算优先级的四则运算。

程序welcome界面,好像有点vim内味儿了。

计算界面。

代码放在 Github

逻辑上其实很简单,获取用户输入、分析算式、计算就可以了,但受限于jack的语法及库,带来了很多额外的工作量。

首先jack接收用户输入只能获取到单个字符,要存起来,首先得写一个双向链表,jack默认只有定长的array,所以自己的链表是必不可少的,代码在这里。链表存储了用户输入的字符序列,接着我们得将连续的数字字符组合成数字,例如["1", "2"]将会变成数字12。

现在我们已经有了用户输入的数字与加减乘除的操作符了,他们存储在一个链表里,例如["12", "+", "2", "*", "3"]。如果是波兰或逆波兰表达式,我们可以直接把链表当成栈来处理,但这里我们只要求用户输入普通的四则运算表达式即可,那么可以使用Dijkstra双栈四则运算即可,也就是一个操作数栈,一个操作符栈,每次从操作符栈pop一个元素时,就从操作数栈pop两个元素,将其按照四则规则运算,再将结果push回操作数栈,直到操作符栈为空,此时操作数栈只有一个元素,就是最终的计算结果。

要区分计算优先级,则可以进行两次遍历,第一次只处理乘除操作符及其操作数,第二次则处理剩下的,如此就能实现带有优先级的四则运算了。