zoukankan      html  css  js  c++  java
  • 20175305张天钰Java结对编程四则运算

    Java结对编程四则运算


    一.题目描述:如何对表达式进行求值运算呢

    1、中缀表达式与后缀表达式(娄老师讲解)

    中缀表达式就是运算符号在运算数中间的表达式,比如1+2,顾名思义,后缀表达式就是运算符在运算数后面的表达式,比如1 2 +。为什么要讲后缀表达式呢?因为电脑运算后缀表达式会比中缀表达式方便很多。那么如何运算后缀表达式呢?

    举个例子:计算9+(3-1)*3+6/2,转换为后缀表达式即为9 3 1 - 3 * + 6 2 / +(怎么转换后面再讲)。计算规则就是建立一个空栈,遇到数字就入栈,遇到符号就以符号前面的两个数为运算数进行计算。

    2、中缀表达式转换为后缀表达式

    法则:

    如果遇到数字,我们就直接将其输出。
    如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。
    如果遇到一个右括号,持续出栈并输出符号,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈。
    如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,则持续出栈,直到栈顶元素优先级小于该运算符。最后将该元素入栈。
    如果我们读到了输入的末尾,则将栈中所有元素依次弹出。


    二.需求分析。

    要随机产生规定数量的式子。
    要对分式进行计算。
    要支持多语言。
    要自动判断对错。

    三.设计思路

    确定要选用的语言;
    要产生随机数;
    在产生随机数的时候就要产生随机的运算符;
    在产生数字与运算符时最后一个数字之后就不能再产生运算符(运算符的数量始终比数字少1);
    在一个式子中要多次产生随机数与运算符因此要用到循环;
    在循环结束时就产生了一个式子就要求进行计算与输入;
    在产生中缀的式子后要将其转化为后缀;
    在输入完之后就要判断对错,统计正确率;

    四.代码编译

      public String calculate(ArrayList<String> postOrder)throws IOException {
       Stack stack = new Stack();
        //ArrayList<String> stack = postOrder;
        String res = "";
        FileWriter fm = new FileWriter("answer.txt");
        BufferedWriter bufm = new BufferedWriter(fm);
        for (int i = 0; i < postOrder.size(); i++) {            if (res.equals("")) {
                if (Character.isDigit(postOrder.get(i).charAt(0))) {
                   stack.push(Integer.parseInt(postOrder.get(i)));
               } else {
                   Integer back = (Integer) stack.pop();
    
                    Integer front = (Integer) stack.pop();
                    stack.push(back);
    
                    Calculator calculator2 = new Calculator();
                    switch (postOrder.get(i).charAt(0)) {
                        case '+':
    
                            res = calculator2.compute(front + "/1", "+", back + "/1");
                           //res = (front + back);
                            bufm.write(res);
                            bufm.flush();
                            bufm.newLine();
    
                            break;
                        case '-':
                            res = calculator2.compute(front + "/1", "-", back + "/1");
                            bufm.write(res);
                            bufm.flush();
                            bufm.newLine();>                            break;
                            case '*':
                            res = calculator2.compute(front + "/1", "*", back + "/1");
                            bufm.write(res);
                            bufm.flush();
                            bufm.newLine();
                            break;
                        case '/':
                            res = calculator2.compute(front + "/1", "/", back + "/1");
                            bufm.write(res);
                            bufm.flush();
                            bufm.newLine();
                            break;
                    }
                }            }
            else {
               if (Character.isDigit(postOrder.get(i).charAt(0))) {
                    stack.push(Integer.parseInt(postOrder.get(i)));
                } else {
                    Integer back = (Integer) stack.pop();
                    Calculator calculator2 = new Calculator();
                    switch (postOrder.get(i).charAt(0)) {
                       case '+':
                           res = calculator2.compute(res, "+", back + "/1");
                           bufm.write(res);
                            bufm.flush();
                            bufm.newLine();
                            break;
                       case '-':
                            res = calculator2.compute(res, "-", back + "/1");
                            bufm.write(res);>                            bufm.flush();
                            bufm.newLine();
                            break;
                        case '*':>                            res = calculator2.compute(res, "*", back + "/1");
                            bufm.write(res);
                            bufm.flush();
                            bufm.newLine();
                            break;
                        case '/':
                            res = calculator2.compute(res, "/", back + "/1");
                            bufm.write(res);
                            bufm.flush();
                            bufm.newLine();
                            break;
                    }
                }
           }
        }
       return res;
    }
  • 相关阅读:
    .netcore持续集成测试篇之Xunit结合netcore内存服务器发送post请求
    .netcore持续集成测试篇之搭建内存服务器进行集成测试一
    .netcore持续集成测试篇之Xunit数据驱动测试
    .netcore持续集成测试篇之开篇简介及Xunit基本使用
    .net持续集成测试篇之Nunit 测试配置
    .net持续集成测试篇之Nunit参数化测试
    .net持续集成测试篇之Nunit that断言
    .net持续集成测试篇之Nunit文件断言、字符串断言及集合断言
    .net持续集成测试篇之Nunit常见断言
    .net持续集成单元测试篇之单元测试简介以及在visual studio中配置Nunit使用环境
  • 原文地址:https://www.cnblogs.com/zhangtianyu/p/10657457.html
Copyright © 2011-2022 走看看