MFC計算器課程設計報告-2019年文檔資料_第1頁
MFC計算器課程設計報告-2019年文檔資料_第2頁
MFC計算器課程設計報告-2019年文檔資料_第3頁
MFC計算器課程設計報告-2019年文檔資料_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、MFC計算器課程設計報告計算機應用3班黃錦湫,羅潔,饒益指導老師:蔣鵬2009315一題目:利用 MFC框架編寫簡易計算器要求使用MFC框架在Visual Studio 6.0環(huán)境下編寫一個簡易的計算器, 支持任意位數(shù)的加減乘數(shù),正負轉換,并且實現(xiàn) Backspace CE C功能。二設計過程1. Windows消息處理機制的理解首先編寫程序需要對 Windows程序的消息處理機制 (Message Handle)有個比較清晰的了解。 Windows的程序都是通過消息來傳送數(shù)據(jù),有不需要用戶參與的系統(tǒng)消息,比如異常處理等。還有用戶消息,比如鼠標的單擊,雙擊,鍵盤的鍵入等。2. 界面的設計仿照W

2、indows附件里面的計算器,在資源視圖中畫好界面,如圖:簡駅計算蠱1.0VetalJK1X:Edit :_d _±JBACK±JCE_£ : 3 B2:+/-:41主要使用到Layout菜單中的Align功能對各個按鈕進行對其,使界面更加整潔。拖出的控件有上面的一個Edit控件用于顯示數(shù)字,Butt on控件用于處理鼠標的消息。3.建立的變量,控件的命名,對應的消息處理函數(shù)對應表IDCAPTIONMessage HandlerIDD CALC DIALOG簡易計算器 1.0 Beta1版N/AIDC NUMO0OnNum0IDC NUM11OnNum1IDC N

3、UM22OnNum2IDC NUM33OnNum3IDC NUM44OnNum4IDC NUM55OnNum5IDC NUM66OnNum6IDC NUM77OnNum7IDC NUM88OnNum8IDC NUM99OnNum9IDC NEG+/-OnNegIDC PT.OnPtIDC DIV/OnDivIDC MUL*OnMulIDC MIN-OnMinIDC_ADD+OnAddIDC BACKSPACEBACKOnBackspaceIDC CECEOnCeIDC CLEARCOnClearIDC EQU=OnEquIDC DISN/AN/AOnCal(double num)變量定義:do

