软件工程第三次作业

一,学号姓名地址

项目 内容
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13479
这个作业的目标 设计实现小学四则运算的命令行程序,熟悉团队编程
GitHub仓库 https://github.com/mmt-hub/My-app
成员一:黄思博 学号:3123004483
成员二:袁斯楷 学号:3123004503

二,PSP表

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

三,效能分析
3.1 初版代码的效能分析图:

image

从效能分析图中可以看出,程序的时间主要消耗在generate和write_exercises_and_answers函数中,因此,改良代码主要针对这两处函数进行优化。

3.2 改良后的效能分析图:

屏幕截图 2025-10-18 210923

3.3 优化内容:
(1)缓存机制优化:改良版代码通过双重缓存设计实现性能提升:在Expr基类中同时维护_eval_cache和_canonical_cache两个缓存字段,当表达式结构未被修改时,eval和canonical方法直接返回缓存结果,避免重复计算。由于同一节点可能在规范化比较、求值验证和字符串化过程中被多次访问,因此,该缓存机制能够将时间复杂度从指数级降低至线性级。
(2)算法选择:改良版代码采用基于TimSort的内置排序算法进行表达式规范化,利用其O(nlogn)的高效性能处理可交换操作符的同类项排序;同时通过控制最大尝试次数为10次以避免无效循环。相比之下,源代码使用O(n²)的冒泡排序引入了大量不必要的计算复杂度,显著增加了算法在最坏情况下的执行时间。

四,设计实现过程
image

系统架构主要包括四个部分:
    1. 表达式树设计
      Expr抽象基类:定义表达式通用接口
      Num类:处理整数和分数,统一内部表示为Fraction
      Op类:构建二叉树结构,支持四则运算

    2. 生成器设计
      递归构建:从叶子节点向上构建表达式树
      约束保证:通过特殊处理确保减法结果非负、除法结果为真分数
      去重机制:使用规范化表示避免生成等价表达式

    3. 解析器设计
      词法分析:将输入字符串分解为token序列
      语法分析:使用调度场算法构建表达式树
      错误处理:完善的异常处理机制

    4. 批改系统设计
      一致性验证:重新计算标准答案确保正确性
      容错处理:对格式错误的题目和答案进行适当处理
      结果统计:详细记录正确和错误的题目编号

五,代码说明
5.1 核心数据结构设计:
image
上图提供求值、字符串化和规范化方法。
image
上图提供数字节点,支持整数和分数。
image
上图提供操作符节点,支持+-*/。
总功能 :用组合模式构建表达式树,令每个节点都能独立求值,使其支持缓存优化。

5.2 算法实现:
    表达式规范化算法:将相同的表达式进行规范化处理(如1+2+3与2+1+3)。

image

    表达式构建算法:用于构建表达式算法。

image

    严格检查算法:用于检测运算过程与最终结果是否出现故障。

image

    解析算法:用于优先级处理与括号处理,使表达式按正确的次序执行。

image
image

六,测试运行
6.1 基本测试:
测试1: 生成题目
image
测试2: 检查文件是否存在
image
测试3: 验证文件内容
image
测试4: 批改功能
image
6.2 具体测试:
image
6.3 测试结果:
image
通过test.py中主要功能路径与具体测试用例的测试可以得出:程序的主要功能完整,程序的运算结果准确。因此,该程序是正确的。

七,小结
在本轮结对编程开发四则运算题目生成系统的过程中,我们两人协作顺畅。一名成员主要负责核心算法架构的设计,包括表达式树的构建与规范化去重机制;另一位成员则致力于工程实现与性能优化,通过引入缓存策略显著提升了系统运行效率。我们通过定期代码审查与方案讨论不断优化实现,虽然在技术选型过程中存在不同观点,但通过充分沟通与实践达成最终共识,确保了项目的顺利推进。这次合作不仅高效完成了开发目标,更让我们体会到项目开发中团队的重要性,为未来的持续合作奠定了坚实基础。

posted @ 2025-10-21 17:06  Hsibo  阅读(11)  评论(0)    收藏  举报