C++簡單計算器課程設計報告_第1頁
C++簡單計算器課程設計報告_第2頁
C++簡單計算器課程設計報告_第3頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、.目錄1基本功能描述12設計思路13軟件設計43.1 設計步驟43.2界面設計53.3關鍵功能的實現114結論與心得體會125參考文獻136思考題137附錄147.1調試報告147.2測試結果157.3關鍵源代碼16. v. v.簡單計算器1基本功能描述簡單計算器包括雙目運算和單目運算功能。雙目運算符包含基本的四則運算及乘冪功能,單目運算符包含正余弦,階乘,對數,開方,倒數等運算??蓪斎肴我獠僮鲾担ㄐ岛驼麛导罢龜岛拓摂颠M行以上的所有運算并能連續(xù)運算。出現錯誤會給出相應提示,同時包含清除,退格,退出功能以及有與所有按鈕相對應的菜單項。2設計思路如圖是整個計算器的流程圖,打開計算器程序,輸

2、入數據,調用輸入數據子程序。子程序開始時m_num為零。按下數字按鈕后,判斷m_num的正負號,對其進行相關處理,然后在判斷是否有小數點,處理后輸出結果?;氐娇偭鞒虉D中,輸完第一個操作數后,若按下雙目運算符,則把m_num存入num2,按下輸入第二個操作數并算出結果。若按下的是單目運算符,則直接對其處理得出結果。若按下清零,則m_num等于0.在運算中還要判斷運算是否合法,以及結果是否超出顯示范圍,以做出相關提示,按下清零。算出后把結果保存至num2。若需用算出的結果繼續(xù)運算則回到輸入完第一個操作數后,若不需要則判斷試否需要開始新一輪的運算,不需要則結束。NNY鍵入一個數是否為正數.m_num

3、 =10*m_num+im_num =10*m_num-i是否為小數.用UpdateData(FALSE)刷新顯示還原m_num根據小數點后位數將鍵入的數除以n次10累加到m_numYN繼續(xù)鍵入數字.Y輸入數據子函數編輯框關聯變量m_num=0圖1 輸入數據子函數流程圖Y開始輸入數據子函數編輯框關聯的變量保存至num2輸入數據子函數進行運算運算是否合法把結果保存到num2m_num清零彈出對話框顯示ERRORNY是否用保存的結果繼續(xù)進行運算N結束jie雙目運算符單目運算符是否開始新一輪的計算YN圖2 簡單計算器總流程圖3軟件設計3.1 設計步驟打開Microsoft Visual C+ 6.0

4、,在文件中點擊新建,在彈出框內選擇MFC AppWizardexe工程,輸入工程名zhoutong及其所在位置,點擊確定,如圖3所示。圖3 新建MFC AppWizardexe工程將彈出MFC AppWizard-step 1對話框,選擇基本對話框,點擊完成,如圖4所示。圖4 基本對話框這樣,MFC AppWizard就建立了一個基于對話窗口的程序框架,如圖5所示。圖5 新建的對話框3.2界面設計1、創(chuàng)建控件在圖5所示的Resoure View選項卡中打開Dialog資源組,雙擊IDD_ZHOUTONG_DIALOG,在右邊的窗口中顯示出待編輯的對話框。開始擺放控件,包括編輯框和按鈕的創(chuàng)建。按

5、鈕的創(chuàng)建以“1”為例進行介紹,其他按鈕的創(chuàng)建可參照此進行操作。1)在圖5中Controls的“編輯框”按鈕上單擊鼠標左鍵,在對話框編輯窗口上合適的位置按下鼠標左鍵并拖動鼠標畫出一個大小合適的編輯框。在編輯框上單擊鼠標右鍵,在彈出的快捷萊單中選擇屬性選項,此時彈出Edit屬性對話框,如圖6所示,在該對話框中輸入ID屬性。 圖6 Edit屬性對話框2)在圖3中Controls的“Button”按鈕上單擊鼠標左鍵,在對話框上的合適的位置上按下鼠標左鍵并拖動鼠標畫出一個大小合適的下壓式按鈕。在按鈕上單擊鼠標右鍵,在彈出的快捷菜單中選擇屬性選項,此時也彈出Push Button屬性對話框,如圖7所示,在

