基於MFC的含四則混合運算的計算器
今天無意間發現win7系統的標準型計算器連最基本的四則混合運算都沒做,剛剛好公司給了我一個工作任務,就是用MFC實現一個含四則混合運算的計算器。
我在網上查詢資料,發現大部分只是實現了基本的加減乘除運算,而含四則混合運算的也沒有能夠說得清楚明白。於是我搜索四則混合運算算法,發現要實現四則混合運算,就要用到逆波蘭算法,而使用逆波蘭算法,就要先把算術式從中綴表達式轉換為後綴表達式。
所謂中綴表達式,就是我們平常的算術式,例如:1+2-3*4/5。
而後綴表達式,就是將運算符寫在操作數之後,上面算術式的後綴表達式為:12+34*5/-。具體是怎麽來的呢,讓我們看看後綴表達式的算法:
1)首先構造一個運算符棧,此運算符在棧內遵循越往棧頂優先級越高的原則;
2)讀入一個用中綴表示的簡單算術表達式,為方便起見,設該簡單算術表達式的右端多加上了優先級最低的特殊符號“#”;
3))從左至右掃描該算術表達式,從第一個字符開始判斷,如果該字符是數字,則分析到該數字串的結束並將該數字串直接輸出;
4)如果不是數字,該字符則是運算符,此時需比較優先關系,做法如下:
將該字符與運算符棧頂的運算符的優先關系相比較。如果,該字符優先關系高於此運算符棧頂的運算符,則將該運算符入棧。倘若不是的話,則將棧頂的運算符從棧中彈出,直到棧頂運算符的優先級低於當前運算符,將該字符入棧。
5)重復上述操作(1)-(2)直至掃描完整個簡單算術表達式,確定所有字符都得到正確處理,我們便可以將中綴式表示的簡單算術表達式轉化為逆波蘭表示的簡單算術表達式。
可能很多人不是很理解這個過程,下面我們以1+2-3*4/5作為例子展示給大家。
我們用vector容量來裝後綴表達式,構建一個棧來裝運算符。遍歷算術式,遇到數字“1”,壓進vector;遇到“+”,直接進棧;遇到“2”,壓進vector;遇到“-”,“-”的優先級不高於“+”,“+”出棧,壓進vector,“-”進棧;遇到“3”,壓進vector;遇到“*”,“*”的優先級比“-”高,進棧;遇到“4”,壓進vector;遇到“/”,“/”的優先級不比“*”高,“*”出棧,壓進vector,此時棧頂為“-”,“/”的優先級比“-”高,進棧;遇到“5”,壓進vector。遍歷完成,此時vector為{12+34*},運算符棧為{-/},將運算符棧的內容壓進vector,因為棧是後進先出,所以壓進後vector的內容為{12+34*5/-}。如此,便完成了後綴表達式。
下面介紹逆波蘭算法。引用上面的例子,轉換後的後綴表達式為12+34*5/-,構建一個新的棧,遍歷後綴表達式,遇到數字直接進棧,遇到運算符,把棧頂2個數字拿出來進行運算,遍歷完就是最後的結果。“1”“2”進棧,遇到“+”,把“1”“2”拿出來進行+運算,結果為“3”,把“3”進棧,繼續遍歷,“3”進棧,“4”進棧,此時棧為“3”“3”“4”,遇到“*”,把“3”“4”拿出來進行*運算,結果為“12”,把“12”進棧,此時棧為“3”“12”,繼續遍歷,“5”進棧,遇到“/”,把“12”“5”拿出來進行/運算,結果為“2.4”,把“2.4”進棧,遇到“-”,把“3”“2.4”拿出來進行-運算,結果為“0.6”,把“0.6”進棧,遍歷完成,最後結果為“0.6”。這就是逆波蘭算法的過程。
下面,我們正式用MFC實現四則混合運算的計算器。
新建項目,選擇MFC,選擇MFC應用程序,輸入名稱,點擊下一步;
點擊下一步,選擇基於對話框,一直點下一步,完成;
項目建成後,將界面設計成計算器模樣;
給2個編輯框添加變量,一個輸入算術式,一個輸出結果,雙擊每個按鍵,添加輸入函數,如此,基本框架已經定好,開始編寫程序。
先添加頭文件#include <vector>、#include <stack>和using namespace std。
先對OperatorEnable進行初始化,BOOL OperatorEnable = FALSE。
這是我頭文件的程序:
數字按鍵的程序如下,0到9的程序一樣,把數字改一下:
運算符的程序如下,程序一樣,把運算符改一下:
清除按鍵程序如下:
等號按鍵的程序如下:
轉換後綴表達式的程序如下:
逆波蘭算法過程程序如下:
判斷運算符優先級程序如下:
到此,程序已經完成。可以實現四則混合運算。以下進行測試:
隨機輸入一段算術式,按下等號,輸出結果,然後在電腦計算器上進行運算,得出結果進行對比。
好了,基於MFC的含四則混合運算的計算器已經完成,這個實現過程讓我對MFC有了更深的認識。下一篇,我會寫一篇基於MFC的單色BMP圖片生產軟件。
基於MFC的含四則混合運算的計算器