MFC計算器 用vector實現和計算逆波蘭表示式

2021-06-25 11:58:39 字數 1550 閱讀 3279

短學期本來已逃脫計算器的厄運,因為一直糾結不清我計算器的架構,不知如何下手;

但學了mfc的底層實現機制和框架後發現計算器還是比較好實現的,於是總結下做計算器的架構和關鍵演算法

先宣告:資料型別是cstring,並用vector進行操作,演算法為逆波蘭

我用mfc做的計算器架構比較簡單,介面上除括號外的所有按鈕都是直接在編輯框中顯示,成為乙個算術表示式,「=」作為乙個響應函式,建立cmycalculator的例項,再把算術表示式作為引數呼叫計算函式,得到結果更新顯示在介面上。

void ctestdlg::onbuttonequal()       //"="的響應函式

else

m_stest="";}

class cmycalculator  ;

算術表示式->逆波蘭表示式

//1.將運算子(含括號)壓入m_voperator,把運算元(含運算子)壓入m_voprand;

//2.遇'('直接壓入運算子棧,遇')'把中間的運算子彈出到運算元棧;

//3.當前元素《棧頂元素時,棧頂元素的運算子壓入運算子棧,當前元素再入運算元棧。

void cmycalculator::change()

//若為')'

if(m_string.getat(i)==')')

m_voperator.pop_back();

}//若為運算子

if(m_string.getat(i)!='('&&m_string.getat(i)!=')')

else

//若當前元素優先順序<=棧頂元素

}}//若為數字

else

if(i==m_string.getlength()-1)    //  防止訪問下表越界,而專為最後一位進行判斷

m_voprand.push_back(str);

i--;      //for迴圈中會i++,所以這裡得先減1}}

//將運算子棧中剩餘的運算子壓入運算元棧

while(m_voperator.back()!="#")}

計算逆波蘭表示式(字尾表示式)

//將運算元棧中的字尾表示式依次取出,

從左至右掃瞄

//若遇運算元壓入m_vresult棧中

//若遇運算子(只含計算的運算子),則把棧頂倆元素彈出進行運算,把結果壓入棧中

//最後在棧中儲存的就只有乙個元素的棧,把m_vresult[0]返回即可

注意:我的計算器是用vector來操作,

入棧,出棧只是形象化的比喻,還有vector的記憶體需要析構,不然會不斷耗盡記憶體的,其次不能簡單的析構,需要呼叫swap來把vector占用的記憶體給交換出來再析構,vector的clear只是清除資料,不能釋放記憶體。

模擬計算器(MFC)實現

忙了一天終於搞定了。以下為演算法類封裝 caldlg.cpp implementation file author baker email baker1203 sina.com course designing for data structures and program design in c ...

c 算式 計算器 用C 編寫計算器

零有點問題,而且目前只能做一些簡單的運算,平方 開根號 希望有大佬指正我的錯誤 感謝using system using system.collections.generic using system.componentmodel using system.data using system.dra...

bc 把Linux shell當作計算器用

bc 為任意精度算術語言提供直譯器。bc的含義是 binary calculator,用於實現任意精度計算 往往是高精度計算 今天弄點簡單的吧,如何把自己的shell,輕鬆變成計算器,免得每次都要重新計算,基本都是用bc命令了。在shell上計算3.14 9.28 echo 3.14 9.26 bc...