首页  编辑  

一个快速的表达式计算类

Tags: /超级猛料/Open Source.开源代码/   Date Created:

檔案名稱: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

原本的檔案連結已經失效了,在另外一個地方可以找到

http://delphi.icm.edu.pl/ftp/d10free/parser10.zip

parser10.zip (21.2KB)