结对项目
1. 项目基本信息
成员
- 钟鸣3123004336
- 黄熙儿3123004308
- GitHub:https://github.com/i7uer/FourCalculation
这个作业属于哪个课程 | 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_expression
→choose_operator
→generate_number
→combine_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:
1 + 1
→ 预期答案:2
- 用例2:
2 - 1
→ 预期答案:1
- 用例3:
3 * 3
→ 预期答案:9
- 用例4:
4 / 2
→ 预期答案:2
- 用例5:
5 + 5 - 3
→ 预期答案:7
- 用例6:
1/2 + 1/3
→ 预期答案:5/6
- 用例7:
2 * (3 + 1)
→ 预期答案:8
- 用例8:
(4 - 1) * 3
→ 预期答案:9
- 用例9:
(5 + 5) / 2
→ 预期答案:5
- 用例10:
1/4 + 1/4
→ 预期答案:1/2
说明:通过对每个表达式进行手动计算,确保程序的答案计算模块正确无误。
8. 项目小结
在这个项目中,我们成功实现了一个功能齐全的四则运算题目生成器。通过合作,我们在代码质量和文档编写方面相互学习。尽管在实现过程中遇到了一些性能问题,但通过优化算法,我们最终提高了程序的效率。我们意识到,良好的沟通和分工对于项目的成功至关重要。