?? readme.txt
字號:
copyright:黃云輝,huangyh@toone.com.cn
●這是個計算字符串表達式的計算引擎
功能:給出一個字符串表達式(可以是任意復雜的字符串表達式),計算字符串表達式的值.
特性:
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 + -