mfc 實現 可加減乘除,括號,乘方 以及進製轉換的 計算器
一、帶括號的四則運算以及乘方運算
輸入的字串為中綴表示式,我們對表示式進行求值,則首先要解決的問題即為運算優先順序,然後再進行求值,通俗的說就是我先根據計算優先順序確定好表示式計算的順序,然後我在根據這個順序一步一步進行計算。。
那麼,首先,我們先處理運算優先順序,這裡我們用到資料結構以及離散數學裡面的乙個知識點,將中綴表示式轉化為後(前)綴表示式,或者說是將中序遍歷表示式樹轉化為後(前)序遍歷。這裡 小熊 給大家介紹的方法是 中綴表示式轉化為字尾表示式。
學過了資料結構的同學這裡應該很容易理解,比如表示式a
*(b+ c)-d我們這裡轉化的規則為:
從左到右掃瞄a*(b + c)-d的每一數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於棧頂符號(乘方優先乘除,乘除優先加減)則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。【ps:這裡「輸出」的意思是將字元存入 乙個字串裡面】。
考慮到讀者可能還是感到有點迷惑,小熊 以具體的例子給大家進行分析吧!比如,輸入的表示式為9+(3-1)*3+10/2【這樣運算符號在兩數字之間的,叫做中綴表示式】
【ps:下圖非原創,為了大家能夠清楚地理解這個過程,引用了別人的例子
相信看完這個例子,大家應該都理解這個過程了!下面給出相應的原始碼
預備工作:
#include 「stack」
#include 「math.h」
using namespace std;
const char lnumfront = '[';//兩個數字之間的分隔符
const char rnumback = ']';//兩個數字之間的分隔符
const cstring lpct_opch = "+-*/^";//儲存運算子
int ccalculatordlg::prioritylevel(char op)
bool ccalculatordlg::isopr(char c)
return false;
}//中綴轉為字尾
cstring ccalculatordlg::infixtosuffix(cstring szin)
ans += rnumback;
}else if(optr.empty())
else if(c=='(') //無條件壓棧
else if(c==')') //彈棧並輸出
ans+=optr.top();
optr.pop();
}optr.pop();
} else//其他條件即為 + - * / ^
optr.push(c);}}
}while(!optr.empty())
return ans;
}//下面就是字尾表示式得出答案的過程,由於比較簡單,這個過程由讀者自己思考,小熊在這裡只給出原始碼:
double ccalculatordlg::suffixtoresult(cstring szsuffix)
else
ndecres = ndecres*nsrc + ntmp;
}//將十進位制轉為dst進製
int ndiv = ndecres,nrem;
doelse
}while(ndiv != 0);
//將szans逆序
for( i = 0,j = szans.getlength()-1;i < j;i++,j--)
return szans;
}
//附上小熊計算器的效果圖
web加減乘除法c C 實現簡單的加減乘除計算器
第一次學習c 做了個簡單的加減乘除計算器,只能實現兩個因數的運算。主要是練習下c 程式設計,和以前用過的vb差不多。與vb6不同的是,c 區分大小寫。windows視窗程式主要也是由一些控制項組成,響應響應的事件 event 實現具體的功能。1.效果圖如下所示 2.如下所示 using system...
實現帶括號加減乘除運算
問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4資料規模和約定 表示式長度不超過100,表示式運算合法且運算過程都在int內進行。include includ...
複數的加減乘除及開方乘方運算
include includeusing namespace std const double pi 3.1415926535897932384626433 class fushu fushu operator const fushu f fushu operator const fushu f f...