先看看我們的成果:
網上的表示式計算器有很多,但這次我們來點,不同的,有兩點:
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)
裡面有詳細的注釋
電子科技大學軟體學院03級 周銀輝
基於C 語言的可程式設計表示式計算器設計
基於c 語言的可程式設計表示式計算器設計 先看看我們的成果 網上的表示式計算器有很多,但這次我們來點,不同的,有兩點 1 使用者可以程式設計以擴充計算器的函式 即右下角那個 新增函式按鈕 比如,我們想增加乙個 factarial 階乘函式,我們可以 新增函式 然後編輯我們的函式 最後 生成 即可,主...
表示式計算器
早在上大學的時候,就想編寫乙個可以計算數學表示式的計算器,因為windowsxp自帶的計算器不支援表示式輸入,當要計算乙個算式時,不太方便。表示式計算器看似簡單,但要想把它做完善,不太容易,經過幾次改進之後,於一年前完成了這個小程式,雖然可能會有一些不足,不過也不打算再投入時間了,價值不大,只是拿來...
計算器 字尾表示式
不過目前這個功能太少,而且能算的十分有限,測試輸入為 4 4 5 3 測試輸出為 4 4 5 3 27 主要就是了解一下怎麼把中綴表示式轉化成字尾表示式,然後再利用字尾表示式求值,我後續會完善這個程式,做個真正意義上的計算器。o o 轉化步驟我搜尋了一下,大致如下 將中綴表示式轉換為等價的字尾表示式...