还剩5页未读,继续阅读
文本内容:
中缀表达式求值实验报告
一、需求分析要实现的功能描述
1.问题描述在计算机中,算术表达式由常量、变量、运算符和括号组成由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行因而在程序设计时,借助栈实现
2.实现功能算法输入一个算术表达式,由常量、变量、运算符和括号组成以字符串形式输入为简化,规定操作数只能为正整数,操作符为“+、-、*、/算法运行将输入的中缀表达式改为后缀表达式,并进行运算算法输出输出后缀表达式和表达式运算结果
3.测试数据
1、1+3*4-5/5;一位数运算
2、45-5*1+2/5;多位数运算
二、概要设计整个程序包含功能模块及模块间的调用关系
1、struct node创建结构体,被主函数调用
2、struct node*Initialization创建栈链,被主函数调用
3、struct node*assortstruct node*s将中缀表达式转换为后缀表达式并存在s2中被主函数调用
4、struct node*calcolateCstruct node*s求出表达式的值,被主函数调用
5、void main主函数,调用所有函数
三、详细设计抽象数据类型中定义的各种操作算法实现用N-S图描述调试分析
1.程序在调式过程中出现的问题及解决方法一开始选用直接运算方式运用两个栈来存放数字和操作符,后来写着确实不行然后直接转用转为后缀表达式再进行计算在写将多位数(比如123*12)存放字符串中时:一开始我想着直接转换成数字存入数组中,但一直不成功,只能将第一个多位数转换成功;后来在和同学之间交流并且百度搜索后改为直接存入字符串中,再存入字符串过程中,我发现几个数字之间可能没法区分是前一个数字的还是后一个数字的,于是我在扫描字符串过程中在扫描到操作字符时将存入数字的那个字符串s2空出一位,用以区分前后两个数字,如12+45*,如果直接存入字符串中会是s21245*+;但加空格后为s212(空格)45*+;这样后面运算时就好区分两多位数字
2.心得体会在写程序之前要选择适合自己的算法即自己熟悉的能编出的算法,这样后续的编程会简便多了对于一个要实现的功能,会有很多不同的算法,当你一个算法用不了时,可以换一个算法编程,目的是死的,人是活的,算法是活的,程序也是活的!
五、用户手册该软件的操作方法简介输入一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)为简化,规定操作数只能为正整数,操作符为“+、-、*、/,按回车结束输入程序运行输出输出后缀表达式和表达式运算结果
六、测试结果根据已提供的测试数据得到什么样的结果(可以截屏)()>();11+3*4-5/5■H:\2\l\bi n\Debu g\l.exe[请输入表达式(运算符号可以为+、-、*、/、(、))1+3*4-(5/5)后缀表达式为134*55/-+I计算结果为12Process returned00x0execution time
25.200s Pressany keyto continue.
2、45-5*1+2/5;I MM;H:\2\l\bi n\Debug\l.exe回请输入表达式(运算符号可以为+、-、*、/、(、))45-5*(1+2)/5后缀表达式为45512+*5/-计算结果为42Process returned00x0execution time
29.113s Pressany keyto continue.
七、程序清单#includestdio.h#includemalloc.h#includestring.h#includestdlib.h#define MAX60#define RIGHT1#define WRONG0#define DEMAX15#define NULL0char si[MAX];char s2[MAX];int j=0;struct node〃定义结构体char data;int num;struct node*next;;struct nodeInitialization//初始化栈链,链栈不带头结点struct node*top;top=struct node*mallocsizeofstruct node;;top-data=Vtop-num=0;top-next=NULL;return top;}struct node*assortstruct node*s〃输入字符串struct node*p,*top;int i;top=s;int m;char a;m=strlensl;fori=0;i=m;i++a=sl[i];if,0,=sl[i]sl[il=,9,s2U]=sl[i];;j++elseswitcha casep=struct node*mallocsizeofstruct node;p-data=a;p-next=top;top=p;break;casecase7:s2加一;;J++,iftop-data==,K||top-data==7,s2[j]=top-data;j++;〃比其高,现将栈顶运算符出栈,再进栈top-data=a;break;elsep=struct node*mallocsizeofstruct node;//否,直接进栈p-data=a;p-next=top;top=p;break;casecases2[j尸;;j++iftop-data==+,||top-data==,-,||top-data==,:{:,||top-data==7,{s2[j]=top-data;j++;top-data=a;break;elsep=struct node*mallocsizeofstruct node;p-data=a;p-next=top;top=p;break;cases2[j]=;j++iftop-data==;*printfHinput error0;break;whiletop-data!=,,s2|j]=top-data;J++;p=top;top=top-next;freep;}P=top;top=top-next;freep;break;whiletop-data!=’1s2[j]=top-data;j++;p=top;top=top-next;freep;s2[j]=T;printf后缀表达式为fori=0;ij;i++ifs2[i]!=’printfH%c n,s2[i];printfCAn M;return top;}struct node^calcolatestruct node*s〃计算表达式的值struct node*top,*p;char*q;int x,y,a;int i,n;t叩二s;〃指向栈顶的指针fori=0;i=j;i++〃遍历字符串s2ifs2[i]=,0,s2[i]=,9,{q=s2[i];a=atoiq;forn=i;s2[n]-0s2[n]-9;n++{}p=struct node*mallocsizeofstruct node;p-num=a;p-next=top;top=p;i=n-l;else ifs2[i]=-;1〃遇;号结束标志,输出栈中的最后计算结果printf计算结果为:%d\nH,top-num;elseifs2[i]==,*{}else{y=top-num;p=top;top=top-next;freep;x=top-num;P=top;top=top-next;freep;switchs2[i]casea=x+y;p=struct node*mallocsizeofstruct node;p-num=a;p-next=top;top=p;break;casea=x-y;p=struct node*mallocsizeofstruct node;p-num=a;p-next=top;;top=p break;casea二x*y;p=struct node^mallocsizeofstruct node;p-num=a;p-next=top;top=p;break;case7‘a=floatx/y;p=struct node*mallocsizeofstruct node;p-num=a;p-next=top;;top=p break;return0;void mainstructnode*top,*head;top=Initialization;printf”请输入表达式运算符号可以为:+、-、*、/、、\n getssl;head=assorttop;calcolatehead;。