版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課程設計報告課程名稱 面向對象程序設計設計題目 仿Windows電子計算器的設計系別 機電系班級學生姓名學號任課老師 完成時間2009.12.23 設計任務 起至日期:2009.12.14設計題目:仿Windows電子計算器的設計設計要求:設計要求:設計一電子計算器,功能類似于Windows自帶的電子計算器;基于Visual C+開發(fā)平臺;給出計算器相關算法的設計思想及流程圖;給出電子計算器實現的Visual C+源代碼;給出運行測試結果,提交源代碼包。仿Windows電子計算器的設計設計任務與要求設計一電子計算器,功能類似于Windows自帶的電子計算器;基于Visual C+開發(fā)平臺;給出
2、計算器相關算法的設計思想及流程圖;給出電子計算器實現的Visual C+源代碼;給出運行測試結果,提交源代碼包。設計思想程序簡介: 本程序在VS.NET2005的c+語言中的MFC開發(fā)制作,經測試(使用動態(tài)dll庫)在同等環(huán)境(VS.NET2005)下可以正常運行執(zhí)行文件完成計算器功能。使用靜態(tài)dll庫時候,不改變執(zhí)行程序路徑可以正常運行,但移動到其他位置的執(zhí)行文件運行會缺少3D按鈕效果,其他功能不變。但在VC6.0和.NET2003環(huán)境下不能直接使用(提示缺少庫文件)。解決辦法是使用installshield制作軟件安裝包。在沒有裝有VS.NET2005的機器上可以用安裝包安裝該計算器,該安
3、裝包會在桌面放置一程序快捷方式和卸載圖標。本軟件不寫注冊表。程序基本實現思路:1當前輸入的數據,和數據處理過程均由變量n完成。因為最多是2元運算,另設一變量n_2表示第2個數,需要時由n_2=n賦值。2數字錄入部內容相似,首先建立一個函數inum(),負責處理所輸入的數字,按下相應數字鍵時候,調用inum()完成數字的輸入和顯示。3數據計算部分.由函數operation(char ope),通過選擇所按下的運算符(該函數的變量)來完成相應的計算并顯示。由于運算符分為單元運算和雙元 所以具有類似性,分開處理。4小數輸入。按下小數點后,變量setxiaoshu=true,激活小數輸入功能。inum
4、()做出輸入小數的判斷并輸出預期數。5正負號的改變可以通過每按下該鍵后執(zhí)行n=-n來執(zhí)行。對于負數的錄入功能,也由inum()做出判斷,完成正確的負數錄入過程。6等號的實現調用operation(operate),完成相應運算。7刪除一個字符,用n=long(n/10)的思路來完成,由于long的范圍,所以刪除只能實現10位以內的刪除。8CE和C鍵。CE負責清楚欲輸入的第2個數據的相關變量,C清空所有變量,重置計算器。模塊設計及程序清單根據上述設想編寫程序,主要代碼如下:/ CalculateDlg.cpp : implementation file/#include stdafx.h#inc
5、lude Calculate.h#include CalculateDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard gener
6、ated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_IN
7、ITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CCalculateDlg dialogCCalculateDlg:CCalculateDlg(CWnd* pParent /*=NULL*/)
8、: CDialog(CCalculateDlg:IDD, pParent)/AFX_DATA_INIT(CCalculateDlg)/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);m_str=;m_db1=0;m_db2=0;m_bOper=FALSE;m_chOpe
9、rator= ;m_store=0;m_b2=FALSE;void CCalculateDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CCalculateDlg)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CCalculateDlg, CDialog)/AFX_MSG_MAP(CCalculateDlg)ON_WM_SYSCOMMAND()ON_WM_PA
10、INT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN0, OnBtn0)ON_BN_CLICKED(IDC_BTN1, OnBtn1)ON_BN_CLICKED(IDC_BTN2, OnBtn2)ON_BN_CLICKED(IDC_BTN3, OnBtn3)ON_BN_CLICKED(IDC_BTN4, OnBtn4)ON_BN_CLICKED(IDC_BTN5, OnBtn5)ON_BN_CLICKED(IDC_BTN6, OnBtn6)ON_BN_CLICKED(IDC_BTN7, OnBtn7)ON_BN_CLICKED(IDC_BTN8, On
11、Btn8)ON_BN_CLICKED(IDC_BTN9, OnBtn9)ON_BN_CLICKED(IDC_BTN_DIVIDE, OnBtnDivide)ON_BN_CLICKED(IDC_BTN_MULTIPLY, OnBtnMultiply)ON_BN_CLICKED(IDC_BTN_MINUS, OnBtnMinus)ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)ON_BN_CLICKED(IDC_BTN_EQUAL, OnBtnEqual)ON_BN_CLICKED(IDC_BTN_DOT, OnBtnDot)ON_BN_CLICKED(IDC_BTN_SQ
12、RT, OnBtnSqrt)ON_BN_CLICKED(IDC_BTN_REC, OnBtnRec)ON_BN_CLICKED(IDC_BTN_NEGATIVE, OnBtnNegative)ON_BN_CLICKED(IDC_BTN_MC, OnBtnMc)ON_BN_CLICKED(IDC_BTN_MPLUS, OnBtnMplus)ON_BN_CLICKED(IDC_BTN_MR, OnBtnMr)ON_BN_CLICKED(IDC_BTN_MS, OnBtnMs)ON_BN_CLICKED(IDC_BTN_BACKSPACE, OnBtnBackspace)ON_BN_CLICKED(
13、IDC_BTN_CE, OnBtnCe)ON_BN_CLICKED(IDC_BTN_C, OnBtnC)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CCalculateDlg message handlersBOOL CCalculateDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0 xFFF0) = IDM_ABOUT
14、BOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set smal
15、l icon/ TODO: Add extra initialization hereSetDlgItemText(IDC_EDIT_DISPLAY,0);return TRUE; / return TRUE unless you set the focus to a controlvoid CCalculateDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0 xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID,
16、lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CCalculateDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingS
17、endMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the ic
18、ondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CCalculateDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CCalculateDlg:OnBtn0() / TODO: Add your control notification handler code hereif(
19、m_str=0)m_str.Empty();m_str+=0;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);if(m_bOper)m_b2=TRUE;void CCalculateDlg:OnBtn1() / TODO: Add your control notification handler code hereif(m_str=0)m_str.Empty();m_str+=1;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);if(m_bOper)m_b2=TRUE;void CCalculateDlg:OnBtn2() / TO
20、DO: Add your control notification handler code hereif(m_str=0)m_str.Empty();m_str+=2;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);if(m_bOper)m_b2=TRUE;void CCalculateDlg:OnBtn3() / TODO: Add your control notification handler code hereif(m_str=0)m_str.Empty();m_str+=3;SetDlgItemText(IDC_EDIT_DISPLAY,m_str)
21、;if(m_bOper)m_b2=TRUE;void CCalculateDlg:OnBtn4() / TODO: Add your control notification handler code hereif(m_str=0)m_str.Empty();m_str+=4;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);if(m_bOper)m_b2=TRUE;void CCalculateDlg:OnBtn5() / TODO: Add your control notification handler code hereif(m_str=0)m_str.E
22、mpty();m_str+=5;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);if(m_bOper)m_b2=TRUE;void CCalculateDlg:OnBtn6() / TODO: Add your control notification handler code hereif(m_str=0)m_str.Empty();m_str+=6;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);if(m_bOper)m_b2=TRUE;void CCalculateDlg:OnBtn7() / TODO: Add your co
23、ntrol notification handler code hereif(m_str=0)m_str.Empty();m_str+=7;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);if(m_bOper)m_b2=TRUE;void CCalculateDlg:OnBtn8() / TODO: Add your control notification handler code hereif(m_str=0)m_str.Empty();m_str+=8;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);if(m_bOper)m_b
24、2=TRUE;void CCalculateDlg:OnBtn9() / TODO: Add your control notification handler code hereif(m_str=0)m_str.Empty();m_str+=9;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);if(m_bOper)m_b2=TRUE;void CCalculateDlg:OnBtnDivide() / TODO: Add your control notification handler code hereif(m_bOper)if(m_b2)Calculate
25、();elseGetDlgItemText(IDC_EDIT_DISPLAY,m_str);m_db1=atof(m_str);m_str=;m_bOper=TRUE;m_chOperator=/;void CCalculateDlg:OnBtnMultiply() / TODO: Add your control notification handler code hereif(m_bOper)if(m_b2)Calculate();elseGetDlgItemText(IDC_EDIT_DISPLAY,m_str);m_db1=atof(m_str);m_str=;m_bOper=TRUE
26、;m_chOperator=*;void CCalculateDlg:OnBtnMinus() / TODO: Add your control notification handler code hereif(m_bOper)if(m_b2)Calculate();elseGetDlgItemText(IDC_EDIT_DISPLAY,m_str);m_db1=atof(m_str);m_str=;m_bOper=TRUE;m_chOperator=-;void CCalculateDlg:OnBtnAdd() / TODO: Add your control notification ha
27、ndler code hereif(m_bOper)if(m_b2)Calculate();elseGetDlgItemText(IDC_EDIT_DISPLAY,m_str);m_db1=atof(m_str);m_str=;m_bOper=TRUE;m_chOperator=+;void CCalculateDlg:OnBtnEqual() / TODO: Add your control notification handler code hereif(m_bOper)Calculate();m_bOper=FALSE;void CCalculateDlg:Calculate()GetD
28、lgItemText(IDC_EDIT_DISPLAY,m_str);m_db2=atof(m_str);switch(m_chOperator)case /:if(m_db2=0)SetDlgItemText(IDC_EDIT_DISPLAY,零不能做除數);return;m_db1=m_db1 / m_db2;break;case *:m_db1=m_db1 * m_db2;break;case -:m_db1=m_db1 - m_db2;break;case +:m_db1=m_db1 + m_db2;break;default:break;m_str.Format(%.10f,m_db
29、1);m_str=round(m_str);SetDlgItemText(IDC_EDIT_DISPLAY,m_str);m_str.Empty();m_b2=FALSE;void CCalculateDlg:OnBtnDot() / TODO: Add your control notification handler code hereif(m_str.Find(.)!=-1)return;m_str+=.;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);void CCalculateDlg:OnBtnSqrt() / TODO: Add your contr
30、ol notification handler code heredouble dbTemp;GetDlgItemText(IDC_EDIT_DISPLAY,m_str);dbTemp=atof(m_str);dbTemp=sqrt(dbTemp);m_str.Format(%.10f,dbTemp);m_str=round(m_str);SetDlgItemText(IDC_EDIT_DISPLAY,m_str);m_str.Empty();void CCalculateDlg:OnBtnRec() / TODO: Add your control notification handler
31、code heredouble dbTemp;GetDlgItemText(IDC_EDIT_DISPLAY,m_str);dbTemp=atof(m_str);dbTemp=1/dbTemp;m_str.Format(%.10f,dbTemp);m_str=round(m_str);SetDlgItemText(IDC_EDIT_DISPLAY,m_str);m_str.Empty();void CCalculateDlg:OnBtnNegative() / TODO: Add your control notification handler code heredouble dbTemp;
32、GetDlgItemText(IDC_EDIT_DISPLAY,m_str);dbTemp=atof(m_str);dbTemp=-dbTemp;m_str.Format(%.10f,dbTemp);m_str=round(m_str);SetDlgItemText(IDC_EDIT_DISPLAY,m_str);void CCalculateDlg:OnBtnMc() / TODO: Add your control notification handler code herem_store=0;SetDlgItemText(IDC_EDIT_M,);void CCalculateDlg:O
33、nBtnMplus() / TODO: Add your control notification handler code heredouble dbTemp;GetDlgItemText(IDC_EDIT_DISPLAY,m_str);dbTemp=atof(m_str);m_store+=dbTemp;m_str.Empty();SetDlgItemText(IDC_EDIT_M,M);void CCalculateDlg:OnBtnMr() / TODO: Add your control notification handler code herem_str.Format(%.10f
34、,m_store);m_str=round(m_str);SetDlgItemText(IDC_EDIT_DISPLAY,m_str);m_str.Empty();void CCalculateDlg:OnBtnMs() / TODO: Add your control notification handler code heredouble dbTemp;GetDlgItemText(IDC_EDIT_DISPLAY,m_str);dbTemp=atof(m_str);m_store=dbTemp;m_str.Empty();SetDlgItemText(IDC_EDIT_M,M);void
35、 CCalculateDlg:OnBtnBackspace() / TODO: Add your control notification handler code hereGetDlgItemText(IDC_EDIT_DISPLAY,m_str);int len=m_str.GetLength();if(len=1)m_str=0;elsem_str=m_str.Left(len-1);SetDlgItemText(IDC_EDIT_DISPLAY,m_str);void CCalculateDlg:OnBtnCe() / TODO: Add your control notificati
36、on handler code herem_str=0;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);void CCalculateDlg:OnBtnC() / TODO: Add your control notification handler code herem_db1=0;m_db2=0;m_bOper=FALSE;m_str=0;SetDlgItemText(IDC_EDIT_DISPLAY,m_str);CString CCalculateDlg:round(CString str)int index=str.Find(.);if(index=-1
37、)return str;int len=str.GetLength();int i;for(i=len-1; i=index; i-)if(str.GetAt(i)!=0)break;if(i=index)str=str.Left(i);elsestr=str.Left(i+1);return str;運行測試結果與分析計算器設計成寬型的,更符合人們手移動鼠標的習慣,因為橫向移動比縱向簡單.把數字錄入部分放在中間,右邊放上常用的運算符,左邊放上不常用的函數,可以減少移動鼠標的總距離.CE C Backspace放在上面,分成明顯的4大塊布局,使用戶更快適應新計算器的各鍵位置.設計心得這次程序設
38、計,讓我對windows編程有了新的體會.一個程序的嚴密性是最重要的.而簡單的實現加減乘除等運算和backspace的功能并不難,難得是設計的合理.所謂合理就是在各種情況下用戶的輸入都是預期的結果.而不是受到前次輸入數據的干擾.如實現不按等號的連續(xù)運算(e.g. 1+1+1可以直接通過按這5個鍵實現.不用按1 + 1 = + 1 =,即避免了中間按等號的麻煩).按了等號后,顯示出計算結果后直接輸入數據不會和上次顯示的結果混為一個數(e.g. 如按了=顯示上次運算的結果為1,這時再按1,應該顯示的是新的運算的開始,即顯示1,而不嚴密的計算器會把上次顯示的1和這次輸入的1合成一個數,即顯示11.這
39、不是用戶預期的效果.)如按下backspace后應該可以直接修改數據.但不嚴密的計算器會存在這樣一個bug,即如果是多位小數,如12.34時候,這時按下兩次backspace時候,顯示的是1但要在接著輸入數據時候,比如按下2,預期的顯示應該是12.而部分計算器會顯示1.002,因為它沒有同步改變小數點的判斷,致使輸入數據時候不是預期結果.再如代碼里解釋的正負數的輸入地方,用戶按下2 +/- 2時候,顯示的依次應該是2,-2,-22,但部分計算器會出現顯示的數據為2,-2,-18.這是由于正負數沒有分開討論的結果系統(tǒng)在處理時候第3個按鍵會處理成-2*10+2,即顯示的-18.本計算器很好的處理了這一bug.類似的bug處理細節(jié)還有很多,就不一一列舉了.下面指出本計算器的缺陷.backspace鍵的實現,調用了類型轉換long int(double),這樣就局限了退格的范圍為10e10的范圍.在輸入0 . 0 3時候,計算器默認應該顯示的依次是0,0.,0.0,0.03,但由于數據會自動去掉最后的0,所以中間會只顯示0.,直至按下3 后才會顯示0.03這個預期的結果.解決辦法是把顯示的變量換成string型的.并把輸入的數據默認為char型的,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學班級管理年度發(fā)展策略報告
- 語文知識與能力訓練答案
- 腸鏡前后健康宣教
- 餐飲連鎖店衛(wèi)生安全自查清單
- 2025版甲減癥狀分析及中醫(yī)調理護理要點
- 管理人員崗位安全培訓教材匯編
- 中國飲食文化概述
- 醫(yī)療機構患者隱私保護規(guī)范指南
- 營養(yǎng)管路的護理
- 六年級語文課外閱讀教學資料
- 全國水資源中長期供求規(guī)劃技術指南與大綱解讀
- 數據資產會計核算的現狀與問題研究
- 監(jiān)理履約考核管理辦法
- 艾梅乙培訓課件
- 貨物運輸安全管理制度
- 《電子工業(yè)全光網絡工程技術規(guī)范》
- 3 面粉碼垛機器人的結構設計
- 肝癌介入免疫聯合-洞察及研究
- 衛(wèi)生毒理學課程教學大綱
- 涂氟及窩溝封閉的治療
- 腦梗塞所致精神障礙病人護理
評論
0/150
提交評論