好文档 - 专业文书写作范文服务资料分享网站

c++面向对象程序设计MFC简单计算器实验报告资料

天下 分享 时间: 加入收藏 我要投稿 点赞

4.4.2 设计思路

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来判断,分别出来小数和整数。

4.2.3 成员函数及其释义

因为对OnNum0()到OnNum9()的处理函数差异仅在一个数字上,可以通过调用一个共同的函数OnCal(double num)来简化源代码长度,增加模块性。

void CCalcDlg::OnCal(double num)

{ //分三种状态来处理 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) {

4

1

} }

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的值来进行相应的运算。

void CCalcDlg::OnAdd() {

//根据numfirst和numsecond和op的值分为5种状态。 if(numfirst!=0 && numsecond==0&&op=='+') { }

if(numfirst!=0 && numsecond==0&&op=='-') { }

if(numfirst!=0 && numsecond==0&&op=='*') { }

if(numfirst!=0 && numsecond==0&&op=='/') {

numsecond=m_Dis;

numfirst=numfirst*numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0;

numsecond=m_Dis;

numfirst=numfirst-numsecond; m_Dis=numfirst; numsecond=0; UpdateData(FALSE); m_Dis=0;

numsecond=m_Dis;

numfirst=numfirst+numsecond; //之前按的是加把两个数赋值到前一个数 m_Dis=numfirst;//赋值给屏幕

numsecond=0; //从新赋值为0,清空,不影响下一次判断 UpdateData(FALSE);

m_Dis=0; //屏幕的值同时清空

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() { //主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换 char buffer[30]; //定义个装字符的数组 _gcvt(m_Dis,sizeof(m_Dis),buffer); //把m_Dis存的数字转换为string for(int i=0;i<30;i++) { if(buffer[i]=='.'&& buffer[i+1]==0)//判断是否为整数 { point_flag=FALSE; //标志位设置为“整数位” break; } } if(point_flag==TRUE) //如果是小数 { for(int j=0;j<30;j++) { if(buffer[j]==0) { buffer[j-1]=0; //把’\\0’之前的字符赋值为’\\0’,就相当于剪掉最后一位

2

3

}

break; } } }

else //如果是整数 { buffer[i-1]=0; //剪掉’.’之前那位 }

m_Dis=strtod(buffer,NULL);//再用strtod弄成浮点数 UpdateData(FALSE); poz=1;

‘CE’按钮处理函数

void CCalcDlg::OnCe() { }

if(numfirst!=0 && numsecond==0)//CE只能修改第二个数字 { }

m_Dis=0; //把屏幕的值赋值为0 UpdateData(FALSE);//并显示出来

‘C’按钮处理函数

void CCalcDlg::OnClear() { }

op=NULL; //清空符号 numfirst=0;//清空第一个数字 numsecond=0;//清空第二个数字 point_flag=FALSE;//改为默认整数位 poz=1;//小数点归位 m_Dis=0;

UpdateData(FALSE); //屏幕显示归0

键盘响应:

void CCalcDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {

switch(nChar) {

case VK_NUMPAD0: OnNum0();break; case VK_NUMPAD1: OnNum1();break; case VK_NUMPAD2: OnNum2();break; case VK_NUMPAD3: OnNum3();break; case VK_NUMPAD4: OnNum4();break; case VK_NUMPAD5: OnNum5();break; case VK_NUMPAD6: OnNum6();break; case VK_NUMPAD7: OnNum7();break; case VK_NUMPAD8:

OnNum8();break; case VK_NUMPAD9: OnNum9();break; case VK_ADD:

OnAdd();break; case VK_SUBTRACT: OnMin();break; case VK_MULTIPLY: OnMul();break; case VK_DIVIDE: OnDiv();break; case VK_BACK:

OnBackspace();break; case VK_DECIMAL: OnPt();break; case VK_DELETE:

OnBackspace();break; case VK_RETURN: OnEqu();break; }

CDialog::OnKeyDown(nChar, nRepCnt, nFlags); }

BOOL CCalcDlg::PreTranslateMessage(MSG* pMsg) {

SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam); return CDialog::PreTranslateMessage(pMsg); }

5 程序运行结果

6 课程设计总结

通过这次课程设计,我又收获到很多,平时的在做作业时,因为题

4

c++面向对象程序设计MFC简单计算器实验报告资料

4.4.2设计思路a)首先考虑对所有按键分为两类,数字类和符号类,0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/,=为符号类。数字在计算的过程中最多需要保存两个,所以定义了两个double型变量numfirst和numsecond来进行存储。符号需要一个charop来存储。b)然后考虑在计算的过程中,nu
推荐度:
点击下载文档文档为doc格式
0g0fm98vt64qfr01784a35m4y31ezc0157w
领取福利

微信扫码领取福利

微信扫码分享