6、該對話框中輸入控件的ID值和標題屬性。圖7 Push Button屬性按照上面的操作過程編輯其他按鈕和編輯框等對象的屬性。表1 各按鈕和編輯框等對象的屬性對象ID標題或說明編輯框IDC_xianshi結果顯示按鈕IDC_BUTTON00按鈕IDC_BUTTON11按鈕IDC_BUTTON22按鈕IDC_BUTTON33按鈕IDC_BUTTON44按鈕IDC_BUTTON55按鈕IDC_BUTTON66按鈕IDC_BUTTON77按鈕IDC_BUTTON88按鈕IDC_BUTTON99按鈕IDC_change+/-按鈕IDC_point.按鈕IDC_add+按鈕IDC_difference-按鈕

7、IDC_multiply*按鈕IDC_devide/按鈕IDC_sqrtsqrt按鈕IDC_daoshu1/x按鈕IDC_jiechengn!按鈕IDC_lnln按鈕IDC_sinsin按鈕IDC_coscos按鈕IDC_powxy按鈕IDC_Onequal=按鈕IDC_backspaceBackspace按鈕IDC_OnclearClear完成后界面如圖8所示。圖8 計算器界面2、連接變量和代碼1) 給編輯框連接變量。在編輯框上單擊鼠標右鍵,在彈出菜單中選擇ClassWizard菜單項,彈出MFC ClassWizard對話框,選擇Member Variables選項卡,如圖9所示。 圖9

8、MFC ClassWizard對話框中的Menber Variable選項卡在Control IDs列表框中選擇IDC_xianshi,單擊Add Variables按鈕,在彈出的對話框中連接變量m_num。變量類型設定為doubel型。如圖10所示。圖10 m_num屬性設置2) 給“1”按鈕連接代碼。在“1”按鈕上單擊鼠標右鍵,選擇ClassWizard菜單項,在彈出的對話框中選擇Messages Maps選項卡,然后在Object IDs列表框中選擇IDC_ADD_BUTTON,在Messages列表框中選擇BN_CLICKED項,即選擇單擊按鈕事件,如圖11所示。 圖11 “1”按鈕鏈

9、接代碼對話框3、菜單的設計選擇 插入/資源命令,將顯示插入資源對話框。如圖12所示。選擇Menu,點擊新建即可。圖12 插入資源對話框Resoure View選項卡中打開Menu資源組,雙擊IDR_MENU1, 然后給菜單添加相應的標題,并把每個菜單對應的ID值與相應的按鈕的一致。如圖13所示。圖13 菜單屬性對話框在對話框的任何一個空白域單擊鼠標右鍵,然后在彈出的快捷菜單中選擇Properties命令,彈出Dialog Properties對話框,如圖14。在對話框中的菜單組合框中選擇IDR_MENU1。圖14 對話屬性對話框最終的得到的界面如圖15。圖15 計算器完整界面3.3關鍵功能的實

10、現1)操作數的輸入編輯框所關聯的變量為m_num,程序開始時為零。每按下一個數字鍵按鈕,就把它累加到m_num里并刷新顯示。BOOL型變量ele來判斷是否有小數點和一個整型數dint來表示小數點后的數據的位數。當ele=TRUE時,表示有小數點,否則則表示無小數點。按下小數點按鈕后執(zhí)行ele=TRUE。當按下一個數字鍵時,首先根據ele判斷是否按下小數點,若有則把小數點后數的位數加1,dint則為此次鍵入的數所處的位數,將鍵入的數除以dint個10然后累加到編輯框所關聯的變量m_num上,若沒有則把m_num乘以10,然后累加到編輯框所關聯的變量m_num上。2)單目運算符功能的實現由于單目運

11、算符中必須有執(zhí)行運算的函數,因而頭文件中要加入math.h,如m_num=sqrt(m_num).按下按鈕即可實現其功能。為實現連續(xù)運算,程序有所改動,參見(6)。3)雙目運算符功能的實現雙目運算符需要兩個操作數才能運算,所以在執(zhí)行雙目運算符按鈕的函數代碼中,要把m_num中的值保存到變量num2中,然后把m_num清零。這樣即可保存第一個操作數。另外先定義了一個整形變量addt,在不同的雙目運算符中給addt賦不同的值,然后在等號中用switch語句來匹配addt值來判斷需要執(zhí)行何種雙目運算。為實現連續(xù)運算,程序有所改動,參見(6)。4)退格鍵功能的實現當按下一次退格按鈕時,若m_num為整

