软工第三次作业
这个属于那个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 带三次作业 |
基本信息:
项目GitHub地址:https://github.com/pascal5233/Four-Arithmetic-Operations
realease:https://github.com/pascal5233/Four-Arithmetic-Operations/releases/tag/master
袁镇清:3123002353
1.PSP2.1表格:
PSP2.1 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|
计划 | 15 | 20 |
估计这个任务需要多少时间 | 20 | 20 |
开发 | 60 | 60 |
需求分析 (包括学习新技术) | 60 | 90 |
生成设计文档 | 20 | 30 |
设计复审 | 20 | 20 |
代码规范 (为目前的开发制定合适的规范) | 30 | 45 |
具体设计 | 30 | 20 |
具体编码 | 75 | 75 |
代码复审 | 30 | 30 |
测试(自我测试,修改代码,提交修改) | 30 | 30 |
报告 | 30 | 20 |
测试报告 | 20 | 20 |
计算工作量 | 5 | 5 |
事后总结, 并提出过程改进计划 | 15 | 15 |
合计 | 460 | 500 |
2.设计实现过程:
1. 整体架构设计
类关系图
2. 核心类设计
2.1 Fraction 类 - 分数处理
职责:表示和操作分数,支持真分数、带分数格式
关键方法:
-
normalize(): 分数规范化(约分、假分数转带分数)
-
算术运算符重载:+, -, *, /
-
toString(): 格式化为字符串
-
value(): 转换为数值用于比较
设计特点:
-
自动处理分数规范化,确保无假分数
-
支持多种输入格式(整数、真分数、带分数)
-
重载运算符便于表达式计算
2.2 ExpressionGenerator 类 - 表达式生成
职责:生成不重复的算术表达式
关键方法流程图:
表达式构建策略:
-
左结合:((a op b) op c) op d
-
右结合:a op (b op (c op d))
-
混合结合:(a op b) op (c op d)
2.3 ExpressionCalculator 类 - 表达式计算
职责:计算算术表达式的值
关键方法流程图:
2.4 AnswerChecker 类 - 答案检查
职责:比较练习答案并统计结果
关键方法流程图:
3. 关键算法设计
3.1 表达式生成算法
伪代码:
生成表达式(运算符数量):
操作数数量 = 运算符数量 + 1
操作数列表 = 生成操作数(操作数数量) // 30%概率为分数
运算符列表 = 生成运算符(运算符数量)
选择表达式结构:
左结合: ((a op b) op c) op d
右结合: a op (b op (c op d))
混合结合: (a op b) op (c op d)
计算表达式值
规范化表达式用于去重
3.2 表达式求值算法
伪代码:
求值(表达式, 开始位置, 结束位置):
if 是单个操作数:
解析为Fraction返回
if 被括号包围且括号匹配:
去掉外层括号递归求值
查找优先级最低的运算符位置
左结果 = 求值(左子表达式)
右结果 = 求值(右子表达式)
return 左结果 op 右结果
3.3 去重机制
规范化表示:去除空格,统一格式
哈希集合:使用unordered_set存储规范化表达式
唯一性检查:确保数学等价的表达式不被重复生成
4. 文件处理设计
输入文件格式:
text
1. (3 + 4) * 2
2. 1/2 + 1/3
3. 2'1/2 * 3
输出文件格式:
Exercises.txt: 生成的题目
Answers.txt: 对应的答案
Grade.txt: 批改结果
text
Correct: 3 (1, 3, 5)
Wrong: 2 (2, 4)
5. 错误处理设计
-
边界检查:防止vector越界访问
-
异常捕获:try-catch处理计算异常
-
输入验证:检查命令行参数合法性
-
文件操作:检查文件打开状态
6. 设计模式应用
6.1 单一职责原则
-
Fraction: 只负责分数表示和运算
-
ExpressionGenerator: 只负责表达式生成
-
ExpressionCalculator: 只负责表达式计算
-
AnswerChecker: 只负责答案比较
6.2 静态方法模式
ExpressionCalculator和AnswerChecker使用静态方法,无需实例化
6.3 策略模式
表达式构建支持多种结合性策略(左结合、右结合、混合结合)
7. 性能考虑
-
避免重复计算:生成时即计算值,避免重复解析
-
限制尝试次数:防止无限循环
-
内存管理:使用智能指针避免内存泄漏
-
文件流优化:批量写入而非单行写入
这个设计实现了完整的四则运算题目生成和批改系统,具有良好的模块化、可扩展性和健壮性。
3测试样例
生成功能测试命令行参数:
Four Arithmetic Operations.exe -n 10 -r 10
测试结果:
生成功能极限情况测试:
Four Arithmetic Operations.exe -n 10000 -r 1000
测试结果:
批改功能测试:
Four Arithmetic Operations.exe -e Exercises -a Answers
测试文件:
Exercises.txt:
Answers.txt:
测试结果:
测试结果文件