C语言表达式计算课设报告

上传人:wuy****ng 文档编号:143424279 上传时间:2022-08-26 格式:DOC 页数:31 大小:458.50KB
收藏 版权申诉 举报 下载
C语言表达式计算课设报告_第1页
第1页 / 共31页
C语言表达式计算课设报告_第2页
第2页 / 共31页
C语言表达式计算课设报告_第3页
第3页 / 共31页
资源描述:

《C语言表达式计算课设报告》由会员分享,可在线阅读,更多相关《C语言表达式计算课设报告(31页珍藏版)》请在装配图网上搜索。

1、目录一、 需要分析21) 课题要求22) 课题分析23) 实现功能步骤24) 承担模块工作详解25) 运行环境2二、 概要设计31) 系统流程图32) 提示输入模块43) 表达式正误判断模块44) 中缀表达式转为后缀表达式模块45) 后缀表达式计算模块4三、 详细设计41) main函数模块42) 提示输入模块53) 表达式正误判断64) 中缀表达式转为后缀表达式75) 后缀表达式的计算9四、 调试分析141) 调试过程中遇到的问题和解决方法142) 经验和体会14五、 用户使用说明14六、 测试结果15七、 参考文献17八、 附录18图表目录图表 1 .1 输入提示15图表 2 .1 输入选

2、择错误15图表 3 .1 正常表达式计算16图表 4 .1表达式错误提示17一、 需要分析 1) 课题要求表达式计算(难度:B)要求:输入一个表达式,输出其结果。表达式由数字、运算符(+ - * / ( ) )常用数学函数组成。例如,输入 3*(sqrt(64)+(4/3),输出28。此外,如果输入的是错误的表达式,则提示错误。例如:2+*3则输出:表达式输入错误。2) 课题分析根据课题要求应该做到以下几点: 提示输入,输出提示内容。包括数的类型(浮点型),运算符种类(+、-、*、/), 函数的种 类(sqrt(x)、log(x)、fabs(x)、sin(x)、cos(x)、tan(x))。

3、主函数中设置计算循环,实现可以运算多个表达式,并设置退出表达式计算按钮。 实现表达式的正误判断,错误返回0并输出表达式错误,正确返回1。 实现将中缀表达式转为后缀表达式的处理,返回后缀表达式。 实现后缀表达式的运算,返回最后数值。3) 实现功能步骤由提示输入,输入“1”按回车进行表达式计算,输入要计算的表达式按回车就可以得出结果,由提示输入,输入“2”按回车退出表达式的计算程序。4) 承担模块工作详解我要做的是先做到输出提示输入的内容,用while语句做到多个表达式计算循环,再利用单向栈的知识做到将中缀表达式转为后缀表达式的处理,其中关乎括号和函数的处理,采用整体法思路,把括号里的内容和函数内

4、容看做整体处理,最后进行后缀表达式的计算,采用先分后整的方法,利用调用函数和递归,先进行表达式里的函数和括号里内容的计算,再整体计算。主要要编写出各部分的程序,合理的进行栈和递归的处理。5) 运行环境系统软件:Window 2000 以上系统语言选择:C语言工具软件:VC+二、 概要设计1) 系统流程图开始输入选择输入为1 输入表达式 是表达式正确 否 结束输出计算结果转为后缀表达式后缀表达式计算 是 否 2) 提示输入模块该模块进行一些输出提示,包括tishishuru(),tishishuru1() 两个函数,主要输出表达式的运算符种类,函数类型等提示,输出是否进行表达式计算板块,采用pr

