用C編寫計算器程序_第1頁
用C編寫計算器程序_第2頁
用C編寫計算器程序_第3頁
用C編寫計算器程序_第4頁
用C編寫計算器程序_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1.2計算器的介紹(1)在運行程序后,系統(tǒng)會彈出一個基于對話框的計算器界面,如下圖所示:圖1.1計算器界面(2)在計算器程序中,主要通過一個編輯框來獲取表達式和顯示計算結(jié)果,表達式可以 通過鍵盤和單擊按鈕2種方式輸入,輸入后的結(jié)果如下圖所示:圖1.2輸入表達式后的界面(3)在輸入完表達式后,單擊“=后,開始對表達式進行計算,計算完成后,在編輯 框中顯示計算的結(jié)果。圖1.3計算后的結(jié)果acsqr t4.000000轉(zhuǎn)化為二進制轉(zhuǎn)化為十六進制in后退+ i sin-cos*tan/cot其實現(xiàn)的操作為先輸入一個十進(4)計算器可以實現(xiàn)十進制轉(zhuǎn)化為十六進制或二進制,制整數(shù),再單擊按鈕“轉(zhuǎn)化為二進制”

2、或“轉(zhuǎn)化為十六進制圖1.5 100轉(zhuǎn)化為二進制后的結(jié)果圖1.4 輸入一個十進制數(shù)100圖1.6 100轉(zhuǎn)化為十六進制后的結(jié)果(4)另外,計算器還可以實現(xiàn)一些簡單的函數(shù)運算,實現(xiàn)的操作和十六進制/二進制轉(zhuǎn)化類似,是先輸入一個數(shù)字,在單擊想要進行的函數(shù)的按鈕,單擊后就會在編輯框中顯示運 算的結(jié)果。1算法的實現(xiàn)2.1把字符串轉(zhuǎn)化為數(shù)字和運算符的算法(1)如果字符串中只有數(shù)字。這個情況用來實現(xiàn)一些簡單函數(shù)的運算。在進行簡單函數(shù) 的運算時,都是先輸入一個數(shù)字,再單擊要進行運算的按鈕,然后編輯框顯示運算的結(jié)果。 程序用了一個函數(shù)double getastr(cstring str)來實現(xiàn)這個功能,該函數(shù)以

