四则运算(C++)
目录
[TOC]
【注】后缀表达式参考博客:https://blog.csdn.net/geekcoder/article/details/6829386,但后缀表达式计算有改动
1、需求分析:
- 使用 -n 参数控制生成题目的个数,使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围
- 每道题目中的运算符个数不超过3个
- 题目和运算结果中如果出现假分数应用真分数表示
- 将生成的题目存入Exercise.txt,题目答案存入Answer.txt,用户做题结果存入Grade.txt
- 程序支持1万道题目的生成
- 对生成的题目进行查重
2、整体思路
- 步骤一:运算式子生成:先随机生成数字,在随机生成运算符,最后随机生成括号。
- 步骤二:中缀转后缀
- 步骤三:进行后缀
3、设计实现
- 代码结构
Arithmetic :生成四则运算、转后缀、计算后缀、保存
MyStack:封装栈
Posifit:中缀转后缀
Tool:工具函数
重要代码
思路:照常是在后缀表达式过程中全部按照真分数来计算,但是有一点不同是采用两个栈,其中一个是分子栈,另一个是分母栈,初始情况下分母栈全为1。这样中缀转后缀的过程就不用特意考虑真分数,所以中缀转后缀的过程还是按常规操作。string Postfit::postfix_value(const char post[]) { MyStack<double> stack; // 操作数栈 stack.init(); MyStack<double> denominatorStack; // 操作数对应的分母站 denominatorStack.init(); double numerator = 0.0; // 分子 double denominator = 1.0; // 分母 double newNumerator = 0.0; double newDenominator = 1.0; int i = 0; double x1, x2; double x1D, x2D; // 对应的分母 while (post[i] != ‘#‘) { if (post[i] >= ‘0‘ && post[i] <= ‘9‘) { double num = read_number(post, &i); stack.push(num); denominatorStack.push(1.0); } else if (post[i] == ‘ ‘) i++; else { x2 = stack.pop(); x1 = stack.pop(); x2D = denominatorStack.pop(); x1D = denominatorStack.pop(); switch (post[i]) { case ‘+‘: denominator = getLCM(x1D, x2D); // 通分 if (denominator == x1D) { numerator = x1 + x2 * denominator; } else if (denominator == x2D) { numerator = x1 * denominator + x2; } else { numerator = x1 * denominator + x2 * denominator; } break; case ‘-‘: denominator = getLCM(x1D, x2D); // 通分 if (denominator == x1D) { numerator = x1 - x2 * denominator; } else if (denominator == x2D) { numerator = x1 * denominator - x2; } else { numerator = x1 * denominator - x2 * denominator; } break; case ‘*‘: denominator = x1D * x2D; numerator = x1 * x2; break; case ‘/‘: denominator = x1D * x2; numerator = x1 * x2D; break; default: break; } // 约分 double gcd = 1.0; if (denominator != 0 && numerator != 0) { gcd = getGCD(denominator, numerator); } newDenominator = denominator / gcd; newNumerator = numerator / gcd; stack.push(newNumerator); denominatorStack.push(newDenominator); i++; } } if (numerator == denominator) { return "1"; } else if (denominator == 1.0) { return double2str(numerator); } else if (numerator > denominator) { int n = (int)numerator % (int)denominator; double m = (numerator - (double)n) / denominator; return double2str(m) + "‘" + int2str(n) + "/" + double2str(denominator); } else { return double2str(numerator) + "/" + double2str(denominator); } }
4、PSP
PSP2.1 | Personal Software Process Stages | Time |
---|---|---|
Planning | 计划 | 1 |
Estimate | 估计这个任务需要多少时间 | 22 |
Development | 开发 | 1 |
Analysis | 需求分析 | 3 |
Design Spec | 生成设计文档 | 1 |
Design Review | 设计复审 | 1 |
Coding Standard | 代码规范 | 1 |
Design | 具体设计 | 2 |
Coding | 具体编码 | 7 |
Test | 测试 | 1 |
Reporting | 报告 | 1 |
Test Report | 测试报告 | 1 |
Size Measurement | 计算工作量 | 1 |
合计 | 20 |
5、结果
6、代码地址:
https://gitee.com/mingpukj/Arithmetic
7、总结
- 算法是非常重要的,还是希望自己能提高。
- 希望自己能不断进步,不仅在代码质量,也在代码思维。
- 博客是很好的记录方式。
- 看了其他同学的作业,虚心学习。:)