基于MFC的简易计算器制作设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《一个简单的计算器设计》课程设计报告学院:计算机工程学院学号:2012304030223姓名:朱钟雄专业年级:12计算机应用技术2班指导教师:游明坤时间:2014年12月25日JINGCHUUNIVERSITYOFTECHNOLOGY基于对话框的计算器MFC方法实现随着社会的发展,人们在日常生活中经常需要用到计算器来进行简单或者复杂的运算,计算器在人们生活中的地位也越来越重要。简单的计算器能实现加、减、乘、除、开方、平方等运算。学习了C++的程序设计语言这门课程,可以利用基于VC的MFC方法制作一个简易的计算器,实现基本的运算功能,从而满足生活中的需要,降低计算的难度。一.面向对象的程序设计方法区别与面向过程的“先功能后数据”思想,面向对象的程序设计方法把状态(数据)和行为(功能)捆绑在一起,形成了对象。当遇到一个具体的问题时,我们只需要将一个系统分解成一个个的对象,同时将状态和行为封装在对象中。面向对象的程序设计方法具有三个基本特点:封装、继承和多态。(1)封装性封装是一个用来指代将对象的状态和行为捆绑到一个单一逻辑单元的机制的正式术语。它不是面向对象语言所特有的,面向过程的C语言用结构封装了数据,函数封装了逻辑。但是面向对象封装了两者,从这种意义上来说,面向对象的封装更加完美。出于一些安全性与方便性的考虑,对象经常会限制对它们特征(包括属性和方法)的访问,这种限制称为信息隐藏。作为对象的抽象,类通常只公开对象可以公开的东西,主要是一个特定对象对系统的服务,而隐藏执行服务的内部细节和为了完成这些服务而设计的数据。(2)继承性继承是定义新类的一种机制,使用这种机制创建新类时只需要声明新类和已创建类之间的差别。对于一个特定的继承关系,我们将创建的新类称为子类(subclass),被继承的原始类称为超类(superclass)。子类可以使用超类定义属性和方法,也可以自己定义新的属性和方法。超类的特征不会受到子类的影响。继承带来的第一个且是最显而易见的好处是减少了代码冗余,因此也减轻了需要改进或重写代码时的负担。进一步地,子类会比不使用继承时更加简洁,这点应当不难理解;通过继承可以不加修改地重用和扩展已经彻底测试的代码,这避免了工程性的组装对已经完成测试代码的影响;最好的一点,即使没有已有类的源代码,仍然可以从已有的类中派生出新类,只要我们拥有那个类编译后的字节码。(3)多态性术语多态指的是属于两个或多个不同类的对象以各自的类相关的不同方式响应同一消息(方法调用)的能力。同一个消息根据发送的对象不同而采用多种不同的行为方式。换句话说多态使得消息发送者能给一组具有公共接口的对象发送相同的消息,接收者做出相应的回应。多态的作用:增强了代码的可读性、操作的透明性,增强了代码的灵活性和可扩充性。二.MFC程序设计方法(1)API应用程序编程的接口函数一个应用程序要和具体的硬件打交道,比如接收按键值,接收鼠标左击或右击,记录鼠标的坐标等,就势必要有所有这些硬件的驱动,这样加大了程序的代码量。而且,每一个应用程序都得写,增加了不必要的重复工作。操作系统就是解决这些问题的。操作系统基于硬件和应用程序之间,它提供应用程序调用的函数,应用程序可通过这些函数与硬件打交道。而这些函数就是API。(2)MFC(MicrosoftFoundationClass)微软基础类库MFC类库集成了大量已经预先定义好的类,用户可以根据编程的需要调用响应的类,或根据需要自定义有关的类。(3)窗口就是一个应用程序能够看到的部分。是Windows应用程序中一个非常重要的元素。通常都包含标题栏、菜单栏、系统菜单等(4)消息和消息队列消息:应用程序接收的事件都会产生相应的消息,消息的产生是因为事件发生的结果。如键盘有键盘按下和抬起消息,鼠标有点击消息,画面有刷新消息,重画消息等。编写应用程序时,如果需要对某事件进行响应,如需要当按下Ctrl+S组合键就进行保存操作时,就需要对Ctrl+S这个事件对应的消息设计响应函数。消息队列:应用程序对事件消息进行的响应时从它本身的消息队列里取出消息来执行的。事件是有操作系统接收的,然后把它转化成消息,再把消息送到应用程序所在的队列中,供应用程序取走。(5)事件驱动Windows应用程序函数执行过程没有一个固定的顺序。一条消息过来就对应进行响应(只要设计了响应函数),那条消息来就执行那条对应的函数,没有消息就等待。MFC程序设计的好处:一是MFC提供了一个标准化的结构,通过创建时的选择就可以实现一个基本的程序功能。这样不必从头开始设计创建和管理一个标准Windows应用程序所需的代码,节省了时间;二是它可以自动生成很多代码,比如只要用类向导(ClassWizard)添加了一个成员变量,它就会自动在代码的相应位置添加代码进去,如果手动添加,不光麻烦,而且文件很多,位置不固定可能会遗漏。所以类向导是经常需要用的,以提高编程效率,减少出错。MFC编程的主要过程就是编写消息响应函数的过程,因为其他的工作都自动生成了。因此就需要我们知道如何添加消息响应函数(用类向导),响应函数中写什么内容。响应函数的内容主要是调用系统函数,类里定义的成员函数,系统的系统函数,以及变量的传递等。三.MFC实现计算器的程序设计程序流程图主要程序代码如下://为了能在同一个编辑框里显示完整的算式,我添加了两个编辑框,同时输入,一个负责计算数据的不可见,另一个可见的用来显示。voidCJncalDlg::OnNUM1()//点击数字键1时显示1{UpdateData(TRUE);m_str1=m_str1+1;/在编辑框1的字符串后加上字符1m_str2=m_str2+1;/在编辑框2的字符串后加上字符1UpdateData(FALSE);}voidCJncalDlg::OnNUM2()//按下数字键2时显示数字2{UpdateData(TRUE);m_str1=m_str1+2;//在编辑框1的字符串后加上字符2m_str2=m_str2+2;//在编辑框2的字符串后加上字符2UpdateData(FALSE);}voidCJncalDlg::OnNUM3()//按下数字键3时显示数字3{UpdateData(TRUE);m_str1=m_str1+3;//在编辑框1的字符串后加上字符3点击加减乘除等进行运算选择点击数字键,输入第二个操作数点击数字键,输入第一个操作数点击“=”键,输出运算结果程序开始显示运算结果m_str2=m_str2+3;//在编辑框2的字符串后加上字符3UpdateData(FALSE);}数字键4、5、6、7、8、9、0、00的代码同上voidCJncalDlg::OnSUB()//加法{UpdateData(TRUE);m_str2=m_str2++;//显示框上显示“+”UpdateData(FALSE);SaveValue1();//调用函数将第一个操作数变为double型并保存m_Sign=0;//选择语句的条件赋值}voidCJncalDlg::OnDEC()//减法{UpdateData(TRUE);m_str2=m_str2+-;//显示框上显示“-”UpdateData(FALSE);SaveValue1();//调用函数将第一个操作数变为double型并保存m_Sign=1;//选择语句的条件赋值}voidCJncalDlg::OnMUL(){UpdateData(TRUE);m_str2=m_str2+×;//显示框上显示“×”UpdateData(FALSE);SaveValue1();//调用函数将第一个操作数变为double型并保存m_Sign=2;//选择语句的条件赋值}voidCJncalDlg::OnDIV()//除法{UpdateData(TRUE);m_str2=m_str2+÷;//显示框上显示“÷”UpdateData(FALSE);SaveValue1();//调用函数将第一个操作数变为double型并保存m_Sign=3;//选择语句的条件赋值}voidCJncalDlg::OnEQUAL()//“=”操作{Calculator();//调用Calculator函数}voidCJncalDlg::SaveValue1()//保存第一个操作数函数{UpdateData(TRUE);m_num1=atof(m_str1);//第一个编辑框内的字符转换为数字并赋给m_fNumber1m_str1=;//清空第一个编辑框UpdateData(FALSE);}voidCJncalDlg::Calculator()//Calculator函数{UpdateData(TRUE);m_num2=atof(m_str1);//编辑框1内的字符转换成数字并赋值给m_fNumber2doubler=0.0f;switch(m_Sign)//选择语句{case0://加f=m_num1+m_num2;break;case1://减f=m_num1-m_num2;break;case2://乘f=m_num1*m_num2;break;case3://除if(m_num2==0.0f){MessageBox(输入错误,请重新输入);}else{f=m_numn1/m_num2;}break;case4://平方f=m_num2*m_num2;break;case5://开方f=sqrt(m_num2);break;default:break;}if(r-int(r)=1e-5)//如果浮点数其实是个整数{m_str1.Format(%d,(int)f);m_str2=m_str2+=+m_str1+;}else{m_str1.Format(%f,f);m_str2=m_str2+=+m_str1+;}UpdateData(FALSE);m_num1=r;m_num2=0.0f;}voidCJncalDlg::OnABOUT()//软件关于按钮{CAboutDlgdlg;dlg.DoModal();//调用}voidCJncalDlg::OnCE()//清空编辑框操作{UpdateData(TRUE);m_str1=;//第一个编辑框赋空值m_str2=;//第二个编辑框赋空值m_num1=0.0f;//第一个操作数赋0m_num2=0.0f;//第二个操作数赋0m_Sign=0;UpdateData(FALSE);}voidCJncalDlg::OnDEL()//退格操作{UpdateData(TRUE);if(!m_str1.IsEmpty())//移除编辑框内最右边一个字符{m_str1=m_str1.Left(m_str1.GetLength()-1);m_str2=m_str2.Left(m_str2.GetLength()-1);}UpdateData(FALSE);}//以下为显示当前时间操作intCJncalDlg::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CDialog::OnCreate(lpCreateStruct)==-1)return-1;SetTimer(1,1000,NULL);//设置定时器return0;}voidCJncalDlg::OnTimer(UINTnIDEvent){SYSTEMTIMEst;GetLocalTime(&st);CStringstr_time;str_time.Format(%d:%d:%d,st.wHour,st.wMinute,st.wSecond);SetDlgItemText(IDC_STATICTIME,str_time);CDialog::OnTimer(nIDEvent);}四、试验结果展示计算器的整体效果图。我在计算器的顶端加入了显示当前日期和时间的功能,更加方便快捷。加法功能的实现减法功能的实现乘法功能的实现除法功能的实现本计算器除了能实现加减乘除运算,还能进行平方(x^2)和开方(sqrt

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功