第一周的作业是完成小学生计算器,这个项目如果仅仅是一个数字的四则运算的话是一个很简单的问题。但是加入了随机生成表达式和分数计算的要求之后,难度就大大增加了。
最初的想法:
首先面对这个问题,第一反应就是逆波兰表达式的求解变形,重载加减乘除的符号算法。随机生成表达式则是递归由里到外生成,括号随机添加
遇到的困难:
(1) 由于加入了分数运算,存取数据的栈就要改成另外的可以表示分数的形式,我选择了采用字符串的形式,就涉及了大量的字符串的操作,字符串地址的传递。并且
(2) 上述方法生成的表达式的括号总是嵌套的,不能出现括号并列的情况。
获得的经验:
C++的栈操作存储的字符串总是以地址的形式保存,而不是内容。导致代码在某阶段总是存在栈保存的内容发生改变的问题,原因是栈指针指向的内存空间被后续的操作改变了值,因此后来采取了申请多个新的内存空间存储不同的字符串,保证了栈的内容不改变。
由于分数中间计算的结果可能很大,导致在运行过程中总是容易容易出现数组溢出的情况,这种错误非常难以发现。
模块化的代码调试,逐步缩小问题出现位置的范围。