项目成员:3117004631 魏建雄
3117004623 卢悦盛
一 、Github项目地址:https://github.com/Yueson-Lu/Myapp1.0
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 1150 | 1420 |
· Analysis | · 需求分析 | 60 | 60 |
· Design Spec | · 生成设计文档 | 60 | 70 |
· Design Review | · 设计复审 | 60 | 50 |
· Coding Standard | · 代码规范 | 50 | 60 |
· Design | · 具体设计 | 90 | 100 |
· Coding | · 具体编码(包含第一次错误的代码设计) | 720 | 960 |
· Code Review | · 代码复审 | 50 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | 120 | 160 |
· Test Report | · 测试报告 | 60 | 90 |
· Size Measurement | · 计算工作量 | 30 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 1300 | 1710 |
三、设计实现过程
浏览结对项目之后,我们对问题进行需求分析,主要解决题目生成、结果计算、题目判重以及文件处理4个问题。因为最多出现三个运算符,也就是实现四元运算,我们枚举出二元运算、三元运算以及四元运算,然后随机生成运算式。因为乘法、除法的优先级高于加减法,我们打算运用枚举的方式将所有的运算可能枚举出来,就不用考虑优先级运算,程序只需要匹配枚举的运算情况,然后调用方法,进行运算就能得出结果。因为不能直接对分数进行运算,我们打算程序随机生成double型参数,然后进行四则运算,然后将double转化成分数输出,但由于分数转小数会有精度的缺失(例如1/3只能转化为0.33),而且0.33转化不了1/3。题目判重我们越想越复杂,我们打算先暴力解决,运用结果判重,如果结果相同就舍去,看项目后续完成情况,再进行修改完善。我们已经解决了大部分问题,可是我们不能分数形式的题目与结果的输出,以项目要求不符,所以我们打算重新编程,一开始就生成分数,用分数去进行四则运算。
我们打算随机生成参数与运算符生成字符串完成题目的生成。难点在于操作符的运算,我们发现了中缀转后缀的方法解析算术表达式,由于后缀表达式的运算符在两个操作数的后面,那么计算机在解析后缀表达式的时候,只需要从左向右扫描,也就是只需要向前扫描,而不用回头扫描,遇到运算符就将运算符放在前面两个操作符的中间,一直运算到最右边的运算符,那么就得出运算结果了。因为运算数可能包含的类型有整数和分数,那么就有三种运算的形式:整数和整数运算,分数和整数运算,分数和分数运算。为了方便运算,将整数也转化为分数,整数作为分子,分母设为1,这样就能将三类运算化为一类。
四、 代码说明
1.从控制台传入生成题目和生成范围的参数
2.文件生成的方式,固定生成位置为D盘
题目和答案的名称由myapp类调用传入参数
3.符号的生成使用了随机生成,1-4个数字平均分到加减乘除四个符号
4.处理统一分母的时候使用了辗转相除法
5.使用栈的方法处理符号的判断
五、测试运行
1.生成100道题目:
2.生成10000题:
六、项目小结
1.第一次尝试两个人一起进行程序开发,一起进行需求分析、算法设计,发现会比一个人独自进行更为快捷有效。在遇到困难时,一起想办法解决,互相勉励,共同进步。
2.本次结对项目,我们在第一次需求分析、设计复审时,并没有那么细致,没有考虑好实现基本运算后操作数的转换,导致编程时才发现小数转分数存在问题,增加了工作量,减低了效率,浪费了很多时间。在今后的编程前,应该更加细致地做好需求分析以及算法复审,一切准备好之后,再进行具体编程,这样能够增加编程效率,节省时间。
3.由于前期浪费了挺多时间,导致我们并没有完成答案文件的校对,还有一些地方还能进行完善,例如进行图形界面的设计。