MFC计算器.docx
《MFC计算器.docx》由会员分享,可在线阅读,更多相关《MFC计算器.docx(25页珍藏版)》请在冰豆网上搜索。
![MFC计算器.docx](https://file1.bdocx.com/fileroot1/2023-7/9/38d0f0b4-9102-4105-b56e-b069ebf18b10/38d0f0b4-9102-4105-b56e-b069ebf18b101.gif)
MFC计算器
C语言工程训练报告
设计题目:
简单计算器
专业:
电子信息科学与技术
班级:
12
学号:
031341205
姓名:
谢亮
指导老师:
杨兴忠
日期:
2014年6月29日——2014年5月30日
成绩:
目录
第一章问题的描述
第二章功能分析
第三章设计
第四章源程序
第五章测试
第一章问题的描述
计算器(calculator),该名词由日文传入中国。
计算器能进行数学运算的常用工具,结构简单,比现代电脑结构简单得多,较为方便,可广泛运用于商业交易中,是必备的办公用品之一,能够进行加、减、乘、除四则运算,高级的计算器还具有函数计算及统计功能等,显示计算结果。
在现代社会中,计算器已经进入了每一个家庭,人们在生活和学习中经常需要使用到计算器,它的出现大大减少了人们在计算方面的工作量,可以说它在人们生活和学习中是不可缺少的。
计算器只是简单的计算工具,有些机型具备函数计算功能,计算器和计算机一样都能够实现数据的录入、处理、存储和输出,区别于计算机的就是,它不能自动地实现这些操作过程,必须由人来操作完成。
本论文主要是讨论在VC++环境下的,通过MFC来编写一个计算器,除了实现简单的加减乘除等简单运算外,还可以添加了一些常用的功能,可以解决平时一些简单的运算。
第2章功能分析
能实现基本的运算加、减、乘、除四则运算,可以实现一些其他的功能,如开方、取反等。
本设计是简单计算器。
日常计算机使用中,常常涉及到一些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需要空间资源较少,对电脑其他程序的应用影响较小。
它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性;醒目美观的软件封面。
使用人员能快捷简单地进行操作。
即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。
本计算器是在基于对话框的应用程序中模拟一个计算器,本计算器可以进行十进制下的四则运算加、减、乘、除和四则混合运算,添加了一些特殊的功能如“开方”,系统开发平台为Windows7,程序设计设计语言采用VisualC++6.0,程序运行平台为Windows7/XP/8。
程序通过调试运行,初步实现了设计目标。
现在介绍一下按钮的功能:
*乘法。
+加法。
%取余数。
sqrt开方。
+/-改变显示数字的符号。
-减法。
.插入小数点。
/除法。
0–9将此数字置于计算器的显示区。
1/x计算显示数字的倒数。
=对上两个数字执行任意运算。
若要重复上一次的运算,请再次单击“=”。
Backspace删除当前显示数字的最后一位。
C清除当前的计算。
CE清除显示数字。
M+显示的数字与内存中已有的任何数字相加,但不显示这些数字的和。
M-显示的数字与内存中已有的任何数字相减,但不显示这些数字的减。
MC清除内存中的所有数字。
MR重调用存内存中的数字。
该数字保留在内存中。
MS将显示数字保存在内存中。
sqrt计算显示数字的平方根。
另外我增加了一个编辑框,用来显示保存的数据,个人感觉很实用,可以有效的查看必要的数据。
第三章设计
1.计算器界面
计算器界面包括主题“高级计算器”和背景图片,在计算区上有显示文本框和数字按钮以及运算符按钮。
在计算区上部分有运算模式选择模块和小提示语句。
设计思路与分析:
a)首先考虑对所有按键分为两类,数字类和符号类,0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/,=为符号类。
数字在计算的过程中最多需要保存两个,所以定义了两个double型变量来进行存储。
符号需要一个char来存储。
b)然后考虑在计算的过程中,一种是是程序刚开始运行还没有开始录入数字的状态。
二种是第一个数字已经录入,符号也已经录入时候直接赋值。
c)因为数字全部使用的是double,键入的数字必须通过一定的处理达到累加的效果,加上小数和整数的处理差异性大,所以要进行判断,分辩出来小数和整数。
页面设计与控件部分:
首先打开VC++6.0,选择MFCAppWizard[exe],设定好路径和工程名(这里我设置工程名为为“031341205”)。
这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”。
此时我们把当前页面上原配的控件按Delete全部清除。
接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加,我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面,当然作为“所见即所得”的MFC控件设计,干净整齐的界面是基本要求,甚至会影响用户的心情。
我们用按钮控件添加按钮,分别是数字“0~9”以及“+-*/”。
每个控件“属性”都有属于它自己的ID,默认的按钮按键为IDC_BUTTON0,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID之后。
这里我们把数字按钮0设置ID,其他的依次类推,就需给控件添加消息响应了,基本操作可以是直接双击控件,便会有向导提示。
MFC默认下了的响应信息都为On_开头,之后所有的依次类推,这步骤一般不对成员函数名称做任何修改,直接点击OK即可之后就会跳转到具体的代码实现过程这里我们依次给每一个控件添加消息响应函数。
到此为止,我们基本上完成了计算器页面的前半部分预备工作,下来是我们的对控件具体实现代码的添加,这里我把添加的控件消息响应函数。
2.模块功能简介
系统分为多个模块,分别为计算模块、错误分析模块、界面显示模块和模式选择模块。
其中计算模块用来进行各种基本的加、减、乘、除的运算并且显示运算结果;错误分析模块用来进行错误处理;界面显示模块用来美化计算器界面;择模块用来进行运算模式的选择和切换,以实现不同的运算要求。
3.程序框图
4.资源编辑
3、效果图
第四章源程序
(1)添加的头文件
#include"math.h"//对sqrt添加头文件
#include"SkinH.h"//添加皮肤的头文件
#pragmacomment(lib,"SkinH.lib")
(2)编写的源程序
voidCMy031341205Dlg:
:
OnButton1()//数字按钮1
{
c_result+="1";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton2()//数字按钮2
{
c_result+="2";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton3()//数字按钮3
{
c_result+="3";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton4()//数字按钮4
{
c_result+="4";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton5()//数字按钮5
{
c_result+="5";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton6()//数字按钮6
{
c_result+="6";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton7()//数字按钮7
{
c_result+="7";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton8()//数字按钮8
{
c_result+="8";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton9()//数字按钮9
{
c_result+="9";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton10()//数字按钮0
{
c_result+="10";
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton17()//操作符'+'
{
sign();
c_flag='+';
}
voidCMy031341205Dlg:
:
sign()//对输入的操作符进行处理
{
UpdateData(true);
d_num2=atof(c_result);
if(i_mark==1)
switch(c_flag1)
{
case'a':
d_num2=-d_num2;break;
case's':
d_num2=sqrt(d_num2);break;
case'c':
d_num2=1/d_num2;
}
else
switch(c_flag)
{
case'+':
d_num1+=d_num2;break;
case'-':
d_num1-=d_num2;break;
case'*':
d_num1*=d_num2;break;
case'/':
(double)d_num1/=d_num2;break;
case'%':
d_num1=(int)d_num1%(int)d_num2;break;
case'=':
d_num1=d_num2;
}
if(i_mark==1)
c_result.Format("%.2f",d_num2);
else
c_result.Format("%.2f",d_num1);
UpdateData(false);
i_mark=0;
c_result="";
}
voidCMy031341205Dlg:
:
OnButton18()//操作符'-'
{
sign();
c_flag='-';
}
voidCMy031341205Dlg:
:
OnButton19()//操作符'*'
{
sign();
c_flag='*';
}
voidCMy031341205Dlg:
:
OnButton20()//操作符'/'
{
sign();
c_flag='/';
}
voidCMy031341205Dlg:
:
OnButton21()//操作符'sqrt'
{
sign();
c_flag='s';
}
voidCMy031341205Dlg:
:
OnButton22()//操作符'%'
{
sign();
c_flag='%';
}
voidCMy031341205Dlg:
:
OnButton23()//操作符'1/x'
{
sign();
c_flag='c';
}
voidCMy031341205Dlg:
:
OnButton24()//操作符'='
{
sign();
c_flag='=';
}
voidCMy031341205Dlg:
:
OnButton16()//操作数后添加'.',重复按小数点,进行一次
{
UpdateData(true);
if(i_mark==0)
{
i_mark=1;
c_result+='.';
}
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton27()//操作符'Backspce'
{
UpdateData(true);
c_result=c_result.Left(c_result.GetLength()-1);
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton15()//操作符'+/-'
{
sign();
c_flag='a';
}
voidCMy031341205Dlg:
:
OnButton25()//操作符'EC'
{
c_result="";
i_mark=0;
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton26()//操作符'C'
{
c_result="";
c_flag='=';
d_num1=0;
d_num2=0;
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton11()//操作符'MC'
{
m_result="";
d_num3=0;
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton14()//操作符'M+'
{
UpdateData(true);
d_num3+=atof(c_result);
c_result="";
m_result.Format("%.2f",d_num3);
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton28()//操作符'M-'
{
UpdateData(true);
d_num3-=atof(c_result);
c_result="";
m_result.Format("%.f",d_num3);
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton12()//操作符'MR'
{
c_result=m_result;
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnButton13()//操作符'MS'
{
UpdateData(true);
m_result=c_result;
UpdateData(false);
}
voidCMy031341205Dlg:
:
OnTimer(UINTnIDEvent)//计算器上显示系统时间
{
CTimetime=CTime:
:
GetCurrentTime();
CStringstring=time.Format("%Y-%m-%d--%H:
%M:
%S");//时间格式
SetWindowText(string);
CDialog:
:
OnTimer(nIDEvent);
}
第五章测试
计算器能加减乘除四则运算等的运算,用鼠标单击一个数然后再单击相应的运算符即能实现相应的功能。
下面对计算器的相关操作功能作测试:
(1)四则运算(以乘法为例):
例如:
“1*3=3”,用鼠标点击数字“1”,“*”,“3”再单击“=”则屏幕上就会显示“3”,如下图:
点击1的界面
点击*的界面
点击3时的界面
点击=时的界面
小结
本次C语言课程设计我是按照老师的要求来完成的,通过一个多星期的折腾,总算把课程设计给完成了,这是一个坚苦而又漫长的过程。
看着劳动成果,很欣慰!
刚开始,可以说是完全没有头绪,于是上网查,找到了些与我题目相似的源代码,然后对之进行修改,测试,最后得到我这次课程设计所需要的代码. 通过计算器的设计这一课题的设计和实现,我对简单的C语言编程有了进一步的认识,对Microsoft Visual C++ 6.0这个程序的操作更加熟练了一些。
回顾此次的课程设计,我学到了很多东西不仅巩固了书本的知识并且与实践相结合提高具体操作能力,在设计的过程中发现自己的不足,有些知识掌握的不够牢靠,通过这次的课程设计之后我把前面所学的知识又重新温故了一遍。
同时,在老师和同学身上我学到了很多非常实用的知识,在此对给过我帮助的同学和老师表示由衷的感谢!
1.工作内容
这次实验报告主要研究的内容就是熟悉C++的应用领域mfc的制作过程,并且能够在VisualC++6.0的环境下进入操作,掌握工作流程,了解C++的特点、功能,掌握如何用C++来编程的要点及结构,区别C与其区别和联系,更进一步的,要求在C++的工作环境下编辑一个简单的计算器,并且能够正常运行。
2.工作量的大小
运行程序,在不同的运算模式下输入数据然后进行调试。
在单步运算模式下应分别测试加、减、乘、除以及除数为0和被除数小于除数这两种特殊情况。
在算式运算模式下除了要测试与单步运算相同的内容外,还应注意算术优先级是否正确,运算结果是否正确。
注意清零功能是否能够正确实现。
经测试没有发现错误,系统运开始运行计算加减运算,读入字符,计算乘除运算,输出结果,结束,开始,读入字符,计算结果,读入运算符,读入字符,输出结果,结束,显示界面,模式选择,程序计算,显示计算结果,输入算式,单步运算,算式运算,输入数据,调用动态链接库,C++程序设计设计性实验,运行正常。
3、完成情况
通过每步的设计工作、修改,网上查找答案,同学的帮助,完成程序的设定,并经过调试、运行,能够正常运行,可以实现基本的加减乘除,能够满足我们的需要,因此成功的完成。
此次程序设计遇到了很多困难,让我认识到了自己的太多不足,同时上网查资料的时候也让我知道了网络是个非常大的资料库,对于编程来说学会调试则是一个非常好的编程习惯,希望自己以后多多使用,也希望同学们多多使用。
在程序设计中遇到困难遇到错误是不可避免的,我们应该学会调试,一个会编程的人一定是会调试的人,同时调试是个非常乏味且烦躁的工作,所以我们应该在编程前尽量做好多的准备,尽量减少我们的调试时间。
写这个程序的时候才发现,原来做一些程序的时候,拿来就上机实现,而不做任何准备,那只能应付小程序,一旦像现在这样写一个很大的程序时,就发现在长长的一大块里面找一个小错误是多么的困难。
如果调试很久也成功不了,就要考虑是不是自己储备的某些知识是错的,一直在误导你,这个时候就需要去重新认真的看看书,看看资料,之后就恍然大悟了。
4、问题与解决方法
问题一:
对C++工程建立有点不熟悉。
解决方法:
询问问同学,到图书馆借用相关的书籍,了解其工作环境,对C++有初步的了解。
问题二:
对C++面向对象程序设计结构和特点不熟悉,编程无从下手。
解决方法:
去图书馆借有关C++语言的书籍,全面,彻底的了解C++,了解它的函数,文件,语句,循环等等,从书本上的例题出发,搞懂每一步程序的作用和功能。
通过比较它和C语言的异同点,找到学习C++的更好的方法,在编程过程中还参考了老师的编程。
问题三:
在调试过程中,很多时候会遇到很多问题,答案是无法找出错误,导致程序不能进行
解决方法:
通过网上寻找答案,从而找出错误,修改后,继续调试,进行后续工作,在找出其他错误,直到最后程序没有出现问题。
5、收获和体会
上学期上过c语言,书上有一个简易的编程,但是对于利用MFC这个类库制作能进行科学运算的方法还不是很了解。
感觉写得并不是很好,因为还有一些问题没有得到完全的解决,只能以后有空再好好想想了!
本来还想上网学一下MFC的美化,把这个页面做得好看一些的,所以只是在同学的指点下添加了计算器的背景图。
总的来说,这次的课程设计,还是让自己学到不少东西。
本次MFC计算器的制作,学习到了MFC基本的编程方法,增加了小组开发的团结协作能力。
对mfc编程的理解进一步加深。
但是程序仍然没存在一定的问题,比如除数不能为0这个漏洞没有考虑,符号键多次点击结果混乱。
如果有更多的时间,必定这些问题会更加深入讨论。
通过这次课程设计,以后Windows应用程序势必会轻车熟路。
对自己的要求:
1、需要有好的C/C++基础。
正所谓“磨刀不误砍柴工”,最开始接触VC++6.0时不要急于开始Windows程序开发,而是应该进行一些字符界面程序的编写。
这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉一些在编程中常犯的错误。
更重要的是理解并能运用C++的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用MFC进行开发的对C++一定要能熟练运用。
2、理解Windows的消息机制,窗口句柄和其他GUI句柄的含义和用途。
了解和MFC各个类功能相近的API函数。
3、一定要理解MFC中消息映射的作用。
4、训练自己在编写代码时不使用参考书而是使用HelpOnline。
5、记住一些常用的消息名称和参数的意义。
6、学会看别人的代码。
7、多看书,少买书,买书前一定要慎重。
8、闲下来的时候就看参考书。
6、改进方向
在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。
在程序设计中,可以用两种方法解决问题:
一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。
由于多个函数均需要访问某些数据,这些数据常被设计为全局变量。
而在面向对象程序设计中关键是如何将问题域中的实体(即日常所见的概念)抽取出来,作为C++程序中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还应考虑类必须满足的约束。
感觉到自己现在的不足——基础不够扎实,很多东西都是一知半解,真的要好好加强对基础知识的学习了!
很多问题,不仅仅只是把功能实现就行了,还要注意代码的优化,把结果做得更好!
系统使用说明书:
首先进行模式选择,在单步运算时,先点击下一个数字,再点击运算符,再点击下一个数字,然后点击等于号显示结果,如果被除数为零,则提示错误,按清零键后重新输入。
在算式运算时,随便输入一个算式,计算器可识别算式错误不显示,显示的就是输入的算式,点等于号后显示结果,如果被除数为零,则提示错误,按清零键后重新输入,如果输入一个运算符后,只能输入数字不能再输入运算符,如果此时点击运算符,则不会显示在算式中。
致谢
这次C语言工程设计让我学到了很多,从编程中可以看出编写一个程序的是一件很难的事。
要想成为一名优秀的程序员,需要持久的耐心和深厚的专业知识。
虽然这次我这组的课程设计题目不是很难,但要做好也不是一件很容易的事情。
我努力使我的设计更加完美,我也有幸得到杨兴忠老师的指导,使我能够顺利完成我的课程设计,我同时也要感谢其他同学给予我帮助的同学,他们使我认识到团队的力量。
再一次感谢所有帮助我完成这次课程设计的人。
参考文献
1.谭浩强编著《C程序设计(第三版)》北京清华大学出版社2005
2.谭浩强编著《C程序设计题解与上机指导》北京清华大学出版社2005
3.Decoder编著《C/C++程序设计》北京中国铁路出版社2002
4.朱站立编著《数据结构(C语言版)》西安西安交通大学出版社2006
所有工程链接: