结对项目——小学四则运算
这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 结对项目 |
这个作业的目标 | 1、尝试结对编程 2、深入熟悉开发过程 3、设计一个能自动生成小学四则运算题并批改题目的程序 |
一、合作者
姓名 | 学号 |
---|---|
冯逸华 | 3121005162 |
马传丞 | 3121005096 |
GitHub仓库地址 | GitHub |
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 120 | 150 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 25 |
· Design Spec | · 生成设计文档 | 30 | 35 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 25 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
· Design | · 具体设计 | 60 | 50 |
· Coding | · 具体编码 | 400 | 480 |
· Code Review | · 代码复审 | 20 | 15 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 70 |
Reporting | 报告 | 80 | 75 |
· Test Report | · 测试报告 | 30 | 25 |
· Size Measurement | · 计算工作量 | 30 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 895 | 1015 |
三、效能分析
1、改进思路
程序中最消耗性能的部分就是生成多条算式时遍历比较算式的重复,一开始的比较思路是比较算式生成的后缀表达式的数组元素是否全部重复。但是每个算式都遍历的话非常耗时且占用内存较大。
改进思路就是添加筛选,先比较数组长度及对应算式产生的答案,若不同,则算式肯定不重复,直接返回不重复。
2、性能分析图
3、消耗最大的函数
用于去除重复的函数:Equation.filter()
因为里面用了许多逻辑判断和嵌套循环,时间复杂度高,随生成数量提高而呈幂次增长
四、设计实现过程
1、代码组织
- Main
- po包
- Operand
- Operator
- util包
- FileUtil
- 项目结构
五、代码说明
1、关键代码
filter()
对存储表达式的指定数组做筛选,筛除不合格的表达式,返回存放合格表达式的数组。
generate()
生成随机中缀表达式,并返回
infixToPostfix()
将中缀表达式转换为后缀表达式
2、思路说明
(1)filter()
- 说明:用于过滤重复的表达式
- 思路:按顺序层层筛选,由于转换成后缀表达式,不用考虑括号
- 先去除运算过程含负数的
- 先比较结果
- 比较表达式是否一样
- 再比较包含的运算符是否相同
- 比较第一次运算的两数是否只是交换位置
(2)generate()
- 说明:用于生成随机表达式
- 思路:通过传参确定此次生成中包含的操作数数量、运算符数量、括号数量、数的范围,然后随机new出各对象,交替拼接操作数和运算符,最后随机添加括号
(3)infixTOPostfix
-
说明: 将中缀表达式转换成后缀表达式
-
思路:
无括号:
1.扫描中缀表达式的每一个字符,将数字入列;
2.遇到运算符,栈空时直接进栈,栈顶非空时,运算符优先级大于栈顶元素才进栈,
否则栈顶元素退栈入列,当前运算符再进栈;
3.依次进行直至所有字符操作完毕
有括号:
1.扫描中缀表达式的每一个字符,将数字入列;
2.遇到运算符,栈空时直接进栈,栈顶非空时,运算符优先级大于栈顶元素才进栈,
否则栈顶元素退栈入列,当前运算符再进栈;
3.遇到左括号,直接进栈,左括号后面的运算符直接进栈,直至遇到右括号;
4.遇到右括号时,将栈顶元素依次退栈入列,直到遇到左括号,将左括号退栈,符号操作移动下一位
5.重复以上操作,直至所有字符操作完成。
六、测试运行
1、测试用例
(1)生成1万个算式
(2)下载算式
(3)将生成的算式分题目和答案下载
(4)统计结果
七、项目小结
小结1:
冯逸华:
本来以为这个项目很快能完成,总体思路只花了20分钟,但尽管有思路,具体实现也没那么快。另外在去除重复表达式和添加多个小括号中也没有特别好的思路,拖了很长时间。关于结对编程,我的搭档能在一些地方提醒我,帮我想到更简单的实现,但总体来说,因为讨论和熟悉设备而花的成本还是挺高的。
小结2:
马传丞:
寒假刚刚学习java语言,正缺乏项目练手,这次的结对编程给我提供了一次机会。一开始接到项目需求的时候,有点两眼发愣,无从下手,后面查找了资料相对了解了这个项目大致思路。这次能完成这个作业,很大程度是因为有一个好搭档。我的搭档编程能力比我优秀许多,在项目编写之处,就能构思好整个项目的编写思路,所需要的主要函数,甚至主要函数的实现思路都有了。在一个下午左右的时间里,我的搭档向我解说,他的构思;解决我的疑惑,并完成框架搭建。这让我有了种我上我也行的感觉。最后,感谢搭档的帮助,让我对java编程有了更高的认识。