研究生课程论文课程名称C++语言应用授课学期2013学年至2014学年第一学期学院电子工程学院专业电子与通信学号2013011646姓名刘艳红任课教师闭金杰专题C++的带括号四则运算设计交稿日期2014年02月15日成绩阅读教师签名日期广西师范大学研究生学院目录摘要.......................................................................................................1一、设计任务,目的与要求....................................................................21.设计内容:.......................................................................................22.设计目的:.......................................................................................23.设计要求:.......................................................................................2二、概要设计.............................................................................................31.需求分析:.......................................................................................32.设计要求:.......................................................................................33.总体设计:.......................................................................................3三、运行结果及分析................................................................................51.程序运行测试:...............................................................................52.测试数据:.......................................................................................53.结果及分析.......................................................................................6附录.........................................................................................................7四则运算的程序:..............................................................................71摘要在工资管理软件中,不可避免的要用到公式的定义及求值等问题。对于数学表达式的计算,虽然可以直接对表达式进行扫描并按照优先级逐步计算,但也可以将中缀表达式转换为逆波兰表达式,这样更容易处理。四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。问题描述:有理数是一个可以化为一个分数的数,例如2/3,533/920,-12/49都是有理数,而就为无理数。在C++中,并没有预先定义有理数,需要时可以定义一个有理数类,将有理数的分子和分母分别存放在两个整型变量中。对有理数的各种操作都可以用重载运算符来实现。基本要求:定义并实现一个有理数类,通过重载运算符+、-、*、/对有理数进行算术运算,通过重载运算符==实现判定两个有理数是否相等。写一个优化函数,它的作用是使有理数约去公分母,也即是使保存的有理数分子和分母之间没有公约数(除去1以外)。此外,还要定义一个将有理数转换为实数的函数,再加上构造函数和有理数输出函数。2一、设计任务,目的与要求1.设计内容:四则运算显示功能要求:1)在屏幕能够手动输入待运算的带有括号的四则运算式子;2)输入完成后,通过选择可以完成运算式的运算;3)将结果显示在屏幕上。4)验收时程序能够演示,自己单独做。5)输入是一个带有括号的四则运算表达式,输出是计算得出的正确计算结果。例如:输入:123+213-67*34+345/23*45。2.设计目的:1)复习、巩固C++语言的基础知识,进一步加深对C++语言的理解和掌握。2)课程设计为将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力。提高适应实际,实践编程的能力。3.设计要求:1)对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理。2)系统设计要实用,编程简练,可用,功能全面。3)说明书、流程图要清楚。4)记录设计情况(备查,也为编写设计说明书作好准备)。5)要求采用模块化程序设计方法,要求上机调试通过和按设计报告格式。6)设计上交内容:设计报告一人一份(按格式书写);源程序文件。3二、概要设计1.需求分析:1.四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。2.用户通过键盘输入一个中缀表达式,回车表示结束。3.在Dos界面输出后缀表达式。4.测试数据输入:21+23*(12-6)输出:2123126-*+2.设计要求:实现带有括号的四则运算。输入是一个带有括号的四则运算表达式,输出是计算得出的正确计算结果。算法的设计:设有两个有理数a*b和c/d,则有(1)有理数相加计算式=a*d+b/c;(2)有理数相减计算式=a*d-b/c;(3)有理数相乘计算式=a*(b+c-d);(4)有理数相除计算式=a/d;输入:123+213-67*34+345/23*45*(34+34-345+245+567)回车,然后程序计算得出结果为:359183。3.总体设计:算法的基本思想:建树是本程序的难点。思路很直观,就是按照每次查找当前表达式区间的最后一次运算的运算符然后以这个运算符为根把区间分成左右进行递归建树。比如1+2*(1+2),最后一次运算是1+2*(1+2)标记为红色的加号,把它作为根节点然后把表达式分为“1”和“2*(1+2)”进行递归,函数返回的是该函数处理区间表达式的根节点。判断最后运算的运算符(即根节点)的方法是找表达式中最右边的不在括号中的+或-,如果没有那就选最右边的不在括号中4的*或/。根据此算法设计流程图为:进入程序检查字符匹配字符串转换为浮点数输出error除法加法乘法减法四则运算的结果YESNO5三、运行结果及分析1.程序运行测试:在电脑中打开C++应用程序,首先进入VC++6.0,将程序代码输入,编译,组建,调试。观察运行结果,和各个功能情况。针对有理数的各种算法,首先要定义一个有理数类,在类中定义两个整型变量作为私有数据,分别存放有理数的分子和分母;其次,要对有理数进行各种不同的操作,如加、减、乘、除、判断两个有理数是否相等等各种关系运算,有理数是通过分数形式来进行各种运算的,有理数的加减乘除,并不是简单的分子与与分子相加减,分母与分母相加减,故要实现它的各种不同的运算,则要针对每种算法进行不同的操作,处理好两个有理数的分子与分母之间的运算;再次,有理数是一个可以转化为分数的数,但它还有实数的形式,所以,要定义一个函数来实现将有理数的分数形式转化为实数形式,以实现其完整性;同时当从键盘输入一个有理数的分子与分母,或者两数进行运算后,有理数之间并不是最优化的形式,分子与分母之间仍可以进行化简,所以,针对这种情况仍需要定义一个函数来使有理数的分数形式化为最简,以实现有理数的最优化。2.测试数据:在应用程序中,创建若干有理数对象,通过带参数的构造函数使得各有理数对象值各不相同,然后分别进行各类运算,输出运算结果,检验其正确性。算法的时空分析如建树复杂度:每次递归查找根节点的复杂度是)(n,n为当前表达式树的规模(节点数),所以总的开销是按这种规则所建的树中的所有子树的规模之和。其他部分的复杂度:后续遍历的复杂度是)(EV,计算后序表达式的复杂度是)(V,由于建树的复杂度要大于其他部分功能的复杂度,所以本实验实现的复杂度即为建树的复杂度。输入和输出的格式:输入:在字符界面上输入一个中缀表达式,回车表示结束。输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。63.结果及分析程序计算得出结果为:359183。是在基于对话框的应用程序中模拟一个计算器,本计算器分为基础模式和拓展模式。其中基础模式可以把十进制转化为二进制~十六进制之间的任意进制,可以进行一些常用的函数运算(比如sin、cos、tan、sqrt、ln等),可以用来求一些简单的定积分。拓展模式可以进行十进制下的四则运算(加、减、乘、除)和四则混合运算,还可以支持带“(”,“)”符号的表达式的计算。系统开发平台为Windows7,程序设计设计语言采用VisualC++6.0,程序运行平台为Windows98/2000/XP。程序通过调试运行,初步实现了设计目标。7附录四则运算的程序:#includeiostream#includestdio.h#includectype.h#includestdlib.husingnamespacestd;chartoken[61];/*存放表达式字符串的数组*/intn=0;doubleterm(void);/*计算乘除的函数*/doublefactor(void);/*处理括号和数字的函数*/classA{public:voiderror(void);voidmatch(charexpected);doubleterm(void);doublefactor(void);doubleexp(void);};voidA::error(void)/*报告错误函数*/{coutERROR!\n;exit(1);}voidA::match(charexpected)/*检查字符匹配的函数*/{if(token[n]==expected)token[++n]=getchar();elseerror();}doubleA::factor(void){doubletemp;charnumber[61];inti=0;8if(token[n]=='('){match('(');temp=exp();match(')');}elseif(isdigit(token[n])||token[n]=='.'){while(isdigit(token[n])||token[n]=='.')/*将字符串转换为浮点数*/{number[i++]=token[n++];token[n]=getchar();}number[i]='\0';temp=atof(number);}elseerror();returntemp;}doubleA::term(void){doublediv;doubletemp=factor();while((token[n]=='*