结对成员:何炎尧3117004655 梁景涛3117004619
一、Github项目地址:
https://github.com/Jarrett-L/Myapp
https://github.com/SIGH2333/Homework2
二、PSP表格:
二、PSP表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning |
计划 | 45 | 70 |
|
|
60 | 80 |
Development | 开发 |
1000 | 1200 |
|
|
60 | 120 |
|
|
35 | 35 |
|
|
40 | 50 |
|
|
30 | 30 |
|
|
70 | 80 |
|
|
750 | 800 |
|
|
45 | 55 |
|
|
90 | 110 |
Reporting | 报告 | 120 | 150 |
|
|
60 | 80 |
|
|
30 | 30 |
|
|
30 | 40 |
合计 | 1260 | 1500 |
三、效能分析:
1) 开始写的时候用了各类之间的调用比较混乱,对代码的可阅读性以及逻辑的清晰性都产生了影响,导致在有的类中会出现因为自己逻辑不清晰设置的实则重复的代码(变量的定义等),在两人一起讨论缕清逻辑关系后便对结构进行的调整,把多余的代码删除。
2)起初在响应main类的Server类中不仅调用了生成两个文件(Exercise.txt,answer.txt),还在生成题目的同时在控制台输出题目,在题目数量比较大 的情况下就会产生较大的时间开销
优化前的时间开销:
优化后的时间开销:
四、设计实现过程
对于这样一棵二叉树,每个叶子节点都是数字,每个父节点都是符号,然后中序遍历结果就是我们所需要的四则运算,而且每次父节点返回的时候,可以根据符号进行运算式的计算
其中TreeNode类中提供了getResult()方法和toString()方法供BTree类使用,
例如:CalAndVal()方法通过root节点的getResult()得到结果值
BTree类的toString方法通过TreeNode的toString方法得到生成的运算式字符串
树节点用的是String类型,生成的运算式子和答案也是String类型,那么通过递归生成运算式和答案,同时动态的赋值到相应的String[]数组中,通过OutputStream将字符串数组逐个逐行输出到对应的TXT文件
五、代码说明
BTree类:生成运算式子二叉树的方法:
TreeNode类:
①封装了树节点的两种构造方法;
②hasChild();判断是否为叶子节点的方法
③左右儿子结点的get、set方法;
④getStr();获得本结点字符的方法
⑤getResult();//运用递归思想,调用hasChild()方法判断,若本节点有子节点,则其为运算符,通过getStr()获得运算符的值,分加减乘 除四种情况对该节点的左右节点进行算术运算处理,其中值得注意的是,在处理减法时,若发现左儿子数值比右儿子小,则将该节点的减 运算换成其他运算形式,保证了结果一定为正数。对于除运算,若无法整除,则将最后结果(必为小数)交给Cycle类处理得到小数有无 循环体以及循环体开始的索引位置,最后由处理小数的类将小数转化为一个真分数形式。
⑥toString()方法:获得生成式子的字符串
对于每一个节点的括号的处理
1、若运算符为'/',则 (m2 op2 n2)的括号必须保留;
2、若运算符为'*'或'-',如果op2为'+'或'-',则(m2 op2 n2)的括号必须保留;
3、若运算符为'*'或'/',如果op1为'+'或'-',则(m1 op1 n1)的括号必须保留;
4、 除此之外,去掉括号不影响表达式的计算顺序。
Ran类: 需要通过Random获取随机数操作的方法类
getChildPlace();//根据运算符的个数获得倒数第二层所有节点的个数size,同时判断出在此层的子节点数d,最后创建一个大小为size的 boolean类型数组,同时随机获得d个子节点的索引值,并将这些索引值标记为FALSE;用于BTree类中的create方法
getNumber();//获得0-max之间数值的随机数
getNumber2();//获得1-max之间数值的随机数
getOperator();//获得一个随机数,并对该随机数进行对4求余的操作,得到的结果1234分别对应四种运算符号进行转化,获得相应的 运算符。
Write类:思路:调用OutputStream方法将字符串数组逐个按行写入指定文档中;
createAnswers();
createExercises();
createGrade();
六、测试运行
测试生成10道题目:
答题后对照答案:
将生成的题目,答案,成绩保存到对应的TXT文件中:
七、项目小结:
个人开发经历在前两个学年都已经有较多的体会,而结对编程的经验真的是第一次,感觉大有收获。
在个人开发的时候遇到技术的空白区或者逻辑混乱的地方,可能自己就会卡壳,使得进度很慢。而结对编程可以汇集两个人的力量,从讨论和思考中对项目有更清楚地了解,更深的认识。即使遇到两个人都没接触过的需求,也可以进行分工合作,大大提高了开发的效率。同时比起个人编程来说,结对编程不容易枯燥,对于项目的开发的讨论中能激发思考以及进一步的探索,保持对项目的热情。另外在结对编程时,两个人的思维可以变得更加灵活,不会选择一个方向硬啃下去,有更宽阔的视野,更灵活的思维方式以及更高的效率,不仅激发了对项目的热情同时也能对自身有更多的认识,从合作中知道自己欠缺什么,需要补足什么,总的来说是一次非常好的经验。