c面向对象程序设计MFC简单计算器实验报告.docx
- 文档编号:27283578
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:16
- 大小:98.29KB
c面向对象程序设计MFC简单计算器实验报告.docx
《c面向对象程序设计MFC简单计算器实验报告.docx》由会员分享,可在线阅读,更多相关《c面向对象程序设计MFC简单计算器实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
c面向对象程序设计MFC简单计算器实验报告
计算机与信息工程学院
《程序设计基础》课程设计报告
题目名称:
60.编写一个能实现简单功能的计算器
学生姓名:
刘沛东
学生学号:
2011508154
专业班级:
电子信息工程
(1)班
指导教师:
高攀
1课程设计的题目
编写一个能实现简单功能的计算器
2题目要求
1.有一个计算器图形。
2.能实现加、减、乘、除及乘方的运算。
3.当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色
例如:
输入数字1时,在计算器图形上的1键变为红色。
4.屏幕、图形颜色、形状自定
3总体设计
3.1总体框架
图1系统框架
3.2系统功能说明
在VC++6.0中绘制计算器界面,各控件的设置
对0~9控件设定相应的ID和其他属性:
图2“1”控件设置
对“+、-、*、\”控件设定相应的ID和其他属性:
图2“+”控件设置
对其它控件设定相应的ID和其他属性:
图3其它控件设置
主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。
拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。
4程序详细设计
4.1系统主调模块
图5程序流程图
4.2各模块详细设计
4.2.1建立的变量,控件的命名,对应的消息处理函数对应表
ID
CAPTION
MessageHandler
IDD_CALC_DIALOG
简易计算器
N/A
IDC_NUM0
0
OnNum0
IDC_NUM1
1
OnNum1
IDC_NUM2
2
OnNum2
IDC_NUM3
3
OnNum3
IDC_NUM4
4
OnNum4
IDC_NUM5
5
OnNum5
IDC_NUM6
6
OnNum6
IDC_NUM7
7
OnNum7
IDC_NUM8
8
OnNum8
IDC_NUM9
9
OnNum9
IDC_NEG
+/-
OnNeg
IDC_PT
.
OnPt
IDC_DIV
/
OnDiv
IDC_MUL
*
OnMul
IDC_MIN
-
OnMin
IDC_ADD
+
OnAdd
IDC_BACKSPACE
BACK
OnBackspace
IDC_CE
CE
OnCe
IDC_CLEAR
C
OnClear
IDC_EQU
=
OnEqu
IDC_DIS
N/A
N/A
OnCal(doublenum)
变量定义:
doublepoz;//保存小数点的位置,初始化为1,表示poz-1个小数点。
doublem_Dis;//Edit控件上需要显示的数字
BOOLpoint_flag;//小数点表示位,判定是否是小数,是小数为1,不是小数为0。
doublenumfirst;//保存计算过程中的前一个数字,
doublenumsecond;//保存计算过程中的第二个数字
charop;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’
变量初始化:
poz=1;
m_Dis=0.0;
numfirst=0;
numsecond=0;
op=0;
4.4.2设计思路
a)首先考虑对所有按键分为两类,数字类和符号类,0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/,=为符号类。
数字在计算的过程中最多需要保存两个,所以定义了两个double型变量numfirst和numsecond来进行存储。
符号需要一个charop来存储。
b)然后考虑在计算的过程中,numfirst和numsecond的存储状态有三种,一种是numfirst==0&&numsecond==0也就是程序刚开始运行还没有开始录入数字的状态。
二种是numfirst!
=0&&numsecond==0也就是第一个数字已经录入,符号也已经录入时候把m_Dis的值直接赋值给numfirst,第三种是numfirst!
=0&&numsecond!
=0,表示可以通过op来把两数合并为一个数。
c)考虑到该计算器支持连续的计算,比如3.33+1.33*88/96=?
。
所以必须在点符号Button也要计算出之前的结果,通过判断op,来计算,把两个数字合并为一个数字,方便下一次运算,功能近似于点=,所以把=也划分到符号类。
d)因为数字全部使用的是double,键入的数字必须通过一定的处理达到累加的效果,加上小数和整数的处理差异性大,所以分别用point_flag来判断,分别出来小数和整数。
4.2.3成员函数及其释义
因为对OnNum0()到OnNum9()的处理函数差异仅在一个数字上,可以通过调用一个共同的函数OnCal(doublenum)来简化源代码长度,增加模块性。
voidCCalcDlg:
:
OnCal(doublenum)
{//分三种状态来处理
if(numfirst!
=0&&numsecond!
=0)
{
if(point_flag==TRUE)//判定为小数
{
poz*=0.1;//小数进位
m_Dis=m_Dis+poz*num;//递增
UpdateData(false);//把结果从内存传递到屏幕
}
else
{
m_Dis=m_Dis*10+num;
UpdateData(false);
}
}
if(numfirst!
=0&&numsecond==0)
{
if(point_flag==TRUE)
{
poz*=0.1;
m_Dis=m_Dis+poz*num;
UpdateData(false);
}
else//判定为整数
{
m_Dis=m_Dis*10+num;//递增
UpdateData(false);
}
}
if(numfirst==0&&numsecond==0)
{
if(point_flag==TRUE)
{
poz*=0.1;
m_Dis=m_Dis+poz*num;
UpdateData(false);
}
else
{
m_Dis=m_Dis*10+num;
UpdateData(false);
}
}
}
4.2.4以OnAdd()为例子讲解符号的处理函数,函数的功能是先判定之前按下字符时op的值,更具op的值来进行相应的运算。
voidCCalcDlg:
:
OnAdd()
{//根据numfirst和numsecond和op的值分为5种状态。
if(numfirst!
=0&&numsecond==0&&op=='+')
{
numsecond=m_Dis;
numfirst=numfirst+numsecond;//之前按的是加把两个数赋值到前一个数
m_Dis=numfirst;//赋值给屏幕
numsecond=0;//从新赋值为0,清空,不影响下一次判断
UpdateData(FALSE);
m_Dis=0;//屏幕的值同时清空
}
if(numfirst!
=0&&numsecond==0&&op=='-')
{
numsecond=m_Dis;
numfirst=numfirst-numsecond;
m_Dis=numfirst;
numsecond=0;
UpdateData(FALSE);
m_Dis=0;
}
if(numfirst!
=0&&numsecond==0&&op=='*')
{
numsecond=m_Dis;
numfirst=numfirst*numsecond;
m_Dis=numfirst;
numsecond=0;
UpdateData(FALSE);
m_Dis=0;
}
if(numfirst!
=0&&numsecond==0&&op=='/')
{
numsecond=m_Dis;
numfirst=numfirst/numsecond;
m_Dis=numfirst;
numsecond=0;
UpdateData(FALSE);
m_Dis=0;
}
if(numfirst==0&&numsecond==0)
{//该状态为程序启动还没有开始录入输入的状态
numfirst=m_Dis;//屏幕的值赋值到numfirst
UpdateData(FALSE);
m_Dis=0;
}
op='+';//最后记录最后一个操作是+
poz=1;//小数点位置归位
point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE
}
“+/-“按钮的处理函数
voidCCalcDlg:
:
OnNeg()
{
m_Dis=-m_Dis;//换个符号,其他都一样
UpdateData(FALSE);
poz=1;
point_flag=FALSE;
}
‘.’按钮的处理函数
voidCCalcDlg:
:
OnPt()
{
point_flag=TRUE;//把标志位改为“小数点”状态
}
“Backspace”按钮的处理
voidCCalcDlg:
:
OnBackspace()
{
//主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换
charbuffer[30];//定义个装字符的数组
_gcvt(m_Dis,sizeof(m_Dis),buffer);//把m_Dis存的数字转换为string
for(inti=0;i<30;i++)
{
if(buffer[i]=='.'&&buffer[i+1]==0)//判断是否为整数
{
point_flag=FALSE;//标志位设置为“整数位”
break;
}
}
if(point_flag==TRUE)//如果是小数
{
for(intj=0;j<30;j++)
{
if(buffer[j]==0)
{
buffer[j-1]=0;//把’\0’之前的字符赋值为’\0’,就相当于剪掉最后一位
break;
}
}
}
else//如果是整数
{
buffer[i-1]=0;//剪掉’.’之前那位
}
m_Dis=strtod(buffer,NULL);//再用strtod弄成浮点数
UpdateData(FALSE);
poz=1;
}
‘CE’按钮处理函数
voidCCalcDlg:
:
OnCe()
{
if(numfirst!
=0&&numsecond==0)//CE只能修改第二个数字
{
m_Dis=0;//把屏幕的值赋值为0
UpdateData(FALSE);//并显示出来
}
}
‘C’按钮处理函数
voidCCalcDlg:
:
OnClear()
{
op=NULL;//清空符号
numfirst=0;//清空第一个数字
numsecond=0;//清空第二个数字
point_flag=FALSE;//改为默认整数位
poz=1;//小数点归位
m_Dis=0;
UpdateData(FALSE);//屏幕显示归0
}
键盘响应:
voidCCalcDlg:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
switch(nChar)
{
caseVK_NUMPAD0:
OnNum0();break;
caseVK_NUMPAD1:
OnNum1();break;
caseVK_NUMPAD2:
OnNum2();break;
caseVK_NUMPAD3:
OnNum3();break;
caseVK_NUMPAD4:
OnNum4();break;
caseVK_NUMPAD5:
OnNum5();break;
caseVK_NUMPAD6:
OnNum6();break;
caseVK_NUMPAD7:
OnNum7();break;
caseVK_NUMPAD8:
OnNum8();break;
caseVK_NUMPAD9:
OnNum9();break;
caseVK_ADD:
OnAdd();break;
caseVK_SUBTRACT:
OnMin();break;
caseVK_MULTIPLY:
OnMul();break;
caseVK_DIVIDE:
OnDiv();break;
caseVK_BACK:
OnBackspace();break;
caseVK_DECIMAL:
OnPt();break;
caseVK_DELETE:
OnBackspace();break;
caseVK_RETURN:
OnEqu();break;
}
CDialog:
:
OnKeyDown(nChar,nRepCnt,nFlags);
}
BOOLCCalcDlg:
:
PreTranslateMessage(MSG*pMsg)
{
SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
returnCDialog:
:
PreTranslateMessage(pMsg);
}
5程序运行结果
6课程设计总结
通过这次课程设计,我又收获到很多,平时的在做作业时,因为题形与结构都是很简单的,并且每一章的内容都是有相应的例题可以参考,所以在做题时没有遇到过很麻烦的问题,而这次不同了,一个课题拿到手时,给我的感觉是无从下手,而且要求很多,使得题目要求更大了。
我将整个程序分块完成的.将整个大的程序的实现分8个功能,每个功能都通过一个相应的函数来实现.在调试时分别进行调试,使得调试更方便些.在编写各个函数只是按着题目要求的去完成,后来经指导老师指导后,发现了很多自己欠缺的地方,又一次将程序整体进行调试.最后把程序完善了许多。
本次MFC计算器的制作,学习到了MFC基本的编程方法。
对OOP编程的理解进一步加深。
但是程序仍然存在一定的问题,比如除数不能为0的Exceptionhandle,符号键多次点击结果混乱。
通过这次课程设计,以后Windows应用程序势必会轻车熟路。
参考书目:
[1]谭浩强,《C++程序设计》,北京,清华大学出版社,2006年。
[2]孙鑫《深入浅出MFC》,视频教程。
[3]《Visual_C++MFC入门教程》,电子版。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 MFC 简单 计算器 实验 报告