结对编程作业(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文件中:

 

 


七、项目小结:

  个人开发经历在前两个学年都已经有较多的体会,而结对编程的经验真的是第一次,感觉大有收获。

  在个人开发的时候遇到技术的空白区或者逻辑混乱的地方,可能自己就会卡壳,使得进度很慢。而结对编程可以汇集两个人的力量,从讨论和思考中对项目有更清楚地了解,更深的认识。即使遇到两个人都没接触过的需求,也可以进行

  分工合作,大大提高了开发的效率。同时比起个人编程来说,结对编程不容易枯燥,对于项目的开发的讨论中能激发思考以及进一步的探索,保持对项目的热情。另外在结对编程时,两个人的思维可以变得更加灵活,不会选择一个方向

  硬啃下去,有更宽阔的视野,更灵活的思维方式以及更高的效率,不仅激发了对项目的热情同时也能对自身有更多的认识,从合作中知道自己欠缺什么,需要补足什么,总的来说是一次非常好的经验。

猜你喜欢

转载自www.cnblogs.com/sigh2333/p/11683736.html