版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p> 1.基本功能描述1</p><p><b> 2.設(shè)計(jì)思路1</b></p><p><b> 2.1相關(guān)說(shuō)明1</b></p><p> 2.2各塊流程圖2</p><p>
2、<b> 3.軟件設(shè)計(jì)7</b></p><p> 3.1 設(shè)計(jì)步驟7</p><p> 3.2 界面設(shè)計(jì)9</p><p> 3.2.1添加圖標(biāo)9</p><p> 2.2.2添加控件10</p><p> 3.2.3添加菜單12</p><p>
3、 3.3 關(guān)鍵功能的實(shí)現(xiàn)14</p><p> 4.結(jié)論與心得體會(huì)16</p><p><b> 5.參考文獻(xiàn)17</b></p><p><b> 6.思考題18</b></p><p><b> 7.附錄20</b></p><p&g
4、t; 7.1調(diào)試報(bào)告20</p><p> 7.2測(cè)試結(jié)果21</p><p> 7.3關(guān)鍵源代碼23</p><p><b> 簡(jiǎn)單計(jì)算器</b></p><p><b> 1.基本功能描述</b></p><p> 該簡(jiǎn)單計(jì)算器主要實(shí)現(xiàn)了雙目運(yùn)算和單目運(yùn)
5、算功能。雙目運(yùn)算符包含基本的四則運(yùn)算及乘冪功能,單目運(yùn)算符主要包含正余弦,階乘,對(duì)數(shù),開(kāi)方,倒數(shù)等運(yùn)算,同時(shí)也包含角度制的轉(zhuǎn)換、科學(xué)型與標(biāo)準(zhǔn)型的轉(zhuǎn)換、輸出設(shè)計(jì)者信息、清除、退格、退出功能。簡(jiǎn)單計(jì)算器可對(duì)輸入的任意操作數(shù),包括小數(shù)和整數(shù)及正數(shù)和負(fù)數(shù)進(jìn)行上述各種運(yùn)算并能實(shí)現(xiàn)連續(xù)運(yùn)算,并且能在出現(xiàn)錯(cuò)誤時(shí)給出相應(yīng)提示。同時(shí)也可以操作與運(yùn)算按鈕相對(duì)應(yīng)的菜單項(xiàng)。</p><p><b> 2.設(shè)計(jì)思路</b
6、></p><p><b> 2.1相關(guān)說(shuō)明</b></p><p> 1)相關(guān)的變量標(biāo)志位:</p><p> m_num:與編輯框相關(guān)聯(lián)的變量</p><p> num1:作為臨時(shí)變量?jī)?chǔ)存當(dāng)時(shí)按下的按鈕值</p><p> num2:作為臨時(shí)變量?jī)?chǔ)存編輯框的值</p>
7、;<p> m_hudu:角度制的標(biāo)志位,為0時(shí)為弧度</p><p> m_jiao:角度轉(zhuǎn)換的臨時(shí)變量</p><p> point:bool值,小數(shù)點(diǎn)有無(wú)標(biāo)志位,當(dāng)值為ture時(shí)為有小數(shù)點(diǎn)</p><p> dianhou:小數(shù)點(diǎn)后位數(shù)記錄位</p><p> danshuang:單雙目運(yùn)算符標(biāo)志位</p&
8、gt;<p> zhengfu:bool值,作為正負(fù)數(shù)標(biāo)志位,當(dāng)為ture時(shí)為正數(shù)</p><p> 2)主要功能設(shè)計(jì)簡(jiǎn)述:</p><p> 該簡(jiǎn)單計(jì)算器的重難點(diǎn)主要在一個(gè)編輯框要實(shí)現(xiàn)輸入和輸出的顯示,小數(shù)的實(shí)現(xiàn),正負(fù)數(shù)的交替輸入,退格時(shí)數(shù)的實(shí)現(xiàn),單雙目運(yùn)算符的不同如何實(shí)現(xiàn)等方面。其中單目運(yùn)算符sin、cos、tan等要考慮角度轉(zhuǎn)換,之后的運(yùn)算和其他單目運(yùn)算符沒(méi)有差別
9、,基于以上的考慮,想到必須對(duì)相關(guān)的操作進(jìn)行相應(yīng)的標(biāo)志位,具體的如上列舉。</p><p> 簡(jiǎn)單計(jì)算器,在輸入數(shù)據(jù)時(shí),調(diào)用輸入數(shù)據(jù)子程序。子程序開(kāi)始時(shí)m_num為零。按下數(shù)字按鈕后,判斷m_num的值是否為小數(shù),對(duì)其進(jìn)行相關(guān)處理,然后再判斷是否為正數(shù),處理后輸出結(jié)果。</p><p> 在sin、cos、tan運(yùn)算中首先利用角度轉(zhuǎn)換的標(biāo)志位m_hudu判斷當(dāng)時(shí)是度還是弧度,若是弧度可以
10、直接調(diào)用函數(shù)進(jìn)行相關(guān)計(jì)算,若是度則要進(jìn)行角度的轉(zhuǎn)換,在轉(zhuǎn)換時(shí)要記得Pi首先記性宏定義,然后調(diào)用數(shù)學(xué)函數(shù)進(jìn)行計(jì)算,最后對(duì)相關(guān)的各種標(biāo)志位進(jìn)行復(fù)位、并輸出結(jié)果到編輯框。流程圖以sin運(yùn)算為例。</p><p> 雙目運(yùn)算符運(yùn)算首先要進(jìn)行單雙目運(yùn)算符標(biāo)志位danshuang判斷,若不為0,則直接調(diào)用等號(hào)的函數(shù),可以完成上次的運(yùn)算,并且同時(shí)用num2記錄下與編輯框關(guān)聯(lián)的變量m_num的值,同時(shí)也記錄下此時(shí)danshua
11、ng標(biāo)志位的值便于在等號(hào)函數(shù)中進(jìn)行調(diào)用,在輸入第二個(gè)操作數(shù)后,按等號(hào)進(jìn)行對(duì)雙目運(yùn)算符的處理運(yùn)算,各項(xiàng)復(fù)位,并輸出結(jié)果到編輯框。流程圖以log運(yùn)算為例。</p><p> 整個(gè)計(jì)算器系統(tǒng)中,總的流程是:輸完第一個(gè)操作數(shù)后,若按下的運(yùn)算符是雙目運(yùn)算符,則把m_num存入num2,按下輸入第二個(gè)操作數(shù)并按下“=”按鈕后算出結(jié)果。若按下的是單目運(yùn)算符,則直接對(duì)其輸入數(shù)據(jù)進(jìn)行處理得出結(jié)果。在運(yùn)算中還要判斷運(yùn)算是否合法(如
12、log、ln等),以及結(jié)果是否超出顯示范圍,做出相關(guān)提示,按下清零,對(duì)各個(gè)標(biāo)志位、編輯框的值等進(jìn)行清零。算出后把結(jié)果保存并輸出顯示。若需要用算出的結(jié)果繼續(xù)運(yùn)算則回到輸入完第一個(gè)操作數(shù)后繼續(xù)進(jìn)相應(yīng)的流程,若不需要?jiǎng)t判斷試否需要開(kāi)始新一輪的運(yùn)算,不需要?jiǎng)t結(jié)束。</p><p><b> 2.2各塊流程圖</b></p><p> 圖1 輸入子函數(shù)流程圖</p&g
13、t;<p> 圖2 sin運(yùn)算程序流程圖</p><p> 圖3 log運(yùn)算流程圖</p><p><b> 圖4 總的流程圖</b></p><p><b> 3.軟件設(shè)計(jì)</b></p><p><b> 3.1 設(shè)計(jì)步驟</b></p>
14、<p> 打開(kāi)Microsoft Visual C++ 6.0應(yīng)用程序,在文件菜單中點(diǎn)擊新建,在彈出的對(duì)話(huà)框內(nèi)選擇MFC AppWizard[exe]工程,輸入工程名liuyunlong,并找到你要保存的位置,點(diǎn)擊確定。如下圖所示:</p><p> 圖5 建立MFC AppWizard[exe]工程圖</p><p> 在彈出MFC應(yīng)用程序向?qū)?步驟1對(duì)話(huà)框中,選擇基
15、本對(duì)話(huà)框(D),若不用修改依次點(diǎn)擊“完成”、“確定”按鈕。如下圖所示:</p><p> 圖6 創(chuàng)建應(yīng)用程序類(lèi)型圖</p><p> 此時(shí)就建立了一個(gè)基于對(duì)話(huà)窗口的應(yīng)用程序的大致框架,包括界面、主要的頭文件、實(shí)現(xiàn)文件等。如下圖所示:</p><p> 圖7 對(duì)話(huà)框基本框架創(chuàng)建完成圖</p><p><b> 3.2 界面設(shè)計(jì)
16、</b></p><p><b> 3.2.1添加圖標(biāo)</b></p><p> 1)在圖7所示的Resoure View選項(xiàng)卡中打開(kāi)Icon資源組,在Icon上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇引入選項(xiàng),此時(shí)彈出“引入資源”對(duì)話(huà)框,選擇要添加的圖標(biāo),之后單擊“引入”按鈕,如下圖所示:</p><p> 圖8 引入圖標(biāo)資源對(duì)
17、話(huà)框圖</p><p> 2)在Icon資源組中此時(shí)會(huì)出現(xiàn)一個(gè)新的圖標(biāo)項(xiàng),ID:IDI_ICON1,將原來(lái)的圖標(biāo)項(xiàng)IDR_MAINFRAME用“delete”鍵刪除,鼠標(biāo)右鍵單擊IDI_ICON1在快捷菜單中選擇屬性項(xiàng),在圖標(biāo)屬性對(duì)話(huà)框中將新的圖標(biāo)ID改為IDR_MAINFRAME。如下圖所示:</p><p> 圖9 圖標(biāo)屬性對(duì)話(huà)框圖</p><p><
18、b> 2.2.2添加控件</b></p><p> 在圖7所示的Resoure View選項(xiàng)卡中打開(kāi)Dialog資源組,雙擊IDD_LIUYUNLONG_DIALOG,在右邊的工作區(qū)中顯示出要編輯的對(duì)話(huà)框。將對(duì)話(huà)框中原有的按鈕、靜態(tài)文本框按“delete”鍵刪除,之后開(kāi)始擺放所需要的控件,包括編輯框和按鈕。按鈕的添加以“0”為例,其他按鈕類(lèi)似。</p><p> 1
19、)在圖7中控件的“按鈕”按鈕上單擊鼠標(biāo)左鍵,在對(duì)話(huà)框編輯窗口上合適的位置按下鼠標(biāo)左鍵并拖動(dòng)鼠標(biāo)畫(huà)出一個(gè)大小合適的按鈕。在按鈕上單擊鼠標(biāo)右鍵,在彈出的快捷萊單中選擇屬性選項(xiàng),此時(shí)彈出Push Button屬性對(duì)話(huà)框,在該對(duì)話(huà)框中輸入ID號(hào)和標(biāo)題。如下圖所示: </p><p> 圖10 Push Button屬性對(duì)話(huà)框圖</p><p> 2)在圖7中控件的“編輯框”按鈕上單擊鼠標(biāo)左鍵,
20、在對(duì)話(huà)框上的合適的位置上按下鼠標(biāo)左鍵并拖動(dòng)鼠標(biāo)畫(huà)出一個(gè)大小合適的編輯框。在編輯框上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇屬性選項(xiàng),此時(shí)彈出Edit屬性對(duì)話(huà)框,在該對(duì)話(huà)框中輸入控件的ID值。如下圖所示:</p><p> 圖11 Edit屬性圖</p><p> 對(duì)應(yīng)的按鈕、編輯框?qū)傩匀缦卤恚?lt;/p><p> 表1 按鈕和編輯框等對(duì)象屬性表</p>
21、<p><b> 3.2.3添加菜單</b></p><p> 1)在圖7所示的Resoure View選項(xiàng)卡中打開(kāi)Icon資源組,鼠標(biāo)右鍵單擊liuyunlong resource,在快捷菜單中單擊“插入”,彈出“插入資源”對(duì)話(huà)框,單擊Menu選項(xiàng),之后單擊“新建”。如下圖所示:</p><p> 圖12 插入資源對(duì)話(huà)框圖</p>&
22、lt;p> 2)右鍵單擊菜單項(xiàng),修改菜單資源的ID為IDR_MENU,在工作區(qū)右鍵單擊矩形框,選擇屬性,在標(biāo)明里寫(xiě)要添加的菜單項(xiàng)名稱(chēng),同時(shí)修改ID。如下圖所示:</p><p> 圖13 添加的查看菜單項(xiàng)圖</p><p> 對(duì)應(yīng)的菜單屬性如下表:</p><p><b> 表2 菜單屬性表</b></p><
23、p> 3)幫助菜單彈出對(duì)話(huà)框:右鍵單擊Dialog,在快捷菜單中單擊插入Dialog,確定,在新生成的對(duì)話(huà)框中加入靜態(tài)文本框,并編輯相應(yīng)的文字。如下圖所示:</p><p> 圖14 幫助菜單項(xiàng)彈出的對(duì)話(huà)框圖</p><p> 根據(jù)以上操作最終的界面圖:</p><p> 圖15 最終界面的顯示圖</p><p> 3.3 關(guān)
24、鍵功能的實(shí)現(xiàn)</p><p> 1)界面顏色的改變:</p><p> 首先重載對(duì)話(huà)框的CLiuyunlongDlg類(lèi)的OnPaint()成員函數(shù),即WM_PAINT消息。利用GetClientRect()函數(shù)獲取窗口客戶(hù)區(qū)的坐標(biāo)。</p><p> 然后利用FillSolidRect成員函數(shù)用指定的固體色填充矩形,其中顏色由RGB函數(shù)進(jìn)行設(shè)定。</p&
25、gt;<p> 2)窗口的伸縮的實(shí)現(xiàn):</p><p> 首先要在對(duì)話(huà)框中要伸縮的位置插入一個(gè)圖像控件,將其拉成一條直線(xiàn),并取消可見(jiàn)。</p><p> 其次在實(shí)現(xiàn)文件里邊定義兩個(gè)靜態(tài)變量,用來(lái)存儲(chǔ)對(duì)話(huà)框尺寸信息。為了實(shí)現(xiàn)第一次顯示為標(biāo)準(zhǔn)型,所以獲取顯示尺寸和位置信息以及執(zhí)行SetWindowPos函數(shù)的最佳時(shí)機(jī)應(yīng)放在對(duì)話(huà)框創(chuàng)建之后,第一次顯示之前。為此利用WM_INI
26、TDIALOG消息的響應(yīng)函數(shù)OnInitDialog來(lái)對(duì)對(duì)話(huà)框及控件進(jìn)行相關(guān)的設(shè)置和修改。該函數(shù)中利用GetDlgItem函數(shù)獲得圖像控件的窗口句柄,結(jié)合GetWindowRect函數(shù)得到圖像控件的矩形框。進(jìn)而進(jìn)行標(biāo)準(zhǔn)型參數(shù)的獲取,利用SetWindowPos()函數(shù)完成對(duì)對(duì)話(huà)框的寬度、高度等參數(shù)的初始化設(shè)置。</p><p> 最后添加相應(yīng)的菜單響應(yīng)函數(shù),在響應(yīng)函數(shù)里邊利用SetWindowPos()函數(shù)完成
27、對(duì)對(duì)話(huà)框的寬度、高度等參數(shù)的設(shè)置。</p><p> 3)標(biāo)準(zhǔn)型和科學(xué)型選擇標(biāo)記的實(shí)現(xiàn):</p><p> 首先在對(duì)話(huà)框類(lèi)的實(shí)現(xiàn)文件中添加ON_WM_INITMENUPOPUP入口到消息映射里面。</p><p> 其次在對(duì)話(huà)框類(lèi)的頭文件中添加消息函數(shù)聲明afx_msg void OnInitMenuPopup(CMenu *pPopupMenu, UINT
28、nIndex,BOOL bSysMenu);</p><p> 再次在對(duì)話(huà)框類(lèi)的實(shí)現(xiàn)文件中添加相應(yīng)的void CLiuyunlongDlg OnInitMenuPopup函數(shù)代碼,該段代碼大部分取自WinFrm.cpp文件的函數(shù)CFrameWnd::OnInitMenuPopup()。</p><p> 最后在實(shí)現(xiàn)文件中定義兩個(gè)全局的布爾型變量kexue、biaozhun,通過(guò)這兩個(gè)變
29、量的值判斷執(zhí)行的是標(biāo)準(zhǔn)型、科學(xué)型的哪一個(gè),并給標(biāo)準(zhǔn)型和科學(xué)型菜單項(xiàng)添加相應(yīng)的UPDATE_COMMAND_UI響應(yīng)函數(shù),在響應(yīng)函數(shù)里調(diào)用SetRadio函數(shù)來(lái)進(jìn)行標(biāo)記。</p><p> 4)幫助菜單中關(guān)于計(jì)算器菜單的實(shí)現(xiàn):</p><p> 首先創(chuàng)建新的對(duì)話(huà)框資源,在創(chuàng)建完對(duì)話(huà)框資源之后,生成一個(gè)相關(guān)的對(duì)話(huà)框類(lèi)。</p><p> 其次創(chuàng)建相應(yīng)的菜單項(xiàng)資源,
30、即添加幫助菜單,并添加相應(yīng)的CAMMAND消息響應(yīng)函數(shù),在響應(yīng)函數(shù)里邊定義對(duì)話(huà)框類(lèi)對(duì)象,調(diào)用DoModal函數(shù)。</p><p><b> 5)操作數(shù)的實(shí)現(xiàn):</b></p><p> 首先通過(guò)小數(shù)標(biāo)志位point判斷當(dāng)前是否有小數(shù)點(diǎn),如果有用num1記錄當(dāng)前鍵入的數(shù)值,并將小數(shù)點(diǎn)后的位數(shù)標(biāo)志位加一,利用for循環(huán),實(shí)現(xiàn)該數(shù)在小數(shù)點(diǎn)哪一位,然后通過(guò)正負(fù)標(biāo)志位zhe
31、ngfu判斷當(dāng)前數(shù)值是正數(shù)還是負(fù)數(shù),如果是正數(shù)直接將m_num和小數(shù)num1相加,如果是負(fù)號(hào)則m_num減去num1;如果沒(méi)有小數(shù)點(diǎn)則直接判斷該數(shù)的正負(fù),若為正數(shù)則m_num乘10之后加上鍵入的數(shù),若為負(fù)號(hào)則m_num乘10之后減去鍵入的數(shù)。并把結(jié)果保存到m_num中,利用UpdateData(FALSE),刷新輸出到編輯框。</p><p><b> 6)退格鍵的實(shí)現(xiàn):</b></
32、p><p> 首先判斷當(dāng)前數(shù)值是否是小數(shù),如果不是小數(shù)則對(duì)編輯框里邊的數(shù)進(jìn)行除10操作,然后利用fmod進(jìn)行取余操作,減去該十分位小數(shù);當(dāng)該數(shù)為小數(shù)時(shí),利用小數(shù)點(diǎn)后的位數(shù)標(biāo)志位dianhou 進(jìn)行for循環(huán),移動(dòng)小數(shù)點(diǎn)的位置,當(dāng)只有十分位時(shí)停止,減去該位,再次利用for循環(huán)將小數(shù)點(diǎn)移至原來(lái)的數(shù)后面,用UpdateData(FALSE),刷新輸出到編輯框。</p><p><b>
33、 7)清除鍵的實(shí)現(xiàn):</b></p><p> 將編輯框連接的變量m_num,所有的臨時(shí)變量num1、num2,標(biāo)志位dianhou、danshuang、point、zhengfu,進(jìn)行清零復(fù)位操作即可。</p><p> 8)角度值轉(zhuǎn)換的實(shí)現(xiàn):</p><p> 利用單選按鈕框,連接相應(yīng)的變量m_hudu,標(biāo)志當(dāng)前是弧度值,還是一般的度,如果是一
34、般的度,令m_jiao=1,如果是弧度,令m_jiao=(2*Pi)/360,用m_jiao作為角度值轉(zhuǎn)換的臨時(shí)變量,當(dāng)前的編輯框值乘以m_jiao,進(jìn)行轉(zhuǎn)換,而在單選按鈕響應(yīng)函數(shù)中用UpdateData(true)更新數(shù)據(jù)到文檔中。</p><p> 9)單目運(yùn)算符的運(yùn)算實(shí)現(xiàn):</p><p> 首先對(duì)輸入的數(shù)值判斷是否合法,如開(kāi)平方、取對(duì)數(shù)、取倒數(shù)等操作,不合法時(shí)輸出響應(yīng)的提示,合
35、法時(shí)利用數(shù)學(xué)函數(shù)進(jìn)行運(yùn)算,并用m_num記錄結(jié)果,判斷結(jié)果是否超過(guò)double型的范圍,若超過(guò)則輸出提示,若沒(méi)有超過(guò)就更新到編輯框,最后對(duì)標(biāo)志位dianhou、point、zhengfu復(fù)位和臨時(shí)變量num1清零。</p><p> 10)雙目運(yùn)算符的運(yùn)算實(shí)現(xiàn):</p><p> 首先判斷單雙運(yùn)算符標(biāo)志位是否為0,如果不為0,便調(diào)用等號(hào)的消息響應(yīng)函數(shù),實(shí)現(xiàn)上次的雙目運(yùn)算。</p&
36、gt;<p> 其次判斷num2是否為0,若為0,便將此時(shí)編輯框的值賦給num2,再將m_num值置0,設(shè)置當(dāng)前的雙目運(yùn)算符的標(biāo)志,并將point、zhengfu、dianhou復(fù)位。</p><p> 最后輸入數(shù)據(jù)后,按等號(hào)鍵調(diào)用相應(yīng)的消息響應(yīng)函數(shù),根據(jù)danshuang值來(lái)選擇相應(yīng)的算法,進(jìn)行運(yùn)算。</p><p><b> 4.結(jié)論與心得體會(huì)</b
37、></p><p> 很快兩周的時(shí)間就過(guò)去了,在這段時(shí)間里我真的是感觸頗多,隨著自己這兩周的時(shí)間一步一步的推進(jìn),自己對(duì)基于對(duì)話(huà)框的編程也越來(lái)越系統(tǒng)化,真的可以說(shuō)是獲益良多。</p><p> 這次課程設(shè)計(jì)是我們做的第三個(gè)課程設(shè)計(jì),每一個(gè)課程設(shè)計(jì)之后真的是感覺(jué)自己取得了平時(shí)學(xué)習(xí)所不能達(dá)到的效果。像以前的我做的帶通濾波器的設(shè)計(jì)、叮咚門(mén)鈴都使自己在電路理論、模電等方面的知識(shí)有一個(gè)很好的
38、運(yùn)用與實(shí)踐,而這次的簡(jiǎn)單計(jì)算器的設(shè)計(jì)讓自己對(duì)面向?qū)ο缶幊逃幸粋€(gè)更好的認(rèn)識(shí),對(duì)mfc編程的有了進(jìn)一步的了解,并掌握了一些基本的功能的實(shí)現(xiàn)。</p><p> 我做的簡(jiǎn)單計(jì)算器的設(shè)計(jì)是基于對(duì)話(huà)框的,這個(gè)計(jì)算器除了簡(jiǎn)單的加減乘除等運(yùn)算,還要實(shí)現(xiàn)開(kāi)方、指數(shù)、取對(duì)數(shù)、冪、正余弦等運(yùn)算。而實(shí)現(xiàn)這些功能尤其要注意的是單目運(yùn)算符和雙目運(yùn)算符的區(qū)別以及小數(shù)、正負(fù)號(hào)實(shí)現(xiàn)方法。當(dāng)時(shí)想了好久,最后通過(guò)和同學(xué)的探討,決定用相應(yīng)的標(biāo)志位對(duì)
39、這些情況進(jìn)行判定,如小數(shù)點(diǎn)用布爾值point進(jìn)行標(biāo)記,而dianhou標(biāo)記小數(shù)點(diǎn)后的位數(shù)。在這些最基本的功能完成之后,我想增加一些其他功能,為此我打開(kāi)了電腦自帶的計(jì)算器,看了一下界面,看到電腦自帶的計(jì)算器能夠進(jìn)行窗口的伸縮,單擊幫助信息,能夠?qū)崿F(xiàn)彈出一個(gè)對(duì)話(huà)框,顯示該計(jì)算器的基本信息。對(duì)于這個(gè)彈出的對(duì)話(huà)框我參考了課件里最后一章節(jié)在單文檔中的實(shí)現(xiàn)方法,添加新的對(duì)話(huà)框資源,建立新的對(duì)話(huà)框類(lèi)實(shí)現(xiàn)對(duì)話(huà)框的彈出。而窗口的伸縮我在網(wǎng)上搜了一些資料,
40、利用在對(duì)話(huà)框中添加一個(gè)圖像控件將其拉成直線(xiàn),獲取該圖像控件的位置,實(shí)現(xiàn)對(duì)話(huà)框的大小變化。為了辨明此時(shí)選中的是標(biāo)準(zhǔn)型,還是科學(xué)型,我又想到在類(lèi)型前加上點(diǎn),也參考了課件里的單文檔中的做法,添加UPDATE_COMMAND_UI響應(yīng)函數(shù),在響應(yīng)函數(shù)里調(diào)用SetRadio函數(shù)來(lái)進(jìn)行標(biāo)記??墒墙Y(jié)果是當(dāng)點(diǎn)擊標(biāo)準(zhǔn)型</p><p> 這次課設(shè)進(jìn)行的真的是挺開(kāi)心的,本來(lái)自己對(duì)編程就感覺(jué)挺有興趣,對(duì)于這些東西老想做的更好一點(diǎn),每
41、次在添加完一個(gè)新功能之后自己就感覺(jué)很高興,尤其是那些經(jīng)過(guò)很長(zhǎng)時(shí)間才解決的問(wèn)題,給自己的印象更加的深刻。</p><p> 在今后的學(xué)習(xí)中自己一定要把基礎(chǔ)給打好,基本功扎實(shí),同時(shí)也要善于思考,知道不同之間的聯(lián)系,相同之間的差異,并進(jìn)行總結(jié),在以后再隨后根據(jù)情況查詢(xún)寫(xiě)相關(guān)的資料,來(lái)完成所要求的功能??偟膩?lái)說(shuō)這次的課程設(shè)計(jì)既鞏固了自己以前的MFC程序設(shè)計(jì)知識(shí),也拓展了自己的思維,增加了自己的動(dòng)手能力,最后也很感謝老師
42、給我們的支持以及嚴(yán)格要求!</p><p><b> 5.參考文獻(xiàn)</b></p><p> 揣錦華.面向?qū)ο蟪绦蛟O(shè)計(jì)與VC++實(shí)踐[M].西安電子科技大學(xué)出版社,2005.</p><p> 張建宏,湯練兵,馬德駿.計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)-C語(yǔ)言程序設(shè)計(jì)[M].北京:科學(xué)出版社,2009.</p><p> 姚領(lǐng)田
43、.精通MFC程序設(shè)計(jì)[M].北京:人民郵電出版社,2006.</p><p><b> 6.思考題</b></p><p> 1、程序中如何實(shí)現(xiàn)小數(shù)的顯示與運(yùn)算?</p><p> 答:首先在liuyunlongDlg.cpp實(shí)現(xiàn)文件中定義一個(gè)布爾型變量point來(lái)判斷是否為小數(shù),定義一個(gè)整型變量dianhou記錄小數(shù)點(diǎn)后的位數(shù)。當(dāng)輸入數(shù)
44、時(shí)首先判斷point是否為true,若為true表示該數(shù)是小數(shù),用num1記錄當(dāng)前的鍵入值,同時(shí)對(duì)dianhou進(jìn)行加一,根據(jù)dianhou進(jìn)行for循環(huán),進(jìn)行除以10操作,再根據(jù)該數(shù)的正負(fù),來(lái)決定是m_num加num1,還是減num1,用UpdateData(FALSE)刷新輸出到編輯框。在實(shí)現(xiàn)退格功能是,若point為true,則根據(jù)dianhou的值循環(huán)對(duì)m_num乘以10,將小數(shù)點(diǎn)移到只有十分位,利用fmod取余,將編輯框的變量
45、值減去該余數(shù),最后再進(jìn)行循環(huán)將小數(shù)點(diǎn)移到原來(lái)數(shù)字的后邊。</p><p> 2、描述等號(hào)對(duì)應(yīng)的消息處理函數(shù)中需要處理的問(wèn)題及相應(yīng)的實(shí)現(xiàn)代碼?</p><p> 答:等號(hào)對(duì)應(yīng)的消息處理函數(shù)主要處理雙目運(yùn)算符的運(yùn)算。利用單雙目運(yùn)算符的標(biāo)志位danshuang,判斷其值選擇相應(yīng)的雙目運(yùn)算符的算法表達(dá)式進(jìn)行運(yùn)算,這些雙目運(yùn)算按順序依次為:加法、減法、乘法、除法及取對(duì)數(shù)。其中在除法和取對(duì)數(shù)運(yùn)算中
46、還要判斷操作數(shù)是否合法,如果不合法輸出提示內(nèi)容,如果合法進(jìn)行運(yùn)算。然后對(duì)結(jié)果判斷是否超過(guò)double型數(shù)據(jù)的顯示范圍,若超過(guò)也輸出提示信息。最后對(duì)相應(yīng)的標(biāo)志位進(jìn)行復(fù)位。實(shí)現(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("輸入錯(cuò)誤,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("輸入錯(cuò)誤,取對(duì)數(shù)要為正數(shù)!");</p><p> else {m_num=log(m_num)/log(num2)
52、;UpdateData(FALSE);} //取對(duì)數(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("結(jié)果過(guò)大,無(wú)法顯示");</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、(選做)若實(shí)現(xiàn)了科學(xué)型和標(biāo)準(zhǔn)型,說(shuō)明科學(xué)型和標(biāo)準(zhǔn)型實(shí)現(xiàn)的關(guān)鍵算法?</p><p> 答:我做的科學(xué)型和標(biāo)準(zhǔn)型的實(shí)現(xiàn)方法和指導(dǎo)書(shū)上的推薦方法不同,指導(dǎo)書(shū)推薦的方法是通過(guò)單選按鈕,當(dāng)選擇科學(xué)型時(shí)進(jìn)行科學(xué)型的按鈕被激活,可以運(yùn)算,當(dāng)選擇標(biāo)準(zhǔn)型的時(shí)候進(jìn)行科學(xué)型的按鈕不能進(jìn)
55、行運(yùn)算。而我的實(shí)現(xiàn)方法是選擇伸縮框,初始時(shí)是標(biāo)準(zhǔn)型,界面上只有數(shù)值和簡(jiǎn)單的加減乘除等運(yùn)算按鈕,當(dāng)單擊科學(xué)型時(shí),對(duì)話(huà)框進(jìn)行了擴(kuò)展,出現(xiàn)了可以科學(xué)型運(yùn)算的部分。</p><p> 主要的實(shí)現(xiàn)方法:首先要在對(duì)話(huà)框中要伸縮的位置插入一個(gè)圖像控件,將其拉成一條直線(xiàn),并取消可見(jiàn)。其次在實(shí)現(xiàn)文件里邊定義兩個(gè)靜態(tài)變量,用來(lái)存儲(chǔ)對(duì)話(huà)框尺寸信息。為了實(shí)現(xiàn)第一次顯示為標(biāo)準(zhǔn)型,所以獲取顯示尺寸和位置信息以及執(zhí)行SetWindowPos
56、函數(shù)的最佳時(shí)機(jī)應(yīng)放在對(duì)話(huà)框創(chuàng)建之后,第一次顯示之前。為此利用WM_INITDIALOG消息的響應(yīng)函數(shù)OnInitDialog來(lái)對(duì)對(duì)話(huà)框及控件進(jìn)行相關(guān)的設(shè)置和修改。該函數(shù)中利用GetDlgItem()函數(shù)獲得圖像控件的窗口句柄,結(jié)合GetWindowRect()函數(shù)得到圖像控件的矩形框。進(jìn)而進(jìn)行標(biāo)準(zhǔn)型參數(shù)的獲取,利用SetWindowPos()函數(shù)完成對(duì)對(duì)話(huà)框的寬度、高度等參數(shù)的初始化設(shè)置。最后添加相應(yīng)的菜單響應(yīng)函數(shù),在響應(yīng)函數(shù)里邊利用S
57、etWindowPos()函數(shù)完成對(duì)對(duì)話(huà)框的寬度、高度等參數(shù)的設(shè)置。</p><p><b> 7.附錄</b></p><p><b> 7.1調(diào)試報(bào)告</b></p><p> 1、error C2296: '%' : illegal, left operand has type 'dou
58、ble'</p><p> 解決辦法:因?yàn)槿∮鄶?shù)的運(yùn)算符%只能用于整數(shù),不能用于浮點(diǎn)數(shù),經(jīng)過(guò)查詢(xún)資料知道用fmod可進(jìn)行取余運(yùn)算。</p><p> 2、在階乘運(yùn)算代碼中用“else GetDlgItem(IDC_SHUCHU)->SetWindowText("不是整數(shù)無(wú)法進(jìn)行階乘運(yùn)算");UpdateData(FALSE); //數(shù)據(jù)刷新”不能輸出相
59、應(yīng)的提示語(yǔ)句。</p><p> 解決辦法:主要是因?yàn)樵谔崾菊Z(yǔ)句輸出后,立即進(jìn)行了編輯框的刷新,將其覆蓋,所以將updateData(FALSE)提前即可</p><p> 3、在進(jìn)行角度制轉(zhuǎn)換的時(shí),相應(yīng)的資源和代碼完成之后,運(yùn)行發(fā)現(xiàn)剛開(kāi)始沒(méi)有選中標(biāo)準(zhǔn)型和科學(xué)型的任何一個(gè)。</p><p> 解決辦法:經(jīng)分析應(yīng)該是沒(méi)有對(duì)單選按鈕相關(guān)聯(lián)的變量沒(méi)有進(jìn)行初始化,在C
60、LiuyunlongDlg::CLiuyunlongDlg(CWnd* pParent /*=NULL*/): CDialog(CLiuyunlongDlg::IDD, pParent) 中加入m_hudu=0,進(jìn)行初始化后得以解決。</p><p> 4、運(yùn)行時(shí)出現(xiàn)以下提示“l(fā)iuyunlong Microsoft 基礎(chǔ)類(lèi)應(yīng)用程序已停止工作(出現(xiàn)了一個(gè)問(wèn)題,導(dǎo)致程序停止正常工作。請(qǐng)關(guān)閉改程序”。</p&
61、gt;<p> 解決辦法:應(yīng)該是新加的擴(kuò)展與收縮對(duì)話(huà)框的變量CRect rectLarge;CRect rectSmall;所放的位置不對(duì),經(jīng)過(guò)嘗試放在了liuyunlongDlg.cpp文件中作為全局變量得以實(shí)現(xiàn)。</p><p><b> 7.2測(cè)試結(jié)果</b></p><p> 1)運(yùn)行后依次輸入“12”,“/”,“2.4”,“*”,“0.5
62、”,“-”,“6”,“+”,“2”,“=”得出結(jié)果為-1.5,之后結(jié)合相應(yīng)的菜單項(xiàng)中同樣輸入這組操作也得到這個(gè)結(jié)果。如下圖所示:</p><p> 圖16 標(biāo)準(zhǔn)型時(shí)運(yùn)算結(jié)果圖</p><p> 在運(yùn)行程序后剛開(kāi)始的界面如圖16所示,此時(shí)的界面為標(biāo)準(zhǔn)型,主要包括數(shù)字、清零、退格、負(fù)號(hào)、等號(hào)以及簡(jiǎn)單的加減乘除運(yùn)算按鈕,顯示編輯框和菜單項(xiàng)。并且根據(jù)計(jì)算知道該結(jié)果正確,且該計(jì)算器能實(shí)現(xiàn)運(yùn)算符的
63、連續(xù)運(yùn)算。</p><p> 2)點(diǎn)擊查看菜單項(xiàng)中的科學(xué)型,輸入“2”,“asin”得到相應(yīng)的錯(cuò)誤提示如17圖所示;然后點(diǎn)擊“C”和單選按鈕“度”依次并輸入“90”,“sin”,“*”,“2”,“exp”,“l(fā)n” “sqrt”得到相應(yīng)的結(jié)果,之后結(jié)合菜單項(xiàng)實(shí)現(xiàn)結(jié)果一直,如18圖所示:</p><p> 圖17 反正弦輸入錯(cuò)誤提示圖</p><p> 圖18
64、點(diǎn)擊科學(xué)型菜單后運(yùn)算結(jié)果圖</p><p> 在點(diǎn)擊查看菜單中的科學(xué)型選項(xiàng)后,如圖17、圖18所示,界面進(jìn)行了科學(xué)型的擴(kuò)展,添加了三角函數(shù)、冪、取對(duì)數(shù)、階乘等運(yùn)算按鈕及角度制轉(zhuǎn)換的單選按鈕。經(jīng)檢驗(yàn)和√2相當(dāng)?shù)慕咏?,運(yùn)算結(jié)果無(wú)誤,且能實(shí)現(xiàn)對(duì)輸入的錯(cuò)誤操作數(shù)的錯(cuò)誤提示功能。</p><p> 該界面中還包含了編輯、查看、幫助菜單項(xiàng),其中編輯中主要是運(yùn)算符菜單,進(jìn)行數(shù)值計(jì)算,查看中包含了標(biāo)準(zhǔn)
65、型、科學(xué)型、exit選項(xiàng),實(shí)現(xiàn)計(jì)算器界面的伸縮和退出,而在幫助菜單中是關(guān)于計(jì)算器菜單項(xiàng),點(diǎn)擊后顯示計(jì)算器的制作者信息。如下圖所示:</p><p> 圖19 關(guān)于計(jì)算器信息顯示圖</p><p><b> 7.3關(guān)鍵源代碼</b></p><p><b> //定義的相關(guān)變量</b></p><p
66、> BOOL zhengfu=true; // zhengfu定義為布爾值,判斷當(dāng)前值是否是正數(shù)還是負(fù)數(shù)</p><p> int danshuang;//單雙目運(yùn)算符轉(zhuǎn)換</p><p><b> int i;</b></p><p> int dianhou;//diann判斷小數(shù)后的位數(shù)</p><p&g
67、t; BOOL point=false; //point定義為布爾值,判斷是否有小數(shù)點(diǎn)</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;//角度與弧度轉(zhuǎn)換臨時(shí)變量</p><p> CRect rectLarge;</p><p> CRect rectSmall;//新加的擴(kuò)展與收縮對(duì)話(huà)框的變量</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;//弧度相關(guān)聯(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);//圖標(biāo)顯示</p><p><b> }</b></p><p> //界面伸縮式擴(kuò)展代碼</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;//對(duì)話(huà)框的左邊位置</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);//設(shè)置初始化時(shí)標(biāo)準(zhǔn)型界面</p><p> return TRUE; // return
75、 TRUE unless you set the focus to a control</p><p><b> }</b></p><p> //設(shè)置背景顏色所加代碼</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);//獲取該對(duì)話(huà)框的位置坐標(biāo)</p><p> dc.FillSolidRect(rect,RGB(11,
78、125,111)); //設(shè)置為綠色背景</p><p> CDialog::OnPaint();</p><p><b> }</b></p><p><b> }</b></p><p> //在標(biāo)準(zhǔn)和科學(xué)型菜單前面加點(diǎn)標(biāo)志為了使響應(yīng)函數(shù)調(diào)用所加的代碼</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ù)值的實(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) //當(dāng)前是否有小數(shù)點(diǎn),如果有</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) //當(dāng)前值是否是正數(shù)還是負(fù)數(shù),如果是正數(shù)</p><p> m_num=m_num+num1; //前面不加負(fù)號(hào)</p><p><b> else</b></p><p> m_num=m_num-num1; //否則前面加負(fù)號(hào)</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ù)點(diǎn)的按鈕的響應(yīng)函數(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ù)點(diǎn)標(biāo)志位賦值</p><p><b> }</b></p><p> //負(fù)號(hào)按鈕的響應(yīng)函數(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;//負(fù)號(hào)標(biāo)志位賦值</p><p><b> }</b&
107、gt;</p><p><b> //清零實(shí)現(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ù)無(wú)位數(shù)</p><p> danshuang=0; </p><p>
109、 point=FALSE; //當(dāng)前無(wú)小數(shù)</p><p> zhengfu=TRUE; </p><p> UpdateData(FALSE); //數(shù)據(jù)刷新</p><p><b> }</b></p><p><b> //退格鍵實(shí)現(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 ) //判斷當(dāng)前是否有小數(shù)點(diǎn),如果沒(méi)有</p><p> m_num=m_num/10-fmod(m_num/10,1); //去掉末位即此時(shí)的小數(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++) //移動(dòng)小數(shù)點(diǎn)</p><p><b> {</b></p><p> m_num=m_num*10; //移動(dòng)至只有一個(gè)小
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ù)點(diǎn)移至原來(lái)位置</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> //加減乘除、取對(duì)數(shù)實(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; //把第二個(gè)值賦于輸出框的成員變量</p><p> m_num=0; //輸出框的成員變量清0</p><p> point=false; //當(dāng)前小數(shù)無(wú)</p><p> zhengfu=true; //當(dāng)前符號(hào)為正</p><p> dia
118、nhou=0; //小數(shù)位數(shù)無(wú)</p><p> danshuang=2;</p><p><b> }</b></p><p><b> //等號(hào)實(shí)現(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("輸入錯(cuò)誤,0不能作除數(shù)!");</p><p> else {m_num=num2/m_num;UpdateData(FALSE);}</p><p><b> break;</b></p><p><b>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- 計(jì)算器java課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)
- c++簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- c++課程設(shè)計(jì)報(bào)告--簡(jiǎn)單計(jì)算器
- 簡(jiǎn)單的計(jì)算器課程設(shè)計(jì)
- 課程設(shè)計(jì)---簡(jiǎn)單的計(jì)算器
- vb課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器
- 簡(jiǎn)單的計(jì)算器課程設(shè)計(jì)
- 課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器的設(shè)計(jì)
- 課程設(shè)計(jì)--簡(jiǎn)單的計(jì)算器設(shè)計(jì)
- 課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器的設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--簡(jiǎn)單計(jì)算器
- 課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告--簡(jiǎn)單的計(jì)算器設(shè)計(jì)
- c++課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器
- c++課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器
- vc++課程設(shè)計(jì)報(bào)告--簡(jiǎn)單科學(xué)計(jì)算器設(shè)計(jì)
- 計(jì)算器課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告---計(jì)算器設(shè)計(jì)
- vc++課程設(shè)計(jì)---簡(jiǎn)單計(jì)算器的設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論