仿Windows电子计算器的设计_第1页
仿Windows电子计算器的设计_第2页
仿Windows电子计算器的设计_第3页
仿Windows电子计算器的设计_第4页
仿Windows电子计算器的设计_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计报告课程名称 面向对象程序设计设计题目 仿Windows电子计算器的设计系别 机电系班级学生姓名学号任课老师 完成时间2009.12.23 设计任务 起至日期:2009.12.14设计题目:仿Windows电子计算器的设计设计要求:设计要求:设计一电子计算器,功能类似于Windows自带的电子计算器;基于Visual C+开发平台;给出计算器相关算法的设计思想及流程图;给出电子计算器实现的Visual C+源代码;给出运行测试结果,提交源代码包。仿Windows电子计算器的设计设计任务与要求设计一电子计算器,功能类似于Windows自带的电子计算器;基于Visual C+开发平台;给出

2、计算器相关算法的设计思想及流程图;给出电子计算器实现的Visual C+源代码;给出运行测试结果,提交源代码包。设计思想程序简介: 本程序在VS.NET2005的c+语言中的MFC开发制作,经测试(使用动态dll库)在同等环境(VS.NET2005)下可以正常运行执行文件完成计算器功能。使用静态dll库时候,不改变执行程序路径可以正常运行,但移动到其他位置的执行文件运行会缺少3D按钮效果,其他功能不变。但在VC6.0和.NET2003环境下不能直接使用(提示缺少库文件)。解决办法是使用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正负号的改变可以通过每按下该键后执行n=-n来执行。对于负数的录入功能,也由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的功能并不难,难得是设计的合理.所谓合理就是在各种情况下用户的输入都是预期的结果.而不是受到前次输入数据的干扰.如实现不按等号的连续运算(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.这是由于正负数没有分开讨论的结果系统在处理时候第3个按键会处理成-2*10+2,即显示的-18.本计算器很好的处理了这一bug.类似的bug处理细节还有很多,就不一一列举了.下面指出本计算器的缺陷.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. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论