zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Delphi 的字符及字符串 Char、AnsiChar、WideChar、PChar、PAnsiChar、PWideChar
    C# DllImport的用法
    delphi 枚举类型与字符串的转换
    MSSQL2005不能用IP访问
    Delphi制作DLL
    Delphi接口的底层实现
    MacBook下每次SourceTree每次拉取代码都要输入密码解决办法
    因子分析AF
    蒲公英组网
    485通信
  • 原文地址:https://www.cnblogs.com/gravity9874/p/13769532.html
Copyright © 2011-2022 走看看