MFC簡單計算器設計正文.doc_第1頁
MFC簡單計算器設計正文.doc_第2頁
MFC簡單計算器設計正文.doc_第3頁
MFC簡單計算器設計正文.doc_第4頁
MFC簡單計算器設計正文.doc_第5頁
已閱讀5頁,還剩31頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

武漢理工大學面向對象程序設計課程設計說明書實用計算器程序1.基本功能描述計算器是人們日常生活中非常實用的計算工具。預期設計目標與實際計算器為標準,Windows 10系統提供的計算器為范例進行設計。實用計算器要實現單目運算和雙目運算。單目運算主要包括階乘、正弦、余弦;雙目運算主要包括加、減、乘、除、乘冪等。計算器要能夠對輸入的各種數據進行處理,包括小數、整數、負數等數據進行操作。實際過程中要能夠對不同的數據靈活判斷執行。同時要能夠對不滿足運算符的操作數,提示出錯信息以方便用戶進行處理。用戶的修改包括清屏和退格。程序設計的重點和難點在于:第一,能夠對于不同的操作數和操作符進行連續運算,運算過程中要有優先級的判斷,根據優先級執行不同的運算順序;第二,能夠用一個編輯框實現運算表達式的顯示和結果的輸出。編程環境采用Visual Studio 2017提供的MFC建立對話框應用程序,設計界面要簡單大方,并提供程序所有功能的接口。2.設計思路表1 操作符優先級設計優先級操作符1階乘、正弦、余弦2乘冪3乘、除4加、減對對話框編輯框關聯一個變量從中讀取數據,按下數字鍵時對數據數組num進行更新,其中num0表示的是當前已經存儲變量的個數。由于算法設計為四層優先級,且單目運算的優先級最高。當按下相應單目運算符,首先將當前數據數組的最后一個存儲(防止按下Backspace退格發生錯誤),并將此位數據執行運算后重新賦值。但按下雙目運算符相應按鍵后,將計數num0+,同時將運算符的類型和位置記錄。當按下等于之前,這樣就將一個單目雙目混合的運算表達式轉化為雙目運算。如果沒有按下等號鍵,則繼續執行循環。在按下等號按鈕之后,按照先乘冪、再乘除、后加減的運算順序執行運算,將最后結果保存并顯示。(在實際的計算器中,執行完運算之后,按下運算符的操作鍵,最終結果將按照左操作數的形式出現,故需要保存變量。)如果用戶沒有結束程序,在運行初始化程序,進行下一次運算,否則直接退出。圖1 程序流程圖3.軟件設計3.1 設計步驟 1)創建基于對話框的程序利用AppWizard建立應用程序框架,創建一個基于對話框的MFC工程,命名為“fengwanjincalculator”,如圖2所示。在圖3顯示的應用程序類型中選擇基于對話框。創建成功后,系統自動生成相應程序文件。圖2 創建MFC工程圖圖3 應用程序類型選擇圖2)定義成員變量添加相應變量和標志位,以方便程序的編寫,主要變量如表2所示:表2 成員變量表變量名變量類型變量作用mystrCString編輯框關聯變量m_editFontCFont設置編輯框字體numfloat存儲操作數flagdianbool點號標志位flagdengyubool等號標志位flagerrorbool錯誤標志位Jiajianint存儲加減運算符的位置4) 添加事件處理程序MFC應用程序是通過消息響應來進行各項操作的,必須在對話類中加入消息處理函數來處理這些事件。當點擊相應控件,在進入WinMain函數之前,每個可以響應消息的MFC類都生成了一個消息映射表,程序運行時通過查詢該表判斷是否需要響應某條消息。在相應控件單擊右鍵,彈出圖4,選擇添加事件處理程序,在圖5的事件處理程序向導中選擇fengwanjincalculatorDlg類,消息類型選擇為BN_CLICKED,即左鍵單擊。圖4 添加事件處理程序圖5 選擇添加事件處理程序類型在完成上述操作后 MFC使用ClassWizard幫助實現消息映射,它在源碼中添加一些消息映射的內容,并聲明和實現消息處理函數。首先,在類的定義(頭文件)里,它增加了消息處理函數聲明,并添加一行聲明消息映射的宏DECLARE_MESSAGE_MAP。在類的實現(實現文件)里,實現消息處理函數,并使用IMPLEMENT_MESSAGE_MAP宏實現消息映射。BEGIN_MESSAGE_MAP*END_MESSAGE_MAP3.2 界面設計圖5 向對話框添加控件在項目的資源視圖中找到位于Dialog下的對話框,如圖4所示。添加相應控件,完成用戶界面設計。圖6 用戶界面設計其中編輯框行為下Multiline屬性設置為True,作為多行編輯框。第一行顯示算式,第二行結果。整體上將控件分為四組,數值控件區NUM,加減乘除一般運算控件區NORMAL,階乘、乘冪、正余弦科學運算控件區SCIENCE以及清零退格控件。設計完成后的界面如圖7所示。圖7 用戶界面設計的界面中只有編輯框關聯Cstring類型變量mystr。其余控件關聯相應的消息處理函數。3.3 關鍵功能的實現程序主要分為數值、單目運算、雙目運算、清除等。1) 數值控件消息處理函數void CfengwanjincalculatorDlg:OnBnClickedButton1()shuzihanshu(L1, 1);考慮到09數字的處理函數有很大的相似處,所以都采用調用shuzhihanshu函數的方法執行。shuzhihanshu包含兩個參數,分別是數值對應字符和相應數值。其具體實現如下:void CfengwanjincalculatorDlg:shuzihanshu(char shuzi, int shuzhi)/09對應函數UpdateData(TRUE);if (flagdengyu)OnBnClickedButtonClear();flaglast = 0;mystr += shuzi;data = shuzhi;changevalue();UpdateData(FALSE);首先,判斷再點擊數值控件之前是否按下等號鍵,如果按下執行OnBnClickedButtonClear(),即執行清除函數,然后將單擊的數值顯示在編輯框中。如果之前沒有單擊等號,則直接將數值添加到顯示字符串的最后,通過UpdateData(FALSE)更新編輯框控件。同時需要將數值傳遞給data,通過changevalue()函數改變數值數組中的數值。2)雙目運算消息處理函數void CfengwanjincalculatorDlg:OnBnClickedButtonJia()/加sincos();if (flaglast = 0)|(flaglast = jiecheng)shuangmusuanfu(L+, jia);flaglast = jia;jiajian0+;jiajianjiajian0 = 1;雙目運算首先設置相應標志和參數的改變,其主要的函數體部分由shuangmusuanfu函數概括,其中jia參量為用枚舉定義的一個常量。枚舉定義如下:enum suit jia = 1 , jian , cheng , chu , jiecheng , zhishu , Sin , Cos ;shuangmusuanfu中函數實現部分:函數體中首先對是否按下等號是否有表達式錯誤進行判斷,如果相應標志為1,則轉到相應處理函數,否則將算符存儲,數值計數器num0加一。3)清除函數void CfengwanjincalculatorDlg:OnBnClickedButtonClear()UpdateData(TRUE);mystr = L;flagdian = 0;beishu = 1;flagerror = 0;data = 0;flagdengyu = 0;for (int i = 0; i LoadIcon(IDR_MAINFRAME);/ 自添加flagdian = 0;beishu = 1;flagerror = 0;data = 0;flagdengyu = 0;for (int i = 0; i SetFont(&m_editFont); / 設置新字體5、清屏函數void CfengwanjincalculatorDlg:OnBnClickedButtonClear()/ TODO: 在此添加控件通知處理程序代碼UpdateData(TRUE);mystr = L;flagdian = 0;beishu = 1;flagerror = 0;data = 0;flagdengyu = 0;for (int i = 0; i = 48 & temp 0; mizhi0-)nummizhimizhi0 = pow(nummizhimizhi0, nummizhimizhi0+1);for (int i = mizhimizhi0+1; i num0; i+)numi = numi + 1;num0-;for (int i = 1; i mizhimizhi0)if (chengchui 0)chengchui -= 1;elsechengchui += 1;for (; chengchu0 0; chengchu0-)if (chengchuchengchu0 0)numchengchuchengchu0 *= numchengchuchengchu0 + 1;elseif (num-chengchuchengchu0 + 1 = 0)AfxMessageBox(_T(除數不能為0!);flagerror = 1;OnBnClickedButtonClear();break;elsenum-chengchuchengchu0 /= num-chengchuchengchu0 + 1;for (int i = abs(chengchuchengchu0) + 1; i num0; i+)numi = numi + 1;num0-;float sum = num1;for (int i = 2; i = num0; i+)sum += jiajiani-1 * numi;for (int i = 0; i 10; i+)numi = 0;num1 = sum;num0 = 1;8、雙目算符對應函數void CfengwanjincalculatorDlg:shuangmusuanfu(char zifu,int shuzhi)/ 雙目算符對應函數UpdateData(TRUE);if (flagdengyu = 1)mystr = L;flagdian = 0;beishu = 1;flagdengyu = 0;for (int i = 0; i 10; i+)jiajiani = 0;chengchui = 0;mizhii = 0;flaglast = 0;if (!flagerror)mystr.Format(_T(%g), num1);elsefor (int i = 0; i 10; i+)numi = 0;flagdengyu = 0;num0+;/數值個數+if (!flagerror)mystr += zifu;flagdian = 0;beishu = 1;flagerror = 0;UpdateData(FALSE);9、09對應函數void CfengwanjincalculatorDlg:shuzihanshu(char shuzi, int shuzhi)/09對應函數UpdateData(TRUE);if (flagdengyu)OnBnClickedButtonClear();flaglast = 0;mystr += shuzi;data = shuzhi;changevalue();UpdateData(FALSE);10、各控件消息響應函數void CfengwanjincalculatorDlg:OnBnClickedButton1()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L1, 1);void CfengwanjincalculatorDlg:OnBnClickedButton2()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L2, 2);void CfengwanjincalculatorDlg:OnBnClickedButton3()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L3, 3);void CfengwanjincalculatorDlg:OnBnClickedButton4()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L4, 4);void CfengwanjincalculatorDlg:OnBnClickedButton5()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L5, 5);void CfengwanjincalculatorDlg:OnBnClickedButton6()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L6, 6);void CfengwanjincalculatorDlg:OnBnClickedButton7()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L7, 7);void CfengwanjincalculatorDlg:OnBnClickedButton8()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L8, 8);void CfengwanjincalculatorDlg:OnBnClickedButton9()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L9, 9);void CfengwanjincalculatorDlg:OnBnClickedButton0()/ TODO: 在此添加控件通知處理程序代碼shuzihanshu(L0, 0);void CfengwanjincalculatorDlg:OnBnClickedButtonDian()/ TODO: 在此添加控件通知處理程序代碼UpdateData(TRUE);if (flagdengyu)OnBnClickedButtonClear();elseif(flagdian=0)mystr += L.;flagdian = 1;flaglast = 0;UpdateData(FALSE);void CfengwanjincalculatorDlg:sincos()if (nextdata2 * (int)nextdata0 - 1 = Sin)nextdata2 * (int)nextdata0 = num(int)num0;num(int)num0 = sin(num(int)num0);nextdata2 * (int)nextdata0 - 1 = -Sin;if (nextdata2 * (int)nextdata0 - 1 = Cos)nextdata2 * (int)nextdata0 = num(int)num0;num(int)num0 = cos(num(int)num0);nextdata2 * (int)nextdata0 - 1 = -Cos;void CfengwanjincalculatorDlg:OnBnClickedButtonJia()/加/ TODO: 在此添加控件通知處理程序代碼sincos();if (flaglast = 0)|(flaglast = jiecheng)shuangmusuanfu(L+, jia);flaglast = jia;jiajian0+;jiajianjiajian0 = 1;void CfengwanjincalculatorDlg:OnBnClickedButtonJian()/減/ TODO: 在此添加控件通知處理程序代碼sincos();if (flaglast = 0) | (flaglast = jiecheng)shuangmusuanfu(L-, jian);flaglast = jian;jiajian0+;jiajianjiajian0 = -1;void CfengwanjincalculatorDlg:OnBnClickedButtonCheng()/乘/ TODO: 在此添加控件通知處理程序代碼sincos();if (flaglast = 0) | (flaglast = jiecheng)shuangmusuanfu(L*, cheng);flaglast = cheng;chengchu0+;chengchuchengchu0 = (int)num0-1;void CfengwanjincalculatorDlg:OnBnClickedButtonChu()/除/ TODO: 在此添加控件通知處理程序代碼sincos();if (flaglast = 0) | (flaglast = jiecheng)shuangmusuanfu(L/, chu);flaglast = chu;chengchu0+;chengchuchengchu0 = -(int)num0-1);void CfengwanjincalculatorDlg:OnBnClickedButtonZhishu()/指數/ TODO: 在此添加控件通知處理程序代碼sincos();if (flaglast = 0) | (flaglast = jiecheng)shuangmusuanfu(L, zhishu);flaglast = zhishu;mizhi0+;mizhimizhi0 = (int)num0-1;void CfengwanjincalculatorDlg:OnBnClickedButtonJiecheng()/階乘/ TODO: 在此添加控件通知處理程序代碼if (fl

溫馨提示

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

評論

0/150

提交評論