还剩5页未读,继续阅读
文本内容:
MFC计算器课程设计报告计算机应用3班黄锦湫,罗洁,饶益指导老师蒋鹏
2009.
3.15一.题目利用MFC框架编写简易计算器要求使用MFC框架在VisualStudio
6.0环境下编写一个简易的计算器,支持任意位数的加减乘数,正负转换,并且实现BackSpa____C功能二.设计过程
1.Windows消息处理机制的理解首先编写程序需要对Windows程序的消息处理机制(MessageHandle)有个比较清晰的了解Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等还有用户消息,比如鼠标的单击,双击,键盘的键入等
2.界面的设计仿照Windows附件里面的计算器,在资源视图中画好界面,如图主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息
3.建立的变量,控件的命名,对应的消息处理函数对应表IDCAPTIONMessageHandlerIDD_CALC_DIALOG简易计算器
1.0Beta1版N/AIDC_NUM00OnNum0IDC_NUM11OnNum1IDC_NUM22OnNum2IDC_NUM33OnNum3IDC_NUM44OnNum4IDC_NUM55OnNum5IDC_NUM66OnNum6IDC_NUM77OnNum7IDC_NUM88OnNum8IDC_NU__9OnNu__IDC_NEG+/-OnNegIDC_PT.OnPtIDC_DIV/OnDivIDC_MUL*O__ulIDC_MIN-O__inIDC_ADD+OnAddIDC_BACKSPA__BACKOnBackspa__IDC_____On__IDC_CLEARCOnClearIDC_EQU=OnEquIDC_DISN/AN/AOnCaldoublenum变量定义doublepoz;//保存小数点的位置,初始化为1,表示poz-1个小数点doublem_Dis;//Edit控件上需要显示的数字BOOLpoint_flag;//小数点表示位,判定是否是小数,是小数为1,不是小数为0doublenumfirst;//保存计算过程中的前一个数字,doublenumsecond;//保存计算过程中的第二个数字charop;//记录当前的计算符号,可以为’+’’-’’*’’/’’=’’c’’n’变量初始化poz=1;m_Dis=
0.0;numfirst=0;numsecond=0;op=0;
4.设计思路a首先考虑对所有按键分为两类,数字类和符号类,0123456789为数字类,+,-,*,/,=为符号类数字在计算的过程中最多需要保存两个,所以定义了两个double型变量numfirst和numsecond来进行存储符号需要一个charop来存储b然后考虑在计算的过程中,numfirst和numsecond的存储状态有三种,一种是numfirst==0numsecond==0也就是程序刚开始运行还没有开始录入数字的状态二种是numfirst!=0numsecond==0也就是第一个数字已经录入,符号也已经录入时候把m_Dis的值直接赋值给numfirst,第三种是numfirst!=0numsecond!=0,表示可以通过op来把两数合并为一个数c考虑到该计算器支持连续的计算,比如
3.33+
1.33*88/96=所以必须在点符号Button也要计算出之前的结果,通过判断op,来计算把两个数字合并为一个数字,方便下一次运算,功能近似于点=,所以把=也划分到符号类d因为数字全部使用的是double,键入的数字必须通过一定的处理达到累加的效果,加上小数和整数的处理差异性大,所以分别用point_flag来判断,分别出来小数和整数
5.成员函数及其释义因为对OnNum0到OnNu__的处理函数差异仅在一个数字上,可以通过调用一个共同的函数OnCaldoublenum来简化源代码长度,增加模块性voidCCalcDlg::OnCaldoublenum{//分三种状态来处理ifnumfirst!=0numsecond!=0{ifpoint_flag==TRUE//判定为小数{poz*=
0.1;//小数进位m_Dis=m_Dis+poz*num;//递增UpdateDatafalse;//把结果从内存传递到屏幕}else{m_Dis=m_Dis*10+num;UpdateDatafalse;}}ifnumfirst!=0numsecond==0{ifpoint_flag==TRUE{poz*=
0.1;m_Dis=m_Dis+poz*num;UpdateDatafalse;}else//判定为整数{m_Dis=m_Dis*10+num;//递增UpdateDatafalse;}}ifnumfirst==0numsecond==0{ifpoint_flag==TRUE{poz*=
0.1;m_Dis=m_Dis+poz*num;UpdateDatafalse;}else{m_Dis=m_Dis*10+num;UpdateDatafalse;}}}以OnAdd为例子讲解符号的处理函数,函数的功能是先判定之前按下字符时op的值,更具op的值来进行相应的运算voidCCalcDlg::OnAdd{//根据numfirst和numsecond和op的值分为5种状态ifnumfirst!=0numsecond==0op==+{numsecond=m_Dis;numfirst=numfirst+numsecond;//之前按的是加把两个数赋值到前一个数m_Dis=numfirst;//赋值给屏幕numsecond=0;//从新赋值为0清空,不影响下一次判断UpdateDataFALSE;m_Dis=0;//屏幕的值同时清空}ifnumfirst!=0numsecond==0op==-{numsecond=m_Dis;numfirst=numfirst-numsecond;m_Dis=numfirst;numsecond=0;UpdateDataFALSE;m_Dis=0;}ifnumfirst!=0numsecond==0op==*{numsecond=m_Dis;numfirst=numfirst*numsecond;m_Dis=numfirst;numsecond=0;UpdateDataFALSE;m_Dis=0;}ifnumfirst!=0numsecond==0op==/{numsecond=m_Dis;numfirst=numfirst/numsecond;m_Dis=numfirst;numsecond=0;UpdateDataFALSE;m_Dis=0;}ifnumfirst==0numsecond==0{//该状态为程序启动还没有开始录入输入的状态numfirst=m_Dis;//屏幕的值赋值到numfirstUpdateDataFALSE;m_Dis=0;}op=+;//最后记录最后一个操作是+poz=1;//小数点位置归位point_flag=FALSE;//默认小数点标志为整数,也就是0,也就是FALSE}“+/-“按钮的处理函数voidCCalcDlg::OnNeg{m_Dis=-m_Dis;//换个符号,其他都一样UpdateDataFALSE;poz=1;point_flag=FALSE;}‘.’按钮的处理函数voidCCalcDlg::OnPt{point_flag=TRUE;//把标志位改为“小数点”状态}“Backspa__”按钮的处理voidCCalcDlg::OnBackspa__{//主要通过___vt和strtod函数进行字符串和浮点数之间的转换charbuffer
[30];//定义个装字符的数组___vtm_Dissizeofm_Disbuffer;//把m_Dis存的数字转换为stringforinti=0;i30;i++{ifbuffer[i]==.buffer[i+1]==0//判断是否为整数{point_flag=FALSE;//标志位设置为“整数位”break;}}ifpoint_flag==TRUE//如果是小数{forintj=0;j30;j++{ifbuffer[j]==0{buffer[j-1]=0;//把’\0’之前的字符赋值为’\0’就相当于剪掉最后一位break;}}}else//如果是整数{buffer[i-1]=0;//剪掉’.’之前那位}m_Dis=strtodbufferNULL;//再用strtod弄成浮点数UpdateDataFALSE;poz=1;}‘__’按钮处理函数voidCCalcDlg::On__{ifnumfirst!=0numsecond==0//__只能修改第二个数字{m_Dis=0;//把屏幕的值赋值为0UpdateDataFALSE;//并显示出来}}‘C’按钮处理函数voidCCalcDlg::OnClear{op=NULL;//清空符号numfirst=0;//清空第一个数字numsecond=0;//清空第二个数字point_flag=FALSE;//改为默认整数位poz=1;//小数点归位m_Dis=0;UpdateDataFALSE;//屏幕显示归0}键盘响应voidCCalcDlg::OnKeyDownUINTnCharUINTnRepCntUINTnFlags{switchnChar{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:OnNu__;break;caseVK_ADD:OnAdd;break;caseVK_SUBTRACT:O__in;break;caseVK_MULTIPLY:O__ul;break;caseVK_DIVIDE:OnDiv;break;caseVK_BACK:OnBackspa__;break;caseVK_DECI__L:OnPt;break;caseVK_DELETE:OnBackspa__;break;caseVK_RETURN:OnEqu;break;}CDialog::OnKeyDownnCharnRepCntnFlags;}BOOLCCalcDlg::PreTranslateMessageMSG*pMsg{SendMessagepMsg-messagepMsg-wParampMsg-lParam;returnCDialog::PreTranslateMessagepMsg;}总结本次MFC计算器的制作,学习到了MFC基本的编程方法,增加了小组__的团结协作能力对OOP编程的理解进一步加深但是程序仍然没存在一定的问题,比如除数不能为0的Ex__ptionhandle,符号键多次__结果混乱由于时间仓促,如果有更多的时间,必定这些问题会迎刃而解通过这次课程设计,以后Windows应用程序势必会轻车熟路。