zoukankan      html  css  js  c++  java
  • 5.1加强

    一、第一阶段目标 - 把计算的功能封装成类

    /** 采用算符优先算法计算表达式  
    * @param   
    *  String ex : 表达式的字符串;  
    * @return   
    *  String 类型的计算结果;    
    * 运算符栈operatorList按优先级存放运算符;运算数栈operandList存放运算数;  
    */    
    public String evaluateExpression(String ex){    
     // 在表达式首尾加上字符'#'以方便比较运算符    
     StringBuffer exB = new StringBuffer(ex);    
     exB.insert(0,'#');    
     exB.append('#');    
     ex = exB.toString();    
         
     StringBuffer operandBuffer = new StringBuffer(); // 运算数的字符缓冲区    
     java.util.LinkedList<BigDecimal> operandList = new LinkedList<BigDecimal>();    
     java.util.LinkedList<String> operatorList = new LinkedList<String>();    
         
     int count = 1; // 从ex的序号为1开始,即‘#’后    
     int num = 0 ; // 调试用    
     operatorList.addLast("#");    
     while(count < ex.length()){    
      String ch = String.valueOf(ex.charAt(count));    
          
      if(Pattern.matches("[0-9//.]",ch) // 当前字符如果是数字或.就把它放到运算数缓冲区    
      ||(ch.equals("-")  // "-"看成是负号的条件:在表达式的首位或在”(“之后;    
      &&(count ==1 || ex.charAt(count-1) == '('))){     
       operandBuffer.append(ch);    
       System.out.println(ch+"属于运算数:"); // 调试用    
       ++count;    
      }    
          
      else{    
       // 把运算数放入栈    
       if(Pattern.matches("[//+//-//*/////)//#]",ch) && operandBuffer.length() != 0){    
        operandList.addLast(new BigDecimal(Double.valueOf(operandBuffer.toString()).toString()));    
            
        System.out.println("序号"+(++num)+":"+operandBuffer.toString()); // 调试用    
        System.out.println("");    
            
        operandBuffer.delete(0,operandBuffer.length());    
       }    
           
       System.out.println(ch+"属于运算符:"); // 调试用    
       System.out.println("");    
           
       // 比较运算符,并根据它进行计算    
       switch(compareOperator(operatorList.getLast(),ch)){    
        // ch优先级高,将ch压入运算符栈    
        case '<' :     
         operatorList.addLast(ch);    
         ++count;    
         break;    
        // 优先级相等时,去掉()或前后的#;    
        case '=' :    
         operatorList.removeLast();    
         ++count;    
         break;    
        // ch优先级低,从运算数栈取出两个数,从运算符栈取出运算符,进行计算其结果放入运算数栈;    
        case '>' :    
         BigDecimal b = operandList.removeLast();    
         BigDecimal a = operandList.removeLast();    
         String curOperator = operatorList.removeLast();    
             
         try{    
          operandList.addLast(operate(a,curOperator,b));    
         }catch(ArithmeticException e){    
          return "除数不能为0!";    
         }    
         break;    
        // 运算符输入错误的处理:终止计算,在屏幕显示input error!    
        default :    
         return "输入有误!";    
       }    
      }    
     }//End 0f while    
     for(BigDecimal e : operandList)  // 调试用    
      System.out.println(e.toString());    
          
     return operandList.getLast().toString();    
    }    
        
    /** 比较前后运算符的优先级 */    
    public char compareOperator(String operator1,String operator2){    
     char result = '/u0000'; // 局部内部类的实例方法的局部变量能自动初始化为'/u0000'吗?不得行!!!    
     char o1 = operator1.charAt(0);    
     char o2 = operator2.charAt(0);    
         
     switch(o1){    
      case '+':    
       switch(o2){    
        case '+':    
         result = '>';    
         break;    
        case '-':    
         result = '>';    
         break;    
        case '*':    
         result = '<';    
         break;    
        case '/':    
         result = '<';    
         break;    
        case '(':    
         result = '<';    
         break;    
        case ')':    
         result = '>';    
         break;    
        case '#':    
         result = '>';    
         break;    
       }    
       break; // 跳出case '+';    
      case '-':    
       switch(o2){    
        case '+':    
         result = '>';    
         break;    
        case '-':    
         result = '>';    
         break;    
        case '*':    
         result = '<';    
         break;    
        case '/':    
         result = '<';    
         break;    
        case '(':    
         result = '<';    
         break;    
        case ')':    
         result = '>';    
         break;    
        case '#':    
         result = '>';    
         break;    
       }    
       break; // 跳出case '-';    
      case '*':    
       switch(o2){    
        case '+':    
         result = '>';    
         break;    
        case '-':    
         result = '>';    
         break;    
        case '*':    
         result = '>';    
         break;    
        case '/':    
         result = '>';    
         break;    
        case '(':    
         result = '<';    
         break;    
        case ')':    
         result = '>';    
         break;    
        case '#':    
         result = '>';    
         break;    
       }    
       break; // 跳出case '*';    
      case '/':    
       switch(o2){    
        case '+':    
         result = '>';    
         break;    
        case '-':    
         result = '>';    
         break;    
        case '*':    
         result = '>';    
         break;    
        case '/':    
         result = '>';    
         break;    
        case '(':    
         result = '<';    
         break;    
        case ')':    
         result = '>';    
         break;    
        case '#':    
         result = '>';    
         break;    
       }    
       break; // 跳出case '/';    
      case '(':    
       switch(o2){    
        case '+':    
         result = '<';    
         break;    
        case '-':    
         result = '<';    
         break;    
        case '*':    
         result = '<';    
         break;    
        case '/':    
         result = '<';    
         break;    
        case '(':    
         result = '<';    
         break;    
        case ')':    
         result = '=';    
         break;    
        case '#':    
         result = '?'; // (后不能是#,如果是则是错误输入;    
         break;    
       }    
       break; // 跳出case '(';    
      case ')':    
       switch(o2){    
        case '+':    
         result = '>';    
         break;    
        case '-':    
         result = '>';    
         break;    
        case '*':    
         result = '>';    
         break;    
        case '/':    
         result = '>';    
         break;    
        case '(':    
         result = '?'; // )后不能接(;    
         break;    
        case ')':    
         result = '>';    
         break;    
        case '#':    
         result = '>';    
         break;    
       }    
       break; // 跳出case ')';    
      case '#':    
       switch(o2){    
        case '+':    
         result = '<';    
         break;    
        case '-':    
         result = '<';    
         break;    
        case '*':    
         result = '<';    
         break;    
        case '/':    
         result = '<';    
         break;    
        case '(':    
         result = '<';    
         break;    
        case ')':    
         result = '?'; // #后不能接);    
         break;    
        case '#':    
         result = '=';    
         break;    
       }    
       break; // 跳出case '#';    
     }// End Of switch    
         
     return result;         
    }    
        
    /** 根据运算符进行二元计算,  
    * @param  
    *  BigDecimal类型 a ? b  
    * @return:  
    *  BigDecimal类型的结果  
    */    
    public BigDecimal operate(BigDecimal a,String operator,BigDecimal b){    
      final int DEF_DIV_SCALE = 20;    
      BigDecimal result = null;    
         
     switch(operator.charAt(0)){    
      case '+':    
       result = a.add(b);    
       break;    
      case '-':    
       result = a.subtract(b);    
       break;    
      case '*':    
       result = a.multiply(b);    
       break;    
      case '/':    
       result = a.divide(b,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP);    
       break;    
     }    
     return result;    
    }    
    复制代码

      

    二、设计测试用例:用白盒与黑盒测试设计技术,为计算核心设计测试用例

    三、在实验环境中(如MyEclipse集成开发环境+Junit测试框架)运行测试用例,分析测试结果,找出程序问题,给出改进前后的代码对照









    
    

    四、心得和体会

         看老师提供的视频和资料看得一塌糊涂,不过还是掌握了一点测试的方法,希望能改进,在测试过程中经常出错,搭档比较忙,所以我们这次交流的时间

    比之前的少,不过没关系,我们之前都有比较好的合作和交流,希望下次能努力做得更好

  • 相关阅读:
    UVA 1386 Cellular Automaton
    ZOJ 3331 Process the Tasks
    CodeForces 650B Image Preview
    CodeForces 650A Watchmen
    CodeForces 651B Beautiful Paintings
    CodeForces 651A Joysticks
    HUST 1601 Shepherd
    HUST 1602 Substring
    HUST 1600 Lucky Numbers
    POJ 3991 Seinfeld
  • 原文地址:https://www.cnblogs.com/hj1994/p/4492601.html
Copyright © 2011-2022 走看看