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;
}    
时间: 2024-11-13 06:49:25

5.1封装与测试的相关文章

C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试

在上篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及对应的对象模型,本篇继续微信小店的主题,介绍其中API接口的封装和测试使用.微信小店的相关对象模型,基本上包括了常规的商品.商品分组.货架.库存.订单这些模型,还有商品分类,商品分类属性.商品分类SKU.快递邮寄模板.图片管理等功能.本文介绍的接口封装也就是基于这些内容进行的,并针对接口的实现进行测试和使用. 1.商品管理接口的定义 前面文章介绍了微信小店的对象模型,如下所示. 这个图形基本上覆

作业五 关于封装与测试 拿我小学生四则运算为例

我的封装: 1 class yy 2 { 3 private int max=4; 4 private int min=1; 5 private double w2,m2; 6 private String ff; 7 Random random = new Random(); 8 9 //System.out.println(s); 10 public yy() 11 { 12 int s = random.nextInt(max)%(max-min+1) + min; 13 14 doubl

5.1(封装,测试)

程序源代码(简单Java版): package arrays.myArray; import java.util.Scanner; public class SortObject { private static int intercePosition = 0; // 记录单个运算数据的长度 private static int[] intercePositionIndex = null; // 记录“(”的下标 private static int[] intercePositionEnd =

自己手写http服务器 http响应信息的封装与测试

package cn.edu.sss.httpServer; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Date; //这个类是对http协议返回的封装 public class HttpResponse

作业五:封装与测试

1 import java.awt.Dimension; 2 import java.awt.FlowLayout; 3 import java.awt.GridLayout; 4 import java.awt.Toolkit; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 8 import javax.swing.JButton; 9 import javax.swing.JFra

作业5.2(封装及测试)

开发环境:eclipse 结对同伴 :37 施少涛 同伴博客:http://www.cnblogs.com/shishaotao/ 预计用时:半天 实际用时:1天 新增功能:1.空值异常处理 2.做错题目可提示做错并给出正确答案 3.可继续做题 import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.

【作业报告】作业5 四则运算 测试与封装 5.1

测试与封装 5.1 程序开发简介: [开发环境]:eclipse [开发人员]:Ives & 郑胜斌 [博客地址]:38郑胜斌 [开发时间]:2015-04-30 [版本]:5.1 [要求]: 封装 测试 封装: 概念 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一种信息隐藏技术,在java中通过关键字private实现封装.什么是封装?封装把对象的所

四则运算,测试与封装。

测试与封装 5.1 程序开发简介: [开发环境]:eclipse [开发人员]:Ives & 郑胜斌 [博客地址]:http://www.cnblogs.com/IvesHe/ [开发时间]:2015-04-30 [版本]:5.1 [要求]: 封装 测试 [分工]: Ives:单元测试.界面.自定义异常. 郑胜斌:封装 Expression类. 封装: 概念 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对

相机位姿估计1_1:OpenCV:solvePnP二次封装与性能测试

关键词:OpenCV::solvePnP 文章类型:方法封装.测试 @Author:VShawn([email protected]) @Date:2016-11-27 @Lab: [email protected] 前言 今天给大家带来的是一篇关于程序功能.性能测试的文章,读过<相机位姿估计1:根据四个特征点估计相机姿态>一文的同学应该会发现,直接使用OpenCV的solvePnP来估计相机位姿,在程序调用上相当麻烦,从一开始的参数设定到最后将计算出的矩阵转化为相机的位姿参数,需要花费近两百