表达式求值课程设计.doc

上传人:cn****1 文档编号:562705069 上传时间:2023-04-02 格式:DOC 页数:16 大小:118KB
返回 下载 相关 举报
表达式求值课程设计.doc_第1页
第1页 / 共16页
表达式求值课程设计.doc_第2页
第2页 / 共16页
表达式求值课程设计.doc_第3页
第3页 / 共16页
表达式求值课程设计.doc_第4页
第4页 / 共16页
表达式求值课程设计.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《表达式求值课程设计.doc》由会员分享,可在线阅读,更多相关《表达式求值课程设计.doc(16页珍藏版)》请在金锄头文库上搜索。

1、宜春学院数学与计算机科学学院课 程 名 称: 数据结构 课 程 代 码: 题 目: 表达式求值 年级/专业/班: 12嵌入班 学 生 姓 名: 李诗蒙、许鹏晖、胡鱼帅 学 号: 1231308104、1231308121 、12313081 指 导 教 师: 易战军 开 题 时 间: 2013 年 12 月 16 日完 成 时 间: 2013 年 12 月 26 日第- 1 -页目 录摘 要1一、引 言1二、设计目的与任务1三、设计方案2四、结 论10五、致 谢12六、参考文献12摘 要关键词:表达式求值实现表达式求值的功能,可以小数整数混合运算,如果表达式输入错误要提示错误的原因,并且正确求

2、出表达式的值。一、引 言 程序可以实现,输入表达式的字符串,以“=”表示结束,计算并输入表达式的值,操作数可以是整数或小数,操作符有“+”,“-”,“*”,“/”,“(”,“)”的值。二、 设计目的与任务实验目的:掌握栈的工作原理实验任务:1、实现()、+、-、*、/等运算;2、实现小数和整数混合运算;3、优先级的处理;4、能判断算术表达式是否正确(除数为0,括号配对问题);5、正确计算出表达式的结果,错误的表达式说明原第2页三、 设计方案程序框图如图所示:开始输入中缀表达式中缀表达式转换为后缀表达式表达式求值输出表达式的值结束首先输入一个字符串,对于这些字符串,我们要同过一些函数对其识别,要

3、把我们认为的数字和运算符分开来,函数实现如下:int isdigit(string s)string a9=#,(,),%,+,-,*,/,=;for(int i=0;i9;i+)if(i=8&ai!=s)return 1;if(ai=s)return 0;elsecontinue;void strtok_f(string st,string *ss,int &n)string s=;for(int j=0;jst.size();j+)ssj=;for(int i=0;ist.size();i+)s=s+sti;if(i=0&!isdigit(s)ssn=ssn+sti;n+;elseif(i

4、sdigit(s)ssn=ssn+s;string q=;q=q+sti+1;if(!isdigit(q)n+;elsessn=ssn+sti;n+;s=;以上是将我们认为的数字和运算符分开。然后我们把我们认为的数字进行处理,因为在电脑里这些还是字符。处理的函数如下:int check_point(string s)for(int i=0;is.size();i+)if(i=s.size()-1&si!=.)return -1;if(si=.)return i;elsecontinue;string double_string(double a)string st1=,st2=.,st3=;i

5、nt b=int(a);double c=a-b;if(c=0)st3=0;while(b)int x=b%10;st1=char(x+48)+st1;b=b/10;while(c!=0)int x=int(c/0.1);st3=st3+char(x+48);c=c/0.1-x;return st1+st2+st3;void get_two_string(string s,string &s1,string &s2,int n)if(n=-1)s1=s;s2=0;elsefor(int i=0;in;i+)s1=s1+si;for(int j=n+1;js.size();j+)s2=s2+sj

6、;double string_double_target(string s)int i=0,len=s.size();double n=0;while(ist;string *ss=new stringst.size();strtok_f(st,ss,nn);int r=0;while(rnn)ch=ssr;while(!StackEmpty(OPTR)&ch!=#)if(isdigit(ch)an=ch;n+;break;elsech1=GetTop(OPTR);if(isp(ch1)icp(ch)op=popLstack(OPTR);an=op;n+;elseop=popLstack(OP

7、TR);if(op=()break; r+;最后对后缀表达式进行计算得到表达式的值,函数实现如下:double reasault(string *a,int x)LinkStack port=new Linknode;InitStack(port);string Right,Left,Target;double left,right,target;for(int i=0;ix-1;i+)if(isdigit(ai)pushLstack(port,ai);elseRight=popLstack(port);right=string_double(Right);Left=popLstack(por

8、t);left=string_double(Left);if(left = 0)printf(除数为0,不能运算);exit(0);switch(ai0)case +:target=left+right;Target=double_string(target);pushLstack(port,Target);break;case -:target=left-right;Target=double_string(target);pushLstack(port,Target);break;case *:target=left*right;Target=double_string(target);p

9、ushLstack(port,Target);break;case /:target=left/right;Target=double_string(target);pushLstack(port,Target);break;case #:return target;return target;对于判断表达式正确与否我们通过判断后缀表达式最后能否在计算来判断它的对错,而除数为零的问题我们在对两个数进行计算前对除数进行判断,如是零就不再计算。而对于带小数的数,我们在进行字符串处理时就处理好了。运算结果如下图:1、正确表达式:2、表达式为零报错:3、表达式不正确报错:4、表达式中不是运算符报错:5

10、、程序不完善出错:四、结 论 这次课程设计让我更加了解大一学到的C和这个学期学到的数据结构。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。就像我在写EvalExpr()函数时,忘了指针的地址符值不用加*号,这一点小小的错误也耽误了我几十分钟,所以说细节很重要。程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号