📄 readme.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 + -