结对作业

这个作业属于哪个课程 班级的链接
这个作业要求在哪里
作业要求的链接
这个作业的目标 进行结对,培养团队协作和沟通交流能力,开发一个自动生成小学四则运算题目的项目

成员:朱俊锋 3123004467
Github仓库链接

  1. 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
  1. 效能分析
    改进时间:约 30 分钟。
    改进思路:
    优化表达式生成逻辑,减少不必要的递归调用。
    在生成题目时,使用 HashSet 来存储已经生成的题目,避免重复生成。

  2. 设计实现过程

  • 类的设计
    Fraction 类:用于表示分数,包含分子和分母,实现了分数的四则运算和化简功能。
    Problem 类:表示一个题目,包含表达式字符串和计算结果。
    ArithmeticProblemGenerator 类:主类,包含生成题目、写入文件、读取文件和检查答案等功能。
  • 函数关系
    generateRandomFraction 方法:生成随机分数。
    generateRandomOperator 方法:生成随机运算符。
    generateExpression 方法:生成一个表达式并计算结果。
    generateProblems 方法:生成指定数量的不重复题目。
    writeProblems 和 writeAnswers 方法:分别将题目和答案写入文件。
    readFile 方法:从文件中读取内容。
    checkAnswers 方法:检查答案的正确性并统计结果。
  • 关键函数流程图
    generateProblems 方法的流程图如下:
  1. 代码说明
  • 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;
        }
    }
}
思路:该类用于表示分数,通过构造函数初始化分子和分母,并调用 simplify 方法进行化简。提供了分数的四则运算方法,方便后续计算。toString 方法用于将分数转换为指定格式的字符串。
  • 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;
}
  1. 项目小结
  • 成功之处:
    实现了题目生成、答案计算和答案检查的基本功能。
    代码结构清晰,类和方法分工明确,易于维护和扩展。
  • 不足之处:
    性能方面还有提升空间,特别是在生成大量题目时,速度较慢。
    代码的错误处理还可以进一步完善,以应对更多异常情况。
  • 经验分享:
    在开发过程中,先进行需求分析和设计,再进行具体编码,可以提高开发效率。
    使用测试用例来验证程序的正确性,确保程序的稳定性。
  • 教训总结:
    在编写递归函数时,要注意递归终止条件,避免出现无限递归的情况。
    在处理文件操作时,要考虑文件不存在、文件读写权限等异常情况。
  • 结对感受
    在结对编程过程中,我们可以相互交流、相互学习,及时发现和解决问题。同时,通过分工合作,提高了开发效率。
  1. 闪光点和建议
    • 闪光点:
      队友在算法设计方面有很好的思路,能够提出一些优化方案。
      队友在代码编写过程中,注重代码的规范性和可读性。
    • 建议:
      可以更加注重代码的性能优化,提前考虑代码的复杂度。
      在遇到问题时,可以更加积极地进行讨论,共同寻找解决方案。
posted @ 2025-03-22 21:51  PigPhilosophy  阅读(22)  评论(0)    收藏  举报