结对项目

成员 杨子俊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.核心模块

  • 表达式生成:生成随机的四则运算表达式。

  • 表达式计算:解析并计算表达式的值。

  • 文件读写:保存题目、答案和校验结果。

  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;
    }
}

性能分析
性能分析
测试运行

  • 生成的题目:
    题目
  • 答案:
    答案

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

posted @ 2025-03-15 12:40  yzj4157  阅读(51)  评论(0)    收藏  举报