简单计算器课程设计(附源代码) .doc
简单计算器课程设计(附源代码) 目 录一、需求分析.1 1 系统的基本要求.1 2 数据结构设计及用法说明.1 3 功能模块.1 4 流程图.2 5 数据结构.3 6 系统开发.3二、基本功能描述.4 1 设计思路.4 2 软件设计.7三、测试过程与结果.15四、结论与心得体会.16五、参考文献.17六、附录.17简单计算器一.需求分析1.系统的基本要求1. 算术运算功能。能够实现+、-、*、/、mod、int运算。2. 函数运算功能。能够实现exp、ln、sin、xy、log、cos、x3、n!、tan、x2、1/x等运算。3. 进制之间的转换功能。能够实现十六、十、二、八进制数据之间的转换。4.通过键盘控制字符和数字的输入。2.数据结构设计及用法说明此程序调用的函数主要有 /*数学函数的定义*/ /*屏幕操作函数*/ /*I/O函数*/ /*库函数*/ / /*字符操作函数*/。基本使用:用控制鼠标图形移动,当*变量长度参数表*/ /*图形函数*/ /*字符串函数*移动到相应得按钮时按回车键输入当前数字或执行对应的函数。加法:输入一个被加数数,按“+”,输入被加数,按“ ”,输出结果。乘法: 输入一个数,按“*”,输入另个数,按“ ”,输出结果。除法: 输入一个被除数,按“+”,输入另个除数,按“ ”,输出结果。求余:输入一个数,按“mod”,按“ ”,输出结果。取整:输入一个数,按“int”,按“ ”,输出结果。八进制转十进制:输入一个八进制数,按“10- 8”,按“ ”,输出十进制结果。十六进制转十进制:输入一个十六进制数,按下“jz”+“16- 10” 按“ ”,输出十进制结果3.功能模块键盘控制模块:通过int specialkey void 和键盘来实现输入数据,操作方式的控制。计算模块:通过调用math.h中的数学函数,如:+、-、*、/、sin、cos、mod等来实现对result的赋值。输出模块:在指定位置输出计算模块中result的值,在指定位置输出键盘控制模块中对参量所赋的值以及在指定位置输出键盘控制模块中得到的运算符。4.流程图5.数据结构用到了if判断语句,for循环语句,while语句,且主要通过while语句实现对键盘、光标的操作和数据、运算符的输入,还用到了switch语句,switch语句的主要作用是实现对所输入的数据的运算操作,然后将运算结果赋值给result,最后输出。系统实现(开发工具) Visual C+Visual C+6.0 是Microsoft公司在1998年推出的基于Windows 9X和Windows NT的优秀集成开发环境。该环境为用户提供了良好的可视化编程环境,程序员可以里利用该开发环境轻松地访问C+源代码编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件。Visual C+6.0不仅包括编译器,而且它还包括许多有用组件,通过这些组件的协同工作,可以在Visual C+6.0集成环境中轻松地完成创建源文件,编辑资源,以及对程序的编译,连接和调试等各项工作。VC+6.0是Windows 95/98、XPWindows 95/98、Windows NTVisual Studio Visual C+、Visual Foxpro 图1 输入数据子函数流程图图2 简单计算器总流程图2 软件设计2.1 设计步骤打开Microsoft Visual C+ 6.0,在文件中点击新建,在弹出框内选择MFC AppWizardexe工程,输入工程名zhoutong及其所在位置,点击确定,如图3所示。 图3 新建MFC AppWizardexe工程将弹出MFC AppWizard-step 1对话框,选择基本对话框,点击完成,如图4所示。这样,MFC AppWizard就建立了一个基于对话窗口的程序框架,如图5所示。1、创建控件在图5所示的Resoure View选项卡中打开Dialog资源组,双击IDD_ZHOUTONG_DIALOG,在右边的窗口中显示出待编辑的对话框。开始摆放控件,包括编辑框和按钮的创建。按钮的创建以“1”为例进行介绍,其他按钮的创建可参照此进行操作。1)在图5中Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。在编辑框上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出Edit属性对话框,如图6所示,在该对话框中输入ID属性。 图6 Edit属性对话框2)在图3中Controls的“Button”按钮上单击鼠标左键,在对话框上的合适的位置上按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出Push Button属性对话框,如图7所示,在该对话框中输入控件的ID值和标题属性。图7 Push Button属性按照上面的操作过程编辑其他按钮和编辑框等对象的属性。表1 各按钮和编辑框等对象的属性对象ID标题或说明编辑框IDC_xianshi结果显示按钮IDC_BUTTON00按钮IDC_BUTTON11按钮IDC_BUTTON22按钮IDC_BUTTON33按钮IDC_BUTTON44按钮IDC_BUTTON55按钮IDC_BUTTON66按钮IDC_BUTTON77按钮IDC_BUTTON88按钮IDC_BUTTON99IDC_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完成后界面如图8所示。图8 计算器界面2、连接变量和代码1 给编辑框连接变量。在编辑框上单击鼠标右键,在弹出菜单中选择ClassWizard菜单项,弹出MFC ClassWizard对话框,选择Member Variables选项卡,如图9所示。 图9 MFC ClassWizard对话框中的Menber Variable选项卡在Control IDs列表框中选择IDC_xianshi,单击Add Variables按钮,在弹出的对话框中连接变量m_num。变量类型设定为doubel型。如图10所示。图10 m_num属性设置2 给“1”按钮连接代码。在“1”按钮上单击鼠标右键,选择ClassWizard菜单项,在弹出的对话框中选择Messages Maps选项卡,然后在Object IDs列表框中选择IDC_ADD_BUTTON,在Messages列表框中选择BN_CLICKED项,即选择单击按钮事件,如图11所示。 图11 “1”按钮链接代码对话框3、菜单的设计选择 插入/资源命令,将显示插入资源对话框。如图12所示。选择Menu,点击新建即可。图12 插入资源对话框Resoure View选项卡中打开Menu资源组,双击IDR_MENU1, 然后给菜单添加相应的标题,并把每个菜单对应的ID值与相应的按钮的一致。如图13所示。图13 菜单属性对话框在对话框的任何一个空白域单击鼠标右键,然后在弹出的快捷菜单中选择Properties命令,弹出Dialog Properties对话框,如图14。在对话框中的菜单组合框中选择IDR_MENU1。图15 计算器完整界面2.3 关键功能的实现1)操作数的输入编辑框所关联的变量为m_num,程序开始时为零。每按下一个数字键按钮,就把它累加到m_num里并刷新显示。BOOL型变量ele来判断是否有小数点和一个整型数dint来表示小数点后的数据的位数。当ele TRUE时,表示有小数点,否则则表示无小数点。按下小数点按钮后执行ele TRUE。当按下一个数字键时,首先根据ele判断是否按下小数点,若有则把小数点后数的位数加1,dint则为此次键入的数所处的位数,将键入的数除以dint个10然后累加到编辑框所关联的变量m_num上,若没有则把m_num乘以10,然后累加到编辑框所关联的变量m_num上。2)单目运算符功能的实现由于单目运算符中必须有执行运算的函数,因而头文件中要加入math.h,如m_num sqrt m_num .按下按钮即可实现其功能。为实现连续运算,程序有所改动,参见(6)。3)双目运算符功能的实现双目运算符需要两个操作数才能运算,所以在执行双目运算符按钮的函数代码中,要把m_num中的值保存到变量num2中,然后把m_num清零。这样即可保存第一个操作数。另外先定义了一个整形变量addt,在不同的双目运算符中给addt赋不同的值,然后在等号中用switch语句来匹配addt值来判断需要执行何种双目运算。为实现连续运算,程序有所改动,参见(6)。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;ele2 !ele2。6)连续运算功能的实现要连续运算必须将每次运算的结果保存下来。对于双目运算符:首先在等号按钮的消息处理函数中在m_num清零之前将m_num的值赋给num2.不过这样的话如果再按双目运算符则num2的值将会被覆盖,于是在双目运算符按钮的消息处理函数中将“num2 m_num;”改为“if m_num! 0 num2 m_num;”.这样若已经保存了结果则不进行覆盖。然后在每个数字按钮前加上“if addt 0 num2 0;”,这样如果进行完一次运算之后按下任一数字键表示不需要连续运算,则将保存的结果删除,若按下的是双目运算符按钮则可以继续运算。对于单目运算符:每次运算完之后都会对m_num清零,因此其结果也要赋给num2,下次运算是则会用到num2,于是第一次运算时直接将m_num 的值赋给num2,对其进行运算。以开根号为例,在消息处理函数代码中将“m_num sqrt m_num ;”改为“num2 m_num;m_num sqrt num2 ; num2 m_num;”。但是第一次运算执行完成之后m_num被清零,所以之后将m_num 的值不能赋给num2,代码改为 “if m_num 0 m_num sqrt num2 ; num2 m_num;”。其他单目运算符同理。为实现连续运算是不需要按下等号即可实现,又在所有的运算符按钮的消息处理函数代码前加上了“if addt! 0 Onequal ;”。既若之前有按下双目运算符和两个操作数则连续运算再按下任一运算符时会自动调用等号的处理函数将上次的运算完成并保存结果方便下一次的运算。”,“2.36”,“ ”,并在菜单中同样输入这组操作,均得到结果如图16。图16 结果图1结果正确,证明可以实现双目运算符的连续运算,菜单功能正常。2.输入“901”,“+/-”,“backspace”,“+”,“120”,“sin”,结果如图图17 结果图2因为取的是3.1415926,因此与0.5有小小偏差,认为结果正确。证明可以实现单目运算符的连续运算与backspace回格功能。3.输入“0”,“ln”,结果如图18.经过个星期的VC+课程设计,我在老师的下,顺利完成该课程设计,收获很大。基本功要过硬不犯小错误提自己提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。1 揣锦华.面向对象程序设计与VC+实践.西安电子科技大学出版社,20052 张建宏,汤练兵,马德骏计算机程序设计基础-C语言程序设计.科学出版社,20063Visual C+课程设计案例精选与编程指导.东南大学出版社,2004六. 附录源代码#include "stdafx.h"#include #include #include "resource.h"#include "MainDlg.h"double num,numtmp;TCHAR result256,numstr256;int sel;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, Main_OnClose ; return FALSE; BOOL Main_OnInitDialog HWND hwnd, HWND hwndFocus, LPARAM lParam ZeroMemory result,sizeof result /sizeof TCHAR ;ZeroMemory numstr,sizeof numstr /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,TEXT "0" ; return TRUE; void Main_OnCommand HWND hwnd, int id, HWND hwndCtl, UINT codeNotify switch id TCHAR content256;ZeroMemory content,sizeof content /sizeof TCHAR ; case ID_MENUITEMCOPY: strncpy content,result,sizeof result ;/GetDlgItemText hwnd,IDC_EDIT1,content,sizeof content ; break;case ID_MENUITEMPOST: SetDlgItemText hwnd,IDC_EDIT1,content ; break; case IDC_BIN0:/输入数字0 strcat result,"0" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_BIN1:/输入数字1 strcat result,"1" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_BIN2:/输入数字2 strcat result,"2" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_BIN3:/输入数字3 strcat result,"3" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_BIN4:/输入数字4 strcat result,"4" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_BIN5:/输入数字5 strcat result,"5" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_BIN6:/输入数字6 strcat result,"6" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_BIN7:/输入数字7 strcat result,"7" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_BIN8:/输入数字8 strcat result,"8" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_BIN9:/输入数字9 strcat result,"9" ;SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_ if strchr result,'.' NULL strcat result,"." ; SetDlgItemText hwnd,IDC_EDIT1,result ; break;case IDC_ TCHAR resulttmp256;strcpy resulttmp,result ;ZeroMemory result,sizeof result /sizeof TCHAR ;if strlen resulttmp -1 0 SetDlgItemText hwnd,IDC_EDIT1,TEXT "0" ;break; strncpy result,resulttmp,strlen resulttmp -1 ;ZeroMemory resulttmp,sizeof resulttmp /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,result ; break; case IDC_ SetDlgItemText hwnd,IDC_EDIT1,TEXT "0" ;ZeroMemory result,sizeof result /sizeof TCHAR ; ZeroMemory numstr,sizeof numstr /sizeof TCHAR ;sel 0; break;case IDC_ 运算 Main_Count hwnd ;sel 0; break; case IDC_ sel 1;Main_Count hwnd ; break;case IDC_ Main_Count hwnd ;sel 2; break;case IDC_ Main_Count hwnd ;sel 3; break;case IDC_ Main_Count hwnd ;sel 4; break;case IDC_ Main_Count hwnd ;sel 5; break;case IDC_ sel 6;Main_Count hwnd ; break;case IDC_ sel 7;Main_Count hwnd ; break;case IDC_ sel 8;Main_Count hwnd ; break;case IDC_ sel 9;Main_Count hwnd ; break;case IDC_ sel 10;Main_Count hwnd ; break;case IDC_ sel 11;Main_Count hwnd ; break;case IDC_ sel 12;Main_Count hwnd ; break;case IDC_ sel 13;Main_Count hwnd ; break;case IDC_ 运算 sel 14;Main_Count hwnd ; break; default:break; void Main_Count HWND hwnd num atof result ;ZeroMemory result,sizeof result /sizeof TCHAR ;switch sel case 1: numtmp -num;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 2: numtmp+ num;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 3: numtmp- num;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 4: numtmp* num;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 5: if num! 0 numtmp/ num;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; else SetDlgItemText hwnd,IDC_EDIT1,TEXT "除数不能为0!" ; break;case 6: numtmp pow num,2 ;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 7: numtmp sqrt num ;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 8: numtmp sin num*3.1XXXXXXXXXX98/180 ;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 9: numtmp asin num*180/3.1XXXXXXXXXX98 ;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 10: numtmp cos num*3.1XXXXXXXXXX98/180 ;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break; case 11: numtmp acos num*180/3.1XXXXXXXXXX98 ;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 12: numtmp log num ;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break; case 13: numtmp exp num ;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; break;case 14: if num! 0 numtmp 1/num;gcvt numtmp,10,numstr ;ZeroMemory result,sizeof result /sizeof TCHAR ;SetDlgItemText hwnd,IDC_EDIT1,numstr ; else SetDlgItemText hwnd,IDC_EDIT1,TEXT "除数不能为0!" ; break;default:numtmp num;break; void Main_OnClose HWND hwnd EndDialog hwnd, 0 ; 管理信息系统课程设计管理信息系统课程设计1流程图开始输入第一个数x输入第二个数y+、-、*、/、xy、log、等显示结果结束mod、x3、ln、exp、tan、cos、x2、1/x、n!、sin、以及进制转换按“Esc”退出按“CE”清零NNY键入一个数是否为正数?m_num 10*m_num+im_num 10*m_num-i是否为小数?用UpdateData FALSE 刷新显示还原m_num根据小数点后位数将键入的数除以n次10累加到m_numYN继续键入数字?Y输入数据子函数编辑框关联变量m_num 0Y开始输入数据子函数编辑框关联的变量保存至num2输入数据子函数进行运算运算是否合法把结果保存到num2m_num清零弹出对话框显示ERRORNY是否用保存的结果继续进行运算N结束jie双目运算符单目运算符是否开始新一轮的计算YN