计算器第二步-------计算(+ - * /) (第四次作业)

计算器第二步-------计算(+ - * /)

项目源文件地址: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。(尤其欢迎泡犇犇)
posted @ 2016-04-03 16:16  Starset  阅读(430)  评论(36编辑  收藏  举报