版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算器的介紹(1)在運行程序后,系統(tǒng)會彈出一個基于對話框的計算器界面,如下圖所示: 圖1.1 計算器界面 (2)在計算器程序中,主要通過一個編輯框來獲取表達式和顯示計算結果,表達式可以通過鍵盤和單擊按鈕2種方式輸入,輸入后的結果如下圖所示: 圖1.2 輸入表達式后的界面 (3)在輸入完表達式后,單擊“=”后,開始對表達式進行計算,計算完成后,在編輯框中顯示計算的結果。 圖1.3 計算后的結果(4)計算器可以實現(xiàn)十進制轉化為十六進制或二進制,其實現(xiàn)的操作為先輸入一個十進制整數(shù),再單擊按鈕“轉化為二進制”或“轉化為十六進制。 圖1.4 輸入一個十進制數(shù)100 圖1.5 100轉化為二進制后的結果
2、圖1.6 100轉化為十六進制后的結果(4)另外,計算器還可以實現(xiàn)一些簡單的函數(shù)運算,實現(xiàn)的操作和十六進制/二進制轉化類似,是先輸入一個數(shù)字,在單擊想要進行的函數(shù)的按鈕,單擊后就會在編輯框中顯示運算的結果。 1 算法的實現(xiàn)2.1把字符串轉化為數(shù)字和運算符的算法(1)如果字符串中只有數(shù)字。這個情況用來實現(xiàn)一些簡單函數(shù)的運算。在進行簡單函數(shù)的運算時,都是先輸入一個數(shù)字,再單擊要進行運算的按鈕,然后編輯框顯示運算的結果。程序用了一個函數(shù)double GetaStr(CString str)來實現(xiàn)這個功能,該函數(shù)以編輯框變量m_strResult為實參,再得到m_strResult的值后,調用GetA
3、t函數(shù),一個字符一個字符的讀取,如果碰到整數(shù),執(zhí)行“itemp=itemp*rate+(str.GetAt(i)-'0');”,其中變量itemp初始值為0,變量rate初始值為10,如果碰到了小數(shù)點,改變rate的值,使其等于0.1,再向后繼續(xù)讀取,再碰到整數(shù)時執(zhí)行“itemp=itemp+rate*(str.GetAt(i)-'0');rate=rate/10;”,函數(shù)的最后確定返回值為itemp。以下是這個函數(shù)的代碼2:double CMyDlg:GetaStr(CString str)int i=0;double rate=10.0,itemp=0.0;
4、for(;i<str.GetLength();i+) if(isdigit(str.GetAt(i) /如果字符串str.GetAt(i)的內容是整數(shù) if(rate=10.0) /整數(shù)部分itemp=itemp*rate+(str.GetAt(i)-'0');/獲得整數(shù)else /小數(shù)部分itemp=itemp+rate*(str.GetAt(i)-'0');/獲得小數(shù)rate=rate/10; /每次讓rate小10倍else if(str.GetAt(i)='.') /如果str.GetAt(i)是小數(shù)點rate=0.1; /讓rat
5、e=0.1,開始計算小數(shù)部分 return (itemp);(2)如果字符串中有運算符和數(shù)字,但是沒有括號。程序調用函數(shù)void GetStr(CString str),這個函數(shù)的前半部分和函數(shù)void GetaStr(CString str)一樣,都是獲取數(shù)字的算法,但是因為表達式中可能有多個數(shù)字和運算符,所以我們需要定義2個數(shù)組,分別用來存放數(shù)字和運算符,當讀取字符遇到運算符時,把變量itemp的值保存在數(shù)組a中,并把0賦給itemp,把10賦給rate,把運算符保存在數(shù)組b中。當不在碰到運算符號時,把最后一個整數(shù)itemp的值數(shù)組a中,把z的值賦給s。(z的值表示運算符加數(shù)字一個有多少個
6、,把這個值賦給s,可以在以后的計算中,控制循環(huán)的條件,避免造成不必要的誤差。)這個函數(shù)的代碼如下:void CMyDlg:GetStr(CString str) int i=0,z=0;double rate=10.0,itemp=0.0;for(i=0;i<20;i+) ai=1000000.0; /對數(shù)組a20初始化for(i=0;i<10;i+) bi=' ' /對數(shù)組b10初始化i=0; /把0賦給ifor(;i<str.GetLength();i+) if(isdigit(str.GetAt(i) /如果字符串str.GetAt(i)的內容是整數(shù) i
7、f(rate=10.0) /整數(shù)部分itemp=itemp*rate+(str.GetAt(i)-'0');/獲得整數(shù)else /小數(shù)部分itemp=itemp+rate*(str.GetAt(i)-'0');/獲得小數(shù)rate=rate/10; /每次讓rate小10倍else if(str.GetAt(i)='.') /如果str.GetAt(i)是小數(shù)點rate=0.1; /讓rate=0.1,開始計算小數(shù)部分else if(str.GetAt(i)='+') /如果str.GetAt(i)是加號 az=itemp;item
8、p=0; /把itemp的值放入雙精度數(shù)組a中,并把itemp的值改為0z+; /讓z自加一次bz='+' /把加號放入字符數(shù)組b中 z+; /讓z自加一次rate=10.0; /把10賦給rate,確保讀取下個數(shù)字時,先計算整數(shù)部分else if(str.GetAt(i)='-') /如果str.GetAt(i)是減號 az=itemp;itemp=0; /把itemp的值放入雙精度數(shù)組a中,并把itemp的值改為0 z+; /讓z自加一次 bz='-' /把減號放入字符數(shù)組b中 z+; /讓z自加一次 rate=10.0; /把10賦給rat
9、e,確保讀取下個數(shù)字時,先計算整數(shù)部分else if(str.GetAt(i)='*') /如果str.GetAt(i)是乘號 az=itemp;itemp=0; /把itemp的值放入雙精度數(shù)組a中,并把itemp的值改為0z+; /讓z自加一次bz='*' /把減號放入字符數(shù)組b中z+; /讓z自加一次 rate=10.0; /把10賦給rate,確保讀取下個數(shù)字時,先計算整數(shù)部分else if(str.GetAt(i)='/') /如果str.GetAt(i)是除號 az=itemp;itemp=0; /把itemp的值放入雙精度數(shù)組a中,
10、并把itemp的值改為0z+; /讓z自加一次bz='/' /把除號放入字符數(shù)組b中z+; /讓z自加一次rate=10.0; /把10賦給rate,確保讀取下個數(shù)字時,先計算整數(shù)部分az=itemp; /把最后一個整數(shù)itemp的值放入雙精度數(shù)組a中 s=z; /把z的值賦給變量s,用來控制計算結果的循環(huán)中的條件(3) 如果字符串中有括號。程序用函數(shù)void Bracket(CString str0)來解決括號問題,同樣,函數(shù)以編輯框變量m_strResult為實參,主要思想是把m_strResult先分成3個字符串,比如一個表達式2*(2+3)-6,這個函數(shù)的目的是先把表達
11、式2*(2+3)-6分成2*、2+3、-6三個字符串,再計算2+3后,把結果覆蓋掉2+3所在的字符串,最后把3個字符串相加,這樣就處理掉了括號的問題。具體實現(xiàn)的算法:定義3個字符串變量str1、str2、str3,這三個變量都初始化為空變量,現(xiàn)在開始一個循環(huán),當沒有遇到字符“(”時,把每次得到的字符都加在字符串str1上,當遇到字符“(”時,把“(”后的字符都加在字符串str2上,直到遇到字符“)”。當遇到字符“)”時,把“)”后的字符都加在字符串str3上,str2再調用函數(shù)計算出它的表達式的值,最后把3個字符串相加,這就解決了括號問題。該函數(shù)代碼如下:void CMyDlg:Bracket
12、(CString str0) CString str1="",str2="",str3=""int i=0;for(;i<str0.GetLength();i+) if(str0.GetAt(i)='(') /如果碰到了左括號 i+; /i自加一次,用來跳過左括號 for(;i<str0.GetLength();i+)if(str0.GetAt(i)=')') break; /如果碰到右括號,跳出循環(huán) str2+=str0.GetAt(i); /把括號內的表達式賦給str2i+; /i自加一
13、次,用來跳過右括號for(;i<str0.GetLength();i+)str3+=str0.GetAt(i); /把括號后邊的表達式賦給str3 else str1+=str0.GetAt(i); /把括號前邊的表達式賦給str3GetStr(str2); /調用GetStr(str2)函數(shù),把str2里的數(shù)字和運算符保存在數(shù)組中 GetResult(); /計算出表達式str2的值for(i=0;i<str0.GetLength();i+)if(str0.GetAt(i)='(') /如果m_strResult中有括號str2.Format("%1f&
14、quot;,a0); /把a0轉化為字符串賦給str2m_strResult=str1+str2+str3; /把str1,str2,str3的值加起來賦給m_strResult2.2 計算出結果的算法在把表達式中的數(shù)字和運算符分別保存在數(shù)組后,接下來我們就要進行表達式的計算了,表達式的計算首先要考慮優(yōu)先級的問題,這里先把所有的除法轉化為乘法,再把除法后的數(shù)字取它的倒數(shù),接下來就是進行乘法計算,每次乘法計算后都把計算的結果保存在計算的2個數(shù)中的前面的那個數(shù)上,并把乘號和后面的數(shù)字刪除。進行完乘法運算后,進行一次循環(huán),重新整理下數(shù)組,最后進行加法和減法運算。函數(shù)代碼如下:void CMyDlg:
15、GetResult()int i=0,x=0,y=1,t,z=1;/這個循環(huán)的目的是把所有除法運算都改為乘法計算for(i=0;i<=s;i+) if(bi='/') /當循環(huán)遇到除號時ai+1=1/ai+1; /把ai+1的值改為1/ai+1bi='*' /把bi的值改為乘號 /這個循環(huán)可以對所有乘法進行計算for(i=0;i<=s;i+) if(bi='*') /當循環(huán)遇到乘號時/如果i-t=2(再上次循環(huán)中,t被賦值成了i,這次2個值只相差2,說明表達式的情況是連續(xù)乘法,比如2*3*4)以2*3*4為例,在這個條件之前,函數(shù)已經
16、進行了2*3的運算,其計算結果保存在原來的2中,把2的值覆蓋了,這個條件的作用是讓2*3的結果再和4相乘,結果保存在原來的2中if(i-t=2) at-z=at-z*ai+1; /進行乘法運算,把結果保存在前面的數(shù)組元素中 z=z+2; /這里引進變量z,可以解決很多數(shù)連續(xù)相乘的問題,比如2*2*2*2*2*2 ai-1=ai-1*ai+1; /碰到乘號后把乘號前后2個數(shù)字相乘,結果保存在前面的數(shù)組元素ai+1=1000000.0; /對乘號后面的數(shù)字初始化為0.0bi=' ' /對乘號初始化為空格/2數(shù)相乘后把乘號及其后面的數(shù)字初始化了,如果是2*3*4的情況,將會無法計算*
17、4,所以要用開始的條件語句來解決t=i; /把i的值賦給t/這個循環(huán)的目的是對數(shù)組a和b進行整理,因為已經進行了乘法和除法運算,進行運算的時候,把一些數(shù)字和運算符初始化了這個函數(shù)的作用可以使中間一些初始化了的數(shù)字和符號被后面的數(shù)字和符號代替,讓數(shù)組可以重新排列for(i=0;i<=s;i+) if(ai!=1000000.0) /如果ai的值不為0.0 ax=ai; /把ai的值賦給axx+=2; /x自加2if(bi!=' ') /如果bi的值不為空格by=bi; /把bi的值賦給byy=y+2; /y自加2/這個循環(huán)是進行最后的加減法運算for(i=0;i<=y
18、-2;i+) /這里i的上限小于等于y-2,可以保證不進行多余的運算 if(bi='+') /如果bi等于加號a0=a0+ai+1; /把加號后的數(shù)字和a0相加,結果保存在a0中else if(bi='-') /如果bi等于減號a0=a0-ai+1; /把減號后的數(shù)字和a0相減,結果保存在a0中2.3 轉化為十六進制和二進制的算法(1)轉化為二進制的算法。將數(shù)值除以2并記錄余數(shù),只要商不為0,繼續(xù)將最新的商除以2并記錄余數(shù),當商為0以后,此數(shù)的二進制便可以由記錄下來的余數(shù)得到3。以下是函數(shù)的代碼:void CMyDlg:On2() int m,n20;CStri
19、ng str;UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultm=(int)GetaStr(m_strResult); /調用GetaStr(m_strResult),用來獲取m_strResult中的數(shù)字 m_strResult="" /對m_strResult的值初始化for(int i=0;i<=20;i+) ni=m%2; /把m除2的余數(shù)保存在ni中 m=m/2; /把m/2的值賦給mif(m=0) break; /當m為0時,退出循環(huán) for(;i>=0;i-) str.Format("%d&q
20、uot;,ni); /用Format函數(shù)把ni的值轉化為字符串 m_strResult+=str; /把str的值加在m_strResult上OperatorPressed=true; /把bool變量OperatorPressed的值改為trueUpdateData(FALSE); /把字符串變量m_strResult傳給編輯框 (2)轉化為十六進制的算法。如果要轉化的數(shù)字大于16,則把這個數(shù)字除以16并記錄余數(shù),繼續(xù)將最新的商除以16并記錄余數(shù),當商為0以后,把大于9的數(shù)字轉化為字母記錄,這樣得到的字符串就是十六進制數(shù)了。函數(shù)代碼如下;void CMyDlg:On16() int m;Up
21、dateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultm=(int)GetaStr(m_strResult); /調用GetaStr(m_strResult),用來獲取m_strResult中的數(shù)字f(m); /調用f(m)函數(shù),把十進制轉化為十六進制 m_strResult=str7; /把str7的值賦給m_strResultstr7="" /把str7初始化OperatorPressed=true; /把bool變量OperatorPressed的值改為trueUpdateData(FALSE); /把字符串變量m_strResul
22、t傳給編輯框void CMyDlg:f(int n)CString str1;int x; if(n/16)!=0) /如果n大于等于16 f(n/16); /把n除以16,進行遞歸調用 x=n%16; /把n除以16的余數(shù)賦給x if(x>=0&&x<=9) /如果x在0到9之間str1.Format("%d",x); /用Format函數(shù)把x的值轉化為字符串str7+=str1; /把str1加在str3上 elsestr7+=char(x+55); /把x的值加55(利用ASCII碼)再轉化為字符型加在str3上 3 參考文獻1譚浩強. C
23、+程序設計.清華大學出版社2004.2鄭阿奇.Visual C+教程.機械工業(yè)出版社 20043J.Gleen Brookshear.計算機科學概論.人民郵電出版社 2003.4 程序代碼void CMyDlg:OnNo0() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultif(OperatorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult=&
24、quot;0" /變量m_strResult的值為按下的按忸"0"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"0"m_strResult+="0"OperatorPressed=false; /把bool變量OperatorPressed和Restarted的值改為false Restarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnNo1() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m
25、_strResultif(OperatorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult="1" /變量m_strResult的值為按下的按忸"1"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"1" m_strResult+="1"OperatorPressed=false; /把bool變量
26、OperatorPressed和Restarted的值改為falseRestarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnNo2() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultif(OperatorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult=&qu
27、ot;2" /變量m_strResult的值為按下的按忸"2"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"2"m_strResult+="2"OperatorPressed=false; /把bool變量OperatorPressed和Restarted的值改為falseRestarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnNo3() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_st
28、rResultif(OperatorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult="3" /變量m_strResult的值為按下的按忸"3"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"3"m_strResult+="3"OperatorPressed=false; /把bool變量Oper
29、atorPressed和Restarted的值改為falseRestarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnNo4() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultif(OperatorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult="4
30、" /變量m_strResult的值為按下的按忸"4"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"4"m_strResult+="4"OperatorPressed=false; /把bool變量OperatorPressed和Restarted的值改為falseRestarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnNo5() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strRes
31、ultif(OperatorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult="5" /變量m_strResult的值為按下的按忸"5"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"5"m_strResult+="5"OperatorPressed=false; /把bool變量Operator
32、Pressed和Restarted的值改為falseRestarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnNo6() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultif(OperatorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult="6&quo
33、t; /變量m_strResult的值為按下的按忸"6"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"6"m_strResult+="6"OperatorPressed=false; /把bool變量OperatorPressed和Restarted的值改為falseRestarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnNo7() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResulti
34、f(OperatorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult="7" /變量m_strResult的值為按下的按忸"7"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"7"m_strResult+="7"OperatorPressed=false; /把bool變量OperatorPres
35、sed和Restarted的值改為falseRestarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnNo8() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultif(OperatorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult="8" /
36、變量m_strResult的值為按下的按忸"8"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"8"m_strResult+="8"OperatorPressed=false; /把bool變量OperatorPressed和Restarted的值改為falseRestarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnNo9() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultif(Op
37、eratorPressed=true|Restarted=true)/在按下了"=","AC","sqrt","tan","sin"等按忸時,m_strResult="9" /變量m_strResult的值為按下的按忸"9"else /在按下數(shù)字鍵的情況下,則在m_strResult后加"9"m_strResult+="9"OperatorPressed=false; /把bool變量OperatorPressed和
38、Restarted的值改為falseRestarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnAdd() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultm_strResult+="+" /在變量m_strResult后加"+"OperatorPressed=false; /把bool變量OperatorPressed和Restarted的值改為false Restarted=false;UpdateData(FALSE);
39、 /把字符串變量m_strResult傳給編輯框void CMyDlg:OnDec() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultm_strResult+="-" /在變量m_strResult后加"-"OperatorPressed=false; /把bool變量OperatorPressed和Restarted的值改為false Restarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnMut() UpdateDa
40、ta(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultm_strResult+="*" /在變量m_strResult后加"*"OperatorPressed=false; /把bool變量OperatorPressed和Restarted的值改為false Restarted=false;UpdateData(FALSE); /把字符串變量m_strResult傳給編輯框void CMyDlg:OnDiv() UpdateData(TRUE); /把編輯框顯示的字符串傳給相應的變量m_strResultm_strResult+="/" /在變量m_strResult后加"/"OperatorPressed=false
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024適用型貸款利息合同書樣本版
- 2025年度彩色印刷設備升級改造合同3篇
- 2024年度城市基礎設施建設項目合同
- 二零二五年度綠色能源開發(fā)項目承包合同范本3篇
- 2025年度航空航天零部件定制設計與運輸服務合同3篇
- 2024物業(yè)委托經營管理合同
- 2025年水果種植基地與冷鏈物流公司合作合同3篇
- 二零二五版科技型企業(yè)貸款合同中的物權擔保與研發(fā)成果3篇
- 2025年蔬菜廢棄物資源化利用合作合同3篇
- 二零二五年版市政工程招標投標合同模板3篇
- 物業(yè)民法典知識培訓課件
- 2023年初中畢業(yè)生信息技術中考知識點詳解
- 2024-2025學年山東省德州市高中五校高二上學期期中考試地理試題(解析版)
- 《萬方數(shù)據(jù)資源介紹》課件
- 麻風病病情分析
- 《急診科建設與設備配置標準》
- 第一章-地震工程學概論
- TSGD7002-2023-壓力管道元件型式試驗規(guī)則
- 2024年度家庭醫(yī)生簽約服務培訓課件
- 建筑工地節(jié)前停工安全檢查表
- 了不起的狐貍爸爸-全文打印
評論
0/150
提交評論