zoukankan      html  css  js  c++  java
  • 2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第一周

    2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第一周

    结对小伙伴:

    需求分析(描述自己对需求的理解,以及后续扩展的可能性)

      • 能根据用户的需求自动生成一定量的题目,且题目的等级是可改变的。
        如:2 + 5 =
        2+53=
        (2+5)
        3=
        (2+5)*3/2=
        这些就是不同等级的题目。(操作数和运算符的数量不同,高级题目中含有不同运算级)
      • 支持括号
      • 可独立使用(能实现自己编写测试类单独生成题目的功能)
      • 题目运算(判题),可独立使用
      • 实现中缀表达式转为后缀表达式并计算
      • 判断用户答题正误,并输出正确结果
      • 支持真分数
      • 可独立使用
      • 实现分数算式的计算
      • 后续扩展:完成表达式随机带括号,题目去重化。

    设计思路(同时输出UML类图)

    1. 在思考第一个问题的时候,我本打算只创建一个类,在这个类中设计三个方法,用来得到三种不同级别的题目,但是这样我就要不停的创造方法,而且方法中还需要不停的初始化不同的Random对象。这时队友提出,要求是随机产生不同等级的题目,就觉得这样太浪费,而且不能够根据实际需要来判定有几个操作符和操作数。这样还容易出现错误。

    这个时候我想到上周学习到的继承,既然每一个方法必不可少的就是运算符和操作数,那么为何不创建一个父类,在父类中就写好这些,于是我们就选择了第二个方法。

    • 这是现阶段的一些关键代码
        {
            String num;//
            protected String Expression;//
            String mount;
            String ope; ```
    
            //我现在需要一个随机数,来表示题目等级,然后随机确定题目的等级
        public String getStage()
        {
             num = getRandomNumber();
             Expression = num +" ";
    
            Random stsge = new Random();
            int a = stsge.nextInt(4);
    
            for (int b =0 ;b <= a;b++)
            {
                ope = getOperator();
                Expression += ope + " ";
                num = getRandomNumber();
                Expression += num + " ";
            }
    
            return Expression;
        }
    
        }
    
    2.中缀表达式转化为后缀表达式表达式,并计算出结果。
    栈是在为解决这个问题的过程中学到的新知识。
    > 列表、对列和堆栈都是线性数据结构。堆找 stack类似于队列,差别在于堆栈元素在堆栈的同一端进入和移出堆栈,最后
    一个进入栈堆的元素,是第一个移出堆栈的元素,就像放在橱柜中的一叠盘子或堆在谷仓中的一垛干草。堆栈是一种以后进先出方式管理数据的线性数据结构。
    
    按照老师讲解的栈的原理,我整理了一下将中缀表达式变成后缀表达式的思路,举个例子:
    9+(3-1)*3+6/2,转换为后缀表达式
    1、遇到9 输出9,此时屏幕显示9,栈为空
    2、遇到+号,此时栈空,直接入栈,此时屏幕显示9,栈元素只有一个+号
    3、遇到左括号,直接入栈,此时屏幕显示9,栈元素为 + (
    4、遇到3,输出3,此时屏幕显示9 3,栈元素为+ (
    5、遇到-号,栈顶元素为(,入栈,此时屏幕显示9 3,栈元素为+ ( -
    6、遇到1,输出1,此时屏幕显示9 3 1,栈元素为+ ( -
    7、遇到),持续出栈,直到栈顶为(,并将(出栈但不输出,且)不入栈。此时屏幕显示9 3 1 -,栈元素为+
    8、遇到*,此时栈顶元素为+,优先级大于栈顶元素,入栈,此时,屏幕显示9 3 1 -,栈元素为+ *
    9、遇到3,输出3,此时屏幕显示9 3 1 - 3,栈元素为+ *
    10、遇到+,此时栈顶元素为*,优先级大于等于+,出栈并输出,之后栈顶元素为+,优先级依然大于等于+,出栈并输出,此时栈空,+入栈,
    此时屏幕显示9 3 1 - 3 * +,栈元素为+
    11、遇到6,输出6.此时屏幕显示9 3 1 - 3 * + 6,栈元素为+
    12、遇到/,优先级大于栈顶元素,入栈,此时屏幕显示9 3 1 - 3 * + 6,栈元素为+ /
    13、遇到2,输出2,此时屏幕显示9 3 1 - 3 * + 6 2
    14、此时所有输入读取完毕,将栈中元素依次出栈至空,最后,屏幕显示9 3 1 - 3 * + 6 2 / +
    
    
    - 现阶段代码(可能还有一些瑕疵,后续还会继续修改)
            public class Transvertor {
            private int num1, num2, value1, value2, number;
            private Stack stack1 = new Stack();
            private String result1;
            private int[][] array = {{0, 0, 0, 0, 0},
                    {0, 1, 1, -1, -1},
                    {0, 1, 1, -1, -1},
                    {0, 1, 1, 1, 1},
                    {0, 1, 1, 1, 1}};
    
            public Transvertor() {
            num1 = 0;
            num2 = 0;
            value1 = 0;
            value2 = 0;
            result1=" ";
    
            }
    
    
            public String getAnswer(String Expression) { 
    
            StringTokenizer st = new StringTokenizer(Expression);
            while (st.hasMoreTokens()) {
                String A = st.nextToken();
    
                if (A.equals("-")  || A.equals("+") || A.equals("×") || A.equals("÷")) {
                    switch (A) {
                        case "+":
                        number = 1;
                            break;
                        case "-":
                            number = 2;
                            break;
                        case "×":
                            number = 3;
                            break;
                        case "÷":
                            number = 4;
                            break;
                    }
    
                    if (stack1.empty()) {
    
                        stack1.push(A);
                        num1 = number;
                        value1++;
    
                    } else {
    
                        num2 = number;
    
                        if (array[num1][num2] <= 0) {
                            stack1.push(A);
                            value1 += 1;
                        } else {
                            result1 += stack1.pop()+" ";
                            stack1.push(A);
                        }
                    }
                }
                else
                    result1 += A + " ";
    
            }
            for (int y = 0; y < value1; y++)
                result1 += stack1.pop()+" ";
    
            return result1;
    
        }
    
        public String getResult()
        {
            return  result1;
        }
    }
    
    
    3.真分数的实现现阶段还只有简单的想法,代码还没有编写完成。٩(๑❛ᴗ❛๑)۶
    
    ## 类图
    ![](https://images2018.cnblogs.com/blog/1333074/201805/1333074-20180501211144804-778876923.png)
    
    
    
    
    
    
    
    注释:
    - Fraction类是为了产生一个真分数,而且可以独立使用。
    - Issue类产生随机的操作数和操作符,是Expressions类的父类,Expressions用来生成一个含有真分数的但现阶段不含括号的表达式。
    - Transvertor类是关键,包含两个方法,一个将中缀表达式转后缀表达式,一个根据后缀表达式计算出结果。
    - Questions类进行实例化。
    - Judgement类用来测试用户回答是否正确,并统计正确的个数以计算正确率
    
    
    ## 对结对的小伙伴做出评价
    - 对队友的评价:
        - 编写代码的能力很强,代码的逻辑清晰、简单。
        - 变通能力很强哟(〃'▽'〃),就像是在中缀表达式转后缀表达式时,我们需要判断到底该是操作符还是操作数时,老师给出的意见是利用ASCII字符集来判断它是否在48-57的范围之内,但是我们在产生表达式时就已经存在分数,所以这样来判断是比较麻烦的,于是队友机智地换了一种思路——直接判断操作符。(。^▽^)厉害。
        - 但因为思路比较简单,所以代码不够精简,后期还可以继续改进。
        - 有一些小的方面没有考虑清楚,有一些小的差错。
    
    - 前期我们是打算一起完成全部的任务,但是因为各自的时间有差异,而且虽然一起讨论是有效果的,但存在差异的地方才是应该重点讨论的地方,而且每个人都有不同的想法,我们要依靠一定的自己的力量来完成一些事情,而不是全程遇到问题不自己思考就寻求队友帮助
    为了更加的高效且团队成员能够都能展现自己能力,所以我们进行了采取了分工合作的方式。
    在产生表达式时主要是我进行代码的编写,中缀表达式转为后缀表达式主要是我的队友完成的,当然我们都有互相接受对方的意见,
    并且一起将代码进行修改和调试,这样更加高效的完成我们的自主学习任务
    
    
    ##  预估项目各个环节完成时间
    |PSP2.1|Personal Software Process Stages|预估耗时(小时)|实际耗时(小时)
    | --------   | :----------------:|:----------------:|:---------------:  |:-----:|
    |Planning|计划|1|5/6
    |Estimate|估计这个任务需要多少时间|0.5|
    |Development|开发|16|
    |Analysis|需求分析 (包括学习新技术)|4|
    |Coding Standard|代码规范 (为目前的开发制定合适的规范)|0.5|0.5
    |Design UML|设计项目UML类图|1|
    |Coding|具体编码|18|
    |Code Review|代码复审|2|
    |Test|测试(自我测试,修改代码,提交修改)|2|
    |Size Measurement|计算工作量(实际时间)|0.5|
    |Postmortem & Process Improvement Plan|事后总结, 并提出过程改进计划|3|
    ||合计|48.5|
    
    
    
    
    ## 参考资料
    -  [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)
    
    -  [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
    
    - [四则运算出题](http://www.cnblogs.com/l534891619/p/8682457.html)
  • 相关阅读:
    3、取邮件
    9、将标准字符流写到文件中
    8、使用转换流处理标准输入
    6、数据流
    关闭子窗体时刷新父页面
    sql索引规则
    DataTable DataRow[] 排序 多列
    Oracle 自定义函数创建同义词、存储过程或表创建同义词
    C# DataTable 排序
    sql 分组后每组查询10个
  • 原文地址:https://www.cnblogs.com/Qiuxia2017/p/8933639.html
Copyright © 2011-2022 走看看