[C++ Calculator 项目] 基础运算实现

Calculator V1.1

注:这是C++计算器项目第二部分-运算 [基于初始部分增改而得]
源文件已上传至github

主要问题:

     Ⅰ.运算实现的问题在于( ) + - * /的优先级的处理,以及对-的处理
     Ⅱ.命令行参数如何进行合法性检查和判断

编写想法:

  • ()的处理:
        基本想法是使用递归,当碰到`(`时,调用自身进入更深层循环,计算`()`内的式子,当遇到`)`时则计算结束返回计算结果给上一层
  • +-*/的处理:
        若字符为`+`则跳过,若字符为`-`则将一个标志负号的bool数 __minus=true ,当字符为`*`或`/`时将其推入栈 stack<char> m_sym 内等待处理
  • num的处理:
        当从队列中取出字符串为数值时,将其赋予 stringstream sstr ,并输出给 int num 
        此后需要经过两个条件判断。
                    ·① 检查__minus == true,为真则将 num*=-1
                    ·② 检查`m_sym`栈是否非空且栈顶元素是否为 *、/ ,为真则将储存数值的栈 stack<int> m_val 的栈顶元素 m_val.top() *or/ num 并赋值给num
        最后 m_val.push(num); 
  • -的处理:
       主要有这三种情况:`1-2` `-1*2` `-(1+2)`,通过分析不难发现,不论`-`号处于哪种情况是都可看做是影响其后一个数字,即前两个式子可看做 `1+(-2)` `(-1)*2` ,而第三种情况由于对`()`已做过处理,故最后得`-3`即为第一种

过程记录:

  • 在写calc函数时,首选并不是递归,当时准备将calc写为处理表达式队列中的-号的函数,并且在碰到-(...)时直接将-乘入(...)内的第一个数,结果一连遇上了好多bug(多到真的数不过来,所以就不列出了)
  • 因为代码是基于原先已经写好了的输入输出类上进行增改,所以在写calculation类的时候,省去了很多的工作。不过由于在写的时候并没有进行一些整体规划,所以最后成形的代码整体架构混乱,自己隔天看了也没看懂,于是把想法整理了之后,重写了两次,才觉得稍微好一些。
  • 由于需要增加一个命令行参数-a,所以就增加了一个处理命令行参数的类 __arg ,以方便将来的开发和处理
  • 最后附上自己的成果
    885613-20160410162626812-453992097.png
    885613-20160410162656265-824724371.png

    最后:[有奖竞猜]

    请解析这句话的结构以及它想表达什么

    885613-20160410163905093-1706626648.png

转载于:https://www.cnblogs.com/tr3e/p/5374173.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值