4、uble poz; 保存小數(shù)點的位置,初始化為 1,表示poz-1個小數(shù)點。double m_Dis; /Edit控件上需要顯示的數(shù)字BOOL point_flag;小數(shù)點表示位,判定是否是小數(shù),是小數(shù)為1,不是小數(shù)為0。double numfirst; /保存計算過程中的前一個數(shù)字,double numsecond;保存計算過程中的第二個數(shù)字char op;/記錄當前的計算符號,可以為'''''''''''c',''變量初始化:poz=1;m_Dis = 0.0;numfirst=

5、0;numsecond=0;op=0;4. 設計思路a) 首先考慮對所有按鍵分為兩類,數(shù)字類和符號類,0,123,4,5,6,7,8,9為數(shù)字類,+,-,*,/,=為符號類。數(shù)字在計算的過程中最多需要保存兩個,所以定義了兩個double型變量numfirst和numsecond來進行存儲。符號需要一個char op來存儲。b) 然后考慮在計算的過程中,numfirst和numsecond的存儲狀態(tài)有三種,一種是numfirst=0 && numsec on d=0也就是程序剛開始運行還沒有開始錄入數(shù)字的狀態(tài)。二種是numfirst!=0 && numsecond

6、=0 也就是第一個數(shù)字已經(jīng)錄入, 符號也已 經(jīng)錄入時候把 m_Dis 的值直接賦值給 numfirst /第三種是 numfirst!=0 &&numsecond!=0,表示可以通過 op來把兩數(shù)合并為一個數(shù)。c) 考慮到該計算器支持連續(xù)的計算,比如3.33+1.33*88/96= ?。所以必須在點符號Butt on也要計算出之前的結果,通過判斷op,來計算,把兩個數(shù)字合并為一個數(shù)字, 方便下一次運算,功能近似于點=,所以把=也劃分到符號類。d) 因為數(shù)字全部使用的是double,鍵入的數(shù)字必須通過一定的處理達到累加的效果,加上小數(shù)和整數(shù)的處理差異性大,所以分別用point_f

7、lag來判斷,分別出來小數(shù)和整數(shù)。5. 成員函數(shù)及其釋義因為對OnNum0()到OnNum9()的處理函數(shù)差異僅在一個數(shù)字上,可以通過調(diào)用一 個共同的函數(shù) OnCal(double num)來簡化源代碼長度,增加模塊性。void CCalcDlg:OnCal( double num) / 分三種狀態(tài)來處理if (numfirst!=0 && numsecond!=0)if (point_flag=TRUE) / 判定為小數(shù) poz*=0.1; / 小數(shù)進位 m_Dis=m_Dis+poz*num;/ 遞增 UpdateData( false ); / 把結果從內(nèi)存?zhèn)鬟f到屏幕 e

8、lsem_Dis=m_Dis*10+num; UpdateData( false );if (numfirst!=0 && numsecond=0)if (point_flag=TRUE) poz*=0.1; m_Dis=m_Dis+poz*num; UpdateData( false );else / 判定為整數(shù) m_Dis=m_Dis*10+num;/ 遞增 UpdateData( false );if (numfirst=0 && numsecond=0)if (point_flag=TRUE) poz*=0.1; m_Dis=m_Dis+poz*num;

9、 UpdateData( false );op 的值,更else m_Dis=m_Dis*10+num; UpdateData( false );以 OnAdd() 為例子講解符號的處理函數(shù),函數(shù)的功能是先判定之前按下字符時 具 op 的值來進行相應的運算。void CCalcDlg:OnAdd()/根據(jù)numfirst和numsecond和op的值分為5種狀態(tài)。if (numfirst!=0 && numsecond=0&&op= '+' ) numsecond=m_Dis;numfirst=numfirst+numsecond; / 之前按的

10、是加把兩個數(shù)賦值到前一個數(shù) m_Dis=numfirst;/ 賦值給屏幕numsecond=0; / 從新賦值為 0, 清空,不影響下一次判斷 UpdateData(FALSE);m_Dis=0; / 屏幕的值同時清空if (numfirst!=0 && numsecond=0&&op= '-' )numsecond=m_Dis; numfirst=numfirst-numsecond;m_Dis=numfirst;numsecond=0;UpdateData(FALSE);m_Dis=0;if (numfirst!=0 && n

11、umsecond=0&&op= '*' )numsecond=m_Dis; numfirst=numfirst*numsecond;m_Dis=numfirst;numsecond=0;UpdateData(FALSE);m_Dis=0;if (numfirst!=0 && numsecond=0&&op= '/' )numsecond=m_Dis; numfirst=numfirst/numsecond;m_Dis=numfirst;numsecond=0;UpdateData(FALSE); m_Dis=0;i

12、f (numfirst=0 && numsecond=0) / 該狀態(tài)為程序啟動還沒有開始錄入輸入的狀態(tài)numfirst=m_Dis; / 屏幕的值賦值到 numfirstUpdateData(FALSE); m_Dis=0;op='+' ; / 最后記錄最后一個操作是 + poz=1;/ 小數(shù)點位置歸位point_flag=FALSE;/ 默認小數(shù)點標志為整數(shù),也就是0,也就是 FALSE“+/-“按鈕的處理函數(shù) void CCalcDlg:OnNeg()m_Dis=-m_Dis;/ 換個符號,其他都一樣UpdateData(FALSE);poz=1;poin

13、t_flag=FALSE; .'按鈕的處理函數(shù) void CCalcDlg:OnPt()point_flag=TRUE; / 把標志位改為“小數(shù)點”狀態(tài)“ Backspace ”按鈕的處理void CCalcDlg:OnBackspace()/ 主要通過 _gcvt() 和 strtod() 函數(shù)進行字符串和浮點數(shù)之間的轉換 char buffer30; / 定義個裝字符的數(shù)組_gcvt(m_Dis, sizeof (m_Dis),buffer); /把m_Dis存的數(shù)字轉換為 stringfor ( int i=0;i<30;i+)if (bufferi= '.'

14、; && bufferi+1=0 )/ 判斷是否為整數(shù) point_flag=FALSE; / 標志位設置為“整數(shù)位” break ;if (point_flag=TRUE) / 如果是小數(shù) for ( int j=0;j<30;j+)if (bufferj=0) bufferj-1=0; /把'0'之前的字符賦值為 '0 ',就相當于剪掉最后一位break;else / 如果是整數(shù)bufferi-1=0; /剪掉 '. '之前那位m_Dis=strtod(buffer,NULL);/ 再用 strtod 弄成浮點數(shù)Upda

15、teData(FALSE);poz=1; CE'按鈕處理函數(shù)void CCalcDlg:OnCe()if (numfirst!=0 && numsecond=0)/CE 只能修改第二個數(shù)字 m_Dis=0; / 把屏幕的值賦值為 0UpdateData(FALSE);/ 并顯示出來 C'按鈕處理函數(shù) void CCalcDlg:OnClear()op=NULL; / 清空符號numfirst=0;/ 清空第一個數(shù)字numsecond=0;/ 清空第二個數(shù)字point_flag=FALSE;/ 改為默認整數(shù)位poz=1;/ 小數(shù)點歸位m_Dis=0;UpdateD

16、ata(FALSE); / 屏幕顯示歸 0鍵盤響應:void CCalcDlg:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) switch(nChar)case VK_NUMPAD0: OnNum0();break;case VK_NUMPAD1: OnNum1();break;case VK_NUMPAD2: OnNum2();break;case VK_NUMPAD3: OnNum3();break;case VK_NUMPAD4: OnNum4();break;case VK_NUMPAD5: OnNum5();break;case VK_NUMPAD6: OnNum6();break;case VK_NUMPAD7: OnNum7();break;case VK_NUMPAD8: OnNum8();break;case VK_NUMPAD9: OnNum9();break;case VK_ADD: OnAdd();break;case VK_SUBTRACT: OnMin();break;case VK_MULTIPLY: OnMul();break;case VK_DIVIDE: OnDiv();break;case VK_BACK:OnBackspace();break;case VK_DECIMAL: OnPt

溫馨提示

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

評論

0/150

提交評論