计算器程序设计C++MFC.docx
- 文档编号:7795891
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:13
- 大小:152.60KB
计算器程序设计C++MFC.docx
《计算器程序设计C++MFC.docx》由会员分享,可在线阅读,更多相关《计算器程序设计C++MFC.docx(13页珍藏版)》请在冰豆网上搜索。
计算器程序设计C++MFC
《C++程序设计》(MFC)
课程设计报告
设计题目:
简易计算器
班级:
姓名:
学号:
指导教师:
时间:
2010年6月30日
目录
1.设计目标……………………………………………………………
2.设计内容……………………………………………………………
3.设计思想……………………………………………………………
4.设计说明……………………………………………………………
5.设计步骤……………………………………………………………
6.主要成员函数关系图………………………………………………
7.程序主要代码………………………………………………………
8.难点分析……………………………………………………………
9.总结…………………………………………………………………
简易计算器(MFC)
1.设计目标
了解Windows应用程序的结构与DOS程序的不同,掌握应用MFC类库编写Windows应用程序的基本模式。
2.设计内容
以简易计算器为例,通过对简单应用软件计算器的设计,编制、调试,实现简单的加,减,乘,除等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。
3.设计思想
基于MFC库类对对话框界面的设计,通过创建类成员函数成员变量,编辑控件创建消息映射,调用消息函数完成数据的输入输出,实现计算功能。
生成简单的应用软件。
4.设计说明
(1)包含的功能有:
加、减、乘、除运算,开方、平方等功能。
(2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。
(3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。
(4)计算功能基本上是用系统内部函数。
(5)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象。
(6)“CE”按钮可以清除所有已输入的数据从头计算
5.设计步骤
(1)选择FileNewlProject命令,选择MFCAppWizard(exe)创建Project名为Caa,按确定。
在弹出界面选择创建对话框,单击Finish按钮
(2)在生成的设计界面中加入控件,得到计算器应用界面。
如图:
(3)为控件编辑框编辑ID,如图:
按钮名称
ID
用途
0
IDC_0
按键0
1
IDC_1
按键1
2
IDC_2
按键2
3
IDC_3
按键3
4
IDC_4
按键4
5
IDC_5
按键5
6
IDC_6
按键6
7
IDC_7
按键7
8
IDC_8
按键8
9
IDC_9
按键9
.
IDC_dian
按键.
+/-
IDC_zhengfu
正负
+
IDC_jia
加
-
IDC_jian
减
*
IDC_cheng
乘
/
IDC_chu
除
CE
IDC_qinglin
清零
sqrt
IDC_sqrt
开方
x*x
IDC_pingfang
平方
=
IDC_dengyu
等于
编辑框
IDC_E1
显示数据输入输出
(4)进入ClassWizard界面选择MessageMaps为控件插入消息映射,插入消息函数,实现控件命令功能。
如图:
(5)进入ClassWizard界面MessageVaribles为编辑框添加成员变量m_result用以显示结果。
如图:
(6)在CaaDlg.h中加入在主要成员函数和成员变量的申明在CaaDlg.cpp中加入主要成员函数实现过程和成员变量的初始化(代码片段将于后面介绍)。
6.主要成员函数关系图
7.程序主要代码
//在头文件中手动添加成员函数与变量声明
//caaDlg.h:
headerfile
//定义两个euum型结构
enumOperator{OpNone,OpAdd,OpSubtract,OpMultiply,OpDivide};
enumCalcError{ErrNone,ErrDivideByZero};
floatm_operand;//存储当前输入的操作数
floatm_accum;//存储当前的计算处理结束
BOOLm_bCoff;//标识当前输入是否是小数
floatm_coff;//小数输入时的系数
Operatorm_operator;//enum型变量用以标识当前运算符
CalcErrorm_errorState;//enum型变量用以标识当前运算状态
BOOLm_bOperandAvail;//标识当前输入是否是新输入数字
voidUpdateDisplay();//处理显示
voidCalculate();//处理计算
voidOnOperandInput(inta);//处理数字输入
//在执行文件中添加成员函数实现部分与变量初始
//caaDlg.cpp:
implementationfile
//以下是对声明变量进行初始
CCaaDlg:
:
CCaaDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CCaaDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CCaaDlg)
m_result=_T("");//默认为m_result变量初始
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_coff=0.1;//为变量进行初始
m_bCoff=0;//为变量进行初始
m_errorState=ErrNone;//为变量进行初始
m_bOperandAvail=FALSE;//为变量进行初始
m_operator=OpNone;//为变量进行初始
}
//以下是消息处理函数,用以响应消息映射
voidCCaaDlg:
:
On0()//处理“0”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput(0);
}
voidCCaaDlg:
:
On1()//处理“1”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput
(1);
}
voidCCaaDlg:
:
On2()//处理“2”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput
(2);
}
voidCCaaDlg:
:
On3()//处理“3”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput(3);
}
voidCCaaDlg:
:
On4()//处理“4”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput(4);
}
voidCCaaDlg:
:
On5()//处理“5”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput(5);
}
voidCCaaDlg:
:
On6()//处理“6”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput(6);
}
voidCCaaDlg:
:
On7()//处理“7”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput(7);
}
voidCCaaDlg:
:
On8()//处理“8”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput(8);
}
voidCCaaDlg:
:
On9()//处理“9”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
OnOperandInput(9);
}
voidCCaaDlg:
:
Oncheng()//处理“*”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
Calculate();
m_operator=OpMultiply;
}
voidCCaaDlg:
:
Onchu()//处理“/”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
Calculate();
m_operator=OpDivide;
}
voidCCaaDlg:
:
Ondengyu()//处理“=”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
Calculate();
m_operator=OpNone;
}
voidCCaaDlg:
:
Ondian()//处理“.”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_bCoff=1;
UpdateDisplay();
}
voidCCaaDlg:
:
Onjia()//处理“+”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
Calculate();
m_operator=OpAdd;
}
voidCCaaDlg:
:
Onjian()//处理“-”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
Calculate();
m_operator=OpSubtract;
}
voidCCaaDlg:
:
Onpingfang()//处理“x*x”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_operand*=m_operand;
UpdateDisplay();
}
voidCCaaDlg:
:
Onqinglin()//处理“CE”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_operator=OpNone;
m_operand=0;
m_accum=0;
m_bOperandAvail=FALSE;
m_errorState=ErrNone;
m_coff=0.1;
m_bCoff=0;
UpdateDisplay();
}
voidCCaaDlg:
:
Onsqrt()//处理“sqrt”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_operand=sqrt(m_operand);
UpdateDisplay();
}
voidCCaaDlg:
:
Onzhengfu()//处理“+/-”按钮
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_operand*=-1;
UpdateDisplay();
}
//以下是自定义函数,用于实现计算功能
voidCCaaDlg:
:
OnOperandInput(inta)//处理0-9数字的输入函数
{if(m_errorState!
=ErrNone)//判断当前运算是否有误,若有则返回
return;
if(!
m_bOperandAvail)//判断是否输入新的数字,1-是0-否
m_operand=0;
if(!
m_bCoff)//判断是否是小数输入,1-是0-否
m_operand=m_operand*10+(a);
else
{
m_operand=m_operand+(a)*m_coff;
m_coff*=0.1;
}
m_bOperandAvail=TRUE;
UpdateDisplay();//更新显示
}
voidCCaaDlg:
:
Calculate()//处理计算函数
{
if(m_errorState!
=ErrNone)
return;
if(m_bOperandAvail)
{
//如果没有计算符就将m_operand值赋予m_accum
if(m_operator==OpNone)
m_accum=m_operand;
elseif(m_operator==OpMultiply)//否则按计算符进行计算
m_accum*=m_operand;
elseif(m_operator==OpDivide)
{
if(m_operand==0)
m_errorState=ErrDivideByZero;
else
m_accum/=m_operand;
}
elseif(m_operator==OpAdd)
m_accum+=m_operand;
elseif(m_operator==OpSubtract)
m_accum-=m_operand;
}
m_bOperandAvail=FALSE;
m_bCoff=0;
m_coff=0.1;
UpdateDisplay();
}
voidCCaaDlg:
:
UpdateDisplay()//处理显示函数
{
if(GetSafeHwnd()==NULL)
return;
if(m_errorState!
=ErrNone)
m_result="除数不能为零";
else//如果当前计算无错误那么进行显示
{
//如果是输入计算数,那么显示输入情况,如果按下计算符,则显示结果
floatlVal=(m_bOperandAvail)?
m_operand:
m_accum;
m_result.Format(_T("%f"),lVal);//将float型转化为CString型
inti=m_result.GetLength();
while(m_result.GetAt(i-1)=='0')
{
m_result.Delete(i-1,1);
i-=1;
}
}
//用编辑控件变量m_result改变编辑控件的值,更新显示
UpdateData(FALSE);
}
8.难点分析
在利用MFC编写计算器过程中,遇到的技术上的问题,及解决方法。
例如:
⑴.计算数输入的处理
在程序中使用m_operand来存储当前的输入。
而程序只使用一个函数来处理所有数字输入,也就是说每次单击数字按钮就会调用该函数。
由于计算数不仅仅是个位数,因此用户可能需要单击几个数字按钮来完成一个计算数的输入,这样在每次输入时都必须将输入的数字累加入m_operand中。
而且对于小数输入和整数输入也必须采取不同的累加方式。
如对整数的输入,累加方式为:
m_operand=m_operand*10+n;其中n为输入的数字。
而对于小数输入,累加方式为:
m_operand=m_operand+n*10i;其中n为数字,i为小数位数。
因此在程序中还需设立布尔型变量m_coff的值来标识当按下按钮小数点的时候来确定调用哪个累加方式。
⑵.自定义消息处理函数、成员函数、变量
在添加自定义函数、变量时需注意函数及变量的声明在头文件中如:
CaaDlg.h;而函数的实现部分及变量的初始在执行文件中如:
CaaDlg.cpp。
值得提醒的是手动添加消息处理函数时,需声明在头文件//{{AFX_MSG(CCaaDlg)…//}}AFX_MSG中的部分。
而添加消息映射在执行文件
//{{AFX_MSG_MAP(CCaaDlg)…//}}AFX_MSG_MAP中的部分。
最后将消息处理函数添加到执行文件末即可。
9.总结
课程设计到此已告一段落,经过团队的努力,在将近一个月的实践中课程设计基本完成了。
从中学到很多有用的知识,也积累了不少宝贵的经验。
从一开始对MFC这样一个陌生的类库名词,在不断的翻阅书籍学习中开始渐渐的有所了解,虽然在此次课程设计我们只是针对性的去学习对对话框应用程序的编程模式,但也体会到了MFC这类库的博大精深。
想全部了解这样一个类库,今后还需多下功夫。
本次课程设计我们完成了一个简易计算器应用软件,在此期间,遇上了不少的技术难题,但是经过努力,通过查找资料,难题还是一个个被解决了,从中学到了许多课堂上没学到的东西,这是很值得高兴的。
经过设计的各个环节,从中学到了很多,锻炼了系统的设计的能力,培养了团队分工合作精神。
这样对我们以后在工作中或学习中得到很好的锻炼,为用VC++编辑软件奠定基础。
在本次实践期间对简易计算器的设计虽然大体实现各个控件的功能,但仍存在许多的不足与漏洞,还待以后的不断学习进一步完善。
参考文献:
[1]《VisualC++7.0起步进阶》,国防工业出版社武装等编著
[2]《VisualC++基础教程》,西安电子科技大学出版社,2006.6
开发环境:
MicrosoftVisualC++6.0
MicrosoftVisualC++7.0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算器 程序设计 MFC
![提示](https://static.bdocx.com/images/bang_tan.gif)