数据结构--算术表达式求值.doc_第1页
数据结构--算术表达式求值.doc_第2页
数据结构--算术表达式求值.doc_第3页
数据结构--算术表达式求值.doc_第4页
数据结构--算术表达式求值.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 设 计 说 明 书课程名称: 数据结构和算法 设计题目: 算术表达式求值 院 系: 计算机科学与信息工程学院 学生姓名: 蒋卓航 学 号: 201203030093 专业班级: 软件工程12-2班 指导教师: 宋强 2014年 06月 16日课 程 设 计 任 务 书设计题目表达式计算程序设计学生姓名蒋卓航所在院系计科系专业、年级、班软件工程12-2设计要求:1、课程设计中,每个学生必须选择参加一个题目组,共同完成课程设计任务书说明的任务,题目组人数不得超过课程设计任务书中的限定人数。2、每组自行推选一个小组长,负责整个题目组的协调和合作。3、课程设计中,每个学生必须负责完成题目的一个部分,并和其他组员讨论协作,共同完成任务书规定的任务的设计、实现和调试。 4、每个学生必须独立完成自己的课程设计说明书,说明书中除把整个项目作为背景,描述整体设计思想外,要重点介绍自己负责设计实现的部分,介绍自己的设计思路、实现过程、问题处理和收获新得。学生应完成的工作: 1、计算表达式手工录入,计算结果必须正确 2、支持两位以上的整数和浮点数的运算 3、运算符优先级表可在程序中直接通过代码初始化 4、能够检查表达式是否合法,对于错误的表达式要能够给出错误原因。参考文献阅读: 1、数据结构(C语言版) 严蔚敏 清华大学出版社 2、C语言程序设计 丁峻岭 中国铁道出版社 3、C程序设计 谭浩强 清华大学出版社工作计划: 1、第一周的第一天:小组布置设计题目;说明进度安排。 2、第一周的第二天:小组审题,查阅资料,进行设计前的必要资料准备。 3、第一周的第三天、第四天、第五天:程序编写、上机调试 4、第二周的第一天至第三天: 上机调试程序、结果分析。 5、第二周的第四天: 撰写设计报告。 6、第二周的第五天: 设计答辩及成绩评定。任务下达日期: 2014年 06月 16日 任务完成日期: 2014年 06月 27日指导教师(签名): 学生(签名): 算术表达式求值摘 要: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。关键词: 括号匹配 运算符 优先级 数据类型转换 表达式 求值目 录1. 设计背景41.1问题描述41.2 问题分析42.设计方案42.1数据结构设计42.2 算法设计42.3 ADT描述52.4 功能模块分析63. 方案实施73.1数据存储结构设计73.2主要算法流程图74. 结果与结论114.1正确结果114.2错误信息115. 收获与致谢126. 参考文献127. 附件131. 设计背景1.1问题描述 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。1.2 问题分析在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为浮点型,操作符为+、-*、/,用#表示结束。算法输出:表达式运算结果。算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。2.设计方案2.1数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。2.2 算法设计为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为”#”)。2.3 ADT描述ADT Stack数据对象:D= |ElemSet,i=1,2,,n, n0数据对象:R1=|,i=2,,n约定端为栈顶,端为栈底。基本操作: InitStack(&S) 操作结果:构造一个空栈S。 GetTop(S) 初始条件:栈S已存在。 操作结果:用P返回S的栈顶元素。 Push(&S,ch) 初始条件:栈S已存在。 操作结果:插入元素ch为新的栈顶元素。 Pop(&S) 初始条件:栈S已存在。 操作结果:删除S的栈顶元素。In(ch)操作结果:判断字符是否是运算符,运算符即返回1。 Precede(c1, c2) 初始条件:c1,c2为运算符。操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b)初始条件:a,b为整数,op为运算符。操作结果:a与b进行运算,op为运算符,返回其值。num(n)操作结果:返回操作数的长度。EvalExpr()初始条件:输入表达式合法。操作结果:返回表达式的最终结果。ADT Stack2.4 功能模块分析1.栈的基本功能。InitStack(Stack *s) 和InitStack2(Stack2 *s)分别构造运算符栈与构造操作数栈,Push(Stack *s,char ch) 运算符栈插入ch为新的栈顶元素,Push2(Stack2 *s,int ch) 操作数栈插入ch为新的栈顶元素,Pop(Stack *s) 删除运算符栈s的栈顶元素,用p返回其值,Pop2(Stack2 *s)删除操作数栈s的栈顶元素,用p返回其值,GetTop(Stack s)用p返回运算符栈s的栈顶元素,GetTop2(Stack2 s) 用p返回操作数栈s的栈顶元素。2.其它功能分析。 (1)In(char ch) 判断字符是否是运算符功能,运算符即返回1,该功能只需简单的一条语句即可实现,return(ch=+|ch=-|ch=*|ch=/|ch=(|ch=)|ch=#)。 (2) Precede(char c1,char c2) 判断运算符优先权功能,该函数判断运算符c1,c2的优先权,具体优先关系参照表1。 (3) Operate(int a,char op,int b)操作数用对应的运算符进行运算功能。运算结果直接返回。 (4) num(int n) 求操作数的长度功能,需要用itoa函数把int型转换成字符串型,strlen函数可求字符长度。 (5) EvalExpr()主要操作函数运算功能。分析详细见“3.详细设计3.2”。3. 方案实施3.1数据存储结构设计因为表达式是由操作符,运算符和界限符组成的。如果只用一个char类型栈,不能满足2位以上的整数,所以还需要定义一个int类型的栈用来寄存操作数。/* 定义字符类型栈 */typedef struct int stacksize; char *base; char *top; Stack;/* 定义浮点型栈 */ typedef struct int stacksize; int *base; int *top; Stack2;3.2主要算法流程图1. Precede(char c1,char c2) 判断运算符优先权,返回优先权高的。算符间的优先关系如下:+-*/()#+-*/(#, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , !, , , , , , , , !, =; /用一维数组存储49种情况switch(c1) /* i为下面array的横标 */ case + : i=0;break; case - : i=1;break; case * : i=2;break; case / : i=3;break; case ( : i=4;break; case ) : i=5;break; case # : i=6;break; switch(c2) /* j为下面array的纵标 */ case + : j=0;break; case - : j=1;break; case * : j=2;break; case / : j=3;break; case ( : j=4;break; case ) : j=5;break; case # : j=6;break; return (array7*i+j); /* 返回运算符array7*i+j为对应的c1,c2优先关系*/ 2. int EvalExpr()主要操作函数。算法概要流程图:利用该算法对算术表达式3*(7-2)求值操作过程如下:步骤OPTR栈OPND栈输入字符主要操作1#3*(7-2)#Push(OPND,3)2#3*(7-2)#Push(OPTR,*)3#*3(7-2)#Push(OPNR,()4#*(37-2)#Push(OPND,7)5#*(3 7-2)#Push(OPNR,-)6#*(-3 72)#Push(OPND,2)7#*(-3 7 2)#Operate(7,-,2)8#*(3 5)#Pop(OPTR)9#*3 5#Operate(3,*,5)10#15#Return(GetTop2(OPND)算法伪代码如下:int EvalExpr()/主要操作函数 c = *ptr+; while(c!=#|GetTop(OPTR)!=#) if(!In(c) /不是运算符即进栈 if(!In(*(ptr-1) ptr=ptr-1;m=atoi(ptr);/取字符串前面的数字段n=num(m); Push2(&OPND,m); ptr=ptr+n;c=*ptr+; else switch(Precede(GetTop(OPTR),c) case :/退栈并将运算结果入栈 theta=Pop(&OPTR); b=Pop2(&OPND); a=Pop2(&OPND); Push2(&OPND,Operate(a,theta,b);break; 4. 结果与结论4.1正确结果图4.1 正确结果4.2错误信息图4.2 括号匹配错误图4.3 零除错误5. 收获与致谢这次课程设计让我更加了解大一学到的C和这个学期学到的数据结构。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。就像我在写EvalExpr()函数时,忘了指针的地址符值不用加*号,这一点小小的错误也耽误了我几十分钟,所以说细节很重要。程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机的重要作用,特别算术表达式有了深刻的理解。这个程序是我们5个人完成的,同时我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致导致整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。团结协作是我们成功的一项非常重要的保证。而这次课程设计也正好锻炼我们这一点,这也是非常宝贵的最后,感谢老师在这次课程设计的悉心指导,祝老师身体健康,工作顺利。6. 参考文献1.数据结构(C语言版) 严蔚敏 清华大学出版社2.C语言程序设计 丁峻岭 中国铁道出版社3.C程序设计 谭浩强 清华大学出版社7. 附件程序源代码:#include #include #include #define OK 1#define ERROR -1 #define STACK_INIT_SIZE 100#define STACKINCREMENT 20int error=0; /* 定义字符类型栈 */ typedef struct int stacksize; char *base; char *top; Stack;/* 定义double型栈 */ typedef struct double stacksize; double *base; double *top; Stack2;/* - 全局变量- */ Stack OPTR;/* 定义运算符栈*/Stack2 OPND; /* 定义操作数栈 */ char expr255 = ; /* 存放表达式串 */ char *ptr = expr; int InitStack(Stack *s) /构造运算符栈 s-base=(char *)malloc(STACK_INIT_SIZE*sizeof(char); if(!s-base) return ERROR; s-top=s-base; s-stacksize=STACK_INIT_SIZE; return OK; int InitStack2(Stack2 *s) /构造操作数栈 s-base=(double *)malloc(STACK_INIT_SIZE*sizeof(double); if(!s-base) return ERROR; s-stacksize=STACK_INIT_SIZE; s-top=s-base; return OK; int In(char ch) /判断字符是否是运算符,运算符即返回1 return(ch!=0&ch!=1&ch!=2&ch!=3&ch!=4&ch!=5&ch!=6&ch!=7&ch!=8&ch!=9&ch!=.); int Push(Stack *s,char ch) /运算符栈插入ch为新的栈顶元素 *s-top=ch; s-top+; return 0; int Push2(Stack2 *s,double ch)/操作数栈插入ch为新的栈顶元素 *s-top=ch; s-top+; return 0; char Pop(Stack *s) /删除运算符栈s的栈顶元素,用p返回其值 char p; s-top-; p=*s-top; return p; double Pop2(Stack2 *s)/删除操作数栈s的栈顶元素,用p返回其值 double p; s-top-; p=*s-top; return p;char GetTop(Stack s)/用p返回运算符栈s的栈顶元素 char p=*(s.top-1); return p; double GetTop2(Stack2 s) /用p返回操作数栈s的栈顶元素 double p=*(s.top-1); return p; /* 判断运算符优先权,返回优先权高的 */ /运算符优先级表的初始化char Precede(char c1,char c2) int i=0,j=0; static char array49= , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 2, , , , , , , , 3, =; switch(c1) /* i为下面array的横标 */ case + : i=0;break; case - : i=1;break; case * : i=2;break; case / : i=3;break; case ( : i=4;break; case ) : i=5;break; case # : i=6;break; default:printf(表达式含有非法运算符!n);error+;break; switch(c2) /* j为下面array的纵标 */ case + : j=0;break; case - : j=1;break; case * : j=2;break; case / : j=3;break; case ( : j=4;break; case ) : j=5;break; case # : j=6;break; default:printf(表达式含有非法运算符!n);error+;break; return (array7*i+j); /* 返回运算符 */ /*操作函数 */ double Operate(double a,char op,double b) switch(op) case + : return (a+b); case - : return (a-b); case * : return (a*b); case / : if(b=0) printf(表达式零做除数!n); error+; return 0; else return (a/b); return 0; double EvalExpr()/主要操作函数 char c,theta,x; int n; double m; double a,b; c = *ptr+; while(c!=#|GetTop(OPTR)!=#) if(!In(c) if(!In(*(ptr-1) ptr=ptr-1;/校验数字 m=strtod(ptr,NULL);/取字符串前面的数字段转化为浮点型 Push2(&OPND,m); while(!In(*(ptr) ptr+; c=*ptr; else switch(Precede(GetTop(OPTR),c) case : theta=Pop(&OPTR); b=Pop2(&OP

温馨提示

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

评论

0/150

提交评论