c面向对象程序设计MFC简单计算器实验报告.docx

上传人:b****4 文档编号:27283578 上传时间:2023-06-28 格式:DOCX 页数:16 大小:98.29KB
下载 相关 举报
c面向对象程序设计MFC简单计算器实验报告.docx_第1页
第1页 / 共16页
c面向对象程序设计MFC简单计算器实验报告.docx_第2页
第2页 / 共16页
c面向对象程序设计MFC简单计算器实验报告.docx_第3页
第3页 / 共16页
c面向对象程序设计MFC简单计算器实验报告.docx_第4页
第4页 / 共16页
c面向对象程序设计MFC简单计算器实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

c面向对象程序设计MFC简单计算器实验报告.docx

《c面向对象程序设计MFC简单计算器实验报告.docx》由会员分享,可在线阅读,更多相关《c面向对象程序设计MFC简单计算器实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

c面向对象程序设计MFC简单计算器实验报告.docx

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入门教程》,电子版。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1