结对项目
| 软件工程 | https://edu.cnblogs.com/campus/gdgy/networkengineering1934-Softwareengineering |
|---|---|
| 作业要求 | https://edu.cnblogs.com/campus/gdgy/networkengineering1934-Softwareengineering/homework/12138 |
| 作业目标 | 体验结对编程的过程,感受两人合作开发项目的好处,提高合作能力 |
3119005347叶杞豪 / 31119005341唐振凯
作业github链接
1、PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 25 | 18 |
| Estimate | 估计这个任务需要多少时间 | 15 | 10 |
| Development | 开发 | 1123 | 1188 |
| Analysis | 需求分析 | 30 | 20 |
| Design Spec | 生成设计文档 | 20 | 21 |
| Design Review | 设计复审 | 26 | 30 |
| Coding Standard | 代码规范 | 17 | 10 |
| Design | 具体设计 | 30 | 27 |
| Coding | 具体编码 | 1000 | 1080 |
| Code Review | 代码复审 | 46 | 28 |
| Test | 测试(自我测试,修改代码,提交修改) | 180 | 250 |
| Reporting | 报告 | 40 | 45 |
| Test Repor | 测试报告 | 33 | 22 |
| Size Measurement | 计算工作量 | 15 | 11 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 43 |
| 合计 | 1507 | 1615 |
2、设计思路
2.1 表达式用二叉树表示
我们平常见到的表达式:3+4×5÷(6-7)+8是一种中缀表达式,表达式可以用二叉树来表示,二叉树有以下特点:
- 非叶子节点表示算术符号,叶子节点表示数
- 非叶子节点的左孩子和右孩子非空
因此上面表达式转化为二叉树就是
![]()
黄色为符号节点,白色为数字节点
2.2 运算符数量控制
因为限定符号数不超过3个,可以用随机函数随机生成一个小于等于3的数,在构建一棵子树的时候顺便算出子树的计算结果和树高
2.3 防止计算过程产生负数
负数的产生是因为减法运算,由于在生成子树的时候会计算结果,可以判断一下结果是否是负数,如果是负数,就取绝对值,即将左右子树互换

2.4 防止题目重复
递归判断两棵表达式树k1、k2, 如果k1和k2的左右子树分别相同,就可以判定k1,k2是两棵相同的树,也就是表达式一样。如果不相同并且符号是+或者×的时候,再判断k1->left == k2->right && k1->right == k2->left,如果结果为真,说明是相同的一个表达式树。其他情况才是不相同的树,比如

2.5 计算表达式结果
将整数也当做分数来计算,在运算的过程中需要保证分数最简。结果的计算和二叉树的生成同时进行。
3、项目流程和各模块功能
3.1 项目流程图

3.2 项目结构
| 类名 | 功能 |
|---|---|
| Main | 调度其他类实现题目要求 |
| Fraction | 四则运算过程的具体实现 |
| Expression | 生成表达式,同时计算结果 |
| HandleCal | 将题目和作答情况写进txt文件 |
4、具体实现
1、四则运算过程的具体实现

2、生成二叉树
从根节点开始,向下递归生成左子树和右子树,同时计算表达式结果和树高

3、判断表达式是否重复
两棵表达式树k1、k2的左右子树是否相同,如果相同可以判定表达式重复。如果不相同并且符号是+或者×的时候,再判断k1->left == k2->right && k1->right == k2->left。

4、输出表达式
按照中序遍历的顺序输出二叉树,形成表达式,同时随机生成括号

5、输出题目到txt文件
给题目加上序号,并按序写进txt文件

6、将作答结果写入txt文件

5、计算模块接口部分的性能
可以发现cpu占用率最高的几个方法都和生成表达式有关,因此生成表达式的算法对程序性能的影响最大
6、计算模块部分单元测试展示
1、生成表达式测试

测试结果:

2、四则运算测试

测试结果:

3、文本读写测试

测试结果:

7、项目功能测试
生成一万道题目:

题目:

答案:

作答情况:

8、小结
叶杞豪:通过本次练习,体会到了二叉树在随机生成表达式和查重方面的巧妙运用,同时通过结队编程,我更深刻地体验到代码规范的重要性。多人结队编程,如果不遵守规范,就会造成组合代码时要花费很多时间。
唐振凯:由于之前从未参与过多人合作项目开发,因此花费了很多功夫进行准备工作。两人合作的好处是形成互补,遇到难题时解决效率会提高。此外积累了一定的合作经验,养成了写注释的习惯。


浙公网安备 33010602011771号