1、课 程 设 计 报 告 课程名称: 面向对象程序设计C+ 设计题目: 计算器课程设计 专 业: 计算机科学与技术2013级 姓 名: 学 号: 指导教师: 李晓虹 2015 年 1 月 10 日目 录1背景与目的32需求分析33总体设计思路34详细设计64.1设计步骤64.2界面设计74.3功能实现125计算器的测试结果135.1测试一135.2测试二145.3测试三145.3测试四146结果分析157总结157附源代码151背景与目的计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除、开方、求倒数等简单运算的工具。要实现计算功能,可以用VC+的知识编写程序来解决此问题。该计算器大大的
2、降低了数字计算的难度及提高了计算的准确度和精确度。该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。简单计算器包括双目运算和单目运算功能。双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,阶乘,对数,开方,倒数等运算。可对输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。出现错误会给出相应提示,同时包含清除,退格,退出功能以及有与所有按钮相对应的菜单项。在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。在程序设计中,可以用两种方法解决问题:一是传统
3、的结构化程序设计方法,二是更先进的面向对象程序设计方法。由于多个函数均需要访问某些数据,这些数据常被设计为全局变量。而在面向对象程序设计中关键是如何将问题域中的实体(即日常所见的概念)抽取出来,作为C+程序中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还应考虑类必须满足的约束2需求分析本软件主要用于计算机windows2000/XP以上版本的用户的使用,这次课程设计一般是实现简单计算器的功能。要程序能实现:加,减,乘,除,开方,倒数等运算功能;还要实现数据的输入,输出,计算,显示及程序退出等功能。另外还可以实现多种科学计算的功能,如:三角函数的计算,弧度与角度间的转换,对数指数的计
4、算等等。3总体设计思路整个计算器的流程图,打开计算器程序,输入数据,调用输入数据子程序。子程序开始时m_num为零。按下数字按钮后,判断m_num的正负号,对其进行相关处理,然后在判断是否有小数点,处理后输出结果。回到总流程图中,输完第一个操作数后,若按下双目运算符,则把m_num存入num2,按下输入第二个操作数并算出结果。若按下的是单目运算符,则直接对其处理得出结果。若按下清零,则m_num等于0.在运算中还要判断运算是否合法,以及结果是否超出显示范围,以做出相关提示,按下清零。算出后把结果保存至num2。若需用算出的结果继续运算则回到输入完第一个操作数后,若不需要则判断试否需要开始新一轮
5、的运算,不需要则结束。图3-1输入数据子函数流程图图3-2简单计算器总流程图4详细设计4.1设计步骤打开MicrosoftVisualC+6.0,在文件中点击新建,在弹出框内选择MFCAppWizardexe工程,输入工程名jisuanqi及其所在位置,点击确定,如图4-1所示:图4-1新建MFCAppWizardexe工程将弹出MFC AppWizard-step1对话框,选择基本对话框,点击完成,如图4-2所示。图4-2基本对话框这样,MFCAppWizard就建立了一个基于对话窗口的程序框架,如图4-3所示。图4-3新建的对话框4.2界面设计1、创建控件在图4-3所示的ResoureVi
6、ew选项卡中打开Dialog资源组,双击IDD_ZHOUTONG_DIALOG,在右边的窗口中显示出待编辑的对话框。开始摆放控件,包括编辑框和按钮的创建。按钮的创建以“1”为例进行介绍,其他按钮的创建可参照此进行操作。1)在图4-3中Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。在编辑框上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出Edit属性对话框,如图4-4所示,在该对话框中输入ID属性。图4-4Edit属性对话框2)在图3中Controls的“Button”按钮上单击鼠标左键,在对话框上的合适的位置上
7、按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出PushButton属性对话框,如图4-5所示,在该对话框中输入控件的ID值和标题属性。图4-5PushButton属性再按照上面的操作过程编辑其他按钮和编辑框等对象的属性。表4-1各按钮和编辑框等对象的属性对象ID标题或说明编辑框IDC_xianshi结果显示按钮IDC_BUTTON00按钮IDC_BUTTON11按钮IDC_BUTTON22按钮IDC_BUTTON33按钮IDC_BUTTON44按钮IDC_BUTTON55按钮IDC_BUTTON66按钮IDC_BUTTON7
8、7按钮IDC_BUTTON88按钮IDC_BUTTON99按钮IDC_change+/-按钮IDC_point.按钮IDC_add+按钮IDC_difference-按钮IDC_multiply*按钮IDC_devide/按钮IDC_sqrtsqrt按钮IDC_daoshu1/x按钮IDC_jiechengn!按钮IDC_lnln按钮IDC_sinsin按钮IDC_coscos按钮IDC_powxy按钮IDC_Onequal=按钮IDC_backspaceBackspace按钮IDC_OnclearClear完成后界面如图4-6所示:图4-6计算器界面2、连接变量和代码1)给编辑框连接变量。在
9、编辑框上单击鼠标右键,在弹出菜单中选择ClassWizard菜单项,弹出MFCClassWizard对话框,选择MemberVariables选项卡,如图4-7所示。图4-7MFC ClassWizard对话框中的MenberVariable选项卡在ControlIDs列表框中选择IDC_xianshi,单击AddVariables按钮,在弹出的对话框中连接变量m_num。变量类型设定为doubel型。如图4-8所示。图4-8m_num属性设置2)给“1”按钮连接代码。在“1”按钮上单击鼠标右键,选择ClassWizard菜单项,在弹出的对话框中选择MessagesMaps选项卡,然后在Obj
10、ectIDs列表框中选择IDC_ADD_BUTTON,在Messages列表框中选择BN_CLICKED项,即选择单击按钮事件,如图4-9所示。图4-9“1”按钮链接代码对话框3、菜单的设计选择“插入/资源”命令,将显示插入资源对话框。如图4-10所示。选择Menu,点击新建即可。图4-10插入资源对话框ResoureView选项卡中打开Menu资源组,双击IDR_MENU1,然后给菜单添加相应的标题,并把每个菜单对应的ID值与相应的按钮的一致。如图4-11所示。图4-11菜单属性对话框在对话框的任何一个空白域单击鼠标右键,然后在弹出的快捷菜单中选择Properties命令,弹出DialogP
11、roperties对话框,如图4-12。在对话框中的菜单组合框中选择IDR_MENU1。图4-12对话属性对话框最终的得到的界面如图4-13。图4-13计算器完整界面4.3功能实现1、操作数的输入编辑框所关联的变量为m_num,程序开始时为零。每按下一个数字键按钮,就把它累加到m_num里并刷新显示。BOOL型变量ele来判断是否有小数点和一个整型数dint来表示小数点后的数据的位数。当ele=TRUE时,表示有小数点,否则表示无小数点。按下小数点按钮后执行ele=TRUE。当按下一个数字键时,首先根据ele判断是否按下小数点,若有则把小数点后数的位数加1,dint则为此次键入的数所处的位数,
12、将键入的数除以dint个10然后累加到编辑框所关联的变量m_num上,若没有则把m_num乘以10,然后累加到编辑框所关联的变量m_num上。2、单目运算符功能的实现由于单目运算符中必须有执行运算的函数,因而头文件中要加入math.h,如m_num=sqrt(m_num).按下按钮即可实现其功能。为实现连续运算,程序有所改动。3、双目运算符功能的实现双目运算符需要两个操作数才能运算,所以在执行双目运算符按钮的函数代码中,要把m_num中的值保存到变量num2中,然后把m_num清零。这样即可保存第一个操作数。另外先定义了一个整形变量addt,在不同的双目运算符中给addt赋不同的值,然后在等号
13、中用switch语句来匹配addt值来判断需要执行何种双目运算。为实现连续运算,程序有所改动。4、退格键功能的实现当按下一次退格按钮时,若m_num为整数,只需对其中数据除以10再取整即可,若按下一次退格按钮为小数,则根据小数点后数据的位数dint进行操作,先对m_num执行(dint-1)次乘以10运算,然后取整,接着执行(dint-1)次除以10的运算即可。完成后需要把dint将减小1。5、正负号功能的实现在头文件中定义一个BOOL型变量ele2来判断m_num的正负。ele2=TRUE时表示为正。在键入操作数时需要用到ele2。在正负号按钮的消息响应函数内容为m_num=-m_num;e
14、le2=!ele2。6、连续运算功能的实现要连续运算必须将每次运算的结果保存下来,对于双目运算符:首先在等号按钮的消息处理函数中在m_num清零之前将m_num的值赋给num2.不过这样的话如果再按双目运算符则num2的值将会被覆盖,于是在双目运算符按钮的消息处理函数中将“num2=m_num;”改为“if(m_num!=0)num2=m_num;”.这样若已经保存了结果则不进行覆盖。然后在每个数字按钮前加上“if(addt=0)num2=0;”,这样如果进行完一次运算之后按下任一数字键表示不需要连续运算,则将保存的结果删除,若按下的是双目运算符按钮则可以继续运算。对于单目运算符:每次运算完之
15、后都会对m_num清零,因此其结果也要赋给num2,下次运算是则会用到num2,于是第一次运算时直接将m_num的值赋给num2,对其进行运算。为实现连续运算是不需要按下等号即可实现,又在所有的运算符按钮的消息处理函数代码前加上了“if(addt!=0)Onequal();”。既若之前有按下双目运算符和两个操作数则连续运算再按下任一运算符时会自动调用等号的处理函数将上次的运算完成并保存结果方便下一次的运算。5计算器的测试结果5.1测试一点击“123.456”“+”“78”“=”,运算结果201.456,与实际结果相同。图5-1 测试运算结果5.2测试二点击“0”进行清零,接下来准备输入“12”
16、“+”“1”“=”,当点击“+”后,屏幕出现了结果213.456,说明是根据上一次的结果继续进行计算的,没有实现清零的功能。图5-2 测试运算结果5.3测试三点击“210”“-”“21”“=”,结果为10,与实际结果相符。图5-3 测试运算结果5.3测试四点击“78”“*”“2”“=”,结果为156,与实际结果相符。图5-4 测试运算结果6结果分析通过对计算器的功能测试,各类运算功能都已经实现,只有没有的实现清零的功能,所以会在连续对数进行操作的时候发生错误。还有,当输入的数据很大或者很小时,会致使结果很大或者很小,此时,若是结果的大小超过数据类型的表示范围,那么就会产生错误,并且显示错误信息
17、。若是没有超出数据的表示范围,那么就会用浮点数来表示比较大或者比较小的数据。7总结经过多次测试,得出结论为设计的计算器基本完成功能描述内容中的全部功能。尽管还有一小部分的功能没有实现,但是收获很大。这样不仅能加深我们对MFC程序设计的掌握,而且还及时、真正的做到了学以致用。基本功要过硬。不能马虎经常犯小错误。提高自己找错纠错能力,通常错误总是那几种,多练习就熟练了。要善于查找资料提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。开始着手程序设计时,有些功能感觉无从下手,都不知道要干什么。这些问题只要找到相关的资料就会得到提示从而理解所要解决问题的大致方向。有了明确的目的,就可以发挥自
18、己的头脑来完成它了。要善于思考。程序中有些实现难点和最初完成程序时免不了的许多不足就需要自己根据代码认真思考来解决。只有这样才能纠正程序的不足并使其更加人性化。这次课程设计让我学到了很多,不仅是巩固了先前学的MFC程序设计知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。希望今后类似这样课程设计、类似这样的锻炼机会能更多些!做一份课程设计出来,不仅做了需求分析、软件开发,还有做了测试工作。做到了一举三得,在以后的学习中,我也会这样鞭策自己学习。7附源代码#include stdafx.h#include #include #include resource.h#include Mai
19、nDlg.h#include TCHAR text50;TCHAR opt=c;BOOL have=FALSE,enable=TRUE;double num1=0,num2=0;BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(uMsg) HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE,
20、Main_OnClose); return FALSE;BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)memset(text,0,sizeof(TCHAR)*50);SetDlgItemText(hwnd,IDC_EDIT,TEXT(0.); return TRUE;void trim()int i=0,j=0;for (i=0;ilstrlen(text);i+)if (texti!=0&texti!=0)j=i;for (j=j+1;jlstrlen(text);j+)textj=0;void AppendT
21、ext(HWND hwnd,TCHAR c)if (lstrlen(text)=1&text0=0&c!=.)text0=c;elsetextlstrlen(text)=c;SetDlgItemText(hwnd,IDC_EDIT,text);void result(HWND hwnd)switch(opt)case +:num2=num2+num1;break;case -:num2=num2-num1;break;case *:num2=num1*num2;break;case /:if (num1=0)SetDlgItemText(hwnd,IDC_EDIT,TEXT(除数不能为零.);
22、enable=FALSE;return; elsenum2=num2/num1;break;default:num2=num2+num1;break;num1=0;sprintf(text,TEXT(%f),num2);trim();SetDlgItemText(hwnd,IDC_EDIT,text);void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)TCHAR c2; switch(id) case IDC_0:case IDC_1:case IDC_2:case IDC_3:case IDC_4:cas
23、e IDC_5:case IDC_6:case IDC_7:case IDC_8:case IDC_9:if (enable)GetDlgItemText(hwnd,id,c,2);AppendText(hwnd,c0);break;case IDC_DOT:if (!have&enable)have=TRUE;if (lstrlen(text)=0)AppendText(hwnd,0);AppendText(hwnd,.);break;case IDC_PLUSS:case IDC_SUB:case IDC_MUL:case IDC_DIV:if(enable)if (lstrlen(tex
24、t)!=0)num1=atof(text);result(hwnd);GetDlgItemText(hwnd,id,c,2);opt=c0;memset(text,0,sizeof(TCHAR)*50);have=FALSE; elseGetDlgItemText(hwnd,id,c,2);opt=c0;break;case IDC_EQUAL:if (lstrlen(text)!=0&enable)num1=atof(text);result(hwnd);memset(text,0,sizeof(TCHAR)*50);have=FALSE;break;case IDC_C:memset(te
25、xt,0,sizeof(TCHAR)*50);num1=0;num2=0;have=FALSE;enable=TRUE;opt=c;SetDlgItemText(hwnd,IDC_EDIT,TEXT(0.);break;case IDC_CE:memset(text,0,sizeof(TCHAR)*50);num1=0;have=FALSE;enable=TRUE;SetDlgItemText(hwnd,IDC_EDIT,TEXT(0.);break;case IDC_CHANGE:if (strlen(text)!=0&enable)num1=atof(text);num1=-num1;sp
26、rintf(text,TEXT(%f),num1);trim();SetDlgItemText(hwnd,IDC_EDIT,text);break;case IDC_1CX:if (enable)num1=atof(text);if (num1=0)SetDlgItemText(hwnd,IDC_EDIT,TEXT(除数不能为零.);enable=FALSE; elsenum1=1.0/num1;sprintf(text,TEXT(%f),num1);trim();SetDlgItemText(hwnd,IDC_EDIT,text);break;case IDC_BFH:break;case
27、IDC_SQRT:if (enable)num1=atof(text);if (num10&enable)textlstrlen(text)-1=0;if (lstrlen(text)=0)SetDlgItemText(hwnd,IDC_EDIT,TEXT(0.); elseSetDlgItemText(hwnd,IDC_EDIT,text);break;case IDC_MC:break;case IDC_MR:break;case IDC_MS:break;case IDC_MPLUSS:break;case ID_ABOUT:MessageBox(hwnd,TEXT(),TEXT(关于计
28、算器),MB_OK);break;case ID_HP:system(start C:windowshelpcalc.chm);break;default:break; void Main_OnClose(HWND hwnd) EndDialog(hwnd, 0);1. 基于C8051F单片机直流电动机反馈控制系统的设计与研究2. 基于单片机的嵌入式Web服务器的研究 3. MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究 4. 基于模糊控制的电阻钎焊单片机温度控制系统的研制 5. 基于MCS-51系列单片机的通用控制模块的研究 6. 基
29、于单片机实现的供暖系统最佳启停自校正(STR)调节器7. 单片机控制的二级倒立摆系统的研究8. 基于增强型51系列单片机的TCP/IP协议栈的实现 9. 基于单片机的蓄电池自动监测系统 10. 基于32位嵌入式单片机系统的图像采集与处理技术的研究11. 基于单片机的作物营养诊断专家系统的研究 12. 基于单片机的交流伺服电机运动控制系统研究与开发 13. 基于单片机的泵管内壁硬度测试仪的研制 14. 基于单片机的自动找平控制系统研究 15. 基于C8051F040单片机的嵌入式系统开发 16. 基于单片机的液压动力系统状态监测仪开发 17. 模糊Smith智能控制方法的研究及其单片机实现 18
30、. 一种基于单片机的轴快流CO,2激光器的手持控制面板的研制 19. 基于双单片机冲床数控系统的研究 20. 基于CYGNAL单片机的在线间歇式浊度仪的研制 21. 基于单片机的喷油泵试验台控制器的研制 22. 基于单片机的软起动器的研究和设计 23. 基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究 24. 基于单片机的机电产品控制系统开发 25. 基于PIC单片机的智能手机充电器 26. 基于单片机的实时内核设计及其应用研究 27. 基于单片机的远程抄表系统的设计与研究 28. 基于单片机的烟气二氧化硫浓度检测仪的研制 29. 基于微型光谱仪的单片机系统 30. 单片机系统软件
31、构件开发的技术研究 31. 基于单片机的液体点滴速度自动检测仪的研制32. 基于单片机系统的多功能温度测量仪的研制 33. 基于PIC单片机的电能采集终端的设计和应用 34. 基于单片机的光纤光栅解调仪的研制 35. 气压式线性摩擦焊机单片机控制系统的研制 36. 基于单片机的数字磁通门传感器 37. 基于单片机的旋转变压器-数字转换器的研究 38. 基于单片机的光纤Bragg光栅解调系统的研究 39. 单片机控制的便携式多功能乳腺治疗仪的研制 40. 基于C8051F020单片机的多生理信号检测仪 41. 基于单片机的电机运动控制系统设计 42. Pico专用单片机核的可测性设计研究 43.
32、 基于MCS-51单片机的热量计 44. 基于双单片机的智能遥测微型气象站 45. MCS-51单片机构建机器人的实践研究 46. 基于单片机的轮轨力检测 47. 基于单片机的GPS定位仪的研究与实现 48. 基于单片机的电液伺服控制系统 49. 用于单片机系统的MMC卡文件系统研制 50. 基于单片机的时控和计数系统性能优化的研究 51. 基于单片机和CPLD的粗光栅位移测量系统研究 52. 单片机控制的后备式方波UPS 53. 提升高职学生单片机应用能力的探究 54. 基于单片机控制的自动低频减载装置研究 55. 基于单片机控制的水下焊接电源的研究 56. 基于单片机的多通道数据采集系统
33、57. 基于uPSD3234单片机的氚表面污染测量仪的研制 58. 基于单片机的红外测油仪的研究 59. 96系列单片机仿真器研究与设计 60. 基于单片机的单晶金刚石刀具刃磨设备的数控改造 61. 基于单片机的温度智能控制系统的设计与实现 62. 基于MSP430单片机的电梯门机控制器的研制 63. 基于单片机的气体测漏仪的研究 64. 基于三菱M16C/6N系列单片机的CAN/USB协议转换器 65. 基于单片机和DSP的变压器油色谱在线监测技术研究 66. 基于单片机的膛壁温度报警系统设计 67. 基于AVR单片机的低压无功补偿控制器的设计 68. 基于单片机船舶电力推进电机监测系统 6
34、9. 基于单片机网络的振动信号的采集系统 70. 基于单片机的大容量数据存储技术的应用研究 71. 基于单片机的叠图机研究与教学方法实践 72. 基于单片机嵌入式Web服务器技术的研究及实现 73. 基于AT89S52单片机的通用数据采集系统 74. 基于单片机的多道脉冲幅度分析仪研究 75. 机器人旋转电弧传感角焊缝跟踪单片机控制系统 76. 基于单片机的控制系统在PLC虚拟教学实验中的应用研究77. 基于单片机系统的网络通信研究与应用 78. 基于PIC16F877单片机的莫尔斯码自动译码系统设计与研究79. 基于单片机的模糊控制器在工业电阻炉上的应用研究 80. 基于双单片机冲床数控系统
35、的研究与开发 81. 基于Cygnal单片机的C/OS-的研究82. 基于单片机的一体化智能差示扫描量热仪系统研究 83. 基于TCP/IP协议的单片机与Internet互联的研究与实现 84. 变频调速液压电梯单片机控制器的研究 85. 基于单片机-免疫计数器自动换样功能的研究与实现 86. 基于单片机的倒立摆控制系统设计与实现 87. 单片机嵌入式以太网防盗报警系统 88. 基于51单片机的嵌入式Internet系统的设计与实现 89. 单片机监测系统在挤压机上的应用 90. MSP430单片机在智能水表系统上的研究与应用 91. 基于单片机的嵌入式系统中TCP/IP协议栈的实现与应用92
36、. 单片机在高楼恒压供水系统中的应用 93. 基于ATmega16单片机的流量控制器的开发 94. 基于MSP430单片机的远程抄表系统及智能网络水表的设计95. 基于MSP430单片机具有数据存储与回放功能的嵌入式电子血压计的设计 96. 基于单片机的氨分解率检测系统的研究与开发 97. 锅炉的单片机控制系统 98. 基于单片机控制的电磁振动式播种控制系统的设计 99. 基于单片机技术的WDR-01型聚氨酯导热系数测试仪的研制 100. 一种RISC结构8位单片机的设计与实现 101. 基于单片机的公寓用电智能管理系统设计 102. 基于单片机的温度测控系统在温室大棚中的设计与实现103.
37、基于MSP430单片机的数字化超声电源的研制 104. 基于ADC841单片机的防爆软起动综合控制器的研究105. 基于单片机控制的井下低爆综合保护系统的设计 106. 基于单片机的空调器故障诊断系统的设计研究 107. 单片机实现的寻呼机编码器 108. 单片机实现的鲁棒MRACS及其在液压系统中的应用研究 109. 自适应控制的单片机实现方法及基上隅角瓦斯积聚处理中的应用研究110. 基于单片机的锅炉智能控制器的设计与研究 111. 超精密机床床身隔振的单片机主动控制 112. PIC单片机在空调中的应用 113. 单片机控制力矩加载控制系统的研究 项目论证,项目可行性研究报告,可行性研究报告,项目推广,项目研究报告,项目设计,项目建议书,项目可研报告,本文档支持完整下载,支持任意编辑!选择我们,选择成功!项目论证,项目可行性研究报告,可行性研究报告,项目推广,项目研究报告,项目设计,项目建议书,项目可研报告,本文档支持完整下载,支持任意编辑!选择我们,选择成功!单片机论文,毕业设计,毕业论文,单片机设计,硕士论文,研究生论文,单片机研究论文,单片机设计论文,优秀毕业论文,毕业论文设计,毕业过关论文,毕业设计,毕业设计说明,毕业论文,单片机论文,基于单片机论文,毕业论文终稿,毕业论文初稿,本文档支持完整下载,支持任意编辑!本文档全网独一无二,放心使用,下载这篇文档,定会成功!