檔案名稱:parser10.zip
版 本:10.1
原始程式:有(Source)
適用版本:(D1) (D2) (D3)
版權種類:免費軟體(FreeWare)
內容說明:
Specialized component for parsing and evaluating mathematical expressions specified at runtime. Only 40-80% slower than the equivalent compiled expression.
TParser 元件能夠解析, 轉換數學算式, 執行時期 ( Runtime ) 解析符式的速度僅比編譯時期解析慢 40% 到 80%.
今天恰巧找到parser10這個元件,安裝後發現還有很多好玩的功能
所以花了一些時間寫個範例給大家看看,雖然原始碼是Delphi但BCB一樣可以安裝
double Result;
1.四則運算
Parser1->Expression="5*3+5*(8+2)";
Result=Parser1->Value;//65
2.預設變數
parser10預設8個變數A,B,C,D,E,X,Y,T指定變數的值後,公式就能使用該變數
Parser1->X=0;
Parser1->Expression="cos(X)";
Result=Parser1->Value;//1
//將A,B,C當作常數,觀察在不同X時所得的值
Parser1->Expression="A*X^2+B*X+C";
Parser1->A=1;
Parser1->B=2;
Parser1->C=1;
for(int i=1;i<10;i++)
{Parser1->X=i;
Result=Parser1->Value;
//4,9,16,25,36,49,64,81
}
3.自訂變數
若8個預設變數不夠用的話,還可以用SetVariable設更多的變數
Parser1->SetVariable("var1",2);
Parser1->SetVariable("var2",3);
Parser1->Expression="var1+var2";
Result=Parser1->Value;//5
//呼叫GetVariable取得某個變數的值
double var=Parser1->GetVariable("var1");//2
4.自訂函數
我最欣賞這個功能了,藉由函數指標 (function pointer)的技術,
原程式沒有函數的功能就能靠自己來擴充
void __fastcall func1(POperation AnOperation)
{//求一個數的倒數值
double a=*(AnOperation->Arg1);
*(AnOperation->Dest)=1/a;
}
Parser1->AddFunctionOneParam("Inverse",func1);
Parser1->Expression="Inverse(X)";
Parser1->X=2;
Result=Parser1->Value;//0.5
void __fastcall func2(POperation AnOperation)
{//點(x,y)到(0,0)的距離
double a=*(AnOperation->Arg1);
double b=*(AnOperation->Arg2);
*(AnOperation->Dest)=sqrt(a*a+b*b);
}
Parser1->AddFunctionTwoParam("Distance",func2);
Parser1->Expression="Distance(X,Y)";
Parser1->X=3;
Parser1->Y=4;
Result=Parser1->Value;//5
原問題
http://delphi.ktop.com.tw/board.php?cid=30&fid=70&tid=86384
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=86130
在2002年就有人推薦過了,我到今天才發現這麼好用的元件
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=19775
原本的檔案連結已經失效了,在另外一個地方可以找到