结对项目

结对作业

成员及项目

周戈 3123004164 李永胜 3123004148

项目地址

这个作业属于哪个课程 地址
这个作业要求在哪里 要求
这个作业的目标 完成结对项目

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
· Estimate · 估计这个任务需要多少时间 30 30
Development 开发 670 765
· Analysis · 需求分析 (包括学习新技术) 60 120
· Design Spec · 生成设计文档 30 20
· Design Review · 设计复审 (和同事审核设计文档) 30 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 5
· Design · 具体设计 120 60
· Coding · 具体编码 300 420
· Code Review · 代码复审 60 60
· Test · 测试(自我测试,修改代码,提交修改) 60 60
Reporting 报告 120 80
· Test Report · 测试报告 60 30
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 20
合计 820 875

效能分析




由图可知,evaluate方法消耗较多

性能改进

经检查,evaluate方法复杂,且多次被调用,所以使用map存储答案,减少被调用的次数

设计实现过程

所有类

1.GlobalConstant.java 全局常量,用于存储常量

2.ExpressionGenerator.java 表达式生成器,用于生成随机表达式

3.FileHandler.java 文件处理器,对文件进行预处理

4.Fraction.java 分数类,用于表示和处理分数运算

5.ExpressionEvaluator.java 表达式计算器,计算表达式的结果

6.ExpressionNormalizer.java 表达式标准化器,标准化表达式,用于去重

7.Main.java 主函数入口

核心方法

generateExpression():循环生成数字和表达式符号,尽量保证结果不为负数,直到生成完整的表达式,计算表达式得数,判断是否为负数,是重新计算,否则返回表达式;

normalizaExpression():先分词,转化为逆波兰表达式,转化为表达式树,对表达式树进行标准化,转化为字符串返回。

核心代码

public List<String> shuntingYard(List<String> tokens) {
    // 输出队列
    List<String> outputQueue = new ArrayList<>();
    // 运算符栈
    List<String> operatorStack = new ArrayList<>();

    for (String token : tokens) {
        // 判断是否为数字
        if (isNumber(token)) {
            outputQueue.add(token);
            // 判断是否为操作符
        } else if (isOperator(token)) {
            // 操作符栈不为空且栈顶元素优先级大于等于当前元素,则将栈顶元素弹出并加入输出队列
            while (!operatorStack.isEmpty() && hasHigherPrecedence(operatorStack.get(operatorStack.size() - 1), token)) {
                outputQueue.add(operatorStack.remove(operatorStack.size() - 1));
            }
            operatorStack.add(token);
        } else if (LEFT_BRACKET.equals(token)) {
            operatorStack.add(token);
        } else if (RIGHT_BRACKET.equals(token)) {
            // 将栈顶元素弹出并加入输出队列,直到遇到左括号
            while (!operatorStack.isEmpty() && !LEFT_BRACKET.equals(operatorStack.get(operatorStack.size() - 1))) {
                outputQueue.add(operatorStack.remove(operatorStack.size() - 1));
            }
            // 将 "(" 从操作符栈中弹出
            operatorStack.remove(operatorStack.size() - 1);
        }
    }

    while (!operatorStack.isEmpty()) {
        outputQueue.add(operatorStack.remove(operatorStack.size() - 1));
    }
    return outputQueue;
}

项目小结

明确分工与责任意识

项目初期,我们通过讨论明确了彼此的强项:我负责表达式标准化和性能调优,搭档专注表达式生成。分工后定期同步进度,确保任务不重叠、不遗漏。

沟通机制与冲突解决

采用“每日15分钟站会”快速同步进展,并约定使用Git版本控制工具管理代码,避免协作冲突。

当对技术方案产生分歧时,我们通过“提案对比法”列出各自的方案优缺点,最终以项目目标为导向达成共识。

互补学习与效率提升

搭档在编码领域的经验弥补了我的知识盲区,而我在性能调优方面的实践也帮助团队提升了整体效率。

通过互相审核代码和文档,我们减少了30%以上的低级错误,并建立了统一的代码规范。

本次合作让我认识到,团队协作不仅是任务的叠加,更是资源整合、信任构建和能力放大的过程。这些经验将为我未来的团队工作奠定坚实基础。

posted @ 2025-03-18 09:07  YiLaiL  阅读(38)  评论(0)    收藏  举报