项目成员:罗海屏、郑晓婷
一 、Github项目地址:https://github.com/ting9500/GNIT_Second.git
二、PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 |
30 |
· Estimate |
· 估计这个任务需要多少时间 |
30 |
30 |
Development |
开发 |
1080 |
1320 |
· Analysis |
· 需求分析 (包括学习新技术) |
80 |
120 |
· Design Spec |
· 生成设计文档 |
20 |
20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
40 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
45 |
60 |
· Coding |
· 具体编码 |
240 |
300 |
· Code Review |
· 代码复审 |
40 |
60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 |
60 |
Reporting |
报告 |
90 |
80 |
· Test Report |
· 测试报告 |
30 |
20 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
15 |
10 |
summary |
合计 |
1810 |
2170 |
三、效能分析
边生成题目边做计算,代码可读性较差
四、设计实现过程
1. 对于此次的课程题目,我们决定通过图形界面来展示结果,在一个生成类中自动生成小学四则运算题目,使用二叉树来进行题目查重,然后调用一个计算类计算出题目答案,再将题目保存在Exercises.txt文件中,答案保存在Answers.txt文件中。通过图形界面获取用户输入的答案,与正确答案进行校对并统计出正确题目数量。
2. 简单的需求分析之后我们具体到功能类的实现:
(1)生成题目:我们的思路是先随机生成前 n - 1 个数的表达式,再添加最后一个数字,补全剩余的括号,目的是为了使所有的括号都有意义。而对于题目中含有“÷ 0”的情况,直接删除,但是对于计算过程中出现的除以0的情况,则需要在计算类中判断是否生成该题目;
(2)计算题目:我们利用栈对题目的计算过程中的运算符、数值及中间结果进行处理,利用Map获取对应运算符的优先级,进行相应的运算。根据有无括号及运算符优先级调用不同的方法doCalcul ( )、comparePriority ( ),然后通过finalResult ( )方法获取到最终结果并将其规范化表达;
(3)题目查重:这个功能比较复杂,一开始的想法是使用数组存放运算过程中运算符及数值的操作顺序记录,之后每次生成题目时都与之前的记录作比较,不同则表示题目不重复,进行下一步运算,否则则重新生成新的题目。但是对于 ( a + b ) + ( c + d )形式的题目,我们暂时没有想到更好的处理方式进行查重,所以我们换了另外一种思路——使用二叉树进行查重,数值作为叶子节点,运算符作为父节点及中间节点,处于同一父节点的两个叶节点按照较小数值置于左边,较大数值置于右边,以此生成二叉树。但是由于逻辑上还有些不清晰,代码一直出现bug,导致最终还是无法实现该功能,将在后面补上;
(4)四则运算:此功能比较简单,我们首先将两个数值都转换成“a / b”的形式,再进行计算,使用add ( ),subtraction ( ) 、multiplication ( )、division ( )计算得出结果。
五、代码说明
(1)边生成题目边计算中间结果,得出题目答案:
(2)使用MAP设置优先级
(3)优先级:高 -> 低情况下的计算
(4)优先级:低 ->高 情况下的计算
(5)结果格式化
(6)四则运算
(7)文件保存
六、测试运行
(1)开始运行程序
(2)未输入生成题目数量及数值范围
(3)输入数值
(4)随机生成题目
(5)用户输入并提交答案,后台将用户答案与正确答案进行校正,统计正确题数
(6)保存题目Exercises.txt文件
(7)保存答案Answers.txt文件
(8)Grade.txt文件
(9)保存的文件
七、实际花费的时间
2170
八、项目小结
本次四则运算的练习还是做得不够完善,运用的方法比较笨重,代码比较冗余,时间复杂度和空间复杂度较大,题目查重将使用二叉树的形式,目前还未完成查重功能,此项目将会继续完善下去。