课程作业一
课程作业一
这次作业我选择了重构代码,因为我上几次作业使用了类似于出题模板的代码,导致我的程序随机性不够,于是我下定决心写一份符合我自己的要求的代码,期间遇见了许许多多的问题,例如计算生成算式值的时候,自己也想了了一个思路:用string型变量来存储算式,然后去寻找第一个“)”,然后计算它与前一个“(”之间算式的值,然后用这个值来替代原来的(a*b+c),然后继续寻找下一个“)”,如此的替换下去,就会把原来复杂的算式,变成一个没有括号的算式,但是在执行的时候我发现,如果括号之间的值为浮点数,就很难进行替代了。思索了很久,终于忍不住去论坛上寻找大佬的帮助,在一篇文章中看到可以用栈的方式来进行求解,具体方式就是扫描整个算式,遇见数字就将其转换为浮点型,存入temp变量中,接下来用下一次遇见的符号来判断是否将这个数值压入数字栈,然后将符号压入符号栈,检测本次符号与栈顶符号的优先级,来简化算式,具体的解释,我在代码中已经标注。
这次作业的感想
这次作业让懂得,写一篇完善的代码确实是一件难事,这次作业整整花费我两天的实践,编码到深夜,但是我觉得是值得的,至少我通过自己的努力写出了一份让自己满意的代码,也在网上学习到了很多东西,比如:vector型容器和map容器,在这期间我也向陈逸超学长,和赵畅学长问了一些问题,很感谢两位学长的耐心解答,之前的代码也告诫着我:偷懒是没有好果子吃的!
对分离函数的看法
分离函数能使自己的程序看起来更具有条理性,读者能很清楚的看出每个模块的功能,这正体现了C语言的特点:模块化设计。在以后的编码中我也会采用这种的编码格式。下面是我的主函数
int main() {
srand(time(0));
int sum = 0;
class problem p;
p.SelectLanguage();
p.showTip();
while (true)
{
string question = p.generateExpression(); //用于生成题目
cout << question << " = ";
float answer = p.calculateResult(question); //用于计算结果
// cout << answer << endl;
sum += p.scan(answer); //用于用户输入并计算做对题目的数目
// cout << sum << endl;
if (p.end() == 1) //用于结束应用
{
break;
}
}
p.print(sum); //用于输出结果
return 0;
}