1、课程设计实验报告2402100411孙朋朋 Microsoft Office Word 文档面向对象程序设计课程设计报告设计题目:MFC计算器 学 院:信息工程学院 专 业:计算机科学与技术(交通信息系)姓 名: 孙朋朋 学 号:2402100411 指导教师:张少博 2011 年 12 月 2 日 目录1 基本功能描述 12 设计思路 13 软件设计 43.1 设计步骤 43.2 界面设计 53.3 关键功能的实现 114 结论与心得体会 125 参考文献 136 思考题 137 附录 147.1 调试报告 147.2 测试结果 157.3 关键源代码 161 基本功能描述简单计算器包括双目
2、运算和单目运算功能。双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,对数,开方,倒数等运算。可对输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。出现错误会给出相应提示,同时包含清除,退格,退出功能以及有与所有按钮相对应的菜单项。2 设计思路如图是整个计算器的流程图,打开计算器程序,输入数据,调用输入数据子程序。子程序开始时m_result为零。按下数字按钮后,判断m_result的正负号,对其进行相关处理,然后在判断是否有小数点,处理后输出结果。回到总流程图中,输完第一个操作数后,若按下双目运算符,则把m_num存入num1,按下输入第二个操作数并算出结
3、果。若按下的是单目运算符,则直接对其处理得出结果。若按下清零,则m_result等于0.在运算中还要判断运算是否合法,以及结果是否超出显示范围,以做出相关提示,按下清零。算出后把结果保存至num1。若需用算出的结果继续运算则回到输入完第一个操作数后,若不需要则判断试否需要开始新一轮的运算,不需要则结束。图1 输入数据子函数流程图图2 简单计算器总流程图3 软件设计3.1 设计步骤打开Microsoft Visual Studio2010,在文件中点击新建,在弹出框内选择MFC AppWizardexe工程,输入工程名Calculator及其所在位置,点击确定,如图所示示。 图3 新建MFC A
4、ppWizardexe工程将弹出MFC AppWizard-step 1对话框,选择基本对话框,点击完成,如图4所示。图4 基本对话框这样,MFC AppWizard就建立了一个基于对话窗口的程序框架,如图5所示。图5 新建的对话框3.2 界面设计1、创建控件在图5所示的Resoure View选项卡中打开Dialog资源组,双击IDD_ZHOUTONG_DIALOG,在右边的窗口中显示出待编辑的对话框。开始摆放控件,包括编辑框和按钮的创建。按钮的创建以“1”为例进行介绍,其他按钮的创建可参照此进行操作。1)在图5中Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按
5、下鼠标左键并拖动鼠标画出一个大小合适的编辑框。在编辑框上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出Edit属性对话框,如图6所示,在该对话框中输入ID属性。 图6 Edit属性对话框2)在图3中Controls的“Button”按钮上单击鼠标左键,在对话框上的合适的位置上按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出Push Button属性对话框,如图7所示,在该对话框中输入控件的ID值和标题属性。图7 Push Button属性按照上面的操作过程编辑其他按钮和编辑框等对象的属性。表1 各按钮和编辑框等对象的属
6、性对象ID标题或说明编辑框IDC_Calcculator结果显示按钮IDC_BUTTON0CE按钮IDC_BUTTON11按钮IDC_BUTTON22按钮IDC_BUTTON33按钮IDC_BUTTON44按钮IDC_BUTTON55按钮IDC_BUTTON66按钮IDC_BUTTON77按钮IDC_BUTTON88按钮IDC_BUTTON99按钮IDC_BUTTON10sqrt按钮IDC_BUTTON11.按钮IDC_BUTTON12sin按钮IDC_BUTTON13ln按钮IDC_BUTTON141/x按钮IDC_BUTTON15(x)y / 指数运算按钮IDC_BUTTON16+按钮ID
7、C_BUTTON17-按钮IDC_BUTTON18*按钮IDC_BUTTON19/按钮IDC_BUTTON20-/+按钮IDC_BUTTON21=。图8 计算器界面2、连接变量和代码1) 给编辑框连接变量。在编辑框上单击鼠标右键,在弹出菜单中选择ClassWizard菜单项,弹出MFC ClassWizard对话框,选择Member Variables选项卡,如图9所示。 图9MFC ClassWizard对话框中的Menber Variable选项卡在Control IDs列表框中选择IDC_Calculator,单击Add Variables按钮,在弹出的对话框中连接变量m_result。
8、变量类型设定为doubel型。2) 给“1”按钮连接代码。在“1”按钮上单击鼠标右键,选择ClassWizard菜单项,在弹出的对话框中选择Messages Maps选项卡,然后在Object IDs列表框中选择IDC_ADD_BUTTON,在Messages列表框中选择BN_CLICKED项,即选择单击按钮事件,如图11所示。 图10 “1”按钮链接代码对话框3.3 关键功能的实现1)操作数的输入编辑框所关联的变量为m_result,程序开始时为零。每按下一个数字键按钮,就把它累加到m_result里并刷新显示。int型变量number来判断是否有小数点和一个整型数dot来表示小数点后的数据
9、的位数。当numer=0时,表示有小数点,否则则表示无小数点。按下小数点按钮后执行number=0。当按下一个数字键时,首先根据number的值判断是否按下小数点,若有则把小数点后数的位数加1,dot则为此次键入的数所处的位数,将键入的数除以dot个10然后累加到编辑框所关联的变量m_result上,若没有则把m_result乘以10,然后累加到编辑框所关联的变量m_result上。2)单目运算符功能的实现由于单目运算符中必须有执行运算的函数,因而头文件中要加入如m_result=sqrt(num1).按下按钮即可实现其功能。3)双目运算符功能的实现双目运算符需要两个操作数才能运算,所以在执行
10、双目运算符按钮的函数代码中,要把m_result中的值保存到变量num1中,然后把m_result清零。这样即可保存第一个操作数。另外先定义了一个整形变量mark,在不同的双目运算符中给mark赋不同的值,然后在等号中用switch语句来匹配mark值来判断需要执行何种双目运算。4)负号功能的实现。键入操作数时。在正负号按钮的消息响应函数内容为m_result=-m_result;Num1=m_result,updateDate(False);双目运算功能的实现要连续运算必须将每次运算的结果保存下来。对于双目运算符:首先在等号按钮的消息处理函数中在m_result清零之前将m_result的值
11、赋给num1. “.,对于单目运算符:每次运算完之后都会对m_result清零,因此其结果也要赋给num1下次运算是则会用到num1,于是第一次运算时直接将m_result的值赋给num1,对其进行运算。以开根号为例,在消息处理函数代码中将“m_result=sqrt(num1); num1=m_result”。其他单目运算符同理。4 结论与心得体会经过多番测试,得出结论为设计的计算器能够完成功能描述内容中的全部功能。经过一个星期的VC+课程设计,我在老师和同学的共同帮助下,顺利完成该课程设计,收获很大。”在本学期课程设计是很必要的,加深我们对MFC程序设计的掌握,而且还及时、真正的做到了学以
12、致用。主要是以下几点。要善于查找资料提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。开始着手程序设计时,有些功能感觉无从下手,都不知道要干什么。这些问题只要找到相关的资料就会得到提示从而理解所要解决问题的大致方向。有了明确的目的,就可以发挥自己的头脑来完成它了。要善于思考。程序中有些实现难点和最初完成程序时免不了的许多不足就需要自己根据代码认真思考来解决。只有这样才能纠正程序的不足并使其更加人性化。这次课程设计让我学到了很多,不仅是巩固了学的MFC程序设计知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。希望今后类似这样课程设计、类似这样的锻炼机会能更多些!本次MFC计算
13、器的制作,学习到了MFC基本的编程方法对OOP编程的理解进一步加深。程序仍然存在一定的问题,比如除数不能为0的Exception handle,通过这次课程设计,以后Windows 应用程序势必会轻车熟路5 参考文献1 揣锦华.面向对象程序设计与VC+实践.西安电子科技大学出版社,20052 张建宏,汤练兵,马德骏.计算机程序设计基础-C语言程序设计.科学出版社,20063 陈清华.Visual C+课程设计案例精选与编程指导.东南大学出版社,20044孙鑫c+教程5window运行原理6 思考题1、程序中如何实现小数的显示与运算?答:在CalculattorDlg.h头文件中定义一个int型
14、变number来判断是否有小数点和一个整型数dot来表示小数点后的数据的位数。当number=0时,表示有小数点,否则则表示无小数点。按下小数点按钮后执行number=0。首先根据number的值判断是否按下小数点,若有则把小数点后数的位数加1,dot则为此次键入的数所处的位数,将键入的数除以dot个10然后累加到编辑框所关联的变量m_result上。2、描述等号对应的消息处理函数中需要处理的问题及相应的实现代码?答:在双目运算符按钮函数代码中将整形变量mark赋值,然后在等号中用switch语句来匹配mark值来判断需要执行何种双目运算。并将结果保存以进行下次运算时使用 ,玩策划那个一些变量
15、的清零。实现代码如下: switch(mark) case 1: m_result=num1+num2; UpdateData(FALSE); num1=m_result; number=2; break; case 2: m_result=num1-num2; UpdateData(FALSE); num1=m_result; number=2; break; case 3: m_result=num1*num2; UpdateData(FALSE); num1=m_result; number=2; break; case 4: m_result=(double)num1/num2; Up
16、dateData(FALSE); num1=m_result; number=2; break; case 0: for(int i=1;inum2;i+) num1*=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.14159
17、26,有小小偏差,认为结果正确。证明可以实现单目运算符的连续运算。7.2 关键源代码1、CalculatorDlg.h里变量的定义:Int number; /,判断当前值是否是正数还是负数int dots; /表明操作数的位数int i;int dot/;/判断小数后的位数double num1;double num2;2、程序运行时初始化和头文件:在CalculatorDlg.cpp的OnInitDialog()里调用cal();CalculatorDlg.cpp里加上头文件#include3、 数字键0的程序:(数字键0到9类似)void CCalculatorDlg:OnBnClicke
18、dButton0() / 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+; double a=1;/ for(int i=0;idot;i+) a/=10; m_result=m_result+0*a; if(1=dots) num1=m_result; else num2=m_result; UpdateData(FALSE);/ if(number=2)/nu
19、m2 dots=2; dot=0; m_result=m_result*10+0; num2=m_result; UpdateData(FALSE); 4, 加法键+的程序:void CCalculatorDlg:OnBnClickedButton14()/(“*,/ 类同) / TODO: 在此?添加控?件t通知a处|理程序代码? mark=1; UpdateData(FALSE); m_result=0; number=2;5、 Sqrt键的程序:void CCalculatorDlg:OnBnClickedButton12() / TODO: 在此?添加控?件t通知a处|理程序代码? n
20、um1=m_result=sqrt(num1); UpdateData(FALSE);6、sin键的程序:void CCalculatorDlg:OnBnClickedButton18()/ TODO: 在此?添加控?件t通知a处|理程序代码? num1=m_result=sin(num1); UpdateData(FALSE);7.1/x键的程序:void CCalculatorDlg:OnBnClickedButton20() / TODO: 在此?添加控?件t通知a处|理程序代码? num1=m_result=(double)1/num1; UpdateData(FALSE);8、键的程
21、序:void CCalculatorDlg:OnBnClickedButton23() mark=0; UpdateData(FALSE); m_result=0; number=2; / TODO: 在此?添加控?件t通知a处|理程序9、ln键的程序:void CCalculatorDlg:OnBnClickedButton19() / TODO: 在此?添加控?件t通知a处|理程序代码? num1=m_result=log(num1); UpdateData(FALSE);10、=键的程序:void CCalculatorDlg:OnBnClickedButton22() cal(); /
22、 TODO: 在此?添加控?件t通知a处|理程序代码?void CCalculatorDlg:cal() switch(mark) case 1: m_result=num1+num2; UpdateData(FALSE); num1=m_result; number=2; break; case 2: m_result=num1-num2; UpdateData(FALSE); num1=m_result; number=2; break; case 3: m_result=num1*num2; UpdateData(FALSE); num1=m_result; number=2; brea
23、k; case 4: m_result=(double)num1/num2; UpdateData(FALSE); num1=m_result; number=2; break; case 0: for(int i=1;inum2;i+) num1*=num1; m_result=num1; UpdateData(FALSE); num1=m_result; number=2; break;11、清除键-/+的程序:void CCalculatorDlg:OnBnClickedButton21() m_result=-m_result; if(number=1) num1=m_result;
24、else num2=m_result; UpdateData(FALSE); / TODO: 在此?添加控?件t通知a处|理程序代码12、CE的程序:void CCalculatorDlg:OnBnClickedButton1() / TODO: 在此?添加控?件t通知a处|理程序代码? num1=num2=m_result=0; UpdateData(FALSE); number=1;13.小数点键的程序void CCalculatorDlg:OnBnClickedButton13() number=0; / TODO: 在此?添加控?件t通知a处|理程序代码?14、关联关于对话框代码:CAboutDlg dlgAbout;dlgAbout.DoModal();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1