此作业要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11245
coding地址:https://e.coding.net/ayuyu/software-engineering-coursework/se-homework-20200924.git
结对对象:夏柳青(https://www.cnblogs.com/ayuyu/)
功能1. 四则运算
支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)。
重难点分析:此功能实现的难点在于如何生成四则运算题目,在本程序中,实现生成运算式的方法是利用二叉树,生成一颗二叉树,它的叶子节点都是数字,每个父节点都是符号,然后经过中序遍历的结果就是题目所需要的四则运算表达式,而且每次父节点返回的时候,可以根据符号进行运算式的计算表达式结果。在生成过程中还需要对运算式进行检验,排除除数为0和不能整除的情况。二叉树示意图如下:
编程收获:在实现这个功能的过程中,复习了数据结构相关的知识,也对二叉树有了更深入的了解。
主要代码如下:
1 public void createBTree() { 2 TreeNode lchild, rchild, lnode, rnode; 3 if (num == 1) { 4 lchild = new TreeNode(String.valueOf(Utils.getNumber(10)), null, null); 5 rchild = new TreeNode(String.valueOf(Utils.getNumber(10)), null, null); 6 root = new TreeNode(String.valueOf(Utils.getOperator()), lchild, rchild); 7 } else { 8 int num1 = 0; 9 int n = getDeep() - 3; 10 boolean[] place = Utils.getChildPlace(num); 11 root = new TreeNode(String.valueOf(Utils.getOperator()), null, null); 12 opeList.add(root); 13 for (int i = 0; i < n; i++) { 14 for (int j = 0; j < (int) Math.pow(2, i); j++, num1++) { 15 lchild = new TreeNode(String.valueOf(Utils.getOperator()), null, null); 16 rchild = new TreeNode(String.valueOf(Utils.getOperator()), null, null); 17 opeList.get(j + num1).setChild(lchild, rchild); 18 opeList.add(lchild); 19 opeList.add(rchild); 20 } 21 } 22 for (int i = 0; i < place.length; i++) { 23 if (place[i]) { 24 lnode = new TreeNode(String.valueOf(Utils.getNumber(10)), null, null); 25 rnode = new TreeNode(String.valueOf(Utils.getNumber(10)), null, null); 26 if (i % 2 == 0) { 27 lchild = new TreeNode(String.valueOf(Utils.getOperator()), lnode, rnode); 28 opeList.add(lchild); 29 opeList.get(num1).setLchild(lchild); 30 } else { 31 rchild = new TreeNode(String.valueOf(Utils.getOperator()), lnode, rnode); 32 opeList.add(rchild); 33 opeList.get(num1).setRchild(rchild); 34 } 35 } else { 36 if (i % 2 == 0) { 37 lchild = new TreeNode(String.valueOf(Utils.getNumber(10)), null, null); 38 opeList.get(num1).setLchild(lchild); 39 } else { 40 rchild = new TreeNode(String.valueOf(Utils.getNumber(10)), null, null); 41 opeList.get(num1).setRchild(rchild); 42 } 43 } 44 num1 = num1 + i % 2; 45 } 46 } 47 }
功能2. 支持括号
老师看了你的表演,大大赞赏了你。然后她说,"你的题库里怎么都是没有括号的题呢,我记得你当初括号就掌握得不好啊。"你的脸红了,对老师说,"给我2个小时时间,我给你一个新版本,有括号的。"
重难点分析:该功能难点主要在于括号的随机生成,而且当中序遍历时要注意括号的匹配。
编程收获:对二叉树的结构,以及中序遍历都有了更深刻的理解。
主要代码如下:
1 public String toString() { 2 String Lstr = "", Rstr = "", Str = ""; 3 if (hasChild()) { 4 if (getRchild().hasChild()) { 5 if (str.equals("/")) { 6 Rstr = getRchild().toString(); 7 } 8 else if (str.equals("*") || str.equals("-")) { 9 if (getRchild().str.equals("+") || getRchild().str.equals("-")) { 10 Rstr = getRchild().toString(); 11 } else { 12 Rstr = getRchild().toString().substring(1, getRchild().toString().length() - 1); 13 } 14 } else { 15 Rstr = getRchild().toString().substring(1, getRchild().toString().length() - 1); 16 } 17 } else { 18 Rstr = getRchild().str; 19 } 20 if (getLchild().hasChild()) { 21 if (str.equals("*") || str.equals("/")) { 22 if (getLchild().str.equals("+") || getLchild().str.equals("-")) { 23 Lstr = getLchild().toString(); 24 } else { 25 Lstr = getLchild().toString().substring(1, getLchild().toString().length() - 1); 26 } 27 } else { 28 Lstr = getLchild().toString().substring(1, getLchild().toString().length() - 1); 29 } 30 } else { 31 Lstr = getLchild().str; 32 } 33 Str = "(" + Lstr + str + Rstr + ")"; 34 } else { 35 Str = str; 36 } 37 return Str; 38 }
功能3. 限定题目数量,"精美"打印输出,避免重复,f4"是程序的名字,它真正的名字是"f4.exe","-c 3"是命令行参数。按下回车,此时程序开始执行。"-c"这个参数后面输入多少,就生成多少题目。
重难点分析:功能三的重难点我认为在于命令行参数输入和输出格式化
编程收获:对java的命令行参数输入有了更多的了解
功能1功能2运行截图如下
功能3运行截图如下
要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,随笔有以下两种方式:(①允许两人写一份,得一份分数,二人均分;②如果每人写一份,内容不得抄袭,体会需要是自己的,分别得到自己博客的分数)。 (1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会,以及 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)
结对编程体会:
在本次作业的完成过程当中,花费时间较长主要在编程当中,以为对java语言不了解,首先是对主要编程语言的争论比较多,讨论是否使用python语言,最后决定使用Java语言,然后在运算式的生成,括号的生成,中序遍历计算结果的过程当中都遇到了许多困难,但是在克服困难的过程当中收获也比较多,收获主要体现在本次作业对二叉树的应用,因为之前对这方面了解甚少,在经历这次作业之后有了更多的理解,在完成这次结对编程作业之后,我最大的心得就是众人拾柴火焰高,人多力量大,有的时候一个人无法解决的问题两个人在一块讨论可以很快地解决。
要求2 给出结对开发的截图证据,要求截图能够证明你们是在结对编程。 (5分)
本次作业由我和夏柳青同学在东华b610宿舍完成,照片如下
要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(25分)
coding地址:https://e.coding.net/ayuyu/software-engineering-coursework/se-homework-20200924.git