结对项目

1. 项目基本信息

成员
这个作业属于哪个课程 23软件工程
这个作业要求在哪里 【作业3】结对项目
这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序,培养团队协作和沟通交流能力

2. PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
· Estimate 估计这个任务需要多少时间 30 30
Development 开发 440 380
· Analysis 需求分析 (包括学习新技术) 60 30
· Design Spec 生成设计文档 40 30
· Design Review 设计复审 30 10
· Coding Standard 代码规范 (制定开发规范) 10 10
· Design 具体设计 30 40
· Coding 具体编码 180 120
· Code Review 代码复审 30 60
· Test 测试(自我测试,修改代码,提交修改) 60 80
Reporting 报告 130 160
· Test Report 测试报告 90 120
· Size Measurement 计算工作量 10 10
· Postmortem 事后总结, 并提出过程改进计划 30 30
Total 合计 600 570

3. 效能分析

在程序的优化过程中,主要关注了题目生成的效率。通过使用递归生成表达式并限制运算符的使用,显著提高了生成速度。初步分析显示,生成题目时,耗时最长的函数是generate_expression,主要由于其递归性质和随机数生成。

  • 改进思路:采用记忆化技术缓存已生成的表达式,避免重复计算。
  • 性能分析图:展示生成1000道题目所需的时间。

4. 设计实现过程

  • 模块划分
    • ExpressionGenerator:负责生成四则运算题目。
    • AnswerCalculator:负责计算题目的答案。
    • FileHandler:负责文件的读写操作。
    • AnswerChecker:负责将统计结果写入 Grade.txt。
  • 关键函数流程图
    • generate_expressionchoose_operatorgenerate_numbercombine_expressions

5. 代码说明

以下是项目的关键代码示例:

const { Fraction } = require("fractional");

function generateRandomNumber(limit) {
  return Math.floor(Math.random() * limit);
}

function generateFraction() {
  const numerator = generateRandomNumber(10);
  const denominator = generateRandomNumber(1, 10) + 1; // 避免分母为0
  return new Fraction(numerator, denominator);
}

function chooseOperator() {
  const operators = ["+", "-", "*", "/"];
  return operators[Math.floor(Math.random() * operators.length)];
}

function generateExpression(depth = 0, maxDepth = 3, limit) {
  if (depth > maxDepth) {
    return generateRandomNumber(limit);
  }

  const operator = chooseOperator();
  const left = generateExpression(depth + 1, maxDepth, limit);
  const right = generateExpression(depth + 1, maxDepth, limit);

  return `(${left} ${operator} ${right})`;
}

function generateExercises(numQuestions, rangeLimit) {
  const exercises = [];
  for (let i = 0; i < numQuestions; i++) {
    exercises.push(generateExpression(0, 2, rangeLimit).replace(/\s+/g, ""));
  }
  return exercises;
}

module.exports = { generateExercises };


# 其他模块实现...  

6. 测试运行

以下是10个测试用例及其说明:

  1. 用例11 + 1 → 预期答案:2
  2. 用例22 - 1 → 预期答案:1
  3. 用例33 * 3 → 预期答案:9
  4. 用例44 / 2 → 预期答案:2
  5. 用例55 + 5 - 3 → 预期答案:7
  6. 用例61/2 + 1/3 → 预期答案:5/6
  7. 用例72 * (3 + 1) → 预期答案:8
  8. 用例8(4 - 1) * 3 → 预期答案:9
  9. 用例9(5 + 5) / 2 → 预期答案:5
  10. 用例101/4 + 1/4 → 预期答案:1/2

说明:通过对每个表达式进行手动计算,确保程序的答案计算模块正确无误。

8. 项目小结

在这个项目中,我们成功实现了一个功能齐全的四则运算题目生成器。通过合作,我们在代码质量和文档编写方面相互学习。尽管在实现过程中遇到了一些性能问题,但通过优化算法,我们最终提高了程序的效率。我们意识到,良好的沟通和分工对于项目的成功至关重要。

posted @ 2025-03-19 23:04  TheMing811  阅读(20)  评论(0)    收藏  举报