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

本文详细介绍了计算器项目的实现过程,包括如何处理四则运算表达式、特殊符号的判定与处理,以及如何通过栈和队列实现计算逻辑。作者还分享了处理特殊表达式的技巧,并邀请读者一起寻找潜在的BUG。

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

项目源文件地址:Calculator


项目信息:

  • 项目名称:Calculator
  • 项目版本:1.1
  • 项目实现:

       *对四则运算表达式进行拆解
       *对拆解后的表达式进行简单的错误判定
       *对正确的表达式进行计算并输出结果

具体实现

  • 对表达式进行拆解

    * 对操作符与数字进行区分,尤其是负号和减号的处理要进行特判。再把拆分后的操作符传入队列储存。
    
      特判处理代码详见: [scan.cpp](https://github.com/Mystarset/object-oriented/blob/master/Calculator/scan.cpp)
  • 对拆解后的表达式进行简单的错误判定

    • 对长度大于10的数字报错
    • 对括号不匹配的算术表达进行报错(用栈进行判断)
  • 对算术表达式进行计算

    • 对原算术表达式加入两个#号,用于判断表达式是否计算结束

    • 用一个OprRelation数组来判断操作符与操作符之间的优先级大小关系
      885624-20160404132636312-1105484016.png

    • 用两个栈一个储存操作符,另一个储存数字 (用 sstream 函数库把字符转成数字)
      885624-20160403162751269-993260749.png

    • 对栈顶操作符和当前遇到的操作符进行优先级大小判断

      • ‘<’ 把当前操作符入栈
      • ‘=’ 说明匹配括号,操作符栈顶元素出栈
      • ‘>' 取出操作符栈顶元素,以及数字栈的两个元素,进行计算。

完成项目的过程

  • 这次的代码修改整体并没有遇到什么困难,大部分东西网络上都可以轻松查到,自己加以理解就可以了。
  • 我纠结比较久的是负号和减号的处理,我在特判出了负数之后,发现“-()”这种形式的式子还是会存在问题,于是我就在数字栈一开始先入栈了一个0元素以防止出现这种情况时式子计算出错。
  • 关于泡犇犇(郑浩晖)在评论的8楼给出的bug,我查看之后发现是负号的处理出现了问题,"()-10"这样的式子之前的代码我会把-和10连在一起看成一个负数,经过修改后把他们分开了。
  • 本来只是想考虑比较正常的表达式的。。但是在泡犇犇的带领下,我还是决定多打些代码去处理一些特殊的表达式,于是我就新建了一个Pretreatment的类去专门对一个表达式的格式进行转换,转成我的计算方法能够接受的表达式。从而使我的代码能够成功计算出评论中泡犇犇给出的式子。
  • 当然我的代码应该还有BUG,欢迎大家来找出BUG。(尤其欢迎泡犇犇)

转载于:https://www.cnblogs.com/starset/p/5350042.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值