12、數,只需對其中數據除以10再取整即可,若按下一次退格按鈕為小數,則根據小數點后數據的位數dint進行操作,先對m_num執(zhí)行(dint-1)次乘以10運算,然后取整,接著執(zhí)行(dint-1)次除以10的運算即可。完成后需要把dint將減小1。5) 正負號功能的實現在頭文件中定義一個BOOL型變量ele2來判斷m_num的正負。ele2=TRUE時表示為正。在鍵入操作數時需要用到ele2。在正負號按鈕的消息響應函數內容為m_num=-m_num;ele2=!ele2。6)連續(xù)運算功能的實現要連續(xù)運算必須將每次運算的結果保存下來。對于雙目運算符:首先在等號按鈕的消息處理函數中在m_num清零之前將

13、m_num的值賦給num2.不過這樣的話如果再按雙目運算符則num2的值將會被覆蓋,于是在雙目運算符按鈕的消息處理函數中將“num2=m_num;”改為“if(m_num!=0)num2=m_num;”.這樣若已經保存了結果則不進行覆蓋。然后在每個數字按鈕前加上“if(addt=0)num2=0;”,這樣如果進行完一次運算之后按下任一數字鍵表示不需要連續(xù)運算,則將保存的結果刪除,若按下的是雙目運算符按鈕則可以繼續(xù)運算。對于單目運算符:每次運算完之后都會對m_num清零,因此其結果也要賦給num2,下次運算是則會用到num2,于是第一次運算時直接將m_num 的值賦給num2,對其進行運算。以開

14、根號為例,在消息處理函數代碼中將“m_num=sqrt(m_num);”改為“num2=m_num;m_num=sqrt(num2); num2=m_num;”。但是第一次運算執(zhí)行完成之后m_num被清零,所以之后將m_num 的值不能賦給num2,代碼改為 “if(m_num>=0)m_num=sqrt(num2); num2=m_num;”。其他單目運算符同理。為實現連續(xù)運算是不需要按下等號即可實現,又在所有的運算符按鈕的消息處理函數代碼前加上了“if(addt!=0)Onequal();”。既若之前有按下雙目運算符和兩個操作數則連續(xù)運算再按下任一運算符時會自動調用等號的處理函數將上

15、次的運算完成并保存結果方便下一次的運算。4結論與心得體會經過多番測試,得出結論為設計的計算器能夠完成功能描述內容中的全部功能。經過2個星期的VC+課程設計,我在老師和同學的共同幫助下,順利完成該課程設計,收獲很大。本學期我們開設了面向對象程序設計與VC+實踐課MFC部分皆為需要實踐內容,正所謂“紙上談兵終覺淺,覺知此事要躬行?!彼栽诒緦W期課程設計是很及時、很必要的。這樣不僅能加深我們對MFC程序設計的掌握,而且還及時、真正的做到了學以致用。主要是以下幾點。基本功要過硬。不能馬虎經常犯犯小錯誤。提高自己找錯糾錯能力,通常錯誤總是那幾種,多練習就熟練了。要善于查找資料提高自己的資料查詢能力,要善

16、于利用網絡來獲得知識,獲得幫助。開始著手程序設計時,有些功能感覺無從下手,都不知道要干什么。這些問題只要找到相關的資料就會得到提示從而理解所要解決問題的大致方向。有了明確的目的,就可以發(fā)揮自己的頭腦來完成它了。要善于思考。程序中有些實現難點和最初完成程序時免不了的許多不足就需要自己根據代碼認真思考來解決。只有這樣才能糾正程序的不足并使其更加人性化。這次課程設計讓我學到了很多,不僅是鞏固了先前學的MFC程序設計知識,而且也培養(yǎng)了我的動手能力,更令我的創(chuàng)造性思維得到拓展。希望今后類似這樣課程設計、類似這樣的鍛煉機會能更多些!5參考文獻1 揣錦華.面向對象程序設計與VC+實踐.西安電子科技大學出版社

17、,20052 張建宏,湯練兵,馬德駿.計算機程序設計基礎-C語言程序設計.科學出版社,20063 陳清華.Visual C+課程設計案例精選與編程指導.東南大學出版社,20046思考題1、程序中如何實現小數的顯示與運算.答:在zhoutongDlg.h頭文件中定義一個BOOL型變量ele來判斷是否有小數點和一個整型數dint來表示小數點后的數據的位數。當ele=TRUE時,表示有小數點,否則則表示無小數點。按下小數點按鈕后執(zhí)行ele=TRUE。首先根據ele判斷是否按下小數點,若有則把小數點后數的位數加1,dint則為此次鍵入的數所處的位數,將鍵入的數除以dint個10然后累加到編輯框所關聯的

18、變量m_num上。2、描述等號對應的消息處理函數中需要處理的問題及相應的實現代碼.答:在雙目運算符按鈕函數代碼中將整形變量addt賦值,然后在等號中用switch語句來匹配addt值來判斷需要執(zhí)行何種雙目運算。并將結果保存以進行下次運算時使用 ,玩策劃那個一些變量的清零。實現代碼如下:switch (addt) /數據判斷case 0: /為實現連續(xù)按下兩次等號后能清零UpdateData(FALSE); /數據刷新break;case 1:m_num=num2+m_num; /兩數相加UpdateData(FALSE); /數據刷新break;case 2:m_num=num2-m_num;

19、 /兩數相減UpdateData(FALSE); /數據刷新break;case 3:m_num=num2*m_num; /兩數相乘UpdateData(FALSE); /數據刷新break;case 4:if (m_num=0) /在除法中,判斷除數是否為0GetDlgItem(IDC_xianshi)->SetWindowText("錯誤,0不能作除數");else m_num=num2/m_num;UpdateData(FALSE);break;case 5:m_num=pow(num2,m_num); /取模UpdateData(FALSE); /數據刷新br

20、eak;if(m_num>=1.7E308|m_num<-1.7E308)GetDlgItem(IDC_xianshi)->SetWindowText("結果過大,無法顯示");num2=m_num;m_num=0;num1=0;dint=0;ele=FALSE;addt=0;ele2=TRUE;7附錄7.1調試報告1、編譯時提示錯誤:“C:Documents and Settings周同桌面zhoutongzhoutongDlg.cpp(230) : error C2018: unknown character '0xa3'C:Docum

21、ents and Settings周同桌面zhoutongzhoutongDlg.cpp(230) : error C2018: unknown character '0xbb'C:Documents and Settings周同桌面zhoutongzhoutongDlg.cpp(231) : error C2143: syntax error : missing '' before 'if'”原因為分號是在中文輸入法狀態(tài)下輸入,將其改為英文輸入狀態(tài)下了分號即可。2、重做時調用其他工程中的對話框資源后編譯鏈接運行后還是本來有的那個對話框,后來將原

22、先的對話框資源刪除并將調用的對話框的ID改為原先的對話框的ID,再次編譯鏈接運行之后沒有反應了,經過多次摸索發(fā)現調用過來的對話框是關聯了菜單了,而新建的工程里沒有菜單,因此將調用的對話框取消與菜單的關聯,再次再次編譯鏈接運行之后一切正常。3、用GetDlgItem(IDC_NAME_EDIT)->SetWindowText(" ");來提示操作錯誤時,總是沒有任何效果,經老師幫助得以解決。因為UpdateData(FALSE)是將變量傳到前臺顯示,SetWindowText就是設置前臺顯示的新內容。所以在SetWindowText后如果還有UpdateData(FAL

23、SE)則其效果會被后者覆蓋,因此程序中SetWindowText之后不用UpdateData(FALSE)即可。4、當操作數超過10位數時,用backspace會出現錯誤結果,一番研究研究發(fā)現用int(m_num)取整有問題,int只有4個字節(jié),當超過其范圍時就會出錯。因此將取整的方法改為先用fmod取其除以1的余數得到其小數位,然后用m_num減去其小數位即可。7.2測試結果1.輸入“90.5”,“-”,“60.7”,“+”,“2.36”,“ =”,并在菜單中同樣輸入這組操作,均得到結果如圖16。圖16 結果圖1結果正確,證明可以實現雙目運算符的連續(xù)運算,菜單功能正常。2.輸入“901”,“

24、+/-”,“backspace”,“+”,“120”,“sin”,結果如圖17.圖17 結果圖2因為取的是3.1415926,因此與0.5有小小偏差,認為結果正確。證明可以實現單目運算符的連續(xù)運算與backspace回格功能。3.輸入“0”,“l(fā)n”,結果如圖18.結果圖18證明錯誤提示功能實現正常。7.3關鍵源代碼1、zhoutongDlg.h里變量的定義:BOOL ele2; / ele定義為布爾值,判斷當前值是否是正數還是負數int addt;int i;int dint;/dent判斷小數后的位數BOOL ele; /ele2定義為布爾值,判斷是否有小數點double num2;dou

25、ble num1;2、程序運行時初始化和頭文件:在zhoutongDlg.cpp的OnInitDialog()里調用Onclear();zhoutongDlg.cpp里加上頭文件*include "math.h"3、 數字鍵1的程序:(數字鍵2到9類似)if(addt=0)num2=0;if(ele2=TRUE)m_num=m_num*10+1; /單擊數字鍵1后把數據傳送到輸出框中else m_num=m_num*10-1;if (ele=TRUE) /當前是否有小數點,如果有num1=1; dint=dint+;for (i=0;i<dint;i+)num1=nu

26、m1/10; /1/10,得到的小數放入輸出框中if (ele2=TRUE) /當前值是否是正數還是負數,如果是正數m_num=(m_num-1)/10+num1; /前面不加負號elsem_num=(m_num+1)/10-num1; /否則前面加負號UpdateData(FALSE); /數據刷新4、 數字鍵0的程序:if(addt=0)num2=0;m_num=m_num*10; /點擊數字鍵0后把數據傳送到輸出框if (ele=TRUE) /判斷當前是否有小數點dint=dint+; /判斷位數m_num=m_num/10; /把數除以10后以小數傳送到輸出框5、 加法鍵+的程序:(-

27、,*,/,x,xy的代碼類似)if(addt!=0)Onequal();if(num2=0)num2=m_num; /把第二個值賦于輸出框的成員變量m_num=0; /輸出框的成員變量清0ele=FALSE; /當前小數無ele2=TURE; /當前符號為正dint=0; /小數位數無addt=1;6、 Sqrt鍵的程序:if(addt!=0)Onequal();if(m_num!=0)num2=m_num;if(m_num>=0)m_num=sqrt(num2); /對數進行開根號UpdateData(FALSE); /數據刷新num2=m_num;else GetDlgItem(ID

28、C_xianshi)->SetWindowText("錯誤,負數不能開根號");m_num=0;num1=0;dint=0;ele=FALSE;ele2=TRUE;7、n!鍵的程序:if(addt!=0)Onequal();if(m_num!=0)num2=m_num;if(fmod(num2,1)=0)m_num=1;for(i=1;i<=num2;i+)m_num*=i; /對數進行求階乘UpdateData(FALSE); /數據刷新num2=m_num;if(m_num>=1.7E308|m_num<-1.7E308)GetDlgItem(I

29、DC_xianshi)->SetWindowText("結果過大,無法顯示");else GetDlgItem(IDC_xianshi)->SetWindowText("不是整數無法進行階乘運算");m_num=0;num1=0;dint=0;ele=FALSE;ele2=TRUE;8、1/x鍵的程序:if(addt!=0)Onequal();if(m_num!=0)num2=m_num;if(num2!=0)m_num=1.0/num2; /對數進行求倒數UpdateData(FALSE);/數據刷新num2=m_num;if(m_num&

30、gt;=1.7E308|m_num<-1.7E308)GetDlgItem(IDC_xianshi)->SetWindowText("結果過大,無法顯示"); else GetDlgItem(IDC_xianshi)->SetWindowText("錯誤,0不能求倒數");m_num=0;num1=0;dint=0;ele=FALSE;ele2=TRUE;9、sin鍵的程序:(cos的代碼類似)if(addt!=0)Onequal();if(m_num!=0)num2=m_num;m_num=sin(num2*3.1415926/180

31、); /對數進行正弦UpdateData(FALSE); /數據刷新num2=m_num;m_num=0;num1=0;dint=0;ele=FALSE;ele2=TRUE;10、ln鍵的程序:if(addt!=0)Onequal();if(m_num!=0)num2=m_num;if(m_num>0)m_num=log(num2); /對數進行求lnUpdateData(FALSE); /數據刷新num2=m_num;else GetDlgItem(IDC_xianshi)->SetWindowText("錯誤,操作數需大于0");m_num=0;num1=0;dint=0;ele=FALSE;ele2=TRUE;11、=鍵的程序:switch (addt) /數據判斷case 0: /為實現連續(xù)按下兩次等號后能清零UpdateData(FALSE); /數據刷新break;case 1:m_num=num2+m_num; /兩數相加UpdateData(FALSE); /數據刷新break;case 2:

溫馨提示

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

最新文檔

評論

0/150

提交評論