⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 表达式解析程序
💻 TXT
字号:
●这是个计算字符串表达式的计算引擎

  功能:给出一个字符串表达式(可以是任意复杂的字符串表达式),计算字符串表达式的值.

  特性: 
        1:用户可以添加其它运算符号 ,也就是说用户可以制定新的运算符,引擎中不存在的运算符号,
           当然具体的运算类还是得用户提供.

        2: 可以修改运算符的性质,你可以使得3*3=6,只要将*的运算类指向expression.DAdd就可以了
           具体如何操作,我会在下面讲.

        3:可以使操作符运算具有多种形态。您即可以用“+”表示加法运算,也可以用"加法"表示加法运算.
 

        强调一下: 本引擎的最大特点就是: 用户可以添加自己的运算符号,而不用修改计算引擎本身.      

  目前支持的运算符号有:

  单目运算符号有:                          对应的运算类       
    sin(double x)//正玄                     expression.SSin
    cos(double x)//余玄                     expression.SCos   
    tan(coule x)//正切                      expression.STan
    n!(double)//正切                        expression.SN
    dao(double)//求倒数                     expression.SDao
    sqrt(double)//开方                      expression.SSqrt
    exp(double)//指数运算                   expression.SExp
    pin(double)//平方                       expression.SX2   
    li (double)//立方                       expression.SX3
    log(double)//e为底的对数                expression.SLog    
    ln(double)//10为底的对数                expression.SLn  

  双目运算符号:
    (double) ^ (double) //幂运算            expression.DPow
    (double) * (double) //乘法运算          expression.DMul 
    (double) / (double) //除发运算          expression.DDiv
    (double) % (double) //求余数            expression.DMod
    (double) + (double) //加法运算          expression.DAdd
    (doubel) - (double) //减法运算          expression.DDec
    //==================================================================================
   
    怎么样,运算符够多的吧!如果您觉得这些运算符号无法满足您的需求,没关系,你可以添加您想要的运算   符号.那用户该如何添加自定义运算符号?又有那些限制?别急,这正是我现在要跟您说的.  

   1:第一步工作: 将expression.jar(计算引擎)添加到运行库中.
       tools-->configure libraries -->new...-->add-->选择expression.jar->ok->ok->ok

   2:新建一个运算类
       如果您要实现的操作符属单目操作符号,请实现SOperator接口,否则实现DOperator接口
       
       /**
        * 定义单目运算符号接口
        * 所有的单目运算符的运算类都必须实现该接口
        * 因为运算数据来自 hashtable,所以我将程序输入参数设成Object,主要是
        * 方便调用,不过在实现中要多做2件事。
        * 1:将参数转成double数据,
        * 2:将运算结果转成 Object类型的.
        */
        public interface SOperator {
          public Object calculate( Object op_num ) throws DataInvalidException;
        }

        /**
         * 定义双目运算符号接口
         * 所有的双目运算符的运算类都必须实现该接口
         * 因为运算数据来自 hashtable,所以我将程序输入参数设成Object,主要是
         * 方便调用,不过在实现中要多做2件事。
         * 1:将参数转成double数据,
         * 2:将运算结果转成 Object类型的.
         */
         public interface DOperator {
            public Object calculate( Object op_num1,Object op_num2 ) throws DataInvalidException;
         }
         说明:1. 要将expression 库函数包含到工程中
              2. 您的写的运算符实现类必须是public 的,所以每个实现类都必须在一个单独的文件中.

      3: 注册操作符号信息

             调用函数registryOp()进行注册
                 StrExpression.registryOp("您的运算符号",运算级别,"运算符实现类的包路径");

            说明:1: 运算符号级别共分为3个级别,分别为1,2,3.其中第1级别为单目运算,
            2,3级别为双木运算符号. * / ^等为第2级别,+ - 为第三级别.因此,所有的单目
            运算符号都必须设置成第1级别,而双目运算符号的级别完全可以由用户指定,如果您
            愿意,您可以把*/等设置为第3级别的运算符.级别的设置会影响运算结果,所以在设置运算
            级别时要特别小心。强调一下:只有单目运算符可以(也必须)设置为第一级别.否则会出现
            异常.
            2:  注意登记函数必须是实现类的 “包”路径(带包名)

     4.现在可以在在字符串表达式中出现您自己的运算符号了. 


  如果这样说您不大明白,没关系,请看下面的例题:                                  

  //自定义单目运算符号
  //-------------SExp.java--------------------------------
  //exp
  package demo;

  public class SExp implements SOperator {
  public Object calculate(Object op_num) throws DataInvalidException {
    try {
      double x = Double.parseDouble(op_num.toString());//取被除数
      double result =Math.exp(x);
      return new Double(result);
    } catch (Exception e) {
       throw new DataInvalidException("您输入的字符串表达式,不符合格式要求,"+
                                      "导致无法计算,请检测您的输入表达式");
   }// end try-catch
   }//end calculate
   }//SExp

   注册:    StrExpression.registryOp("exp",1,"demo.SExp");

  //自定义双目运算符号
  //加法运算实现类
  package demo; 
  public class DAdd implements DOperator {
      public Object calculate(Object op_num1,Object op_num2) throws DataInvalidException {
        try {
          double x = Double.parseDouble(op_num1.toString());//取被加数
          double y = Double.parseDouble(op_num2.toString());//取加数
          double result = x + y;
          return new Double(result);
        } catch (Exception e) {
            throw new DataInvalidException("您输入的字符串表达式,不符合格式要求,"+
                                           "导致无法计算,请检测您的输入表达式");
       }// end try-catch
     }//end calculate
   }//end DAdd

   注册:    StrExpression.registryOp("add",3,"demo.DAdd");

