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测试框架)运行测试用例,分析测试结果,找出程序问题,给出改进前后的代码对照









    
    

    四、心得和体会

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

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

  • 相关阅读:
    => 运算符
    ASP.NET与Javascript中获取URL信息
    ASP.NET中存取图片到数据库的示例
    在C#中利用DirectX实现声音播放
    使用VS2005 DataSet设计器实现数据访问层
    用C#播放声音文件
    VB.NET中声音的播放
    用C#播放声音文件
    声音播放解决方案(C#)
    Asp.Net音频文件上传和播放
  • 原文地址:https://www.cnblogs.com/hj1994/p/4492601.html
Copyright © 2011-2022 走看看