结对项目
| 成员 | 杨子俊3123004331 吴其锦3123004327 |
|---|---|
| GitHub | 链接 |
| 这个作业属于哪个课程 | 地址 |
|---|---|
| 这个作业要求在哪里 | 要求 |
| 这个作业的目标 | 结对完成项目 |
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 15 | 30 |
| Estimate | 估计这个任务需要多少时间 | 30 | 50 |
| Development | 开发 | 500 | 150 |
| Analysis | 需求分析 (包括学习新技术) | 200 | 450 |
| Design Spec | 生成设计文档 | 40 | 45 |
| Design Review | 设计复审 | 55 | 50 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 35 |
| Design | 具体设计 | 20 | 40 |
| Coding | 具体编码 | 240 | 280 |
| Code Review | 代码复审 | 20 | 30 |
| Test | 测试(自我测试,修改代码,提交修改) | 250 | 290 |
| Reporting | 报告 | 90 | 120 |
| Test Repor | 测试报告 | 40 | 50 |
| Size Measurement | 计算工作量 | 40 | 60 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 40 | 45 |
| 合计 | 1360 | 1635 | |
| 这个作业的目标 | 实现小学四则运算 |
代码组织
模块划分
1.核心模块:
-
表达式生成:生成随机的四则运算表达式。
-
表达式计算:解析并计算表达式的值。
-
文件读写:保存题目、答案和校验结果。
- 辅助模块:
-
随机数生成:生成随机数和分数。
-
参数解析:解析命令行参数。
-
校验逻辑:比较题目和答案的正确性。
类设计
类划分
- ExpressionGenerator:
负责生成随机的四则运算表达式。
主要函数:
generateExpression:生成表达式。
generateFraction:生成分数或自然数。
- ExpressionEvaluator:
负责解析和计算表达式的值。
主要函数:
evaluateExpression:计算表达式的值。
parseFraction:解析分数或带分数。
- FileHandler:
负责文件的读写操作。
主要函数:
writeExercisesAndAnswers:生成题目和答案文件。
checkAnswers:校验答案并生成统计结果。
- MathGeneratorApp:
主程序类,负责解析命令行参数并调用其他模块。
主要函数:
run:根据参数执行生成题目或校验答案的逻辑。
关键函数实现
- generateExpression:
string ExpressionGenerator::generateExpression(int range, int depth) {
if (depth >= 3) {
return generateFraction(range);
}
char operators[] = {'+', '-', '*', '/'};
char op = operators[randomInt(0, 3)];
string e1 = generateExpression(range, depth + 1);
string e2 = generateExpression(range, depth + 1);
if (op == '-' || op == '/') {
double val1 = ExpressionEvaluator::evaluateExpression(e1);
double val2 = ExpressionEvaluator::evaluateExpression(e2);
if (val1 < val2) swap(e1, e2);
}
return "(" + e1 + " " + op + " " + e2 + ")";
}
- evaluateExpression:
double ExpressionEvaluator::evaluateExpression(const string& expr) {
string trimmed = expr;
size_t start = trimmed.find_first_not_of(" ");
size_t end = trimmed.find_last_not_of(" ");
if (start != string::npos) trimmed = trimmed.substr(start, end - start + 1);
if (trimmed.front() == '(' && trimmed.back() == ')') {
trimmed = trimmed.substr(1, trimmed.size() - 2);
}
if (trimmed.find_first_of("+-*/") == string::npos) {
return parseFraction(trimmed);
}
size_t opPos = findOperator(trimmed);
if (opPos == string::npos) {
cerr << "Error: No operator found in expression: " << expr << endl;
return 0.0;
}
string left = trimmed.substr(0, opPos);
string right = trimmed.substr(opPos + 1);
char op = trimmed[opPos];
double valLeft = evaluateExpression(left);
double valRight = evaluateExpression(right);
switch (op) {
case '+': return valLeft + valRight;
case '-': return valLeft - valRight;
case '*': return valLeft * valRight;
case '/': return valRight == 0 ? 0.0 : valLeft / valRight;
default: return 0.0;
}
}
性能分析

测试运行
- 生成的题目:
![题目]()
- 答案:
![答案]()
小结
本次结对项目让我们深刻体会到团队合作的重要性。通过分工协作,我们不仅高效完成了任务,还互相学习了许多编程技巧。未来我们会更加注重需求分析和代码风格的统一,以提升开发效率。


浙公网安备 33010602011771号