课程设计实验报告2402100411孙朋朋 Microsoft Office Word 文档.docx
《课程设计实验报告2402100411孙朋朋 Microsoft Office Word 文档.docx》由会员分享,可在线阅读,更多相关《课程设计实验报告2402100411孙朋朋 Microsoft Office Word 文档.docx(24页珍藏版)》请在冰豆网上搜索。
课程设计实验报告2402100411孙朋朋MicrosoftOfficeWord文档
《面向对象程序设计》
课程设计报告
设计题目:
MFC计算器
学院:
信息工程学院
专业:
计算机科学与技术(交通信息系)
姓名:
孙朋朋
学号:
2402100411
指导教师:
张少博
2011年12月2日
目录
1基本功能描述1
2设计思路1
3软件设计4
3.1设计步骤4
3.2界面设计5
3.3关键功能的实现11
4结论与心得体会12
5参考文献13
6思考题13
7附录14
7.1调试报告14
7.2测试结果15
7.3关键源代码16
1基本功能描述
简单计算器包括双目运算和单目运算功能。
双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,对数,开方,倒数等运算。
可对输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。
出现错误会给出相应提示,同时包含清除,退格,退出功能以及有与所有按钮相对应的菜单项。
2设计思路
如图是整个计算器的流程图,打开计算器程序,输入数据,调用输入数据子程序。
子程序开始时m_result为零。
按下数字按钮后,判断m_result的正负号,对其进行相关处理,然后在判断是否有小数点,处理后输出结果。
回到总流程图中,输完第一个操作数后,若按下双目运算符,则把m_num存入num1,按下输入第二个操作数并算出结果。
若按下的是单目运算符,则直接对其处理得出结果。
若按下清零,则m_result等于0.在运算中还要判断运算是否合法,以及结果是否超出显示范围,以做出相关提示,按下清零。
算出后把结果保存至num1。
若需用算出的结果继续运算则回到输入完第一个操作数后,若不需要则判断试否需要开始新一轮的运算,不需要则结束。
图1输入数据子函数流程图
图2简单计算器总流程图
3软件设计
3.1设计步骤
打开MicrosoftVisualStudio2010,在文件中点击新建,在弹出框内选择MFCAppWizard[exe]工程,输入工程名Calculator及其所在位置,点击确定,如图所示
示。
图3新建MFCAppWizard[exe]工程
将弹出MFCAppWizard-step1对话框,选择基本对话框,点击完成,如图4所示。
图4基本对话框
这样,MFCAppWizard就建立了一个基于对话窗口的程序框架,如图5所示。
图5新建的对话框
3.2界面设计
1、创建控件
在图5所示的ResoureView选项卡中打开Dialog资源组,双击IDD_ZHOUTONG_DIALOG,在右边的窗口中显示出待编辑的对话框。
开始摆放控件,包括编辑框和按钮的创建。
按钮的创建以“1”为例进行介绍,其他按钮的创建可参照此进行操作。
1)在图5中Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。
在编辑框上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出Edit属性对话框,如图6所示,在该对话框中输入ID属性。
图6Edit属性对话框
2)在图3中Controls的“Button”按钮上单击鼠标左键,在对话框上的合适的位置上按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。
在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出PushButton属性对话框,如图7所示,在该对话框中输入控件的ID值和标题属性。
图7PushButton属性
按照上面的操作过程编辑其他按钮和编辑框等对象的属性。
表1各按钮和编辑框等对象的属性
对象
ID
标题或说明
编辑框
IDC_Calcculator
结果显示
按钮
IDC_BUTTON0
CE
按钮
IDC_BUTTON1
1
按钮
IDC_BUTTON2
2
按钮
IDC_BUTTON3
3
按钮
IDC_BUTTON4
4
按钮
IDC_BUTTON5
5
按钮
IDC_BUTTON6
6
按钮
IDC_BUTTON7
7
按钮
IDC_BUTTON8
8
按钮
IDC_BUTTON9
9
按钮
IDC_BUTTON10
sqrt
按钮
IDC_BUTTON11
.
按钮
IDC_BUTTON12
sin
按钮
IDC_BUTTON13
ln
按钮
IDC_BUTTON14
1/x
按钮
IDC_BUTTON15
(x)y//指数运算
按钮
IDC_BUTTON16
+
按钮
IDC_BUTTON17
-
按钮
IDC_BUTTON18
*
按钮
IDC_BUTTON19
/
按钮
IDC_BUTTON20
-/+
按钮
IDC_BUTTON21
=
。
图8计算器界面
2、连接变量和代码
1)给编辑框连接变量。
在编辑框上单击鼠标右键,在弹出菜单中选择ClassWizard菜单项,弹出MFCClassWizard对话框,选择MemberVariables选项卡,如图9所示。
图9MFCClassWizard对话框中的MenberVariable选项卡
在ControlIDs列表框中选择IDC_Calculator,单击AddVariables按钮,在弹出的对话框中连接变量m_result。
变量类型设定为doubel型。
2)给“1”按钮连接代码。
在“1”按钮上单击鼠标右键,选择ClassWizard菜单项,在弹出的对话框中选择MessagesMaps选项卡,然后在ObjectIDs列表框中选择IDC_ADD_BUTTON,在Messages列表框中选择BN_CLICKED项,即选择单击按钮事件,如图11所示。
图10“1”按钮链接代码对话框
3.3关键功能的实现
1)操作数的输入
编辑框所关联的变量为m_result,程序开始时为零。
每按下一个数字键按钮,就把它累加到m_result里并刷新显示。
int型变量number来判断是否有小数点和一个整型数dot来表示小数点后的数据的位数。
当numer=0时,表示有小数点,否则则表示无小数点。
按下小数点按钮后执行number=0。
当按下一个数字键时,首先根据number的值判断是否按下小数点,若有则把小数点后数的位数加1,dot则为此次键入的数所处的位数,将键入的数除以dot个10然后累加到编辑框所关联的变量m_result上,若没有则把m_result乘以10,然后累加到编辑框所关联的变量m_result上。
2)单目运算符功能的实现
由于单目运算符中必须有执行运算的函数,因而头文件中要加入如m_result=sqrt(num1).按下按钮即可实现其功能。
3)双目运算符功能的实现
双目运算符需要两个操作数才能运算,所以在执行双目运算符按钮的函数代码中,要把m_result中的值保存到变量num1中,然后把m_result清零。
这样即可保存第一个操作数。
另外先定义了一个整形变量mark,在不同的双目运算符中给mark赋不同的值,然后在等号中用switch语句来匹配mark值来判断需要执行何种双目运算。
4)负号功能的实现
。
键入操作数时。
在正负号按钮的消息响应函数内容为m_result=-m_result;
Num1=m_result,updateDate(False);
双目运算功能的实现
要连续运算必须将每次运算的结果保存下来。
对于双目运算符:
首先在等号按钮的消息处理函数中在m_result清零之前将m_result的值赋给num1.“.,对于单目运算符:
每次运算完之后都会对m_result清零,因此其结果也要赋给num1下次运算是则会用到num1,于是第一次运算时直接将m_result的值赋给num1,对其进行运算。
以开根号为例,在消息处理函数代码中将“m_result=sqrt(num1);num1=m_result”。
其他单目运算符同理。
4结论与心得体会
经过多番测试,得出结论为设计的计算器能够完成功能描述内容中的全部功能。
经过一个星期的VC++课程设计,我在老师和同学的共同帮助下,顺利完成该课程设计,收获很大。
”在本学期课程设计是很必要的,加深我们对MFC程序设计的掌握,而且还及时、真正的做到了学以致用。
主要是以下几点。
要善于查找资料提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。
开始着手程序设计时,有些功能感觉无从下手,都不知道要干什么。
这些问题只要找到相关的资料就会得到提示从而理解所要解决问题的大致方向。
有了明确的目的,就可以发挥自己的头脑来完成它了。
要善于思考。
程序中有些实现难点和最初完成程序时免不了的许多不足就需要自己根据代码认真思考来解决。
只有这样才能纠正程序的不足并使其更加人性化。
这次课程设计让我学到了很多,不仅是巩固了学的MFC程序设计知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。
希望今后类似这样课
程设计、类似这样的锻炼机会能更多些!
本次MFC计算器的制作,学习到了MFC基本的编程方法对OOP编程的理解进一步加深。
程序仍然存在一定的问题,比如除数不能为0的Exceptionhandle,通过这次课程设计,以后Windows应用程序势必会轻车熟路
}
5参考文献
[1]揣锦华.面向对象程序设计与VC++实践.西安电子科技大学出版社,2005
[2]张建宏,汤练兵,马德骏.计算机程序设计基础-C语言程序设计.科学出版社,2006
[3]陈清华.VisualC++课程设计案例精选与编程指导.东南大学出版社,2004
[4]孙鑫c++教程
[5]window运行原理
6思考题
1、程序中如何实现小数的显示与运算?
答:
在CalculattorDlg.h头文件中定义一个int型变number来判断是否有小数点和一个整型数dot来表示小数点后的数据的位数。
当number=0时,表示有小数点,否则则表示无小数点。
按下小数点按钮后执行number=0。
首先根据number的值判断是否按下小数点,若有则把小数点后数的位数加1,dot则为此次键入的数所处的位数,将键入的数除以dot个10然后累加到编辑框所关联的变量m_result上。
2、描述等号对应的消息处理函数中需要处理的问题及相应的实现代码?
答:
在双目运算符按钮函数代码中将整形变量mark赋值,然后在等号中用switch语句来匹配mark值来判断需要执行何种双目运算。
并将结果保存以进行下次运算时使用,玩策划那个一些变量的清零。
实现代码如下:
switch(mark)
{case1:
m_result=num1+num2;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
case2:
m_result=num1-num2;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
case3:
m_result=num1*num2;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
case4:
m_result=(double)num1/num2;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
case0:
for(inti=1;inum1*=num1;
m_result=num1;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
}
}
7.附录
7.1测试结果
1.输入“90.5”,“-”,“60.7”,“=”,并在菜单中同样输入这组操作,均得到结果如图16。
图11结果图1结果正确,证明可以实现双目运算符的连续运算,菜单功能正常。
2.输入“1”,“sin”,结果如图17.
图12结果图2
因为π取的是3.1415926,有小小偏差,认为结果正确。
证明可以实现单目运算符的连续运算。
7.2关键源代码
1、CalculatorDlg.h里变量的定义:
Intnumber;//,判断当前值是否是正数还是负数
intdots;//表明操作数的位数
inti;
intdot/;/判断小数后的位数
doublenum1;
doublenum2;
2、程序运行时初始化和头文件:
在CalculatorDlg.cpp的OnInitDialog()里调用cal();
CalculatorDlg.cpp里加上头文件#include
3、数字键0的程序:
(数字键0到9类似)
voidCCalculatorDlg:
:
OnBnClickedButton0()
{
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
if(number==1)//num1
{
dots=1;
dot=0;
m_result=m_result*10+0;
num1=m_result;
UpdateData(FALSE);
}
else
{
if(number==0){
dot++;
doublea=1;/
for(inti=0;ia/=10;
m_result=m_result+0*a;
if(1==dots)
num1=m_result;
else
num2=m_result;
UpdateData(FALSE);//}
if(number==2)//num2
{
dots=2;
dot=0;
m_result=m_result*10+0;
num2=m_result;
UpdateData(FALSE);
}
}
}
4,加法键+的程序:
voidCCalculatorDlg:
:
OnBnClickedButton14()//(“*,—,/类同)
{
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
mark=1;
UpdateData(FALSE);
m_result=0;
number=2;
}
5、Sqrt键的程序:
voidCCalculatorDlg:
:
OnBnClickedButton12()
{
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
num1=m_result=sqrt(num1);
UpdateData(FALSE);
}
6、sin键的程序:
voidCCalculatorDlg:
:
OnBnClickedButton18()
{
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
num1=m_result=sin(num1);
UpdateData(FALSE);
}
7.1/x键的程序:
voidCCalculatorDlg:
:
OnBnClickedButton20()
{
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
num1=m_result=(double)1/num1;
UpdateData(FALSE);
}
8、
键的程序:
voidCCalculatorDlg:
:
OnBnClickedButton23()
{mark=0;
UpdateData(FALSE);
m_result=0;
number=2;
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°
}
9、ln键的程序:
voidCCalculatorDlg:
:
OnBnClickedButton19()
{
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
num1=m_result=log(num1);
UpdateData(FALSE);
}
10、=键的程序:
voidCCalculatorDlg:
:
OnBnClickedButton22()
{cal();
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
}
voidCCalculatorDlg:
:
cal()
{
switch(mark)
{
case1:
m_result=num1+num2;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
case2:
m_result=num1-num2;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
case3:
m_result=num1*num2;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
case4:
m_result=(double)num1/num2;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
case0:
for(inti=1;inum1*=num1;
m_result=num1;
UpdateData(FALSE);
num1=m_result;
number=2;
break;
}
}
11、清除键-/+的程序:
voidCCalculatorDlg:
:
OnBnClickedButton21()
{m_result=-m_result;
if(number==1)
num1=m_result;
else
num2=m_result;
UpdateData(FALSE);
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码
}
12、CE的程序:
voidCCalculatorDlg:
:
OnBnClickedButton1()
{
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
num1=num2=m_result=0;
UpdateData(FALSE);
number=1;
}
13.小数点键的程序
voidCCalculatorDlg:
:
OnBnClickedButton13()
{
number=0;
//TODO:
在¨²此ä?
添¬¨ª加¨®控?
件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
}
14、关联关于对话框代码:
CAboutDlgdlgAbout;
dlgAbout.DoModal();