结对项目

软件工程 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、小结

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

上一篇:Redis(二)


下一篇:IdentityHashMap