源代码链接:https://github.com/FredaCao/homework1.git
一. PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 10 | 10 |
Estimate | 估计这个任务需要多少时间 | 255 | 260 |
Development | 开发 | 150 | 165 |
Analysis | 需求分析 | 10 | 暂无 |
Design Spec | 生成设计文档 | 10 | 暂无 |
Design Review | 设计复审 | 10 | 暂无 |
Coding Standard | 代码规范 | 10 | 5 |
Design | 具体设计 | 10 | 30 |
Coding | 具体编码 | 100 | 130 |
Code Review | 代码复审 | 10 | |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | 30 | 30 |
Test Report | 测试报告 | ||
Size Measurement | 计算工作量 | 5 | 5 |
Postmortem&Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | 20 |
合计 | 255 | 910 |
二. 解题思路
软件基本功能
- 参与运算的操作数(operands)除了100以内的整数以外,还要支持真分数的四则运算,例如:1/6 + 1/8 = 7/24。操作数必须随机生成。
- 运算符(operators)为 +, ?, ×, ÷ (如运算符个数固定,则不得小于3)运算符的种类和顺序必须随机生成。
- 要求能处理用户的输入,并判断对错,打分统计正确率。
- 使用 -n 参数控制生成题目的个数,或通过用户交互过程确定题目个数,例如执行下面命令将生成5个题目
- (以C/C++/C#为例) calgen.exe -n 5
- (以python为例) python3 calgen.py -n 5
实现思路
- 四则运算采用将中序表达式转化为后缀表达式
- 将原来四则运算中的整数换成分数,抽象出分数的类,并实现+,-,x三个运算符的重载
- 计算后缀表达式的过程中将字符串转化为分数的类实例,然后使用重载的运算符进行计算
- 使用getopt方法来获取命令行中的参数
- 处理用户的输入并转化为分数类实例,通过==运算符判断是否正确
三. 设计过程
1. 分数类 包含分子分母两个类成员,+,-,x运算符实现过程中进行约分,先获得计算之后的分子分母最大公约数,再同时除以这个约数即可
2. 中序表达式转化后缀表达式 使用栈来存储优先级较低的运算符,当遇到运算符时,将相同和更高优先级的操作符出栈,并加入string流中,另外把带数字和带有分号的分数作为一个整体直接加入string流中,使用空格来分割
3. 后缀表达式计算,将字符串使用空格作为分隔符split,如果是代表数的字符串则构造分数对象,并入栈,如果是操作符则使用栈顶的第一个和第二个元素进行计算,计算完之后栈顶元素出栈,迭代后栈中只有一个元素即为所求
四. 代码说明
1. 乘法运算符重载
- 分子与分子相乘,分母与分母相乘
- 计算最大公约数,分子分母同时除以最大公约数
2. 计算后缀表达式
- 将字符串使用空格作为分隔符split,如果是代表数的字符串则构造分数对象,并入栈,
- 如果是操作符则使用栈顶的第一个和第二个元素进行计算,
- 迭代之后最后一个元素即为所求
五. 代码截图
六. 项目小结
中序表达式转化为后缀表达式的迭代过程结束之后,栈内可能还有操作符,此时需要注意一下先输入空格再依次出栈其他操作符。单元测试的编写应该采用更加自动化的过程,以后会尝试使用googletest框架。