基於C 語言的可程式設計表示式計算器設計

2022-08-03 06:57:10 字數 1821 閱讀 5226

基於c#語言的可程式設計表示式計算器設計

先看看我們的成果:

網上的表示式計算器有很多,但這次我們來點,不同的,有兩點:

1)使用者可以程式設計以擴充計算器的函式

即右下角那個「新增函式按鈕」

比如,我們想增加乙個"factarial"階乘函式,我們可以「新增函式」

然後編輯我們的函式

最後「生成」即可,主視窗上會自動新增乙個"factarial"按鈕,然後就可以使用了(該函式將一直存在,除非你手動刪除它)

其實,主視窗上的所有函式按鈕都是這樣生成的

2)我們對表示式的計算將擺脫傳統的觀點(即傳統的對表示式進行詞法分析,語法分析等等),在編寫我們的計算器的**中,不會有任何的詞法分析、語法分析、字尾表示式轉換等

等。啟發來自於這裡:

假設有乙個函式f

double f()

那麼,我們就可以 console.writeline("",f());    

我們計算了3*4.5+sin(50),但我們有進行麻煩的詞法分析與語法分析嗎?沒有,誰幫我們做了,編譯器,ok,關鍵就在這:如果計算器使用者在計算器主視窗上輸入表示式

3*4.5+sin(50),我們負責把它傳給f中的r,然後我們再把f的返回值輸出到使用者介面上就ok了,我們要做的就這些。

我們的functions.dll打包成功以後,我們就可以在計算表示式是呼叫其中的函式了

3 表示式的計算

3.1 如何計算?

在前面計算 3*4.5+sin(50)的例子中,已經說過,我們將利用編譯器幫我們計算,我們僅僅像console.writeline("",f())一樣簡單地將函式f的返回值輸出給使用者(f的返回值就是表示式的值):

double f()

3.2 f()從**來?到**去?

f()肯定不是我們事先寫好的,因為其中的exp的初始表示式是使用者來寫的

我們將這樣來解決這一問題:在使用者輸入表示式以後動態地生成函式f()的** -> 將該**編譯 -> 呼叫編譯成功後的程式集中的該函式

///

/// 將數學表示式轉化為c#程式

///

/// 使用者輸入的數學表示式

/// 返回c#程式**

public static string translatetocsharp(string express)

s +=

"using system;\n" +

"namespace computeunit\n" +

"\n" +

"}" +

"}\n";

return s;

}這裡的getresult()函式也就是我們所說的函式f()

3.3 誰幫我們取得計算結果?

反射!假設使用者輸入了表示式express,我們將如同下面的**所敘述的那樣計算它

string source = translateunit.translatetocsharp(express);

//這裡載入了函式dll

string dlls = new string[1];

dlls[0] = function.getpathoffunctiondll(); //這裡載入了前面所說的functions.dll

//編譯

compilerresults results = compilerunit.compile(source, false,true, dlls,null);

//重要:利用反射獲取計算結果

if (results.errors.count == 0)

catch (exception ex)

,裡面有詳細的注釋

trackback:

基於C 語言的可程式設計表示式計算器設計

先看看我們的成果 網上的表示式計算器有很多,但這次我們來點,不同的,有兩點 1 使用者可以程式設計以擴充計算器的函式 即右下角那個 新增函式按鈕 比如,我們想增加乙個 factarial 階乘函式,我們可以 新增函式 然後編輯我們的函式 最後 生成 即可,主視窗上會自動新增乙個 factarial ...

表示式計算器

早在上大學的時候,就想編寫乙個可以計算數學表示式的計算器,因為windowsxp自帶的計算器不支援表示式輸入,當要計算乙個算式時,不太方便。表示式計算器看似簡單,但要想把它做完善,不太容易,經過幾次改進之後,於一年前完成了這個小程式,雖然可能會有一些不足,不過也不打算再投入時間了,價值不大,只是拿來...

計算器 字尾表示式

不過目前這個功能太少,而且能算的十分有限,測試輸入為 4 4 5 3 測試輸出為 4 4 5 3 27 主要就是了解一下怎麼把中綴表示式轉化成字尾表示式,然後再利用字尾表示式求值,我後續會完善這個程式,做個真正意義上的計算器。o o 轉化步驟我搜尋了一下,大致如下 將中綴表示式轉換為等價的字尾表示式...