作业3
| 成员 | 陈曦3123004137 / 陈培然3123004134 |
|---|---|
| 仓库链接 | https://github.com/Mosya-CX/Mosya-CX/tree/master/第三次作业 |
PSP表
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 60 | 40 |
| · Estimate | · 估计这个任务需要多少时间 | 3 | 1 |
| Development | 开发 | 120 | 140 |
| · Analysis | · 需求分析 (包括学习新技术) | 5 | 5 |
| · Design Spec | · 生成设计文档 | 10 | 5 |
| · Design Review | · 设计复审 | 5 | 3 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 3 | 1 |
| · Design | · 具体设计 | 60 | 50 |
| · Coding | · 具体编码 | 20 | 15 |
| · Code Review | · 代码复审 | 5 | 5 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 20 | 10 |
| Reporting | 报告 | 5 | 5 |
| · Test Repor | · 测试报告 | 5 | 5 |
| · Size Measurement | · 计算工作量 | 3 | 1 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | 15 |
| · 合计 | 329 | 341 |
性能分析


设计实现过程
(1)Fraction 类
作用:
用于存储和处理 带整数部分的分数,并提供字符串转换功能
关系:
Fraction 用于 Expression 类的 操作数(即数学表达式中的数字)。
计算模块(calculator)会返回 Fraction 作为运算结果。
(2)Expression 类
作用:
存储数学表达式,包括 操作数、运算符、括号信息,并支持计算。
关系:
Expression 依赖 Fraction 存储数字。
Expression 的 CalculateFraction() 调用 calculator 进行运算。
(3)ExerciseGenerate 类
作用:
随机生成四则运算表达式,支持整数和分数。
关系:
ExerciseGenerate 生成 Expression 对象。
生成的 Expression 会被计算,并存储到文件。
(4)calculator 模块
作用:
解析表达式并执行计算,包括整数运算和分数运算。
关系:
calc() 解析 Expression 传入的字符串,并计算结果。
计算后的 Fraction 结果会返回给 Expression,再进行格式化。
(5)主函数(main.cpp)
作用:
解析命令行参数,调用 ExerciseGenerate 生成题目或 calculator 进行计算。
关系:
读取用户输入,调用 ExerciseGenerate 生成题目。
计算结果,并与答案进行对比。
代码说明
- 代码结构
Fraction.h / Fraction.cpp(分数处理)
负责分数的数据结构和基本运算,如化简、转换字符串等。
Expression.h / Expression.cpp(表达式处理)
负责存储数学表达式,支持带括号的四则运算,并计算结果。
ExerciseGenerate.h / ExerciseGenerate.cpp(题目生成)
负责随机生成四则运算表达式,包括整数和分数。
calculator.h / calculator.cpp(计算逻辑)
解析数学表达式,进行分数和整数的运算,并校验表达式合法性。
main.cpp(主程序入口)
解析命令行参数,调用生成和计算逻辑,并输出结果。 - 代码功能分析
(1) 分数处理 (Fraction 类)
负责存储和处理分数,包括:
integer(整数部分)、molecule(分子)、denominator(分母)。
simplify():化简分数(求最大公约数)。
toWstring():转换为 wstring 格式,如 "1'2/3"。
Fraction(wstring fraction):解析字符串创建分数对象。
(2) 表达式处理 (Expression 类)
Expression 代表一个四则运算表达式,存储:
操作数(Fraction t[4]):最多支持4个操作数。
运算符(wchar_t wOPERATER[3]):存储 + - × ÷。
括号信息(bracketsNum[2]):支持不同括号模式。
方法
toWstring():将表达式转换成字符串,如 "(1'2/3 + 3/4) × 2"
CalculateFraction():调用 calculator.cpp 进行计算,并存储结果。
(3) 题目生成 (ExerciseGenerate 类)
generateExpress():
随机生成操作数(整数或分数)。
随机生成运算符(+ - × ÷)。
随机加入括号(不同优先级)。
调用 Expression 类封装表达式。
(4) 计算逻辑 (calculator.cpp)
计算不同类型的运算
calculatorFractionAndInt():分数 + 整数
calculatorIntAndFraction():整数 + 分数
calculatorFraction():分数 + 分数
calculatorInt():整数 + 整数
BasicCalculation():统一调用对应计算方法
解析表达式并计算
calc(wstring S, size_t len):
解析字符串,检查是否有非法字符。
处理括号,递归计算子表达式。
按照运算优先级,计算 × ÷,再计算 + -。
(5) 主程序 (main.cpp)
两种模式
生成题目
复制
编辑
Myapp.exe -n 10 -r 100
生成 10 道题目,数值范围 0-100,存入 Exercises.txt 和 Answers.txt。
批改题目
css
复制
编辑
Myapp.exe -e Exercises.txt -a Answers.txt
读取 Exercises.txt 并计算答案,与 Answers.txt 比较,统计正确和错误答案,输出到 Grade.txt。
测试运行
测试样例:https://github.com/Mosya-CX/Mosya-CX/tree/master/第三次作业/测试文件

项目小结
(1)结对编程的优势
在本次结对编程中,我们深刻体会到了团队协作的优势:
思维碰撞:两个人可以提供不同的视角,发现单人开发时容易忽略的问题。
代码质量提升:在代码审查(Code Review)过程中,相互指出潜在的错误,提高代码规范性。
效率提升:任务分工后,开发速度加快,比如一个人专注 数据结构设计,另一个人专注 算法实现,提高开发效率。
(2)我们在结对中的角色分工
在实际开发过程中,我们采用了 Driver & Navigator 角色切换模式:
Driver(驾驶员) 负责编写代码,实现具体逻辑。
Navigator(领航员) 负责思考全局设计,检查代码质量,并及时提出优化建议。
我们的具体分工如下:
A 负责 Fraction、Expression、ExerciseGenerate 的核心设计,确保数据结构合理性。
B 负责 calculator 计算逻辑的实现与优化,并完成 main.cpp 入口逻辑。
这种分工让我们在开发过程中 高效合作,同时也增强了代码的一致性。
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/ |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13326 |
| 这个作业的目标 | 实现一个自动生成小学四则运算题目的命令行程序 |

浙公网安备 33010602011771号