1、4.3详细设计 44.3.1程序中用到的抽象数据类型:4.4测试与分析 64.4.1测试 64.4.2调试分析 84.5附录 85 总结与展望 121 设计时间 2010年12月27至2010年12月302 设计目的 加强我们的实践能力,掌握数据结构的应用,算法的编写,类C语言的算法转换成C程序并上级调试的基本方法。对我们基本的程序设计素养的培养和软件工作者作风的训练,起到显著的促进作用。3设计任务 设计一个程序,演示用算符优先法对算术表达式求值的过程。4设计内容4.1 需求分析4.1.1程序的功能(1)完成运算符和运算数的识别处理。 (2)在识别出运算数的同时,将字符序列形式转换成整数形式。
2、(3)实现对算数四则混和运算表达式的求值。1、在本次演示中,要输入以字符序列的形式,语法正确且不含变量的整数表达式 然后咦“#”结束。2、由于算符有优先关系,故用栈来实现。设置运算符栈接收运算符,优先权低的压入栈内,优先权高的进行运算,设置运算数栈,来接收运算数,并存储运行的结果。3、在读入字符序列的同时,完成运算符合运算数(整数)的识别处理,以及相应的运算,在识别出是运算数的同时,将当前字符序列转换成整数形式。1)8+2-32)3*(7-2)3)8/(4-2)4.2总体设计4.2.1程序用到的抽象数据类型 本程序利用栈的概念,利用栈“先进后出”的原则,利用链表的存储结构,进而设计的。(1)
3、首先定义一个栈,将字符x入栈定义栈结点,之后x出栈,既得到栈顶元素初始化的一个栈;(2) 对输入的字符判断是否为运算符,并比较其优先级;(3) 在读入字符序列的同时,完成运算符合运算数(整数)的识别处理。在读入字符序列的同时,完成运算符合运算数(整数)的识别处理在读入字符序列的同时,完成运算符合运算数(整数)的识别处理。本算法一共进行了两次调用,第一次调用是char Eval_Exp()对void PushOptr(SNode *top,char x)和char PopOptr(SNode *top)的调用,第二次是主函数对char Eval_Exp()的调用,完成了运算符的操作,完成字符串对
4、整形的转换。4.3详细设计栈#includemalloc.h#define NULL 0typedef struct node /栈结点 char date; struct node *next;SNode;SNode *InitStack() /初始化top SNode *top; top=(SNode *)malloc(sizeof(SNode); top-next=NULL; return top;4.3.2对主程序和其它主要函数写出伪码算法:char Eval_Exp() /完成运算符操作 char a,b,c,r,f,z; int result; SNode *top2; top0=
5、InitStack(); PushOptr(top0,#); top1=InitStack(); c=getchar(); while(c!=|(GetTop(top0)!) if(!In(c) PushOptr(top1,c); else r=Precede(GetTop(top0),c); switch(r) case b=PopOptr(top0); a=PopOptr(top1); z=PopOptr(top1); result=Operate(z,b,a); f=result+0; /用+完成字符串对整形的转换 PushOptr(top1,f); return f;4.3.3画出函数
6、的调用关系图各程序模块之间的层次(调用)关系:算符间优先关系如下表:+-*/()#=4.4测试与分析4.4.1测试给出测试数据,输出测试的结果,测试数据应该完整(覆盖算法各种情况)。1) 测试8+2-3结果如图4-1所示: 图4-12)测试3*(7-2)结果如图4-2所示: 图4-23)测试8/(4-2)的结果如图4-3所示:图4-34.4.2调试分析在设计程序的过程中,出现程序不能运行,发现不能找到表达式结束的标识符,因此,在设计的时候需要认为动态的添加结束标识符#,是程序能够顺利的运行。4.5附录typedef struct nodeSNode *InitStack()/初始化2个top,
7、后面用来保存我们的输入void PushOptr(SNode *top,char x) SNode *p; p=(SNode *)malloc(sizeof(SNode); p-date=x;next=top-next;next=p;char PopOptr(SNode *top) char x; if(top=NULL) return NULL; p=top- x=p-date;next=p- free(p); return x;void PushOpnd(SNode *top,char x)char PopOpnd(SNode *top)char GetTop(SNode *top) re
8、turn (top-next)-int In(char c) int n; switch(c)+-*/()n=1;break; default:n=0; return n;char Precede(char x,char y)/判断符号的优先级 int i,j; int form77=1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,0,2,1,1,1,1,2,1,1,-1,-1,-1,-1,-1,2,0; switch(x)i=0;i=1;i=2;i=3;i=4;i=5;i=6; sw
9、itch(y)j=0;j=1;j=2;j=3;j=4;j=5;j=6; if(formij=1) return else if(formij=-1) else int Operate(char x,char z,char y)/进行二元运算acb (c为运算符),并返回运算结果 int a=x-,b=y- switch(z)return a+b;return a-b;return a*b;return a/b;char Eval_Exp() char a,b,c,r,f,z;/调用上面定义的初始化方法/第一个放一个#用来表示并保存第一个输入/进行初始化 /取得你控制台的输入In(c)/如果一直
10、不是#, PushOpnd(top1,c);/放到第二个top中/继续取控制台 else/如果是#/比较优先级 a=PopOpnd(top1); z=PopOpnd(top1); PushOpnd(top1,f);void main() char result; result=Eval_Exp(); printf(%dn,result-5 总结与展望 通过这一个学期对数据结构的学习,让我认识到,数据结构就是众多编程语言里的核心,也为我们日后的学习打下基础在整个上机实践的过程中,我注意到,无论程序的大小,我们都要以一颗认真的心去对待。一旦程序中出现错误,会导致程序运行的失败。因此,在设计程序的过
11、程中,我们所要考虑的内容就不仅仅是仔细,还要做到全面。在以前的C语言学习过程中,我们只需注意如何编写函数,如何顺利的完成我们所要达到的目的,这似乎是没有什么战术而言。然而现在,情况改变了,在我们编写程序之前,还要综合考虑各种因素。如:选择我们自己所需要的数据结构,是用树,图,还是栈,串等,然后选定一种或几种存储结构来确定后面函数的主要风格。最后在编写每一个函数之前,我们应该仔细的比对,挑选最适合当前状况的算法。只有真正理解定义数据类型的好处,才能用这样这样一种数据结构来完成我们的程序,达到我们的目的。通过这次课程设计我觉得我们学习数据结构的方法存在一定的弊端,数据结构的效果直接影响到我们对其它专业课的学习和今后业务的成长。我觉得我们对于数据结构的学习不仅包括理论部分的学习,还要让我们勤动手,多实践。参考文献1严蔚敏,吴伟民.数据结构M.北京:清华大学出版社,2007.2谭浩强.C语言程序设计M.北京:清华大学出版社,2005.3成绩评定成绩 教师签字
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1