MFC计算器课程设计报告
- 格式:doc
- 大小:76.50 KB
- 文档页数:6
如有你有帮助,请购买下载,谢谢!
1页 MFC计算器课程设计报告
计算机应用3班 黄锦湫,罗洁,饶益
指导老师:蒋鹏
一.题目:利用MFC框架编写简易计算器
要求使用MFC框架在Visual Studio 6.0环境下编写一个简易的计算器,支持任意位数的加减乘数,正负转换,并且实现BackSpace CE C功能。
二.设计过程
1. Windows消息处理机制的理解
首先编写程序需要对Windows程序的消息处理机制(Message Handle)有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。还有用户消息,比如鼠标的单击,双击,键盘的键入等。
2. 界面的设计
仿照Windows附件里面的计算器,在资源视图中画好界面,如图:
主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。
3. 建立的变量,控件的命名,对应的消息处理函数对应表
ID CAPTION Message Handler
IDD_CALC_DIALOG 简易计算器 1.0 Beta1版 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 如有你有帮助,请购买下载,谢谢!
2页 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(double num)
变量定义:
double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。
double m_Dis; //Edit控件上需要显示的数字
BOOL point_flag; //小数点表示位,判定是否是小数,是小数为1,不是小数为0。
double numfirst; //保存计算过程中的前一个数字,
double numsecond;//保存计算过程中的第二个数字
char op;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’
变量初始化:
poz=1;
m_Dis = 0.0;
numfirst=0;
numsecond=0;
op=0;
4. 设计思路
a) 首先考虑对所有按键分为两类,数字类和符号类,0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/,=为符号类。数字在计算的过程中最多需要保存两个,所以定义了两个double型变量numfirst和numsecond来进行存储。符号需要一个char op来存储。
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来判断,分别出来小数和整数。
5. 成员函数及其释义
因为对OnNum0()到OnNum9()的处理函数差异仅在一个数字上,可以通过调用一个共同的函数OnCal(double num)来简化源代码长度,增加模块性。void CCalcDlg::OnCal(double num){ //分三种状态来处理
if(numfirst!=0 && numsecond!=0)
{ 如有你有帮助,请购买下载,谢谢!
3页 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);
}
}
}
以OnAdd()为例子讲解符号的处理函数,函数的功能是先判定之前按下字符时op的值,更具op的值来进行相应的运算。
void CCalcDlg::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; 如有你有帮助,请购买下载,谢谢!
4页 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
}
“+/-“按钮的处理函数
void CCalcDlg::OnNeg()
{
m_Dis=-m_Dis;//换个符号,其他都一样
UpdateData(FALSE);
poz=1;
point_flag=FALSE;
} ‘.’按钮的处理函数
void CCalcDlg::OnPt()
{
point_flag=TRUE; //把标志位改为“小数点”状态
}
“Backspace”按钮的处理
void CCalcDlg::OnBackspace()
{