结对作业
| 这个作业属于哪个课程 | 班级的链接 |
|---|---|
| 这个作业要求在哪里 | |
| 这个作业的目标 | 进行结对,培养团队协作和沟通交流能力,开发一个自动生成小学四则运算题目的项目 |
成员:朱俊锋 3123004467
Github仓库链接
- PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 30 |
| · Estimate | · 估计这个任务需要多少时间 | 10 | 10 |
| ·Development | ·开发 | 351 | 363 |
| · Analysis | · 需求分析 (包括学习新技术) | 20 | 25 |
| · Design Spec | · 生成设计文档 | 15 | 20 |
| · Design Review | · 设计复审 (和同事审核设计文档) | 10 | 12 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 6 | 6 |
| · Design | · 具体设计 | 30 | 30 |
| · Coding | · 具体编码 | 200 | 200 |
| · Code Review | · 代码复审 | 40 | 40 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 30 | 30 |
| Reporting | 报告 | 60 | 70 |
| · Test Report | · 测试报告 | 30 | 40 |
| · Size Measurement | · 计算工作量 | 10 | 10 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
| 合计 | 451 | 473 |
-
效能分析
改进时间:约 30 分钟。
改进思路:
优化表达式生成逻辑,减少不必要的递归调用。
在生成题目时,使用 HashSet 来存储已经生成的题目,避免重复生成。 -
设计实现过程
- 类的设计
Fraction 类:用于表示分数,包含分子和分母,实现了分数的四则运算和化简功能。
Problem 类:表示一个题目,包含表达式字符串和计算结果。
ArithmeticProblemGenerator 类:主类,包含生成题目、写入文件、读取文件和检查答案等功能。 - 函数关系
generateRandomFraction 方法:生成随机分数。
generateRandomOperator 方法:生成随机运算符。
generateExpression 方法:生成一个表达式并计算结果。
generateProblems 方法:生成指定数量的不重复题目。
writeProblems 和 writeAnswers 方法:分别将题目和答案写入文件。
readFile 方法:从文件中读取内容。
checkAnswers 方法:检查答案的正确性并统计结果。 - 关键函数流程图
generateProblems 方法的流程图如下:
![]()
- 代码说明
- Fraction 类
点击查看代码
class Fraction {
int numerator;
int denominator;
public Fraction(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
simplify();
}
// 化简分数
private void simplify() {
int gcd = gcd(numerator, denominator);
numerator /= gcd;
denominator /= gcd;
}
// 计算最大公约数
private int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
// 分数加法
public Fraction add(Fraction other) {
int newNumerator = numerator * other.denominator + other.numerator * denominator;
int newDenominator = denominator * other.denominator;
return new Fraction(newNumerator, newDenominator);
}
// 分数减法
public Fraction subtract(Fraction other) {
int newNumerator = numerator * other.denominator - other.numerator * denominator;
int newDenominator = denominator * other.denominator;
return new Fraction(newNumerator, newDenominator);
}
// 分数乘法
public Fraction multiply(Fraction other) {
int newNumerator = numerator * other.numerator;
int newDenominator = denominator * other.denominator;
return new Fraction(newNumerator, newDenominator);
}
// 分数除法
public Fraction divide(Fraction other) {
int newNumerator = numerator * other.denominator;
int newDenominator = denominator * other.numerator;
return new Fraction(newNumerator, newDenominator);
}
@Override
public String toString() {
if (denominator == 1) {
return String.valueOf(numerator);
} else if (numerator > denominator) {
int whole = numerator / denominator;
int remainder = numerator % denominator;
return whole + "'" + remainder + "/" + denominator;
} else {
return numerator + "/" + denominator;
}
}
}
- generateProblems 方法
点击查看代码
private static List<Problem> generateProblems(int numProblems, int range) {
List<Problem> problems = new ArrayList<>();
Set<String> uniqueExpressions = new HashSet<>();
while (problems.size() < numProblems) {
Problem problem = generateExpression(range);
if (problem != null &&!uniqueExpressions.contains(problem.expression)) {
problems.add(problem);
uniqueExpressions.add(problem.expression);
}
}
return problems;
}
- 项目小结
- 成功之处:
实现了题目生成、答案计算和答案检查的基本功能。
代码结构清晰,类和方法分工明确,易于维护和扩展。 - 不足之处:
性能方面还有提升空间,特别是在生成大量题目时,速度较慢。
代码的错误处理还可以进一步完善,以应对更多异常情况。 - 经验分享:
在开发过程中,先进行需求分析和设计,再进行具体编码,可以提高开发效率。
使用测试用例来验证程序的正确性,确保程序的稳定性。 - 教训总结:
在编写递归函数时,要注意递归终止条件,避免出现无限递归的情况。
在处理文件操作时,要考虑文件不存在、文件读写权限等异常情况。 - 结对感受
在结对编程过程中,我们可以相互交流、相互学习,及时发现和解决问题。同时,通过分工合作,提高了开发效率。
- 闪光点和建议
- 闪光点:
队友在算法设计方面有很好的思路,能够提出一些优化方案。
队友在代码编写过程中,注重代码的规范性和可读性。 - 建议:
可以更加注重代码的性能优化,提前考虑代码的复杂度。
在遇到问题时,可以更加积极地进行讨论,共同寻找解决方案。
- 闪光点:


浙公网安备 33010602011771号