xxxx大学信息科学与工程学院课程设计报告班级:通信工程一班姓名(学号):xxx实验项目名称:简易计算器实验室(中心):信息科学与工程学院信息技术实验室指导教师:xxx实验完成时间:2012年6月19日C语言课程设计-简易计算器通信工程11级一班2/17刘秀目录一:课程设计题目........................................................................................3二:功能描述................................................................................................3三:概要设计................................................................................................4四:详细设计................................................................................................5五:测试结果及存在的问题........................................................................9六:课程设计心得体会..............................................................................12七:附录......................................................................................................12C语言课程设计-简易计算器通信工程11级一班3/17刘秀序号项目标准评分1系统演示(功能)(50%)按要求完成系统功能且界面友好容错能力强(45-50)按要求完成系统功能界面一般有较好的容错能力(40-44)基本完成系统功能有一定的容错能力(35-39)基本完成系统功能(30-34分)未完成系统功能或他人代做或抄袭(15)2课程设计说明书(50%)课程设计书各项目认真填写,具有清晰的设计思路及软件测试结果分析(45-50)课程设计书各项目认真填写,具有较为清晰的设计思路并对软件测试结果进行了较为清晰的分析(40-44)课程设计书各项目认真填写,设计思路正确(35-39)课程设计书进行为较为认真的填写(30-34)课程设计书有未完成项或各项填写不属实或他人代做或抄袭(15)教师签字总分一、题目:简易计算器设计二、功能描述:此简易计算器根据算符优先算法原则可以计算由“+,-,*,/,(,)”组成的任意算术表达式的值。其中此程序中包含对负数和字符数据转换功能。如:-9+((2+3)*9/8-5)/(-3);C语言课程设计-简易计算器通信工程11级一班4/17刘秀三、概要设计:根据算符优先算法设计将函数功能模块分布如下:利用结构体数组中脚码的变换达到符号和数据进栈和出栈的目的。功能:完成栈的定义和初始化及函数的类型定义及运算符集合定义.功能:完成负数转换成(0-负数)形N式以便数据读入(Translate).功能:完成判断表达式是否符合一般计算表达式规则(Can).Y功能:完成运算符和数据的进栈和出栈.功能:完成数据转换和运算符比较.功能:完成函数调用以完成数值计算.算符优先算法计算表达式的值定义运算符栈和数据栈及各个函数的类型和数据的类型(自定义完成)字符型数据表达式的输入并对负数处理以符合算法规则(Translate函数完成)字符型数据转换成浮点型数据(Getdouble函数完成)算符优先级比较(Precede函数完成)运算符和数据的进栈和出栈(自定义函数完成)数据运算的过程及输出(Operate和EvaluateExpression函数完成)判断表达式是否正确(Can函数完成)C语言课程设计-简易计算器通信工程11级一班5/17刘秀四、详细设计:各功能模块的实现过程如下:1:栈的应用:通过运用结构体数组中top值的改变来达到数据进栈和出栈的目的,而栈的初始化只需将top的初始值赋为-1即可;2:表达式负数的处理(由Translate函数完成):算法说明:函数中,先扫描数组,若s[0]=‘-’,则将数组的所有元素向后移一位且首位赋值为‘0’,若数组首位之后含有形如(-5)则将负号及其以后的元素全向后移一位且负号位置赋值为‘0’,然后返回新的数组;YNYNNY开始读入字符串数组(s)S[0]=’-’?S数组首位加0s[i]=’(’且s[i+1]=’-’i+1之后元素向后移一位,s[i+1]=0it?(t为数组长度)结束返回新的数组si=i+1,t=t+1C语言课程设计-简易计算器通信工程11级一班6/17刘秀3:表达式正误的判断(由Can函数完成):函数说明:函数中将错误归为几类:括号的完整性、运算符后的数据类型、除号后的数据不能为0、小数点及运算符不能多个在一起、右括号后的数据必须为运算符或结束标志;函数通过p和s记录对这些错误的判断,并返回结果;4:进栈和出栈:说明:运算符和数据的进栈是通过给结构体数组赋值并增加top的值来记录栈的栈顶元素的位置以便取用;出栈是使top的减1后的那个数组中的数据作为新栈的栈顶元素,并返回栈顶元素.即实质上是通过改变数组的位置来达到进栈出栈;C语言课程设计-简易计算器通信工程11级一班7/17刘秀5:字符串数据转换成浮点型数据(由Getdouble函数完成):函数说明:从字符数组的运算符开始扫描,直到遇到下一个运算符结束,然后将这两个运算符间的字符记录在数组S中,再用库函数atof将字符数据转换成浮点型数据并返回数据和数组a中新的元素的起点(即扫描到的第二个运算符);6:算符优先级的比较:函数说明:此函数是记录运算符栈的栈顶元素在运算符集合中的位置与读入运算符在运算符集合中的位置,将这两个值作为运算符优先级表数组的脚码,然后返回这个元素所代表的字符;7:算符优先算法求表达式的值的核心算法:说明:此函数中使用两个工作栈,一个是OPTR,用以寄存运算符;另一个是OPND,用以寄存浮点型数据。基本思想是:首先置数栈为空栈,表达式的起始符号为‘#’算符栈的栈底元素;然后依次读入表达式中的每一个字符,若为数则进OPND数栈,若为运算符则和OPTR算符栈的栈顶运算符比较优先级后,如果栈顶算符优先级低,则此算符进栈并返回新的栈顶算符;如果栈顶算符优先级高,则取算符栈栈顶算符theta并删除此算符,同时去数栈的最上面的两个数a和b并删除这两个数,作athetab运算并将结果进数栈;如果两个算符优先级相同,则删除算符栈顶算符并返回新的栈顶算符。直到整个表达式求值完毕(即OPTR的栈顶算符和当前读入的字符均为‘#’时求值完毕)。C语言课程设计-简易计算器通信工程11级一班8/17刘秀程序框图如下:YNY=开始定义并初始化栈ch=算符栈顶元素,k=0ch!=’#’||s[k]!=’#’s[k]是算符?ch和算符栈顶元素优先级算符进栈删除栈顶元素去算符栈顶元素(theta)删除theta并返回新栈顶元素取数栈栈顶的两元素a,b删除数栈的最上面的两元素计算a(theta)b的值k=k+1ch=算符栈顶元素字符串转换为浮点型数据结果进数栈x=数栈顶元素输出x的值结束C语言课程设计-简易计算器通信工程11级一班9/17刘秀五、测试结果及存在的问题:1:系统运行效果:输入界面:正确的计算:C语言课程设计-简易计算器通信工程11级一班10/17刘秀再计算界面错误报告:C语言课程设计-简易计算器通信工程11级一班11/17刘秀修正再计算:2:存在的不足及预期的解决办法:C语言课程设计-简易计算器通信工程11级一班12/17刘秀不足之处:○1计算器的操作界面不是很美观;○2而且程序循环使用不能在指定的位置退出;○3目前只能用于计算+、-、*、/四则运算;预期的解决办法:○1查询资料学习了解操作界面的制作方法及需要的技巧;○2查询相关资料了解学习有关处理字符数组赋值的相关问题(即处理字符数组赋值只取到预定的位置);○3学习了解相关的库函数的功能以增加计算器的计算功能(如计算器的次方、开方、π、等的运算).六、课程设计心得体会:心得体会:我对编程是有很浓厚兴趣的。在编程的过程中,我深深地体会到力不从心—有些知识没能深入地理解和掌握以及VC++的许多功能没能探索和了解使我编程时有好多的思想运用不上(如设计一个美观的操作界面)。另外,我也感受到了数据结构的重要性,有了结构才能将好的思想付诸实践。同时经过查询资料了解到栈由多种运用方法,其中包括栈的顺序存储结构和链式存储结构,栈是计算表达式的经典应用。数据结构中的许多结构都是很经典思想,只有把编程语言和数据结构都熟练掌握的情况下,才能做出一些很好的作品。在编程过程中,虽然有时候是很发闷的,尤其是程序无错但结果不对,但是在完成一个完整的程序时所带来的喜悦是其它事情所不能替代的。我很喜欢编程,即使我的知识和能力有限,但我相信经过努力,一切皆有可能。七、附录:程序源代码如下:#includestdio.h#includestring.h#includestdlib.h//算符优先级表charFirst[7][7]={//'+','-','*','/','(',')','#'/*'+'*/'','','','','','','',C语言课程设计-简易计算器通信工程11级一班13/17刘秀/*'-'*/'','','','','','','',/*'*'*/'','','','','','','',/*'/'*/'','','','','','','',/*'('*/'','','','','','=','',/*')'*/'','','','','','','',/*'#'*/'','','','','','','='};//运算符数组charOP[7]={'+','-','*','/','(',')','#'};//数据结构体typedefstruct{doubledata[50];inttop;}OPND_Stack;//运算符结构体typedefstruct{chardata[50];inttop;}OPTR_Stack;//初始化运算符栈函数voidInitStack_R(OPTR_Stack*a){a-top=-1;}//初始化数据站函数voidInitStack_D(OPND_Stack*a){a-top=-1;}//运算符进栈函数voidPush_R(OPTR_Stack*a,charb){a-top++;a-data[a-top]=b;}//数据进栈函数voidPush_D(OPND_Stack*a,doubleb){a-top++;a-data[a-top]=b;}//取运算符栈顶符函数voidGetTop_R(OPTR_Stack*a,char*b){*b=a-data[a-top];}//取数据栈顶数函数C语言课程设计-简易计算器通信工程11级一班14/17刘秀voidGetTop_D(OPND_Stack*a,double*b){*b=a-data[a-top];}//判断数据是否为运算符函数intIn(chara,char*s){for(inti=0;i7;i++)if(a==s[i])return1;return0;}//算符优先级判断函数charPrecede(chara,charb){intm,n;for(inti=0;i7;i++){if(a==OP[i])m=i;if(b==OP[i])n=i;}returnF