简单计算器课程设计报告.doc_第1页
简单计算器课程设计报告.doc_第2页
简单计算器课程设计报告.doc_第3页
简单计算器课程设计报告.doc_第4页
简单计算器课程设计报告.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉理工大学专业课程设计3(面向对象程序设计)课程设计说明书目录1.基本功能描述12.设计思路12.1相关说明12.2各块流程图23.软件设计73.1 设计步骤73.2 界面设计93.2.1添加图标92.2.2添加控件103.2.3添加菜单123.3 关键功能的实现144.结论与心得体会165.参考文献176.思考题187.附录207.1调试报告207.2测试结果217.3关键源代码23简单计算器1.基本功能描述该简单计算器主要实现了双目运算和单目运算功能。双目运算符包含基本的四则运算及乘幂功能,单目运算符主要包含正余弦,阶乘,对数,开方,倒数等运算,同时也包含角度制的转换、科学型与标准型的转换、输出设计者信息、清除、退格、退出功能。简单计算器可对输入的任意操作数,包括小数和整数及正数和负数进行上述各种运算并能实现连续运算,并且能在出现错误时给出相应提示。同时也可以操作与运算按钮相对应的菜单项。2.设计思路2.1相关说明1)相关的变量标志位:m_num:与编辑框相关联的变量num1:作为临时变量储存当时按下的按钮值num2:作为临时变量储存编辑框的值m_hudu:角度制的标志位,为0时为弧度m_jiao:角度转换的临时变量point:bool值,小数点有无标志位,当值为ture时为有小数点dianhou:小数点后位数记录位danshuang:单双目运算符标志位zhengfu:bool值,作为正负数标志位,当为ture时为正数2)主要功能设计简述:该简单计算器的重难点主要在一个编辑框要实现输入和输出的显示,小数的实现,正负数的交替输入,退格时数的实现,单双目运算符的不同如何实现等方面。其中单目运算符sin、cos、tan等要考虑角度转换,之后的运算和其他单目运算符没有差别,基于以上的考虑,想到必须对相关的操作进行相应的标志位,具体的如上列举。简单计算器,在输入数据时,调用输入数据子程序。子程序开始时m_num为零。按下数字按钮后,判断m_num的值是否为小数,对其进行相关处理,然后再判断是否为正数,处理后输出结果。在sin、cos、tan运算中首先利用角度转换的标志位m_hudu判断当时是度还是弧度,若是弧度可以直接调用函数进行相关计算,若是度则要进行角度的转换,在转换时要记得Pi首先记性宏定义,然后调用数学函数进行计算,最后对相关的各种标志位进行复位、并输出结果到编辑框。流程图以sin运算为例。双目运算符运算首先要进行单双目运算符标志位danshuang判断,若不为0,则直接调用等号的函数,可以完成上次的运算,并且同时用num2记录下与编辑框关联的变量m_num的值,同时也记录下此时danshuang标志位的值便于在等号函数中进行调用,在输入第二个操作数后,按等号进行对双目运算符的处理运算,各项复位,并输出结果到编辑框。流程图以log运算为例。整个计算器系统中,总的流程是:输完第一个操作数后,若按下的运算符是双目运算符,则把m_num存入num2,按下输入第二个操作数并按下“=”按钮后算出结果。若按下的是单目运算符,则直接对其输入数据进行处理得出结果。在运算中还要判断运算是否合法(如log、ln等),以及结果是否超出显示范围,做出相关提示,按下清零,对各个标志位、编辑框的值等进行清零。算出后把结果保存并输出显示。若需要用算出的结果继续运算则回到输入完第一个操作数后继续进相应的流程,若不需要则判断试否需要开始新一轮的运算,不需要则结束。2.2各块流程图Y继续键入数字?N根据小数点后位数将键入的数除以n次10累加到m_numNNNYi=0point=turem_num =m_num+num1m_num =m_num-num1iSetWindowText(输入错误,0不能作除数!);else m_num=num2/m_num;UpdateData(FALSE);break;case 5:if (m_num=0|num2SetWindowText(输入错误,取对数要为正数!);else m_num=log(m_num)/log(num2);UpdateData(FALSE); /取对数break;if(m_num=1.7E308|m_numSetWindowText(结果过大,无法显示);num2=m_num;num1=0;dianhou=0;point=FALSE;danshuang=0;zhengfu=TRUE;3、(选做)若实现了科学型和标准型,说明科学型和标准型实现的关键算法?答:我做的科学型和标准型的实现方法和指导书上的推荐方法不同,指导书推荐的方法是通过单选按钮,当选择科学型时进行科学型的按钮被激活,可以运算,当选择标准型的时候进行科学型的按钮不能进行运算。而我的实现方法是选择伸缩框,初始时是标准型,界面上只有数值和简单的加减乘除等运算按钮,当单击科学型时,对话框进行了扩展,出现了可以科学型运算的部分。主要的实现方法:首先要在对话框中要伸缩的位置插入一个图像控件,将其拉成一条直线,并取消可见。其次在实现文件里边定义两个静态变量,用来存储对话框尺寸信息。为了实现第一次显示为标准型,所以获取显示尺寸和位置信息以及执行SetWindowPos函数的最佳时机应放在对话框创建之后,第一次显示之前。为此利用WM_INITDIALOG消息的响应函数OnInitDialog来对对话框及控件进行相关的设置和修改。该函数中利用GetDlgItem()函数获得图像控件的窗口句柄,结合GetWindowRect()函数得到图像控件的矩形框。进而进行标准型参数的获取,利用SetWindowPos()函数完成对对话框的宽度、高度等参数的初始化设置。最后添加相应的菜单响应函数,在响应函数里边利用SetWindowPos()函数完成对对话框的宽度、高度等参数的设置。7.附录7.1调试报告1、error C2296: % : illegal, left operand has type double解决办法:因为取余数的运算符%只能用于整数,不能用于浮点数,经过查询资料知道用fmod可进行取余运算。2、在阶乘运算代码中用“else GetDlgItem(IDC_SHUCHU)-SetWindowText(不是整数无法进行阶乘运算);UpdateData(FALSE); /数据刷新”不能输出相应的提示语句。解决办法:主要是因为在提示语句输出后,立即进行了编辑框的刷新,将其覆盖,所以将updateData(FALSE)提前即可3、在进行角度制转换的时,相应的资源和代码完成之后,运行发现刚开始没有选中标准型和科学型的任何一个。解决办法:经分析应该是没有对单选按钮相关联的变量没有进行初始化,在CLiuyunlongDlg:CLiuyunlongDlg(CWnd* pParent /*=NULL*/): CDialog(CLiuyunlongDlg:IDD, pParent) 中加入m_hudu=0,进行初始化后得以解决。4、运行时出现以下提示“liuyunlong Microsoft 基础类应用程序已停止工作(出现了一个问题,导致程序停止正常工作。请关闭改程序”。解决办法:应该是新加的扩展与收缩对话框的变量CRect rectLarge;CRect rectSmall;所放的位置不对,经过尝试放在了liuyunlongDlg.cpp文件中作为全局变量得以实现。7.2测试结果1)运行后依次输入“12”,“/”,“2.4”,“*”,“0.5”,“-”,“6”,“+”,“2”,“=”得出结果为-1.5,之后结合相应的菜单项中同样输入这组操作也得到这个结果。如下图所示:图16 标准型时运算结果图在运行程序后刚开始的界面如图16所示,此时的界面为标准型,主要包括数字、清零、退格、负号、等号以及简单的加减乘除运算按钮,显示编辑框和菜单项。并且根据计算知道该结果正确,且该计算器能实现运算符的连续运算。2)点击查看菜单项中的科学型,输入“2”,“asin”得到相应的错误提示如17图所示;然后点击“C”和单选按钮“度”依次并输入“90”,“sin”,“*”,“2”,“exp”,“ln” “sqrt”得到相应的结果,之后结合菜单项实现结果一直,如18图所示:图17 反正弦输入错误提示图图18 点击科学型菜单后运算结果图在点击查看菜单中的科学型选项后,如图17、图18所示,界面进行了科学型的扩展,添加了三角函数、幂、取对数、阶乘等运算按钮及角度制转换的单选按钮。经检验和2相当的接近,运算结果无误,且能实现对输入的错误操作数的错误提示功能。该界面中还包含了编辑、查看、帮助菜单项,其中编辑中主要是运算符菜单,进行数值计算,查看中包含了标准型、科学型、exit选项,实现计算器界面的伸缩和退出,而在帮助菜单中是关于计算器菜单项,点击后显示计算器的制作者信息。如下图所示:图19 关于计算器信息显示图7.3关键源代码/定义的相关变量BOOL zhengfu=true; / zhengfu定义为布尔值,判断当前值是否是正数还是负数int danshuang;/单双目运算符转换int i;int dianhou;/diann判断小数后的位数BOOL point=false; /point定义为布尔值,判断是否有小数点bool kexue=false;bool biaozhun=TRUE;double num2;double num1;double m_jiao;/角度与弧度转换临时变量CRect rectLarge;CRect rectSmall;/新加的扩展与收缩对话框的变量/编辑框和单选按钮的变量初始化CLiuyunlongDlg:CLiuyunlongDlg(CWnd* pParent /*=NULL*/): CDialog(CLiuyunlongDlg:IDD, pParent)/AFX_DATA_INIT(CLiuyunlongDlg)m_num = 0.0;m_hudu = 0;/弧度相关联的变量初始化/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);/图标显示/界面伸缩式扩展代码BOOL CLiuyunlongDlg:OnInitDialog()/ TODO: Add extra initialization hereCRect rectSeparator;GetWindowRect(&rectLarge);GetDlgItem(IDC_SEPARATOR)-GetWindowRect(&rectSeparator);rectSmall.left=rectLarge.left;/对话框的左边位置rectSmall.top=rectLarge.top;rectSmall.right=rectSeparator.right;/图像控件的位置rectSmall.bottom=rectLarge.bottom;SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(), SWP_NOMOVE|SWP_NOZORDER);/设置初始化时标准型界面return TRUE; / return TRUE unless you set the focus to a control/设置背景颜色所加代码void CLiuyunlongDlg:OnPaint() if (IsIconic() elseCRect rect;CPaintDC dc(this);GetClientRect(rect);/获取该对话框的位置坐标dc.FillSolidRect(rect,RGB(11,125,111); /设置为绿色背景CDialog:OnPaint();/在标准和科学型菜单前面加点标志为了使响应函数调用所加的代码void CLiuyunlongDlg:OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)ASSERT(pPopupMenu != NULL);/ Check the enabled state of various menu items.CCmdUI state;state.m_pMenu = pPopupMenu;ASSERT(state.m_pOther = NULL);ASSERT(state.m_pParentMenu = NULL);/ Determine if menu is popup in top-level menu and set m_pOther to/ it if so (m_pParentMenu = NULL indicates that it is secondary popup).HMENU hParentMenu;if (AfxGetThreadState()-m_hTrackingMenu = pPopupMenu-m_hMenu)state.m_pParentMenu = pPopupMenu; / Parent = child for tracking popup.else if (hParentMenu = :GetMenu(m_hWnd) != NULL)CWnd* pParent = this;/ Child windows dont have menus-need to go to the top!if (pParent != NULL &(hParentMenu = :GetMenu(pParent-m_hWnd) != NULL)int nIndexMax = :GetMenuItemCount(hParentMenu);for (int nIndex = 0; nIndex m_hMenu)/ When popup is found, m_pParentMenu is containing menu.state.m_pParentMenu = CMenu:FromHandle(hParentMenu);break;state.m_nIndexMax = pPopupMenu-GetMenuItemCount();for (state.m_nIndex = 0; state.m_nIndex GetMenuItemID(state.m_nIndex);if (state.m_nID = 0)continue; / Menu separator or invalid cmd - ignore it.ASSERT(state.m_pOther = NULL);ASSERT(state.m_pMenu != NULL);if (state.m_nID = (UINT)-1)/ Possibly a popup menu, route to first item of that popup.state.m_pSubMenu = pPopupMenu-GetSubMenu(state.m_nIndex);if (state.m_pSubMenu = NULL |(state.m_nID = state.m_pSubMenu-GetMenuItemID(0) = 0 |state.m_nID = (UINT)-1)continue; / First item of popup cant be routed to.state.DoUpdate(this, TRUE); / Popups are never auto disabled.else/ Normal menu item./ Auto enable/disable if frame window has m_bAutoMenuEnable/ set and command is _not_ a system command.state.m_pSubMenu = NULL;state.DoUpdate(this, FALSE);/ Adjust for menu deletions and additions.UINT nCount = pPopupMenu-GetMenuItemCount();if (nCount state.m_nIndexMax)state.m_nIndex -= (state.m_nIndexMax - nCount);while (state.m_nIndex GetMenuItemID(state.m_nIndex) = state.m_nID)state.m_nIndex+;state.m_nIndexMax = nCount;/0到9数值的实现代码,此处以0代替:void CLiuyunlongDlg:OnNumber0() / TODO: Add your control notification handler code hereif(danshuang=0)num2=0;if (point=TRUE) /当前是否有小数点,如果有num1=0; dianhou=dianhou+;for (i=0;i0) /如果是小数for (i=0;idianhou-1;i+) /移动小数点m_num=m_num*10; /移动至只有一个小数位m_num=m_num-fmod(m_num,1); /去掉小数位for (i=0;iSetWindowText(输入错误,0不能作除数!);else m_num=num2/m_num;UpdateData(FALSE);break;case 5:if (m_num=0|num2SetWindowText(输入错误,取对数要为正数!);else m_num=log(m_num)/log

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论