●如何使一种操作呈现多种形态:
  进行注册: 
    StrExpression.registryOp("add",3,"demo.DAdd");  
    StrExpression.registryOp("加上",3,"demo.DAdd");  
    StrExpression.registryOp("加法运算",3,"demo.DAdd");  
    实际上操作符号add 加上 加法运算 都是调用demo.Dadd的运算类.
     说明: 以上3个操作符号同时有效(可以在字符串运算表达式中调用 )

  
●如何修改运算符的性质
  注册: 
  StrExpression.registryOp("add",3,"demo.DAdd");  
  StrExpression.registryOp("add",3,"demo.DDiv");  
  StrExpression.registryOp("add",3,"demo.DMul");  //有效(它把上面的覆盖掉了)
  说明:最后注册的有效

●如果您对系统提供的操作符号名不满意,您可以重新注册您所选的运算符号
 比如系统提供的平方运算符号是 "pin",你可以把它该成"平方"
 您可以这样修改:
  StrExpression.registryOp("平方",1,"expression.SX2");  
  为了便于您修改,我把系统已注册的操作符号罗列出来:

      //注册标准标准操作符号
      //第一级别运算符号注册
      registryOp("n!",1,"expression.SN");    //注册阶乘运算
      registryOp("dao",1,"expression.SDao"); //注册倒数运算
      registryOp("sin",1,"expression.SSin"); //注册正玄运算
      registryOp("cos",1,"expression.SCos"); //注册余玄运算
      registryOp("tan",1,"expression.STan"); //注册正切运算
      registryOp("sqrt",1,"expression.SSqrt"); //注册开方运算
      registryOp("log",1,"expression.SLog"); //注册对数运算
      registryOp("ln",1,"expression.SLn"); //注册e为底的对数运算
      registryOp("exp",1,"expression.SExp"); //注册指数运算
      registryOp("pin",1,"expression.SX2"); //注册平方运算
      registryOp("li",1,"expression.SX3"); //注册立方运算

      //第二级别运算符号注册
      registryOp("^",2,"expression.DPow"); //注册立方运算
      registryOp("*",2,"expression.DMul");//注册乘法运算
      registryOp("/",2,"expression.DDiv");//注册除法运算
      registryOp("%",2,"expression.DMod");//注册求余数运算
      //第三级别运算符号注册
      registryOp("+",3,"expression.DAdd");//注册加法运算
      registryOp("-",3,"expression.DDec");//注册减法运算

● 本引擎的缺点:
      出错处理机制不完善,如果表达式非法,将会引起异常。

   
下面我给出一个完整的使用实例:


package demo;

import expression.*;//计算引擎库

public class expressionDemo{
  public static void main(String[] args) {

     //说明: getValue是获取运算结果的唯一方法.
     StrExpression se = new StrExpression();
     String str="4+3+3";
     try{
       System.err.println(se.getValue(str));
       //输出10.0
       //改变操作符号
       StrExpression.registryOp("加法",3,"expression.DAdd");//改变操作符号,但运算性质没变
       str="4加法3+3";
       System.err.println(se.getValue(str));
       //还是输出10.0

       StrExpression.registryOp("加法",3,"expression.DMul");//实现类是乘法运算
       System.err.println(se.getValue(str));
       //输出15.0

       //注册自定义类
       StrExpression.registryOp("我的",2,"demo.my");
       StrExpression.registryOp("你的运算符号",1,"demo.your");
       str="3我的2/2";
       System.err.println(se.getValue(str));

       str="你的运算符号10+20*2";

       System.err.println(se.getValue(str));

     }catch (DataInvalidException die) {
       die.printStackTrace();
  }
  }
}

//--------------my.java
package demo;

import expression.*;

public class my implements DOperator {
  public Object calculate(Object op_num1,Object op_num2) throws DataInvalidException {
    try {
      double x = Double.parseDouble(op_num1.toString());//取被乘数
      double y = Double.parseDouble(op_num2.toString());//取乘数
      double result = x * y+10;
      return new Double(result);
    } catch (Exception e) {
        throw new DataInvalidException("您输入的字符串表达式,不符合格式要求,"+
                                       "导致无法计算,请检测您的输入表达式");
    }// end try-catch
  }//end calculate
}//my


//============================your.java
package demo;
import expression.*;


public class your implements SOperator {
public Object calculate(Object op_num) throws DataInvalidException {
  try {
    double x = Double.parseDouble(op_num.toString());//取被除数
    double result =x*100;
    return new Double(result);
  } catch (Exception e) {
      throw new DataInvalidException("您输入的字符串表达式,不符合格式要求,"+
                                     "导致无法计算,请检测您的输入表达式");
  }// end try-catch
}//end calculate
}//your

//==========================================================================
完!


        联系方式: HuangBin0791@163.com
                   HuangYH@toone.com.cn
                   qq: 29063401

  

















































   



  





























    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -