版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 目錄</b></p><p> 1.基本功能描述1</p><p><b> 2.設計思路1</b></p><p><b> 2.1相關說明1</b></p><p> 2.2各塊流程圖2</p><p>
2、<b> 3.軟件設計7</b></p><p> 3.1 設計步驟7</p><p> 3.2 界面設計9</p><p> 3.2.1添加圖標9</p><p> 2.2.2添加控件10</p><p> 3.2.3添加菜單12</p><p>
3、 3.3 關鍵功能的實現(xiàn)14</p><p> 4.結論與心得體會16</p><p><b> 5.參考文獻17</b></p><p><b> 6.思考題18</b></p><p><b> 7.附錄20</b></p><p&g
4、t; 7.1調試報告20</p><p> 7.2測試結果21</p><p> 7.3關鍵源代碼23</p><p><b> 簡單計算器</b></p><p><b> 1.基本功能描述</b></p><p> 該簡單計算器主要實現(xiàn)了雙目運算和單目運
5、算功能。雙目運算符包含基本的四則運算及乘冪功能,單目運算符主要包含正余弦,階乘,對數(shù),開方,倒數(shù)等運算,同時也包含角度制的轉換、科學型與標準型的轉換、輸出設計者信息、清除、退格、退出功能。簡單計算器可對輸入的任意操作數(shù),包括小數(shù)和整數(shù)及正數(shù)和負數(shù)進行上述各種運算并能實現(xiàn)連續(xù)運算,并且能在出現(xiàn)錯誤時給出相應提示。同時也可以操作與運算按鈕相對應的菜單項。</p><p><b> 2.設計思路</b
6、></p><p><b> 2.1相關說明</b></p><p> 1)相關的變量標志位:</p><p> m_num:與編輯框相關聯(lián)的變量</p><p> num1:作為臨時變量儲存當時按下的按鈕值</p><p> num2:作為臨時變量儲存編輯框的值</p>
7、;<p> m_hudu:角度制的標志位,為0時為弧度</p><p> m_jiao:角度轉換的臨時變量</p><p> point:bool值,小數(shù)點有無標志位,當值為ture時為有小數(shù)點</p><p> dianhou:小數(shù)點后位數(shù)記錄位</p><p> danshuang:單雙目運算符標志位</p&
8、gt;<p> zhengfu:bool值,作為正負數(shù)標志位,當為ture時為正數(shù)</p><p> 2)主要功能設計簡述:</p><p> 該簡單計算器的重難點主要在一個編輯框要實現(xiàn)輸入和輸出的顯示,小數(shù)的實現(xiàn),正負數(shù)的交替輸入,退格時數(shù)的實現(xiàn),單雙目運算符的不同如何實現(xiàn)等方面。其中單目運算符sin、cos、tan等要考慮角度轉換,之后的運算和其他單目運算符沒有差別
9、,基于以上的考慮,想到必須對相關的操作進行相應的標志位,具體的如上列舉。</p><p> 簡單計算器,在輸入數(shù)據(jù)時,調用輸入數(shù)據(jù)子程序。子程序開始時m_num為零。按下數(shù)字按鈕后,判斷m_num的值是否為小數(shù),對其進行相關處理,然后再判斷是否為正數(shù),處理后輸出結果。</p><p> 在sin、cos、tan運算中首先利用角度轉換的標志位m_hudu判斷當時是度還是弧度,若是弧度可以
10、直接調用函數(shù)進行相關計算,若是度則要進行角度的轉換,在轉換時要記得Pi首先記性宏定義,然后調用數(shù)學函數(shù)進行計算,最后對相關的各種標志位進行復位、并輸出結果到編輯框。流程圖以sin運算為例。</p><p> 雙目運算符運算首先要進行單雙目運算符標志位danshuang判斷,若不為0,則直接調用等號的函數(shù),可以完成上次的運算,并且同時用num2記錄下與編輯框關聯(lián)的變量m_num的值,同時也記錄下此時danshua
11、ng標志位的值便于在等號函數(shù)中進行調用,在輸入第二個操作數(shù)后,按等號進行對雙目運算符的處理運算,各項復位,并輸出結果到編輯框。流程圖以log運算為例。</p><p> 整個計算器系統(tǒng)中,總的流程是:輸完第一個操作數(shù)后,若按下的運算符是雙目運算符,則把m_num存入num2,按下輸入第二個操作數(shù)并按下“=”按鈕后算出結果。若按下的是單目運算符,則直接對其輸入數(shù)據(jù)進行處理得出結果。在運算中還要判斷運算是否合法(如
12、log、ln等),以及結果是否超出顯示范圍,做出相關提示,按下清零,對各個標志位、編輯框的值等進行清零。算出后把結果保存并輸出顯示。若需要用算出的結果繼續(xù)運算則回到輸入完第一個操作數(shù)后繼續(xù)進相應的流程,若不需要則判斷試否需要開始新一輪的運算,不需要則結束。</p><p><b> 2.2各塊流程圖</b></p><p> 圖1 輸入子函數(shù)流程圖</p&g
13、t;<p> 圖2 sin運算程序流程圖</p><p> 圖3 log運算流程圖</p><p><b> 圖4 總的流程圖</b></p><p><b> 3.軟件設計</b></p><p><b> 3.1 設計步驟</b></p>
14、<p> 打開Microsoft Visual C++ 6.0應用程序,在文件菜單中點擊新建,在彈出的對話框內選擇MFC AppWizard[exe]工程,輸入工程名liuyunlong,并找到你要保存的位置,點擊確定。如下圖所示:</p><p> 圖5 建立MFC AppWizard[exe]工程圖</p><p> 在彈出MFC應用程序向導-步驟1對話框中,選擇基
15、本對話框(D),若不用修改依次點擊“完成”、“確定”按鈕。如下圖所示:</p><p> 圖6 創(chuàng)建應用程序類型圖</p><p> 此時就建立了一個基于對話窗口的應用程序的大致框架,包括界面、主要的頭文件、實現(xiàn)文件等。如下圖所示:</p><p> 圖7 對話框基本框架創(chuàng)建完成圖</p><p><b> 3.2 界面設計
16、</b></p><p><b> 3.2.1添加圖標</b></p><p> 1)在圖7所示的Resoure View選項卡中打開Icon資源組,在Icon上單擊鼠標右鍵,在彈出的快捷菜單中選擇引入選項,此時彈出“引入資源”對話框,選擇要添加的圖標,之后單擊“引入”按鈕,如下圖所示:</p><p> 圖8 引入圖標資源對
17、話框圖</p><p> 2)在Icon資源組中此時會出現(xiàn)一個新的圖標項,ID:IDI_ICON1,將原來的圖標項IDR_MAINFRAME用“delete”鍵刪除,鼠標右鍵單擊IDI_ICON1在快捷菜單中選擇屬性項,在圖標屬性對話框中將新的圖標ID改為IDR_MAINFRAME。如下圖所示:</p><p> 圖9 圖標屬性對話框圖</p><p><
18、b> 2.2.2添加控件</b></p><p> 在圖7所示的Resoure View選項卡中打開Dialog資源組,雙擊IDD_LIUYUNLONG_DIALOG,在右邊的工作區(qū)中顯示出要編輯的對話框。將對話框中原有的按鈕、靜態(tài)文本框按“delete”鍵刪除,之后開始擺放所需要的控件,包括編輯框和按鈕。按鈕的添加以“0”為例,其他按鈕類似。</p><p> 1
19、)在圖7中控件的“按鈕”按鈕上單擊鼠標左鍵,在對話框編輯窗口上合適的位置按下鼠標左鍵并拖動鼠標畫出一個大小合適的按鈕。在按鈕上單擊鼠標右鍵,在彈出的快捷萊單中選擇屬性選項,此時彈出Push Button屬性對話框,在該對話框中輸入ID號和標題。如下圖所示: </p><p> 圖10 Push Button屬性對話框圖</p><p> 2)在圖7中控件的“編輯框”按鈕上單擊鼠標左鍵,
20、在對話框上的合適的位置上按下鼠標左鍵并拖動鼠標畫出一個大小合適的編輯框。在編輯框上單擊鼠標右鍵,在彈出的快捷菜單中選擇屬性選項,此時彈出Edit屬性對話框,在該對話框中輸入控件的ID值。如下圖所示:</p><p> 圖11 Edit屬性圖</p><p> 對應的按鈕、編輯框屬性如下表:</p><p> 表1 按鈕和編輯框等對象屬性表</p>
21、<p><b> 3.2.3添加菜單</b></p><p> 1)在圖7所示的Resoure View選項卡中打開Icon資源組,鼠標右鍵單擊liuyunlong resource,在快捷菜單中單擊“插入”,彈出“插入資源”對話框,單擊Menu選項,之后單擊“新建”。如下圖所示:</p><p> 圖12 插入資源對話框圖</p>&
22、lt;p> 2)右鍵單擊菜單項,修改菜單資源的ID為IDR_MENU,在工作區(qū)右鍵單擊矩形框,選擇屬性,在標明里寫要添加的菜單項名稱,同時修改ID。如下圖所示:</p><p> 圖13 添加的查看菜單項圖</p><p> 對應的菜單屬性如下表:</p><p><b> 表2 菜單屬性表</b></p><
23、p> 3)幫助菜單彈出對話框:右鍵單擊Dialog,在快捷菜單中單擊插入Dialog,確定,在新生成的對話框中加入靜態(tài)文本框,并編輯相應的文字。如下圖所示:</p><p> 圖14 幫助菜單項彈出的對話框圖</p><p> 根據(jù)以上操作最終的界面圖:</p><p> 圖15 最終界面的顯示圖</p><p> 3.3 關
24、鍵功能的實現(xiàn)</p><p> 1)界面顏色的改變:</p><p> 首先重載對話框的CLiuyunlongDlg類的OnPaint()成員函數(shù),即WM_PAINT消息。利用GetClientRect()函數(shù)獲取窗口客戶區(qū)的坐標。</p><p> 然后利用FillSolidRect成員函數(shù)用指定的固體色填充矩形,其中顏色由RGB函數(shù)進行設定。</p&
25、gt;<p> 2)窗口的伸縮的實現(xiàn):</p><p> 首先要在對話框中要伸縮的位置插入一個圖像控件,將其拉成一條直線,并取消可見。</p><p> 其次在實現(xiàn)文件里邊定義兩個靜態(tài)變量,用來存儲對話框尺寸信息。為了實現(xiàn)第一次顯示為標準型,所以獲取顯示尺寸和位置信息以及執(zhí)行SetWindowPos函數(shù)的最佳時機應放在對話框創(chuàng)建之后,第一次顯示之前。為此利用WM_INI
26、TDIALOG消息的響應函數(shù)OnInitDialog來對對話框及控件進行相關的設置和修改。該函數(shù)中利用GetDlgItem函數(shù)獲得圖像控件的窗口句柄,結合GetWindowRect函數(shù)得到圖像控件的矩形框。進而進行標準型參數(shù)的獲取,利用SetWindowPos()函數(shù)完成對對話框的寬度、高度等參數(shù)的初始化設置。</p><p> 最后添加相應的菜單響應函數(shù),在響應函數(shù)里邊利用SetWindowPos()函數(shù)完成
27、對對話框的寬度、高度等參數(shù)的設置。</p><p> 3)標準型和科學型選擇標記的實現(xiàn):</p><p> 首先在對話框類的實現(xiàn)文件中添加ON_WM_INITMENUPOPUP入口到消息映射里面。</p><p> 其次在對話框類的頭文件中添加消息函數(shù)聲明afx_msg void OnInitMenuPopup(CMenu *pPopupMenu, UINT
28、nIndex,BOOL bSysMenu);</p><p> 再次在對話框類的實現(xiàn)文件中添加相應的void CLiuyunlongDlg OnInitMenuPopup函數(shù)代碼,該段代碼大部分取自WinFrm.cpp文件的函數(shù)CFrameWnd::OnInitMenuPopup()。</p><p> 最后在實現(xiàn)文件中定義兩個全局的布爾型變量kexue、biaozhun,通過這兩個變
29、量的值判斷執(zhí)行的是標準型、科學型的哪一個,并給標準型和科學型菜單項添加相應的UPDATE_COMMAND_UI響應函數(shù),在響應函數(shù)里調用SetRadio函數(shù)來進行標記。</p><p> 4)幫助菜單中關于計算器菜單的實現(xiàn):</p><p> 首先創(chuàng)建新的對話框資源,在創(chuàng)建完對話框資源之后,生成一個相關的對話框類。</p><p> 其次創(chuàng)建相應的菜單項資源,
30、即添加幫助菜單,并添加相應的CAMMAND消息響應函數(shù),在響應函數(shù)里邊定義對話框類對象,調用DoModal函數(shù)。</p><p><b> 5)操作數(shù)的實現(xiàn):</b></p><p> 首先通過小數(shù)標志位point判斷當前是否有小數(shù)點,如果有用num1記錄當前鍵入的數(shù)值,并將小數(shù)點后的位數(shù)標志位加一,利用for循環(huán),實現(xiàn)該數(shù)在小數(shù)點哪一位,然后通過正負標志位zhe
31、ngfu判斷當前數(shù)值是正數(shù)還是負數(shù),如果是正數(shù)直接將m_num和小數(shù)num1相加,如果是負號則m_num減去num1;如果沒有小數(shù)點則直接判斷該數(shù)的正負,若為正數(shù)則m_num乘10之后加上鍵入的數(shù),若為負號則m_num乘10之后減去鍵入的數(shù)。并把結果保存到m_num中,利用UpdateData(FALSE),刷新輸出到編輯框。</p><p><b> 6)退格鍵的實現(xiàn):</b></
32、p><p> 首先判斷當前數(shù)值是否是小數(shù),如果不是小數(shù)則對編輯框里邊的數(shù)進行除10操作,然后利用fmod進行取余操作,減去該十分位小數(shù);當該數(shù)為小數(shù)時,利用小數(shù)點后的位數(shù)標志位dianhou 進行for循環(huán),移動小數(shù)點的位置,當只有十分位時停止,減去該位,再次利用for循環(huán)將小數(shù)點移至原來的數(shù)后面,用UpdateData(FALSE),刷新輸出到編輯框。</p><p><b>
33、 7)清除鍵的實現(xiàn):</b></p><p> 將編輯框連接的變量m_num,所有的臨時變量num1、num2,標志位dianhou、danshuang、point、zhengfu,進行清零復位操作即可。</p><p> 8)角度值轉換的實現(xiàn):</p><p> 利用單選按鈕框,連接相應的變量m_hudu,標志當前是弧度值,還是一般的度,如果是一
34、般的度,令m_jiao=1,如果是弧度,令m_jiao=(2*Pi)/360,用m_jiao作為角度值轉換的臨時變量,當前的編輯框值乘以m_jiao,進行轉換,而在單選按鈕響應函數(shù)中用UpdateData(true)更新數(shù)據(jù)到文檔中。</p><p> 9)單目運算符的運算實現(xiàn):</p><p> 首先對輸入的數(shù)值判斷是否合法,如開平方、取對數(shù)、取倒數(shù)等操作,不合法時輸出響應的提示,合
35、法時利用數(shù)學函數(shù)進行運算,并用m_num記錄結果,判斷結果是否超過double型的范圍,若超過則輸出提示,若沒有超過就更新到編輯框,最后對標志位dianhou、point、zhengfu復位和臨時變量num1清零。</p><p> 10)雙目運算符的運算實現(xiàn):</p><p> 首先判斷單雙運算符標志位是否為0,如果不為0,便調用等號的消息響應函數(shù),實現(xiàn)上次的雙目運算。</p&
36、gt;<p> 其次判斷num2是否為0,若為0,便將此時編輯框的值賦給num2,再將m_num值置0,設置當前的雙目運算符的標志,并將point、zhengfu、dianhou復位。</p><p> 最后輸入數(shù)據(jù)后,按等號鍵調用相應的消息響應函數(shù),根據(jù)danshuang值來選擇相應的算法,進行運算。</p><p><b> 4.結論與心得體會</b
37、></p><p> 很快兩周的時間就過去了,在這段時間里我真的是感觸頗多,隨著自己這兩周的時間一步一步的推進,自己對基于對話框的編程也越來越系統(tǒng)化,真的可以說是獲益良多。</p><p> 這次課程設計是我們做的第三個課程設計,每一個課程設計之后真的是感覺自己取得了平時學習所不能達到的效果。像以前的我做的帶通濾波器的設計、叮咚門鈴都使自己在電路理論、模電等方面的知識有一個很好的
38、運用與實踐,而這次的簡單計算器的設計讓自己對面向對象編程有一個更好的認識,對mfc編程的有了進一步的了解,并掌握了一些基本的功能的實現(xiàn)。</p><p> 我做的簡單計算器的設計是基于對話框的,這個計算器除了簡單的加減乘除等運算,還要實現(xiàn)開方、指數(shù)、取對數(shù)、冪、正余弦等運算。而實現(xiàn)這些功能尤其要注意的是單目運算符和雙目運算符的區(qū)別以及小數(shù)、正負號實現(xiàn)方法。當時想了好久,最后通過和同學的探討,決定用相應的標志位對
39、這些情況進行判定,如小數(shù)點用布爾值point進行標記,而dianhou標記小數(shù)點后的位數(shù)。在這些最基本的功能完成之后,我想增加一些其他功能,為此我打開了電腦自帶的計算器,看了一下界面,看到電腦自帶的計算器能夠進行窗口的伸縮,單擊幫助信息,能夠實現(xiàn)彈出一個對話框,顯示該計算器的基本信息。對于這個彈出的對話框我參考了課件里最后一章節(jié)在單文檔中的實現(xiàn)方法,添加新的對話框資源,建立新的對話框類實現(xiàn)對話框的彈出。而窗口的伸縮我在網(wǎng)上搜了一些資料,
40、利用在對話框中添加一個圖像控件將其拉成直線,獲取該圖像控件的位置,實現(xiàn)對話框的大小變化。為了辨明此時選中的是標準型,還是科學型,我又想到在類型前加上點,也參考了課件里的單文檔中的做法,添加UPDATE_COMMAND_UI響應函數(shù),在響應函數(shù)里調用SetRadio函數(shù)來進行標記??墒墙Y果是當點擊標準型</p><p> 這次課設進行的真的是挺開心的,本來自己對編程就感覺挺有興趣,對于這些東西老想做的更好一點,每
41、次在添加完一個新功能之后自己就感覺很高興,尤其是那些經(jīng)過很長時間才解決的問題,給自己的印象更加的深刻。</p><p> 在今后的學習中自己一定要把基礎給打好,基本功扎實,同時也要善于思考,知道不同之間的聯(lián)系,相同之間的差異,并進行總結,在以后再隨后根據(jù)情況查詢寫相關的資料,來完成所要求的功能。總的來說這次的課程設計既鞏固了自己以前的MFC程序設計知識,也拓展了自己的思維,增加了自己的動手能力,最后也很感謝老師
42、給我們的支持以及嚴格要求!</p><p><b> 5.參考文獻</b></p><p> 揣錦華.面向對象程序設計與VC++實踐[M].西安電子科技大學出版社,2005.</p><p> 張建宏,湯練兵,馬德駿.計算機程序設計基礎-C語言程序設計[M].北京:科學出版社,2009.</p><p> 姚領田
43、.精通MFC程序設計[M].北京:人民郵電出版社,2006.</p><p><b> 6.思考題</b></p><p> 1、程序中如何實現(xiàn)小數(shù)的顯示與運算?</p><p> 答:首先在liuyunlongDlg.cpp實現(xiàn)文件中定義一個布爾型變量point來判斷是否為小數(shù),定義一個整型變量dianhou記錄小數(shù)點后的位數(shù)。當輸入數(shù)
44、時首先判斷point是否為true,若為true表示該數(shù)是小數(shù),用num1記錄當前的鍵入值,同時對dianhou進行加一,根據(jù)dianhou進行for循環(huán),進行除以10操作,再根據(jù)該數(shù)的正負,來決定是m_num加num1,還是減num1,用UpdateData(FALSE)刷新輸出到編輯框。在實現(xiàn)退格功能是,若point為true,則根據(jù)dianhou的值循環(huán)對m_num乘以10,將小數(shù)點移到只有十分位,利用fmod取余,將編輯框的變量
45、值減去該余數(shù),最后再進行循環(huán)將小數(shù)點移到原來數(shù)字的后邊。</p><p> 2、描述等號對應的消息處理函數(shù)中需要處理的問題及相應的實現(xiàn)代碼?</p><p> 答:等號對應的消息處理函數(shù)主要處理雙目運算符的運算。利用單雙目運算符的標志位danshuang,判斷其值選擇相應的雙目運算符的算法表達式進行運算,這些雙目運算按順序依次為:加法、減法、乘法、除法及取對數(shù)。其中在除法和取對數(shù)運算中
46、還要判斷操作數(shù)是否合法,如果不合法輸出提示內容,如果合法進行運算。然后對結果判斷是否超過double型數(shù)據(jù)的顯示范圍,若超過也輸出提示信息。最后對相應的標志位進行復位。實現(xiàn)代碼如下:</p><p> switch (danshuang) //數(shù)據(jù)判斷</p><p><b> {</b></p><p><b> case 1
47、:</b></p><p> m_num=num2+m_num; //兩數(shù)相加</p><p> UpdateData(FALSE); //數(shù)據(jù)刷新</p><p><b> break;</b></p><p><b> case 2:</b></p><p
48、> m_num=num2-m_num; //兩數(shù)相減</p><p> UpdateData(FALSE); //數(shù)據(jù)刷新</p><p><b> break;</b></p><p><b> case 3:</b></p><p> m_num=num2*m_num; //兩數(shù)
49、相乘</p><p> UpdateData(FALSE); //數(shù)據(jù)刷新</p><p><b> break;</b></p><p><b> case 4:</b></p><p> if (m_num==0) //在除法中,判斷除數(shù)是否為0</p><p>
50、 GetDlgItem(IDC_SHUCHU)->SetWindowText("輸入錯誤,0不能作除數(shù)!");</p><p> else {m_num=num2/m_num;UpdateData(FALSE);}</p><p><b> break;</b></p><p><b> case 5
51、:</b></p><p> if (m_num<=0||num2<=0) //判斷操作數(shù)是否合法</p><p> GetDlgItem(IDC_SHUCHU)->SetWindowText("輸入錯誤,取對數(shù)要為正數(shù)!");</p><p> else {m_num=log(m_num)/log(num2)
52、;UpdateData(FALSE);} //取對數(shù)</p><p><b> break;</b></p><p><b> }</b></p><p> if(m_num>=1.7E308||m_num<-1.7E308)</p><p> GetDlgItem(IDC_SH
53、UCHU)->SetWindowText("結果過大,無法顯示");</p><p> num2=m_num;</p><p><b> num1=0;</b></p><p> dianhou=0;</p><p> point=FALSE;</p><p>
54、 danshuang=0;</p><p> zhengfu=TRUE;</p><p> 3、(選做)若實現(xiàn)了科學型和標準型,說明科學型和標準型實現(xiàn)的關鍵算法?</p><p> 答:我做的科學型和標準型的實現(xiàn)方法和指導書上的推薦方法不同,指導書推薦的方法是通過單選按鈕,當選擇科學型時進行科學型的按鈕被激活,可以運算,當選擇標準型的時候進行科學型的按鈕不能進
55、行運算。而我的實現(xiàn)方法是選擇伸縮框,初始時是標準型,界面上只有數(shù)值和簡單的加減乘除等運算按鈕,當單擊科學型時,對話框進行了擴展,出現(xiàn)了可以科學型運算的部分。</p><p> 主要的實現(xiàn)方法:首先要在對話框中要伸縮的位置插入一個圖像控件,將其拉成一條直線,并取消可見。其次在實現(xiàn)文件里邊定義兩個靜態(tài)變量,用來存儲對話框尺寸信息。為了實現(xiàn)第一次顯示為標準型,所以獲取顯示尺寸和位置信息以及執(zhí)行SetWindowPos
56、函數(shù)的最佳時機應放在對話框創(chuàng)建之后,第一次顯示之前。為此利用WM_INITDIALOG消息的響應函數(shù)OnInitDialog來對對話框及控件進行相關的設置和修改。該函數(shù)中利用GetDlgItem()函數(shù)獲得圖像控件的窗口句柄,結合GetWindowRect()函數(shù)得到圖像控件的矩形框。進而進行標準型參數(shù)的獲取,利用SetWindowPos()函數(shù)完成對對話框的寬度、高度等參數(shù)的初始化設置。最后添加相應的菜單響應函數(shù),在響應函數(shù)里邊利用S
57、etWindowPos()函數(shù)完成對對話框的寬度、高度等參數(shù)的設置。</p><p><b> 7.附錄</b></p><p><b> 7.1調試報告</b></p><p> 1、error C2296: '%' : illegal, left operand has type 'dou
58、ble'</p><p> 解決辦法:因為取余數(shù)的運算符%只能用于整數(shù),不能用于浮點數(shù),經(jīng)過查詢資料知道用fmod可進行取余運算。</p><p> 2、在階乘運算代碼中用“else GetDlgItem(IDC_SHUCHU)->SetWindowText("不是整數(shù)無法進行階乘運算");UpdateData(FALSE); //數(shù)據(jù)刷新”不能輸出相
59、應的提示語句。</p><p> 解決辦法:主要是因為在提示語句輸出后,立即進行了編輯框的刷新,將其覆蓋,所以將updateData(FALSE)提前即可</p><p> 3、在進行角度制轉換的時,相應的資源和代碼完成之后,運行發(fā)現(xiàn)剛開始沒有選中標準型和科學型的任何一個。</p><p> 解決辦法:經(jīng)分析應該是沒有對單選按鈕相關聯(lián)的變量沒有進行初始化,在C
60、LiuyunlongDlg::CLiuyunlongDlg(CWnd* pParent /*=NULL*/): CDialog(CLiuyunlongDlg::IDD, pParent) 中加入m_hudu=0,進行初始化后得以解決。</p><p> 4、運行時出現(xiàn)以下提示“l(fā)iuyunlong Microsoft 基礎類應用程序已停止工作(出現(xiàn)了一個問題,導致程序停止正常工作。請關閉改程序”。</p&
61、gt;<p> 解決辦法:應該是新加的擴展與收縮對話框的變量CRect rectLarge;CRect rectSmall;所放的位置不對,經(jīng)過嘗試放在了liuyunlongDlg.cpp文件中作為全局變量得以實現(xiàn)。</p><p><b> 7.2測試結果</b></p><p> 1)運行后依次輸入“12”,“/”,“2.4”,“*”,“0.5
62、”,“-”,“6”,“+”,“2”,“=”得出結果為-1.5,之后結合相應的菜單項中同樣輸入這組操作也得到這個結果。如下圖所示:</p><p> 圖16 標準型時運算結果圖</p><p> 在運行程序后剛開始的界面如圖16所示,此時的界面為標準型,主要包括數(shù)字、清零、退格、負號、等號以及簡單的加減乘除運算按鈕,顯示編輯框和菜單項。并且根據(jù)計算知道該結果正確,且該計算器能實現(xiàn)運算符的
63、連續(xù)運算。</p><p> 2)點擊查看菜單項中的科學型,輸入“2”,“asin”得到相應的錯誤提示如17圖所示;然后點擊“C”和單選按鈕“度”依次并輸入“90”,“sin”,“*”,“2”,“exp”,“l(fā)n” “sqrt”得到相應的結果,之后結合菜單項實現(xiàn)結果一直,如18圖所示:</p><p> 圖17 反正弦輸入錯誤提示圖</p><p> 圖18
64、點擊科學型菜單后運算結果圖</p><p> 在點擊查看菜單中的科學型選項后,如圖17、圖18所示,界面進行了科學型的擴展,添加了三角函數(shù)、冪、取對數(shù)、階乘等運算按鈕及角度制轉換的單選按鈕。經(jīng)檢驗和√2相當?shù)慕咏?,運算結果無誤,且能實現(xiàn)對輸入的錯誤操作數(shù)的錯誤提示功能。</p><p> 該界面中還包含了編輯、查看、幫助菜單項,其中編輯中主要是運算符菜單,進行數(shù)值計算,查看中包含了標準
65、型、科學型、exit選項,實現(xiàn)計算器界面的伸縮和退出,而在幫助菜單中是關于計算器菜單項,點擊后顯示計算器的制作者信息。如下圖所示:</p><p> 圖19 關于計算器信息顯示圖</p><p><b> 7.3關鍵源代碼</b></p><p><b> //定義的相關變量</b></p><p
66、> BOOL zhengfu=true; // zhengfu定義為布爾值,判斷當前值是否是正數(shù)還是負數(shù)</p><p> int danshuang;//單雙目運算符轉換</p><p><b> int i;</b></p><p> int dianhou;//diann判斷小數(shù)后的位數(shù)</p><p&g
67、t; BOOL point=false; //point定義為布爾值,判斷是否有小數(shù)點</p><p> bool kexue=false;</p><p> bool biaozhun=TRUE;</p><p> double num2;</p><p> double num1;</p><p> d
68、ouble m_jiao;//角度與弧度轉換臨時變量</p><p> CRect rectLarge;</p><p> CRect rectSmall;//新加的擴展與收縮對話框的變量</p><p> //編輯框和單選按鈕的變量初始化</p><p> CLiuyunlongDlg::CLiuyunlongDlg(CWnd* p
69、Parent /*=NULL*/)</p><p> : CDialog(CLiuyunlongDlg::IDD, pParent)</p><p><b> {</b></p><p> //{{AFX_DATA_INIT(CLiuyunlongDlg)</p><p> m_num = 0.0;</p&
70、gt;<p> m_hudu = 0;//弧度相關聯(lián)的變量初始化</p><p> //}}AFX_DATA_INIT</p><p> // Note that LoadIcon does not require a subsequent DestroyIcon in Win32</p><p> m_hIcon = AfxGetApp()-
71、>LoadIcon(IDR_MAINFRAME);//圖標顯示</p><p><b> }</b></p><p> //界面伸縮式擴展代碼</p><p> BOOL CLiuyunlongDlg::OnInitDialog()</p><p><b> {</b></p&g
72、t;<p> // TODO: Add extra initialization here</p><p> CRect rectSeparator;</p><p> GetWindowRect(&rectLarge);</p><p> GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&
73、;rectSeparator);</p><p> rectSmall.left=rectLarge.left;//對話框的左邊位置</p><p> rectSmall.top=rectLarge.top;</p><p> rectSmall.right=rectSeparator.right;//圖像控件的位置</p><p>
74、 rectSmall.bottom=rectLarge.bottom;</p><p> SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(), SWP_NOMOVE|SWP_NOZORDER);//設置初始化時標準型界面</p><p> return TRUE; // return
75、 TRUE unless you set the focus to a control</p><p><b> }</b></p><p> //設置背景顏色所加代碼</p><p> void CLiuyunlongDlg::OnPaint() </p><p><b> {</b>&
76、lt;/p><p> if (IsIconic())</p><p><b> {</b></p><p><b> … …</b></p><p><b> }</b></p><p><b> else</b></p
77、><p><b> {</b></p><p> CRect rect;</p><p> CPaintDC dc(this);</p><p> GetClientRect(rect);//獲取該對話框的位置坐標</p><p> dc.FillSolidRect(rect,RGB(11,
78、125,111)); //設置為綠色背景</p><p> CDialog::OnPaint();</p><p><b> }</b></p><p><b> }</b></p><p> //在標準和科學型菜單前面加點標志為了使響應函數(shù)調用所加的代碼</p><p&
79、gt; void CLiuyunlongDlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu){</p><p> ASSERT(pPopupMenu != NULL);</p><p> // Check the enabled state of various menu items.</p>
80、<p> CCmdUI state;</p><p> state.m_pMenu = pPopupMenu;</p><p> ASSERT(state.m_pOther == NULL);</p><p> ASSERT(state.m_pParentMenu == NULL);</p><p> // Deter
81、mine if menu is popup in top-level menu and set m_pOther to</p><p> // it if so (m_pParentMenu == NULL indicates that it is secondary popup).</p><p> HMENU hParentMenu;</p><p> i
82、f (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)</p><p> state.m_pParentMenu = pPopupMenu; // Parent == child for tracking popup.</p><p> else if ((hParentMenu = ::GetMenu
83、(m_hWnd)) != NULL)</p><p><b> {</b></p><p> CWnd* pParent = this;</p><p> // Child windows don't have menus--need to go to the top!</p><p> if (pPar
84、ent != NULL &&</p><p> (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)</p><p><b> {</b></p><p> int nIndexMax = ::GetMenuItemCount(hParentMenu);</p&
85、gt;<p> for (int nIndex = 0; nIndex < nIndexMax; nIndex++)</p><p><b> {</b></p><p> if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)</p><p>
86、<b> {</b></p><p> // When popup is found, m_pParentMenu is containing menu.</p><p> state.m_pParentMenu = CMenu::FromHandle(hParentMenu);</p><p><b> break;<
87、/b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> state.m_nIndexMax =
88、 pPopupMenu->GetMenuItemCount();</p><p> for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;</p><p> state.m_nIndex++)</p><p><b> {</b></p><
89、p> state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);</p><p> if (state.m_nID == 0)</p><p> continue; // Menu separator or invalid cmd - ignore it.</p><p> ASSERT(st
90、ate.m_pOther == NULL);</p><p> ASSERT(state.m_pMenu != NULL);</p><p> if (state.m_nID == (UINT)-1)</p><p><b> {</b></p><p> // Possibly a popup menu, ro
91、ute to first item of that popup.</p><p> state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);</p><p> if (state.m_pSubMenu == NULL ||</p><p> (state.m_nID = state.m_pSub
92、Menu->GetMenuItemID(0)) == 0 ||</p><p> state.m_nID == (UINT)-1)</p><p><b> {</b></p><p> continue; // First item of popup can't be routed to.</p><p
93、><b> }</b></p><p> state.DoUpdate(this, TRUE); // Popups are never auto disabled.</p><p><b> }</b></p><p><b> else</b></p><p>
94、;<b> {</b></p><p> // Normal menu item.</p><p> // Auto enable/disable if frame window has m_bAutoMenuEnable</p><p> // set and command is _not_ a system command.<
95、;/p><p> state.m_pSubMenu = NULL;</p><p> state.DoUpdate(this, FALSE);</p><p><b> }</b></p><p> // Adjust for menu deletions and additions.</p><
96、p> UINT nCount = pPopupMenu->GetMenuItemCount();</p><p> if (nCount < state.m_nIndexMax)</p><p><b> {</b></p><p> state.m_nIndex -= (state.m_nIndexMax - nCo
97、unt);</p><p> while (state.m_nIndex < nCount &&</p><p> pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)</p><p><b> {</b></p><p>
98、 state.m_nIndex++;</p><p><b> }</b></p><p><b> }</b></p><p> state.m_nIndexMax = nCount;</p><p><b> }</b></p><p>&l
99、t;b> }</b></p><p> //0到9數(shù)值的實現(xiàn)代碼,此處以0代替:</p><p> void CLiuyunlongDlg::OnNumber0() </p><p><b> {</b></p><p> // TODO: Add your control notificat
100、ion handler code here</p><p> if(danshuang==0)num2=0;</p><p> if (point==TRUE) //當前是否有小數(shù)點,如果有</p><p><b> {</b></p><p><b> num1=0; </b></p
101、><p> dianhou=dianhou++;</p><p> for (i=0;i<dianhou;i++)</p><p><b> {</b></p><p> num1=num1/10; //1/10,得到的小數(shù)放入輸出框中</p><p><b> }</
102、b></p><p> if (zhengfu==TRUE) //當前值是否是正數(shù)還是負數(shù),如果是正數(shù)</p><p> m_num=m_num+num1; //前面不加負號</p><p><b> else</b></p><p> m_num=m_num-num1; //否則前面加負號</p&g
103、t;<p><b> }</b></p><p> else if(zhengfu==TRUE)</p><p> m_num=m_num*10; //單擊數(shù)字鍵0后把數(shù)據(jù)傳送到輸出框中</p><p> else m_num=m_num*10;</p><p> UpdateData(FALSE
104、); //數(shù)據(jù)刷新</p><p><b> }</b></p><p> //小數(shù)點的按鈕的響應函數(shù)</p><p> void CLiuyunlongDlg::OnPoint() </p><p><b> {</b></p><p> // TODO: Add
105、 your control notification handler code here</p><p> point=true;//小數(shù)點標志位賦值</p><p><b> }</b></p><p> //負號按鈕的響應函數(shù)</p><p> void CLiuyunlongDlg::OnChange()
106、</p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> if(m_num==0)zhengfu=false;//負號標志位賦值</p><p><b> }</b&
107、gt;</p><p><b> //清零實現(xiàn)</b></p><p> void CLiuyunlongDlg::OnClera() </p><p><b> {</b></p><p> // TODO: Add your control notification handler co
108、de here</p><p> m_num=0; //輸出框清0</p><p> num1=0; //變量1為0</p><p> num2=0; //變量2為0</p><p> dianhou=0; //小數(shù)無位數(shù)</p><p> danshuang=0; </p><p>
109、 point=FALSE; //當前無小數(shù)</p><p> zhengfu=TRUE; </p><p> UpdateData(FALSE); //數(shù)據(jù)刷新</p><p><b> }</b></p><p><b> //退格鍵實現(xiàn)</b></p><p>
110、; void CLiuyunlongDlg::OnBackspace() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> UpdateData(true);</p><p>
111、; if (point==FALSE ) //判斷當前是否有小數(shù)點,如果沒有</p><p> m_num=m_num/10-fmod(m_num/10,1); //去掉末位即此時的小數(shù)位</p><p><b> else</b></p><p><b> {</b></p><p>
112、if ( dianhou>0) //如果是小數(shù)</p><p><b> {</b></p><p> for (i=0;i<dianhou-1;i++) //移動小數(shù)點</p><p><b> {</b></p><p> m_num=m_num*10; //移動至只有一個小
113、數(shù)位</p><p><b> }</b></p><p> m_num=m_num-fmod(m_num,1); //去掉小數(shù)位</p><p> for (i=0;i<dianhou-1;i++) //小數(shù)點移至原來位置</p><p><b> {</b></p>
114、<p> m_num=m_num/10; </p><p><b> }</b></p><p><b> }</b></p><p> dianhou=dianhou--;</p><p><b> }</b></p><p>
115、if (dianhou==0)point=FALSE;</p><p> if(m_num==0)zhengfu=TRUE;</p><p> UpdateData(FALSE); //數(shù)據(jù)刷新</p><p><b> }</b></p><p> //加減乘除、取對數(shù)實現(xiàn)代碼,以減法為例</p>
116、<p> void CLiuyunlongDlg::OnDifference() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> if(danshuang!=0)OnEqual();&
117、lt;/p><p> if(num2==0)num2=m_num; //把第二個值賦于輸出框的成員變量</p><p> m_num=0; //輸出框的成員變量清0</p><p> point=false; //當前小數(shù)無</p><p> zhengfu=true; //當前符號為正</p><p> dia
118、nhou=0; //小數(shù)位數(shù)無</p><p> danshuang=2;</p><p><b> }</b></p><p><b> //等號實現(xiàn)代碼</b></p><p> void CLiuyunlongDlg::OnEqual() </p><p>&
119、lt;b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> switch (danshuang) //數(shù)據(jù)判斷</p><p><b> {</b></p><p><b>
120、; case 1:</b></p><p> m_num=num2+m_num; //兩數(shù)相加</p><p> UpdateData(FALSE); //數(shù)據(jù)刷新</p><p><b> break;</b></p><p><b> case 2:</b></p&g
121、t;<p> m_num=num2-m_num; //兩數(shù)相減</p><p> UpdateData(FALSE); //數(shù)據(jù)刷新</p><p><b> break;</b></p><p><b> case 3:</b></p><p> m_num=num2*m_
122、num; //兩數(shù)相乘</p><p> UpdateData(FALSE); //數(shù)據(jù)刷新</p><p><b> break;</b></p><p><b> case 4:</b></p><p> if (m_num==0) //在除法中,判斷除數(shù)是否為0</p>
123、<p> GetDlgItem(IDC_SHUCHU)->SetWindowText("輸入錯誤,0不能作除數(shù)!");</p><p> else {m_num=num2/m_num;UpdateData(FALSE);}</p><p><b> break;</b></p><p><b>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡單計算器課程設計報告
- 計算器java課程設計--簡單計算器
- 簡單計算器課程設計
- c++簡單計算器課程設計報告
- c++課程設計報告--簡單計算器
- 簡單的計算器課程設計
- 課程設計---簡單的計算器
- vb課程設計--簡單計算器
- 簡單的計算器課程設計
- 課程設計--簡單計算器的設計
- 課程設計--簡單的計算器設計
- 課程設計--簡單計算器的設計
- 數(shù)據(jù)結構課程設計報告--簡單計算器
- 課程設計實驗報告--簡單的計算器設計
- c++課程設計--簡單計算器
- c++課程設計--簡單計算器
- vc++課程設計報告--簡單科學計算器設計
- 計算器課程設計報告
- 課程設計報告---計算器設計
- vc++課程設計---簡單計算器的設計
評論
0/150
提交評論