计算器第二步-------计算(+ - * /)
项目源文件地址:Calculator
项目信息:
-
项目名称:Calculator
-
项目版本:1.1
-
项目实现:
*对四则运算表达式进行拆解 *对拆解后的表达式进行简单的错误判定 *对正确的表达式进行计算并输出结果
具体实现
-
对表达式进行拆解
* 对操作符与数字进行区分,尤其是负号和减号的处理要进行特判。再把拆分后的操作符传入队列储存。 特判处理代码详见: [scan.cpp](https://github.com/Mystarset/object-oriented/blob/master/Calculator/scan.cpp)
-
对拆解后的表达式进行简单的错误判定
- 对长度大于10的数字报错
- 对括号不匹配的算术表达进行报错(用栈进行判断)
-
对算术表达式进行计算
-
对原算术表达式加入两个#号,用于判断表达式是否计算结束
-
用一个OprRelation数组来判断操作符与操作符之间的优先级大小关系
-
用两个栈一个储存操作符,另一个储存数字 (用 sstream 函数库把字符转成数字)
-
对栈顶操作符和当前遇到的操作符进行优先级大小判断
- ‘<’ 把当前操作符入栈
- ‘=’ 说明匹配括号,操作符栈顶元素出栈
- ‘>' 取出操作符栈顶元素,以及数字栈的两个元素,进行计算。
-
完成项目的过程
- 这次的代码修改整体并没有遇到什么困难,大部分东西网络上都可以轻松查到,自己加以理解就可以了。
- 我纠结比较久的是负号和减号的处理,我在特判出了负数之后,发现“-()”这种形式的式子还是会存在问题,于是我就在数字栈一开始先入栈了一个0元素以防止出现这种情况时式子计算出错。
- 关于泡犇犇(郑浩晖)在评论的8楼给出的bug,我查看之后发现是负号的处理出现了问题,"()-10"这样的式子之前的代码我会把-和10连在一起看成一个负数,经过修改后把他们分开了。
- 本来只是想考虑比较正常的表达式的。。但是在泡犇犇的带领下,我还是决定多打些代码去处理一些特殊的表达式,于是我就新建了一个Pretreatment的类去专门对一个表达式的格式进行转换,转成我的计算方法能够接受的表达式。从而使我的代码能够成功计算出评论中泡犇犇给出的式子。
- 当然我的代码应该还有BUG,欢迎大家来找出BUG。(尤其欢迎泡犇犇)