结对编程作业(Java实现)
一、Github项目地址:
3117004655 何炎尧:https://github.com/SIGH2333/Homework2
3117004619 梁景涛:https://github.com/Jarrett-L/Myapp.git
二、PSP表格:
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
45 |
70 |
· Estimate |
· 估计这个任务需要多少时间 |
60 |
80 |
Development |
开发 |
1000 |
1200 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
120 |
· Design Spec |
· 生成设计文档 |
35 |
35 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
40 |
50 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
30 |
· Design |
· 具体设计 |
70 |
80 |
· Coding |
· 具体编码 |
750 |
800 |
· Code Review |
· 代码复审 |
45 |
55 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
90 |
110 |
Reporting |
报告 |
120 |
150 |
· Test Report |
· 测试报告 |
60 |
80 |
· Size Measurement |
· 计算工作量 |
30 |
30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
40 |
合计 |
|
1260 |
1500 |
三、效能分析:
1) 开始写的时候用了各类之间的调用比较混乱,对代码的可阅读性以及逻辑的清晰性都产生了影响,导致在有的类中会出现因为自己逻辑不清晰设置的实则重复的代码(变量的定义等),在两人一起讨论缕清逻辑关系后便对结构进行的调整,把多余的代码删除。
2)起初在响应main类的Server类中不仅调用了生成两个文件(Exercise.txt,answer.txt),还在生成题目的同时在控制台输出题目,在题目数量比较大 的情况下就会产生较大的时间开销
优化前的时间开销:
优化后的时间开销:
四、设计实现过程
对于这样一棵二叉树,每个叶子节点都是数字,每个父节点都是符号,然后中序遍历结果就是我们所需要的四则运算,而且每次父节点返回的时候,可以根据符号进行运算式的计算
生成表达书的二叉树结构:
各类的归属结构以及功能关系:
TreeNode类的方法及变量:
BTree类的方法及变量:
其中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文件中:
七、项目小结:
个人开发经历在前两个学年都已经有较多的体会,而结对编程的经验真的是第一次,感觉大有收获。
在个人开发的时候遇到技术的空白区或者逻辑混乱的地方,可能自己就会卡壳,使得进度很慢。而结对编程可以汇集两个人的力量,从讨论和思考中对项目有更清楚地了解,更深的认识。即使遇到两个人都没接触过的需求,也可以进行
分工合作,大大提高了开发的效率。同时比起个人编程来说,结对编程不容易枯燥,对于项目的开发的讨论中能激发思考以及进一步的探索,保持对项目的热情。另外在结对编程时,两个人的思维可以变得更加灵活,不会选择一个方向
硬啃下去,有更宽阔的视野,更灵活的思维方式以及更高的效率,不仅激发了对项目的热情同时也能对自身有更多的认识,从合作中知道自己欠缺什么,需要补足什么,总的来说是一次非常好的经验。