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
,以方便将来的开发和处理 最后附上自己的成果
最后:[有奖竞猜]
请解析这句话的结构以及它想表达什么