




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
浙江工商大学《C++课程设计》报告PAGE16课程设计实验报告题目学院专业班级课程名称学号学生姓名指导教师成 绩二○一三年一月
目录1概述1.1课程设计目的1.2课程设计内容1.3课程设计思想2系统需求分析2.1系统目标2.2主体功能2.3开发环境3系统概要分析3.1设计步骤3.2界面设计3.3主要代码4结论与心得体会4.1遇到的问题与解决方法4.2心得5附录5.1测试5.2程序源代码
1概述课程设计目的《面向对象程序设计》是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程后进行的一次较全面的综合练习。其目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用C++语言进行面向对象设计的基本方法,提高运用面向对象方法分析实际问题、解决实际问题的能力。1、巩固并加深学生对C++语言程序设计知识的理解;2、培养学生面向对象的程序设计思想,使学生认识面向过程和面向对象两种设计方法的区别;3、进一步掌握和应用VS2010集成开发环境;4、提高运用C++语言解决实际问题的能力;5、掌握书写程序设计开发文档的能力(书写课程设计实验报告)。课程设计内容课题名称:功能齐全的计算器说明:利用MFC实现一个功能齐全的计算器要求:实现的基本功能有:加、减、乘、除、计算带括号的运算式;扩展功能有开平方、求三角函数、阶乘、自然底数e的幂、10的幂和普通数的幂、进制的转化等;输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个编辑框中;计算功能基本上是用系统内部函数;“归零”按钮可以清除所有已输入的数据从头计算;“←”按钮可以退位。课程设计思想如流程图1所示,先在编辑框中输入运算式,通过IsChar()函数判断表达式中是否有复杂的运算符。若无,则进行简单的双目运算;若有,则通过String_Replace()函数将IsChar()函数无法识别的运算符或字符用一定方式或浮点数替换,再进行简单的双目运算。开始开始键入运算式,按下=键输入运算式字符串IsChar();是否含有复杂运算符?简单计算Simple()读入运算符和运算符前后两个浮点数返回结果(double型)递归计算括号内的值替换函数String_replace();把无意义的字符换成有意义的浮点数gcvt()函数转化成字符串用SetDlgItemText()在对话框中输出结束NY图1系统需求分析系统目标我们在学习生活中,常会遇到一些繁杂的数值运算,这时候我们就必须用到科学计算器,所以便着手开发了这个计算器程序,以便用于自己的学习工作。要计算功能有以下几个方面:加法,减法,乘法,除法,求幂,求平方根,求Sin,求Cos。主体功能1、十进制数的加、减、乘、除、乘方、阶乘等简单计算。2、科学计算函数,包括正弦、余弦、正切、开方、指数等函数运算。3、实现括号的优先级判断。4、将编辑框里的内容以转化成二、八、十六进制。开发环境Windows操作系统,MicrosoftVisualStudio2010。系统详细设计设计步骤打开VS2010,在文件中点击新建,在弹出框内选择MFCAppWizard[exe]工程,输入工程名Calculator及其所在位置,点击确定,如图2所示。图2新建MFCAppWizard[exe]工程选择基于对话框,如图3所示图3基于对话框界面设计设计如图4所示的计算机界面,右击创建类向导,如表1所示,为每个控件添加ID号和单击响应事件的消息处理(BN_CLICKED)。图4计算机主界面对象ID标题或说明编辑框IDC_EDIT1结果显示按钮IDC_BTNCLEAR归零按钮IDC_BTNBACK←按钮IDC_BUTTON00按钮IDC_BUTTON11按钮IDC_BUTTON22按钮IDC_BUTTON33按钮IDC_BUTTON44按钮IDC_BUTTON55按钮IDC_BUTTON66按钮IDC_BUTTON77按钮IDC_BUTTON88按钮IDC_BUTTON99按钮IDC_BUTTONPOINT.按钮IDC_BTNADD+按钮IDC_BTNSUB-按钮IDC_BTNPLUS*按钮IDC_BTNDIV/按钮IDC_BTNFACTORIALn!按钮IDC_BTNAQRTsqrt按钮IDC_BTNCENTMod按钮IDC_BTNLOGlog按钮IDC_BTNLNln按钮IDC_BTNSINsin按钮IDC_BTNCOScos按钮IDC_BTNTANtan按钮IDC_BTNEXPEXP按钮IDC_BTNEQUAL=按钮IDC_BTNPOWERx^y按钮IDC_BTNLBRACK(按钮IDC_BTNRBRACK)按钮IDC_BTNPIπ单选IDC_RADIO1二单选IDC_RADIO2八单选IDC_RADIO3十单选IDC_RADIO4十六表1各按钮和编辑框等对象的属性如图5所示,为IDC_EDIT1和IDC_RADIO1添加变量。图5添加变量主要代码1)“=”键单击响应代码voidCCalculatorVersion3Dlg::OnBtnequal(){ UpdateData(); m_str=m_string; while(!IsChar(m_str))//判断表达式中是否有其他字符{Calculate(m_str); } doublesum=Simple(m_str); if(sum>-9.9002032198673601e-10&&sum<9.9002032198673601e-10){sum=0;} if(sum>0.4999999&&sum<0.5000001){sum=0.5;} if(sum<-0.4999999&&sum>-0.5000001){sum=-0.5;}charanswer[30]; gcvt(sum,20,answer);//把浮点数转换成字符串,同时返回一个指向字符串的存储位置的指针 SetDlgItemText(IDC_EDIT1,answer);}2)简单双目运算doubleCCalculatorVersion3Dlg::Simple(stringstr){ doublea=0; doubleb,c; charop; istringstreamsin(str);//定义字符流for(sin>>b;sin>>op>>c;)//分别读入运算符和运算符前后¨两个浮点数 { switch(op) { case'-'://减法运算 c=-c; case'+'://加法运算 a+=b; b=c; break; case'*'://乘法运算 b*=c; break; case'/'://除法运算 if(c==0) { MessageBox("Can'tbedividedbyzero");break; } b=b/c; break; case'%'://double数据的取模 if((long)c!=0) b=fmod(b,c); break; default: break; } }returna+b;}3)判断是否有简单双目运算以外的字符或运算符BOOLCCalculatorVersion3Dlg::IsChar(stringstr){ inti; for(i=0;i<str.length();i++) { if(!((str[i]>='0'&&str[i]<='9')||(str[i]=='+')||(str[i]=='-')|| (str[i]=='*')||(str[i]=='/')||(str[i]=='.')||(str[i]=='e')||(str[i]=='%'))) returnFALSE; } returnTRUE;}4)转换函数voidCCalculatorVersion3Dlg::String_replace(string&strBig,conststring&strsrc,conststring&strdst){ { string::size_typepos=0;string::size_typesrclen=strsrc.size();string::size_typedstlen=strdst.size();while((pos=strBig.find(strsrc,pos))!=string::npos) {strBig.replace(pos,srclen,strdst);pos+=dstlen; }}}5)复杂运算doubleCCalculatorVersion3Dlg::Calculate(string&str){//递归计算括号内的值 if(IsChar(str)) { doubletok=Simple(str); chartoken[20] ; gcvt(tok,20,token); String_replace(m_str,str,token); } else { //是否有PI while(str.find("PI")!=-1) { String_replace(m_str,str.substr(str.find("PI"),2),PI); }//是否有e while(str.find("EI")!=-1) { String_replace(m_str,str.substr(str.find("EI"),2),EI); } //是否有括号 while(str.find(")")!=-1) { intrightBrk=str.find(")"); intleftBrk=str.rfind("(",rightBrk); str.erase(rightBrk,1); str.erase(leftBrk,1); returnCalculate(str.substr(leftBrk,rightBrk-leftBrk-1)); } //是否有sqrt while(str.find("sqrt")!=-1) { intm1=str.find("sqrt"); intr1=FindRight(m1+3); doublec1=sqrt(atof(str.substr(m1+4,r1-m1-3).c_str())); charch1[20]; gcvt(c1,20,ch1); String_replace(m_str,str.substr(m1,r1-m1+1),ch1); } //是否有log while(str.find("log")!=-1) { intm2=str.find("log"); intr2=FindRight(m2+2); doublec2=log10(atof(str.substr(m2+3,r2-m2-2).c_str())); charch2[20]; gcvt(c2,20,ch2); String_replace(m_str,str.substr(m2,r2-m2+1),ch2); } //是否有ln while(str.find("ln")!=-1) { intm3=str.find("ln"); intr3=FindRight(m3+1); doublec3=log(atof(str.substr(m3+2,r3-m3-1).c_str())); charch3[20]; gcvt(c3,20,ch3); String_replace(m_str,str.substr(m3,r3-m3+1),ch3); } //是否有阶乘 while(str.find("!")!=-1) { intm4=str.find("!"); intl1=FindLeft(m4); intc4=atoi(str.substr(l1,m4-l1).c_str()); intsum=1; for(intm=1;m<=c4;m++) sum*=m; charch4[20]; itoa(sum,ch4,10); String_replace(m_str,str.substr(l1,m4-l1+1),ch4); } //是否有三角函数 while(str.find("sin")!=-1) { intm5=str.find("sin"); intr5=FindRight(m5+2); doublec5=sin(atof(str.substr(m5+3,r5-m5-2).c_str())/180*pi); if(c5>-9.9002032198673601e-10&&c5<9.9002032198673601e-10){c5=0;} if(c5>0.4999999&&c5<0.5000001){c5=0.5;} if(c5<-0.4999999&&c5>-0.5000001){c5=-0.5;} charch5[20]; gcvt(c5,20,ch5); String_replace(m_str,str.substr(m5,r5-m5+1),ch5); } while(str.find("cos")!=-1) { intm6=str.find("cos"); intr6=FindRight(m6+2); doublec6=cos(atof(str.substr(m6+3,r6-m6-2).c_str())/180*pi); if(c6>-9.9002032198673601e-10&&c6<9.9002032198673601e-10){c6=0;} if(c6>0.4999999&&c6<0.5000001){c6=0.5;} if(c6<-0.4999999&&c6>-0.5000001){c6=-0.5;} charch6[20]; gcvt(c6,20,ch6); String_replace(m_str,str.substr(m6,r6-m6+1),ch6); } while(str.find("tan")!=-1) { intm7=str.find("tan"); intr7=FindRight(m7+2); doublec7=tan(atof(str.substr(m7+3,r7-m7-2).c_str())/180*pi); if(c7>-9.9002032198673601e-10&&c7<9.9002032198673601e-10){c7=0;} if(c7>0.4999999&&c7<0.5000001){c7=0.5;} if(c7<-0.4999999&&c7>-0.5000001){c7=-0.5;} charch7[20]; gcvt(c7,20,ch7); String_replace(m_str,str.substr(m7,r7-m7+1),ch7); } //是否有“^” while(str.find("^")!=-1) { intmd=str.find("^"); intleft=FindLeft(md); intright=FindRight(md); charc[20]; doubleaa,bb; aa=atof(str.substr(left,md-left).c_str()); bb=atof(str.substr(md+1,right-md).c_str()); gcvt(pow(aa,bb),20,c); String_replace(m_str,str.substr(left,right-left+1),c); } } return0;}6)小数点的左部和右部intCCalculatorVersion3Dlg::FindLeft(intm){ for(inti=m-1;i>=0;i--) { if(!((m_str[i]>='0'&&m_str[i]<='9')||(m_str[i]=='.'))) returni+1; } return0;}intCCalculatorVersion3Dlg::FindRight(intm){ for(intj=m+1;j<m_str.length();j++) { if(!((m_str[j]>='0'&&m_str[j]<='9')||(m_str[j]=='.'))) returnj-1; } returnm_str.length()-1;}
4结论与心得体会4.1遇到的问题与解决方法1、DebugAssertionFailed. File:dlgdata.cpp Line:43 Solution:编辑框Edit1属性选Group2、DebugAssertionFailed. File:dlgdata.cpp Line:269 Solution:单选IDC_RADIO1的属性选Group,其他不设3、ASSERTION::IsWindow(m_hWnd)断言 Solution:消除野指针4.2心得这学期上过WINDOWS高级编程,书上有一个简易的计算器的制作,但是对于利用MFC这个类库制作能进行科学运算的方法还不是很了解。这个计算器我命名为VERSION3.0的原因,是我在这个版本之前还做了两个计算器。第一个不能实现科学的单目运算,第二个能进行三角函数等运算但不能实现括号。后来将网上下载来的资源整理后发现substr()、find()等函数的功能,才写出这个计算器。感觉写得并不是很好,因为还有一些问题没有得到完全的解决,比如sin函数与括号的结合问题,至今还没找到解决的方法,只能以后有空再好好想想了!本来还想上网学一下MFC的美化,把这个页面做得好看一些的,但时间不允许了,所以只是在同学的指点下添加了计算器的背景图。总的来说,这次的课程设计,还是让自己学到不少东西,同时也感觉到自己现在的不足——基础不够扎实,很多东西都是一知半解,真的要好好加强对基础知识的学习了!很多问题,不仅仅只是把功能实现就行了,还要注意代码的优化,把结果做得更好!
5附录5.1测试1)(7-9)/5结果正确,证明可以实现双目运算符的连续运算,菜单功能正常2)sin30运算结果证明单目运算符能运行成功3)8/0证明错误提示功能实现正常5.2程序源代码//CalculatorVersion3Dlg.cpp:实现文件#include"stdafx.h"#include"CalculatorVersion3.h"#include"CalculatorVersion3Dlg.h"#include"afxdialogex.h"#include<string>#include<sstream>#include<cmath>usingnamespacestd; #definepi3.141592653579893constchar*PI="3.141592653579893";constchar*EI="2.718281828459045";……voidCCalculatorVersion3Dlg::OnBtnclear(){ m_string=""; UpdateData(FALSE);}voidCCalculatorVersion3Dlg::OnRadio1(){ m_num=0; UpdateData(); intanswer1=(int)atof(m_string.operatorLPCTSTR());itoa(answer1,(char*)m_string.operatorLPCTSTR(),2); UpdateData(FALSE);}v
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人员动态调配管理制度
- 餐饮经理竞聘演讲稿
- 焊工初训考试试题及答案
- 社康护理考试试题及答案
- 竞聘经理成功演讲稿
- 竞选班长的演讲稿
- 化工招聘笔试试题及答案
- 牡丹江科目二试题及答案
- 2025年重庆国企面试真题及答案
- 湖北初中模拟试卷及答案
- 2025至2030年中国液态锂电池行业市场发展现状及投资潜力预测报告
- 机房设备维修服务项目投标方案(技术标)
- (2025年标准)个人薪酬协议书
- 搅拌车司机安全培训课件
- 2025年易制毒试题(含答案)
- 2025年医院药事管理自查报告及整改措施
- 工程地质学 第3版 课件 第3章 地质构造
- 2025标准建设银行贷款合同范本
- 2025年沥青搅拌站试题库(含答案)
- 2024版高中同步学案优化设计思想政治必修4人教版-第二单元测评
- 2024北京一零一中高三10月月考语文试题及答案
评论
0/150
提交评论