第四次作业(计算器第二步)

这里是github传送门

参考资料

作业实现内容

  1.Windows系统下的cmd命令行操作
  2.输入括号不匹配以及非法字符的错误进行判断
  3.对正确的表达式进行计算并输出结果    

具体操作

cmd

命令行模式整体来说没有多大问题,在仔细研究了参考资料之后,我的理解是,本次作业是将输入模式由输入输出流等输入函数变为主函数传参模式,需要注意的就是,如果给主函数参数后,用执行窗口打开,默认mian函数的参数只有一个,内容为exe所在地址(是这样吧?我觉得是),同理,如果是命令行模式下,第一个参数也是,所以我们的传参是从第二个参数开始的...所以判断"-a"还是输入算式都是从第二个参数开始..注意下这点就好了

计算

关于计算,在前次作业便已经留意到后续作业会进行计算,在某种机缘巧合之下提前知道了后缀表达式,本次作业虽然要求两个栈,但是和后缀表达式的优先级处理的思想的想法是一致的(在咨询了某犇犇之后才分清楚了后缀表达式求值与优先级求值是不一样的,而本题应该是优先级来做),因此,在作业开始前,便已经有了一定头绪,加上一些凑巧(后面说明),本次作业总体难度不大

1. 实现关键——运算符的优先级判断

就拿后缀表达式来说,我们输入的是中缀表达式,判断好了优先级,变为后缀表达式,扫一遍即可出答案,本题也是如此,简单点说,就是:较高优先级入栈,同级与较低优先级出栈,‘(’的优先级会变,就是这样子,然后呢,在这里,我借用了参考资料中优先关系用二维数组来表示的方法,然后配合map的一些小技巧,来完成判断的操作

2.负号与减号的判断

这个可以说是上次作业的遗留问题,关于负号与减号,无论是后缀表达式还是优先级,都必须先解决这个问题才能正常计算。我在一天中午睡醒后,反复想了半小时,感觉解决方法有2种,第二种.在进行计算操作时候额外判断,在负号前补0,让它变成减号,但是这样子会加重计算这个类的负荷,而且不利于后续作业的优化,(计算过程本身就比较复杂,再加上判断,以后不利于维护),而且,第二次作业一开始是要求判断出来负号与减号的,我当时做了这个,所以,我的第二次作业中的scan.cpp我有两个版本,而且都有在维护....所以,我果断选择了第二种方法,输入处理的时候就判断出负号与减号...(所以我scan.cpp代码显得比较长...如果后续作业判断方面增加,我的判断可能要移动到另外一个判断的类中去)

括号与非法字符的判断

我本来是不打算做这一步的,直到写随笔去"借用"优秀同学的测试数据时,因为多了一个)导致我的计算结果不一样而找了很久,所以..我决定判断一下...

非法字符不必多说,遍历一遍即可,括号匹配问题,相当于<<高级程序设计语言>>第一次作业中的一题的简化版,用栈就好了,大家都懂,自然不必多说。

大家听听故事---说出来都没人信的问题

对于我而言...这次作业最大的难度..不是题目,而且我家的DEV C++,比较..奇葩一点点..举几个栗子

栗子1:你有见过初始化无效的构造函数吗?


上图的

cout << 3 << endl;
cout << OprRelation[0] << endl;

中第二个语句是在构造函数中初始化的...但是,输出后发现是乱码,说明没有初始化...这个我郁闷了很久才发现的..

栗子2:stringstream只能存中间数据却不能输出。。。

你看!程序运行到

cout << "temp = " << temp << endl;

就出错停下来了!

stream >> opr;

不能执行... 这个我也是郁闷了很久

栗子3:编译到.o文件过不去(这个大家应该可能有


也是不知道为啥,解决方法是:在多人的建议下..重新建一个类,然后复制黏贴过了..然后程序可以可以通过了。。

这些错误的小结:

在多文件方面的处理,DEV 挑错能力不行...因为要么是DEV 坏了,要么是因为我后来发现其代码有其他错误的原因,总之,这些问题..在第三天莫名其妙就全部消失了...我是先把代码改对,比如不用构造函数,自己新建一个init函数来初始化先过计算对再说,等类似的方法,计算对了后,慢慢再改回去.然后..我不喜欢用调试,..代码刚刚正确的时候就变成了这个样子:

...奇丑无比= =

测试数据:

主要测试的方面:
1.多个嵌套括号的优先级处理
2.负号与减号
3.特殊情况, -() 类型的输出以及开头需要补0的情况
4.括号不匹配与非法字符

总结

在做完之后,随笔拖到最后一天才开始写我也是挺厉害的..拖延的毛病是该改改了。。

1.做这种多文件问题我深感自己的查错能力不足,(明明那么弱的查错能力还用DEV。....),可以的话希望在五一安装VS或者eclipse(这两个东西寒假都玩失败了)

2.编码能力有待加强,很多好的想法确实比较难学来,比如用二维数组来代替if等来判断优先级,明显可以缩短代码,又不容易出错

posted @ 2016-04-10 00:08  洛丶航  阅读(275)  评论(4编辑  收藏  举报