软件工程第三次作业
一,学号姓名地址
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 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 初版代码的效能分析图:
从效能分析图中可以看出,程序的时间主要消耗在generate和write_exercises_and_answers函数中,因此,改良代码主要针对这两处函数进行优化。
3.2 改良后的效能分析图:
3.3 优化内容:
(1)缓存机制优化:改良版代码通过双重缓存设计实现性能提升:在Expr基类中同时维护_eval_cache和_canonical_cache两个缓存字段,当表达式结构未被修改时,eval和canonical方法直接返回缓存结果,避免重复计算。由于同一节点可能在规范化比较、求值验证和字符串化过程中被多次访问,因此,该缓存机制能够将时间复杂度从指数级降低至线性级。
(2)算法选择:改良版代码采用基于TimSort的内置排序算法进行表达式规范化,利用其O(nlogn)的高效性能处理可交换操作符的同类项排序;同时通过控制最大尝试次数为10次以避免无效循环。相比之下,源代码使用O(n²)的冒泡排序引入了大量不必要的计算复杂度,显著增加了算法在最坏情况下的执行时间。
四,设计实现过程
系统架构主要包括四个部分:
1. 表达式树设计
Expr抽象基类:定义表达式通用接口
Num类:处理整数和分数,统一内部表示为Fraction
Op类:构建二叉树结构,支持四则运算
2. 生成器设计
递归构建:从叶子节点向上构建表达式树
约束保证:通过特殊处理确保减法结果非负、除法结果为真分数
去重机制:使用规范化表示避免生成等价表达式
3. 解析器设计
词法分析:将输入字符串分解为token序列
语法分析:使用调度场算法构建表达式树
错误处理:完善的异常处理机制
4. 批改系统设计
一致性验证:重新计算标准答案确保正确性
容错处理:对格式错误的题目和答案进行适当处理
结果统计:详细记录正确和错误的题目编号
五,代码说明
5.1 核心数据结构设计:
上图提供求值、字符串化和规范化方法。
上图提供数字节点,支持整数和分数。
上图提供操作符节点,支持+-*/。
总功能 :用组合模式构建表达式树,令每个节点都能独立求值,使其支持缓存优化。
5.2 算法实现:
表达式规范化算法:将相同的表达式进行规范化处理(如1+2+3与2+1+3)。
表达式构建算法:用于构建表达式算法。
严格检查算法:用于检测运算过程与最终结果是否出现故障。
解析算法:用于优先级处理与括号处理,使表达式按正确的次序执行。
六,测试运行
6.1 基本测试:
测试1: 生成题目
测试2: 检查文件是否存在
测试3: 验证文件内容
测试4: 批改功能
6.2 具体测试:
6.3 测试结果:
通过test.py中主要功能路径与具体测试用例的测试可以得出:程序的主要功能完整,程序的运算结果准确。因此,该程序是正确的。
七,小结
在本轮结对编程开发四则运算题目生成系统的过程中,我们两人协作顺畅。一名成员主要负责核心算法架构的设计,包括表达式树的构建与规范化去重机制;另一位成员则致力于工程实现与性能优化,通过引入缓存策略显著提升了系统运行效率。我们通过定期代码审查与方案讨论不断优化实现,虽然在技术选型过程中存在不同观点,但通过充分沟通与实践达成最终共识,确保了项目的顺利推进。这次合作不仅高效完成了开发目标,更让我们体会到项目开发中团队的重要性,为未来的持续合作奠定了坚实基础。