20200924-5 四则运算试题生成,结对

此作业要求参见: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

原文地址:https://www.cnblogs.com/gravity9874/p/13769532.html