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










四、心得和体会

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

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

原文地址:https://www.cnblogs.com/hj1994/p/4492601.html