5、intf,scanf 语句就可以完成。3) 表达式正误判断模块该模块包括函数panduan(char*x) 当输入一个表达式时,将表达式存入数组后,先进行表达式的正误判断。进行一个个字符的判断,用if语句进行判断,得找出所有表达式错误的情况,则剩下正确的表达式。4) 中缀表达式转为后缀表达式模块这一模块实现中缀表达式转为后缀表达式,包括函数trans(char *exp,char*postexp),利用单向栈的知识,实现入栈操作,该模块需采用整体法思想,把括号内内容和函数内容看做整体存入为后缀表达式,利于后一步的分部计算。5) 后缀表达式计算模块该模块包括compvalue (char *po

6、stex) 函数,实现对后缀表达式的计算并且返回计算结果于主函数中,采用出栈计算操作,将计算结果存入数据栈中。三、 详细设计1) main函数模块进行对各个自定义函数的调用,输入表达式,输出计算结果并利用while 语句做循环,实现多次计算。核心代码:void main () /*主函数*/ float r; /*用于存入表达式最后结果*/ char *exp; /*存放输入的表达式*/ char *postexp; /*存放后缀表达式*/ exp=(char*)malloc(MAXSIZE*sizeof(char); postexp=(char*)malloc(MAXSIZE*sizeof(

7、char); /*取内存*/ tishishuru(); /*提示输入的内容*/tishishuru1(); while (n=1) printf(请输入的表达式:); /*提示输入表达式*/ gets(exp); /*输入表达式*/ if (panduan(exp)=0) /*判断表达式正误*/ printf (tt表达式错误!n); else trans(exp,postexp); /*调用中缀表达式转后缀表达式函数*/ r=compvalue(postexp); /*调用函数*/ printf(tt输出最后结果: %g,r); /*输出计算结果*/ tishishuru1(); prin

8、tf(tt表达式计算结束n); 2) 提示输入模块实现输入的提示,主要输出表达式的运算符种类,函数类型等提示,输出是否进行表达式计算,同时进行对输入选择“1”“2”的处理,处理输入字母造成的死循环问题。核心代码:oe: printf(请选择:);scanf(%s,c);getchar();if(!(c0=1&c1=0)|(c0=2&c1=0) printf(输入错误!请重新输入!n); goto oe; n=c0-0;3) 表达式正误判断利用while 语句进行一个个字符的查看,利用if 语句判断是否出错,出错即返回0,若到最后一个字符都没有错则返回1。难点在于函数和括号内容的判断。核心代码:

9、int panduan(char *x) /*自定义函数panduan表达式正误判断*/ int i=-1,j=0,a=b=0; /*定义整型变量*/ char tem4,tem15; /*定义数组存入函数名*/ while (x+i!=0) . (省略次要部分) if(xi=a& xi=a&*exp=0&*exp=0&*postex=0&*postex=0&*postex=a&*postex=z) postex+; postex+; /*遇到函数名先跳过*/ k=1;q=p; /*q取p的首地址进行操作*/ while (k) if (*postex=() k+; if (*postex=)

10、 k-; *q=*postex; q+;postex+; q-; *q=0; /*把函数括号内的内容存入新的内存p中组成新的字符串*/ trans(p,t); /*调用函数*/ e=compvalue(t); /*调用函数函数*/ st.top+; switch (*w) case t: st.datest.top=(float)tan(e);break; /*进行tan()的运算*/ case s: if (*(+w)=q) if (e0) printf (tt不符合函数取值范围出错!n); /*不符合函数取值范围出错*/return 0;break; /*表达式出错返回返回0*/ st.d

11、atest.top=(float)sqrt(e);break; /*进行sqrt()函数的运算*/ else st.datest.top=(float)sin(e);break; /*进行san()函数的运算*/ case l: if (e0) printf (tt不符合函数取值范围出错!n); /*不符合函数取值范围出错*/ return 0;break; /*表达式出错返回返回0*/ st.datest.top=(float)log(e);break; /*进行log()函数的运算*/ case c: st.datest.top=(float)cos(e);break; /*进行cos()

12、函数的运算*/ case f: if (e0) printf (tt不符合函数取值范围出错!n); /*不符合函数取值范围出错*/ return 0;break; /*表达式出错返回返回0*/ st.datest.top=(float)fabs(e);break; /*进行fabs()函数的运算*/ break; case (: /*进行括号的运算,把括号内的表达式看做整体采用先整后分*/ postex+; k=1;q=p; while (k) if (*postex=() k+; if (*postex=) k-; *q=*postex; /*把函数括号内的内容存入新的内存p中组成新的字符再

13、 调用函数对p进行运算处理*/ q+;postex+; q-;*q=0; if (panduan(p)=0) printf (tt表达式错误!n); /*输出错误提示*/四、 调试分析1) 调试过程中遇到的问题和解决方法第一,输入选择“1”“2”时输入字母造成死循环,解决方法:把输入的内容存入字符串数组中,进行判断是否为字符“1”“2”,不是则利用goto函数返回重新输入。第二,对于先有加减号的表达式不知道如何处理,解决方法:在表达式最前方加上一个字符0,构成一个新的表达式来处理,例如:-9+8 变成0-9+8。第三,不知道如何处理函数的计算,采用转表达式整体法和计算先分后总的方法。2) 经验

14、和体会对于本次课设,题目“表达式计算”,开始拿到这个题目时觉得很简单,自己很快就可以处理好,可真正开始写代码时,发现自己在机房发呆了几节课,前几节课都没有写出什么东西。因为自己都不知道怎么下手,所以开始几堂课都在找资料,有看书的,也有百度。找到思路后,自己自学了一下数据结构书中单向栈的知识,看了一个小例题,也知道如何下手了。这个课设花了我许多时间的,虽然是在规定的几周上机时间完成的,通过课设的学习,发现自己学到了不少,C语言的知识加强了不少,了解了栈的初步学习,同时知道了对于写一个代码数量较多的程序,一定不能把一大堆代码堆在一起,而是要学会一小块一小块拼起来,确保小块正确后来确保大块的正确,那

15、样才更容易找出错误并改正。课设的学习,让我对C语言更有兴趣,感觉到程序的实用性,自己也更喜欢写代码了,希望在以后的学习中,自己可以学到更多的知识,写出更好地程序。五、 用户使用说明 本次运行程序的环境是: 程序要包括两次输入,第一输入“1”或“2” ,选择是否进行表达式计算,输入1计算,输入2 退出,按回车键确认输入。若输入1则进行表达式计算,输入要计算的表达式,按回车键计算即可。六、 测试结果图表 1.1 输入提示图表 2.1 输入选择错误图表 3.1 正常表达式计算图表 4.1表达式错误提示七、 参考文献1 C语言程序设计 (第二版)何钦铭,颜晖。2 数据结构 (C语言版) 严蔚敏,吴伟民

16、。八、 附录/*27. 表达式计算(难度:B) 要求:输入一个表达式,输出其结果。表达式由数字、运算符(+ - * / ( ) ) 常用数学函数组成。例如,输入 3*(sqrt(64)+(4/3),输出28。此外, 如果输入的是错误的表达式,则提示错误。例如:2+*3则输出:表达式输入错误。*/ /*源代码*/#include#include#include#include#define MAXSIZE 200 int n; /*定义全局变量n*/int panduan (char *x); /*自定义函数判断表达式的正误*/float compvalue (char *postex); /*

17、中缀表达式转为后缀表达式*/void trans(char *exp,char*postexp); /*进行后缀表达式的运算*/void tishishuru(); /*自定义函数提示输入的内容*/void tishishuru1(); void main () /*主函数*/ float r; /*用于存入表达式最后结果*/ char *exp; /*存放输入的表达式*/ char *postexp; /*存放后缀表达式*/ exp=(char*)malloc(MAXSIZE*sizeof(char); postexp=(char*)malloc(MAXSIZE*sizeof(char);/

18、*取内存*/system(color 6);tishishuru(); /*提示输入的内容*/tishishuru1(); while (n=1) printf(请输入的表达式:); /*提示输入表达式*/ gets(exp); /*输入表达式*/ printf(n); if (panduan(exp)=0) /*判断表达式正误*/ printf (tt表达式错误!n); printf(*n); /*清屏*/ else trans(exp,postexp); /*调用中缀表达式转后缀表达式函数*/ printf(tt输出后缀表达式:%sn,postexp); /*输出后缀表达式*/ r=com

19、pvalue(postexp); /*调用函数*/ printf(n); printf(tt输出最后结果: %g,r); /*输出计算结果*/ printf(n); printf(*n); /*清屏*/ tishishuru1(); printf(tt表达式计算结束n); void trans (char*exps,char*postexp) /*进行对中缀表达式转为后缀表达式*/ struct char date MAXSIZE; int top ; op; /*定义栈存放运算符*/ int k,i=0; /*定义整型变量*/ char *p ,*exp,*q; /*定义指针变量*/ exp

20、=(char*)malloc(MAXSIZE*sizeof(char); p=(char*)malloc(MAXSIZE*sizeof(char); q=(char*)malloc(MAXSIZE*sizeof(char); /*取内存*/ if (*exps=-|*exps=+) * exp=0; exp+; /*若表达式开头为加号或者减号,则表达式前加个零组成新的表达式*/ strcpy(exp,exps); exp-; else exp=exps; /*否则表达式不变*/ op.top=-1; /*定义开始栈*/ while (*exp!=0) switch (*exp) case s:

21、 /*进行对表达式的转化,遇到括 号或函数,把它们看做整体进行 首次后缀表达式转化*/ case l: case t: case f: case c: while (*exp=a&*exp=z) /*存取基本函数名*/ postexpi+=*exp; /*遇到字母则存入postexp*/ exp+; postexpi+=*exp; exp+; /*后移*/ k=1; /*定义K*/ while (k) if (*exp=() k+; if (*exp=) /*把函数括号内内容整体存入*/ k-; postexpi+=*exp; exp+; postexpi+=#; /*存入后用#隔开*/ br

22、eak; /*将函数作为整体存入数组*/ case (: postexpi+=*exp; exp+; k=1; while (k) if (*exp=() /*将非函数括号没的括号内内 容整体存入*/ k+; if (*exp=) k-; postexpi+=*exp; exp+; postexpi+=#; /*存入后用#隔开*/ break; case +: case -: while(op.top!=-1) postexpi+=op.dateop.top; op.top-; /*进行加减号的处理*/ op.top+; op.dateop.top=*exp; exp+; break; case *:

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!