面向对象程序设计课第五次作业
面向对象程序设计课第五次作业
此次作业新增了 -f
这种参数,同时要求所有输出在 Print 类里完成,所以又较大地改动了 main.cpp 和 Print.cpp 两个文件。
main.cpp 中,我把 if(argc == 3)
这样的写法改成了直接判断 argv
数组,对三种参数情况进行了优化。为此,我在 Print 类里新增了不同的输出函数,以应对不同的情况。改动的过程磕磕绊绊,但最后还是大概改好了。
难点及解决
此次作业最坑的两个点在于处理表达式新增的等号和文件输出操作。
由于我的表达式处理方式较为奇葩,对许多新的改动难以适应,上次对负号的处理便是这样。这次在表达式后新增等号,会在队列尾加上这个等号,有两种处理方式,一是在 Scan.cpp 中处理,二是在 Calculation.cpp 里解决。由于 Calculation.cpp 判断符号和相互匹配已经比较完善和不好改变了,我决定改 Scan.cpp。然而这里面的函数有一个复杂的循环,对队列的 push 是在各种判断下完成的,尝试在各个位置去除掉等号总是会带着一个有效的数字或者符号丢失导致无法计算。最后发现应该在遇到等号时,把非空的数字和运算符字符串 push 入队列,然后退出循环。
文件输出方面我虽然参考了网上的文章,但还是挺一头雾水的。以为在 Print.cpp 里输出需要传入 ofstream
类型的参数,但最后输出的文件里要么只有 0 要么只有最后一个答案。原来是我理解不够深,ofstream
类型的参数是不需要传入的,在类里的函数声明即可。打开或者写入是有方式可以选择的,例如 in
、out
、app
、ate
等,我输出的时候选择了 out
就导致了每输出一个结果就会重写文件,导致只有最后一个结果。
项目框架
Github 链接
https://github.com/ladit/object-oriented/tree/master/Calculator