3、編輯框變量m_strresult為實參,再得到m_strresult的值后,調(diào)用getat函數(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;d

4、ouble rate=10.0,itemp=0.0;for(;istr.getlength();i+)if(isdigit(str.getat(i)/如果字符串 str.getat(i) 的內(nè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 倍/如果str.getat(i)是小數(shù)點/讓rate=0.1,開始計算小數(shù)部分else if(str.getat(i)=.)ra

5、te=0.1;return (itemp);(2) 如果字符串中有運算符和數(shù)字,但是沒有括號。 程序調(diào)用函數(shù)void getstr(cstring str),這個函數(shù)的前半部分和函數(shù) void getastr(cstring str)一樣,都是獲取數(shù)字的算法,但是因為表達式中可能有多個數(shù)字和運算符,所以我們需要定義2 個數(shù)組,分別用來存放數(shù)字和運算符,當(dāng)讀取字符遇到運算符時,把變量itemp的值保存在數(shù)組a中,并把0賦給itemp,把10賦給rate,把運算符保存在數(shù)組b中。當(dāng)不在碰到運算符號時,把最后一個整數(shù)itemp的值數(shù)組a中,把z的值賦給so (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;i20;i+)ai=1000000.0;for(i=0;i10;i+)bi= ;i=0;for(;istr.getlength();i+)if(isdigit(str.getat(i)if(rate=10.0)/對數(shù)組 a20 初始化/對數(shù)組 b10 初始化/把 0 賦給 i/如果字符串str.getat(i) 的內(nèi)容是整數(shù)/整數(shù)部分itemp=i

7、temp*rate+(str.getat(i)-0); / 獲得整數(shù)else/小數(shù)部分itemp=itemp+rate*(str.getat(i)-0); / 獲得小數(shù)/每次讓rate小10倍else if(str.getat(i)=.)/如果str.getat(i)是小數(shù)點rate=0.1;/讓rate=0.1,開始計算小數(shù)部分rate=rate/10;/如果str.getat(i) 是加號else if(str.getat(i)=+)az=itemp;itemp=0;/把 itemp 的值放入雙精度數(shù)組a 中,并把 itemp 的值改為 0z+;/讓z 自加一次bz=+;/把加號放入字符數(shù)

8、組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的值改為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中,

9、并把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的值改為0z+;/讓 z 自加一次bz=/;z+;rate=10.0;/ 把除號放入字符數(shù)組b 中/讓 z 自加一次/把10賦給rate,確保讀取下個數(shù)字時,先計算整數(shù)部分 az=itemp;/把最后一個整數(shù)itemp 的值放入雙精度數(shù)組a 中s

10、=z;/把z的值賦給變量s,用來控制計算結(jié)果的循環(huán)中的條件(3)如果字符串中有括號。程序用函數(shù)void bracket(cstring str0)來解決括號問題,同樣, 函數(shù)以編輯框變量 m_strresult為實參,主要思想是把 m_strresult先分成3個字符串,比 如一個表達式2*(2+3)-6 ,這個函數(shù)的目的是先把表達式2*(2+3)-6 分成 2*、 2+3、 -6 三個字符串,再計算2+3 后,把結(jié)果覆蓋掉2+3所在的字符串,最后把3個字符串相加,這樣就處理掉了括號的問題。具體實現(xiàn)的算法:定義 3個字符串變量stu、str2、str3,這 三個變量都初始化為空變量,現(xiàn)在開始一

11、個循環(huán),當(dāng)沒有遇到字符“ (”時,把每次得到的字符都加在字符串 str1 上,當(dāng)遇到字符“ (”時,把“ (”后的字符都加在字符串 str2 上, 直到遇到字符“)。當(dāng)遇到字符“)”時,把“)”后的字符都加在字符串str3上,str2再 調(diào)用函數(shù)計算出它的表達式的值,最后把3 個字符串相加,這就解決了括號問題。該函數(shù)代碼如下:void cmydlg:bracket(cstring str0)cstring str1=,str2=,str3=;int i=0;for(;istr0.getlength();i+)if(str0.getat(i)=()i+;for(;istr0.getlength(

12、);i+)if(str0.getat(i)=) break;str2+=str0.getat(i);i+;for(;istr0.getlength();i+)str3+=str0.getat(i);elsestr1+=str0.getat(i);/如果碰到了左括號/i 自加一次,用來跳過左括號/如果碰到右括號,跳出循環(huán)/把括號內(nèi)的表達式賦給str2/i 自加一次,用來跳過右括號/把括號后邊的表達式賦給str3/ 把括號前邊的表達式賦給str3getstr(str2);調(diào)用getstr(str2)函數(shù),把str2里的數(shù)字和運算符保存在數(shù)組中g(shù)etresult();for(i=0;istr0.ge

13、tlength();i+)if(str0.getat(i)=()str2.format(%1f,a0);/ 計算出表達式str2 的值/如果 m_strresult 中有括號/把 a0 轉(zhuǎn)化為字符串賦給str2m_strresult=str1+str2+str3;/把 str1,str2,str3 的值加起來賦給m_strresult2.2 計算出結(jié)果的算法在把表達式中的數(shù)字和運算符分別保存在數(shù)組后,接下來我們就要進行表達式的計算了,表達式的計算首先要考慮優(yōu)先級的問題,這里先把所有的除法轉(zhuǎn)化為乘法,再把除法后的數(shù)字取它的倒數(shù),接下來就是進行乘法計算,每次乘法計算后都把計算的結(jié)果保存在計算的 2

14、 個數(shù)中的前面的那個數(shù)上,并把乘號和后面的數(shù)字刪除。進行完乘法運算后,進行一次循環(huán),重新整理下數(shù)組,最后進行加法和減法運算。函數(shù)代碼如下:void cmydlg:getresult()int i=0,x=0,y=1,t,z=1;/這個循環(huán)的目的是把所有除法運算都改為乘法計算for(i=0;i=s;i+)if(bi=/)ai+1=1/ai+1;bi=*;/這個循環(huán)可以對所有乘法進行計算for(i=0;i=s;i+)if(bi=*)/當(dāng)循環(huán)遇到除號時/把 ai+1的值改為 1/ai+1 /把 bi 的值改為乘號/當(dāng)循環(huán)遇到乘號時/如果i-t=2(再上次循環(huán)中,t被賦值成了 i,這次2個值只相差2,

15、說明表達式的情況是連續(xù)乘法 ,比如 2*3*4) 以 2*3*4 為例,在這個條件之前,函數(shù)已經(jīng)進行了 2*3 的運算, 其計算結(jié)果保存在原來的 2 中,把 2 的值覆蓋了,這個條件的作用是讓 2*3 的結(jié)果再和 4 相乘,結(jié)果保存在原來的 2 中if(i-t=2)at-z=at-z*ai+1;/進行乘法運算,把結(jié)果保存在前面的數(shù)組元素中z=z+2;/這里引進變量z ,可以解決很多數(shù)連續(xù)相乘的問題,比如2*2*2*2*2*2ai-1=ai-1*ai+1;/碰到乘號后把乘號前后2 個數(shù)字相乘,結(jié)果保存在前面的數(shù)組元素ai+1=1000000.0;/對乘號后面的數(shù)字初始化為 0.0bi= ;/對乘

16、號初始化為空格/2 數(shù)相乘后把乘號及其后面的數(shù)字初始化了,如果是2*3*4 的情況,將會無法計算*4 ,所以要用開始的條件語句來解決t=i;/把 i 的值賦給 t/這個循環(huán)的目的是對數(shù)組a 和 b 進行整理,因為已經(jīng)進行了乘法和除法運算,進行運算的時候,把一些數(shù)字和運算符初始化了這個函數(shù)的作用可以使中間一些初始化了的數(shù)字和符號被后面的數(shù)字和符號代替,讓數(shù)組可以重新排列for(i=0;i=s;i+)if(ai!=1000000.0)ax=ai;x+=2;if(bi!= )by=bi;y=y+2;/這個循環(huán)是進行最后的加減法運算for(i=0;i=y-2;i+)/如果ai 的值不為 0.0/把 a

17、i 的值賦給 ax/x 自加 2/如果 bi 的值不為空格/把 bi 的值賦給 by/y 自加 2/這里i的上限小于等于y-2,可以保證不進行多余的運算if(bi=+)/如果bi 等于加號a0=a0+ai+1;/把加號后的數(shù)字和a0 相加,結(jié)果保存在 a0 中else if(bi=-)如果 bi等于減號a0=a0-ai+1; /把減號后的數(shù)字和a0 相減,結(jié)果保存在 a0 中 2.3 轉(zhuǎn)化為十六進制和二進制的算法1 1) 轉(zhuǎn)化為二進制的算法。將數(shù)值除以2 并記錄余數(shù),只要商不為0,繼續(xù)將最新的商除以2 并記錄余數(shù),當(dāng)商為 0 以后,此數(shù)的二進制便可以由記錄下來的余數(shù)得到 3 。以下是函 數(shù)的代

18、碼:void cmydlg:on2()int m,n20;cstring str;updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultm=(int)getastr(m_strresult);調(diào)用 getastr(m_strresult)用來獲取 m_strresult 中的數(shù)字m_strresult=;for(int i=0;i=0;i-)/對 m_strresult 的值初始化/把 m 除 2 的余數(shù)保存在ni 中/把 m/2 的值賦給 m/ 當(dāng) m 為 0 時,退出循環(huán)str.format(%d,ni);/用 format 函數(shù)把 ni 的值轉(zhuǎn)化為字

19、符串m_strresult+=str;/把 str 的值加在 m_strresult 上operatorpressed=true;把 bool 變量 operatorpressed勺值改為 trueupdatedata(false);/把字符串變量m_strresult傳給編輯框(2)轉(zhuǎn)化為十六進制的算法。 如果要轉(zhuǎn)化的數(shù)字大于16, 則把這個數(shù)字除以 16并記錄余數(shù),繼續(xù)將最新的商除以 16 并記錄余數(shù),當(dāng)商為 0 以后,把大于 9 的數(shù)字轉(zhuǎn)化為字母記錄,這樣得到的字符串就是十六進制數(shù)了。函數(shù)代碼如下;void cmydlg:on16()int m;updatedata(true);/把編輯

20、框顯示的字符串傳給相應(yīng)的變量m_strresultm=(int)getastr(m_strresult);調(diào)用 getastr(m_strresult),用來獲取 m_strresult中的數(shù)字f(m);/調(diào)用f(m) 函數(shù),把十進制轉(zhuǎn)化為十六進制m_strresult=str7;str7=;operatorpressed=true;updatedata(false);/把 str7 的值賦給m_strresult/把 str7 初始化把 bool 變量 operatorpressed勺值改為 true/把字符串變量m_strresult 傳給編輯框void cmydlg:f(int n)cs

21、tring str1;int x;if(n/16)!=0)f(n/16);x=n%16;if(x=0&x=9)str1.format(%d,x);str7+=str1;elsestr7+=char(x+55);/如果n 大于等于 16/ 把 n 除以16,進行遞歸調(diào)用/ 把 n 除以 16 的余數(shù)賦給x/如果x 在 0 到 9 之間/用 format 函數(shù)把 x 的值轉(zhuǎn)化為字符串/把 str1 加在 str3 上/把x的值加55 (利用ascii碼)再轉(zhuǎn)化為字符型加在str3上3 參考文獻1譚浩強.c+程序設(shè)計.清華大學(xué)出版社2004.2 鄭阿奇 .visual c+ 教程 . 機械工業(yè)出版社

22、20043j.gleen brookshear. 計算機科學(xué)概論. 人民郵電出版社2003.4 程序代碼void cmydlg:onno0()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultif(operatorpressed=true|restarted=true)/在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strresult=0;/變量m_strresult 的值為按下的按忸0else /在按下數(shù)字鍵的情況下,則在m_strresult 后加 0m_strresult+=0; operatorpressed=false; 把 b

23、ool 變量 operatorpressedf口 restarted 的值改為 false restarted=false; updatedata(false);/把字符串變量m_strresult傳給編輯框void cmydlg:onno1() updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultif(operatorpressed=true|restarted=true) /在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strresult=1;變量 m_strresult的值為按下的按忸1else /在按下數(shù)字鍵的情況下,則在 m_st

24、rresult后加1 m_strresult+=1; operatorpressed=false; 把 bool 變量 operatorpressedf口 restarted的值改為 false restarted=false; updatedata(false);/把字符串變量m_strresult傳給編輯框void cmydlg:onno2()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量 m_strresult if(operatorpressed=true|restarted=true) /在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strres

25、ult=2;/變量m_strresult 的值為按下的按忸2else /在按下數(shù)字鍵的情況下,則在m_strresult 后加 2m_strresult+=2; operatorpressed=false; 把 bool 變量 operatorpressedf口 restarted 的值改為 false restarted=false; updatedata(false);/把字符串變量m_strresult傳給編輯框void cmydlg:onno3() updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultif(operatorpressed=true

26、|restarted=true) /在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strresult=3;/變量 m_strresult的值為按下的按忸3else /在按下數(shù)字鍵的情況下,則在 m_strresult后加3 m_strresult+=3; operatorpressed=false; 把 bool 變量 operatorpressedf口 restarted 的值改為 false restarted=false; updatedata(false);/把字符串變量m_strresult傳給編輯框updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量

27、 m_strresultif(operatorpressed=true|restarted=true)/在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strresult=4;/變量m_strresult 的值為按下的按忸4else /在按下數(shù)字鍵的情況下,則在m_strresult 后加 4m_strresult+=4;operatorpressed=false;把 bool 變量 operatorpressedf口 restarted 的值改為 falserestarted=false;updatedata(false);/把字符串變量m_strresult傳給編輯框void

28、cmydlg:onno5()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量 m_strresultif(operatorpressed=true|restarted=true)/在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strresult=5;/變量m_strresult 的值為按下的按忸5else /在按下數(shù)字鍵的情況下,則在m_strresult 后加 5m_strresult+=5;operatorpressed=false;把 bool 變量 operatorpressedf口 restarted 的值改為 falserestarted=fal

29、se;updatedata(false);/把字符串變量m_strresult傳給編輯框void cmydlg:onno6()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量 m_strresult if(operatorpressed=true|restarted=true) /在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strresult=6;/變量 m_strresult 的值為按下的按忸6else /在按下數(shù)字鍵的情況下,則在 m_strresult后加6 m_strresult+=6;operatorpressed=false;把 bool 變量

30、 operatorpressedf口 restarted的值改為 falserestarted=false;updatedata(false);/把字符串變量m_strresult傳給編輯框void cmydlg:onno7() updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultif(operatorpressed=true|restarted=true) /在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strresult=7;變量 m_strresult的值為按下的按忸7else /在按下數(shù)字鍵的情況下,則在m_strresult 后加

31、 7m_strresult+=7; operatorpressed=false; 把 bool 變量 operatorpressedf口 restarted 的值改為 false restarted=false; updatedata(false);/把字符串變量m_strresult傳給編輯框void cmydlg:onno8()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultif(operatorpressed=true|restarted=true)/在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strresult=8;變量 m_

32、strresult的值為按下的按忸8else /在按下數(shù)字鍵的情況下,則在m_strresult 后加 8m_strresult+=8;operatorpressed=false;把 bool 變量 operatorpressedf口 restarted 的值改為 falserestarted=false;updatedata(false);/把字符串變量m_strresult傳給編輯框void cmydlg:onno9()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量 m_strresultif(operatorpressed=true|restarted=true)

33、/在按下了 =,ac,sqrt,tan,sin 等按忸時,m_strresult=9;/變量 m_strresult 的值為按下的按忸9else /在按下數(shù)字鍵的情況下,則在m_strresult 后加 9m_strresult+=9; operatorpressed=false; 把 bool 變量 operatorpressedf口 restarted 的值改為 false restarted=false;updatedata(false);/把字符串變量m_strresult傳給編輯框void cmydlg:onadd()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的

34、變量m_strresultm_strresult+=+”;/在變量 m_strresult后加+operatorpressed=false;把 bool 變量 operatorpressecf口 restarted 的值改為 falserestarted=false;updatedata(false);/把字符串變量m_strresult傳給編輯框 void cmydlg:ondec()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultm_strresult+=-;/在變量m_strresult 后加 -operatorpressed=false;把

35、bool 變量 operatorpressedf口 restarted 的值改為 falserestarted=false;updatedata(false);/把字符串變量m_strresult傳給編輯框void cmydlg:onmut()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultm_strresult+=*;/在變量m_strresult 后加 *operatorpressed=false;把 bool 變量 operatorpressedf口 restarted 的值改為 falserestarted=false;updatedata(

36、false);/把字符串變量m_strresult 傳給編輯框if(isdigit(str.getat(i)/如果字符串str.getat(i) 的內(nèi)容是整數(shù)void cmydlg:ondiv()updatedata(true);/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultm_strresult+=/;/在變量 m_strresult后加/operatorpressed=false;把 bool 變量 operatorpressedf口 restarted 的值改為 falserestarted=false;updatedata(false);/把字符串變量m_strresult

37、傳給編輯框/通過這個函數(shù),實現(xiàn)把字符串中的數(shù)字和運算符讀取出來,并分別儲存在2 個數(shù)組里void cmydlg:getstr(cstring str)int i=0,z=0;double rate=10.0,itemp=0.0;for(i=0;i20;i+)ai=1000000.0;for(i=0;i10;i+)bi= ;i=0;for(;istr.getlength();i+)/對數(shù)組a20 初始化/對數(shù)組b10 初始化/把 0 賦給 iif(rate=10.0)/整數(shù)部分itemp=itemp*rate+(str.getat(i)-0); /獲得整數(shù)else/小數(shù)部分itemp=itemp

38、+rate*(str.getat(i)-0); /獲得小數(shù)rate=rate/10;else if(str.getat(i)=.) rate=0.1;else if(str.getat(i)=+)az=itemp;itemp=0;/ 每次讓 rate 小 10 倍/如果 str.getat(i) 是小數(shù)點/讓rate=0.1,開始計算小數(shù)部分/如果 str.getat(i) 是加號/把 itemp 的值放入雙精度數(shù)組 a 中,并把 itemp 的值改為 0z+;bz=+;z+;/讓 z 自加一次/把加號放入字符數(shù)組b 中/讓 z 自加一次rate=10.0;/把10賦給rate,確保讀取下個數(shù)

39、字時,先計算整數(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中,并把itemp的值改為0z+;/讓 z 自加一次bz=*;/把減號放入字符數(shù)組b 中

40、z+;/讓 z 自加一次rate=10.0;/把10賦給rate,確保讀取下個數(shù)字時,先計算整數(shù)部分else if(str.getat(i)=7)如果 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ù)部分az=itemp;/把最后一個整數(shù)itemp 的值放入雙精度數(shù)組a 中s=z;/把z的值賦給變量s,用來控制計算結(jié)果的循環(huán)中的條件/這個函數(shù)結(jié)束后編輯框的表達式被

41、分成了數(shù)字和運算符2部分, 數(shù)字保存在a0,a2,a4.中,運算符保存在b1,b3. 中void cmydlg:getresult()int i=0,x=0,y=1,t,z=1;/這個循環(huán)的目的是把所有除法運算都改為乘法計算for(i=0;i=s;i+)if(bi=/)ai+1=1/ai+1;bi=*;/這個循環(huán)可以對所有乘法進行計算for(i=0;i=s;i+)if(bi=*)/當(dāng)循環(huán)遇到除號時/把 ai+1 的值改為 1/ai+1/把 bi 的值改為乘號/當(dāng)循環(huán)遇到乘號時/如果i-t=2(再上次循環(huán)中,t被賦值成了 i,這次2個值只相差2,說明表達式的情況是連續(xù)乘法 ,比如 2*3*4)

42、以 2*3*4 為例, 在這個條件之前, 函數(shù)已經(jīng)進行了 2*3 的運算, 其計算結(jié)果保存在原來的 2 中,把 2 的值覆蓋了,這個條件的作用是讓2*3 的結(jié)果再和4 相乘,結(jié)果保存在原來的 2 中if(i-t=2)at-z=at-z*ai+1;/進行乘法運算,把結(jié)果保存在前面的數(shù)組元素中z=z+2;/這里引進變量z ,可以解決很多數(shù)連續(xù)相乘的問題,比如2*2*2*2*2*2ai-1=ai-1*ai+1;/碰到乘號后把乘號前后2 個數(shù)字相乘,結(jié)果保存在前面的數(shù)組元素ai+1=1000000.0;/對乘號后面的數(shù)字初始化為0.0bi= ;/對乘號初始化為空格/2 數(shù)相乘后把乘號及其后面的數(shù)字初始

43、化了, 如果是 2*3*4 的情況, 將會無法計算*4 , 所以要用開始的條件語句來解決t=i;/把 i 的值賦給 t/這個循環(huán)的目的是對數(shù)組a 和 b 進行整理,因為已經(jīng)進行了乘法和除法運算,進行運算的時候, 把一些數(shù)字和運算符初始化了這個函數(shù)的作用可以使中間一些初始化了的數(shù)字和符號被后面的數(shù)字和符號代替,讓數(shù)組可以重新排列for(i=0;i=s;i+)if(ai!=1000000.0)/如果ai 的值不為 0.0ax=ai;/把 ai 的值賦給 axx+=2;/x 自加 2if(bi!= )/如果bi 的值不為空格by=bi;/把 bi 的值賦給 byy=y+2;/y 自加 2/這個循環(huán)是

44、進行最后的加減法運算for(i=0;i1)/ 當(dāng) m_strresult 不等于0 且 m_strresult 長度大于 1 時m_strresult=m_strresult.left(m_strresult.getlength()-1);/使m_strresult長度減少1,去掉最右邊的字符elserestarted=true;/把bool變量restarted的值改為true,再次輸入數(shù)字時,覆蓋掉現(xiàn)在的 m_strresult m_strresult=0;/把字符串0賦給 m_strresultupdatedata(false); /把字符串變量m_strresult傳給編輯框void

45、cmydlg:onsin()updatedata(true) ;/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultdouble result/定義一個雙精度型變量result,用來獲取進行了 sin運算的結(jié)果result=sin(getastr(m_strresult);/先調(diào)用 getastr 函數(shù)用來把字符串變?yōu)閿?shù)字,再進行sin 運算,把結(jié)果賦給resultm_strresult.format(%1f,result);/調(diào)用format函數(shù),把result轉(zhuǎn)化為字符串并賦給 m_strresultoperatorpressed=true;把bool變量operatorpresse

46、d勺值改為true,再次輸入數(shù)字時,覆蓋掉現(xiàn)在的m_strresultupdatedata(false); 把字符串變量 m_strresult傳給編輯框void cmydlg:oncos()updatedata(true) ;/把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultdouble result/定義一個雙精度型變量result,用來獲取進行了 cos運算的結(jié)果result=cos(getastr(m_strresult);/先調(diào)用getastr函數(shù)用來把字符串變?yōu)閿?shù)字,再進行 cos運算,把結(jié)果賦給resultm_strresult.format(%1f,result);/調(diào)

47、用format函數(shù),把result轉(zhuǎn)化為字符串并賦給 m_strresultoperatorpressed=true;把bool變量operatorpressed勺值改為true,再次輸入數(shù)字時,覆蓋掉現(xiàn)在的 m_strresult updatedata(false),把字符串變量m_strresult傳給編輯框void cmydlg:ontan()updatedata(true); /把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultdouble result/定義一個雙精度型變量result,用來獲取進行了 tan運算的結(jié)果result=tan(getastr(m_strresult

48、);/先調(diào)用getastr 函數(shù)用來把字符串變?yōu)閿?shù)字,再進行tan 運算,把結(jié)果賦給resultm_strresult.format(%1f,result);/調(diào)用format函數(shù),把result轉(zhuǎn)化為字符串并賦給 m_strresultoperatorpressed=true;把bool變量operatorpressed勺值改為true,再次輸入數(shù)字時,覆蓋掉現(xiàn)在的 m_strresult updatedata(false); 把字符串變量 m_strresult傳給編輯框void cmydlg:oncot()updatedata(true); /把編輯框顯示的字符串傳給相應(yīng)的變量m_strresultdouble result/定義一個雙精度型變量result,用來獲取進行了 cot運算的結(jié)果result=1/tan(getastr(m

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論