收藏 分享(赏)

数据结构--算术表达式求值.doc

上传人:myw993772 文档编号:4563546 上传时间:2019-01-02 格式:DOC 页数:22 大小:153KB
下载 相关 举报
数据结构--算术表达式求值.doc_第1页
第1页 / 共22页
数据结构--算术表达式求值.doc_第2页
第2页 / 共22页
数据结构--算术表达式求值.doc_第3页
第3页 / 共22页
数据结构--算术表达式求值.doc_第4页
第4页 / 共22页
数据结构--算术表达式求值.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、课 程 设 计 说 明 书课程名称: 数据结构和算法 设计题目: 算术表达式求值 院 系: 计算机科学与信息工程学院 学生姓名: 蒋卓航 学 号: 201203030093 专业班级: 软件工程 12-2 班 指导教师: 宋强 2014 年 06 月 16 日1课 程 设 计 任 务 书设计题目 表达式计算程序设计学生姓名 蒋卓航 所在院系 计科系 专业、年级、 班 软件工程 12-2设计要求:1、课程设计中,每个学生必须选择参加一个题目组,共同完成课程设计任务书说明的任务,题目组人数不得超过课程设计任务书中的限定人数。2、每组自行推选一个小组长,负责整个题目组的协调和合作。3、课程设计中,每

2、个学生必须负责完成题目的一个部分,并和其他组员讨论协作,共同完成任务书规定的任务的设计、实现和调试。4、每个学生必须独立完成自己的课程设计说明书,说明书中除把整个项目作为背景,描述整体设计思想外,要重点介绍自己负责设计实现的部分,介绍自己的设计思路、实现过程、问题处理和收获新得。学生应完成的工作:1、计算表达式手工录入,计算结果必须正确2、支持两位以上的整数和浮点数的运算3、运算符优先级表可在程序中直接通过代码初始化4、能够检查表达式是否合法,对于错误的表达式要能够给出错误原因。参考文献阅读:1、 数据结构(C 语言版) 严蔚敏 清华大学出版社2、 C 语言程序设计 丁峻岭 中国铁道出版社3、

3、 C 程序设计 谭浩强 清华大学出版社工作计划:1、第一周的第一天:小组布置设计题目;说明进度安排。2、第一周的第二天:小组审题,查阅资料,进行设计前的必要资料准备。3、第一周的第三天、第四天、第五天:程序编写、上机调试4、第二周的第一天至第三天: 上机调试程序、结果分析。5、第二周的第四天: 撰写设计报告。6、第二周的第五天: 设计答辩及成绩评定。任务下达日期: 2014 年 06 月 16 日 任务完成日期: 2014 年 06 月 27 日指导教师(签名): 学生(签名): 2算术表达式求值摘 要:表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序

4、,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。关键词:括号匹配 运算符优先级 数据类型转换表达式 求值3目 录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. 附件 .1341. 设计背景1.1 问题描述表达式计算是实

5、现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。1.2 问题分析在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入) 。为简化,规定操作数只能为浮点型,操作符为+、-*、/,用#表示结束。算法输出:表达式运算结果。算法要点:设置运算符栈和运算数栈辅助分析算符优

6、先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。2.设计方案2.1 数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针 top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即 top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针 top增 1,删除栈顶元素时,指针 top 减 1。2.2 算法设计为了实现算符优先算法。可以使用

7、两个工作栈。一个称为 OPTR,用以寄存运算符,5另一个称做 OPND,用以寄存操作数或运算结果。1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进 OPND 栈,若是运算符则和 OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即 OPTR 栈的栈顶元素和当前读入的字符均为”#” ) 。2.3 ADT 描述ADT Stack数据对象:D= |ElemSet,i=1,2,,n, n0数据对象:R1= - * / ( # , , , , , , , , , , , , , , , , , , , , , , , , !,

8、, , :/退栈并将运算结果入栈 theta=Pop( b=Pop2( a=Pop2( Push2(break; 114. 结果与结论4.1 正确结果图 4.1 正确结果4.2 错误信息图 4.2 括号匹配错误图 4.3 零除错误125. 收获与致谢这次课程设计让我更加了解大一学到的 C 和这个学期学到的数据结构。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。就像我在

9、写 EvalExpr()函数时,忘了指针的地址符值不用加*号,这一点小小的错误也耽误了我几十分钟,所以说细节很重要。程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到 C 语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机的重要作用,特别算术表达式有了深刻的理解。这个程序是我们 5 个人完成的,同时我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致

10、导致整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。团结协作是我们成功的一项非常重要的保证。而这次课程设计也正好锻炼我们这一点,这也是非常宝贵的最后,感谢老师在这次课程设计的悉心指导,祝老师身体健康,工作顺利。6. 参考文献1.数据结构(C 语言版) 严蔚敏 清华大学出版社2.C 语言程序设计 丁峻岭 中国铁道出版社3.C 程序设计 谭浩强 清华大学出版社137. 附件程序源代码:#include #include #include #define OK 1#define ERROR -1 #define STACK_INI

11、T_SIZE 100#define STACKINCREMENT 20int error=0; /* 定义字符类型栈 */ typedef structint stacksize; char *base; char *top; Stack;/* 定义 double 型栈 */ typedef struct double stacksize; double *base; double *top; Stack2;/* - 全局变量- */ Stack OPTR;/* 定义运算符栈*/Stack2 OPND; /* 定义操作数栈 */ char expr255 = “; /* 存放表达式串 */ 1

12、4char *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-s

13、tacksize=STACK_INIT_SIZE; s-top=s-base; return OK; int In(char ch) /判断字符是否是运算符,运算符即返回 1 return(ch!=0 int Push(Stack *s,char ch) /运算符栈插入 ch 为新的栈顶元素 *s-top=ch; s-top+; return 0; 15 int Push2(Stack2 *s,double ch)/操作数栈插入 ch 为新的栈顶元素 *s-top=ch; s-top+; return 0; char Pop(Stack *s) /删除运算符栈 s 的栈顶元素,用 p 返回其值

14、 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; 16/* 判断运算符优先权,返回优先权高的 */ /运算符优先级表的初始

15、化char Precede(char c1,char c2) int i=0,j=0; static char array49=, , , , , , , , , , , , , , , , , , , , , , , , 2, , , : theta=Pop( b=Pop2( a=Pop2( Push2(break;case 1:printf(“表达式多出一个左括号!n“);error+;break;case 2:printf(“表达式出现非法括号!n“);error+;break;case 3:printf(“表达式多出一个右括号!n“);error+;break;default:prin

16、tf(“表达式出现未知错误!n“);error+;break; if(error!=0) break;return GetTop2(OPND); int main( ) double z;printf(“请输入正确的表达式以#结尾:n“); do 20gets(expr); while(!*expr); InitStack( /* 初始化运算符栈 */ Push( /* 将#压入运算符栈 */ InitStack2( /* 初始化操作数栈 */ z=EvalExpr();if(error=0)printf(“表达式结果为:%lfn“,z);elseprintf(“-_-|n-出现错误,计算已自

17、动终止-n“);system(“PAUSE“);return 0; 21指导教师评语:1、课程设计报告:a、内容: 不完整 完整 详细 b、方案设计: 较差 合理 非常合理c、实现: 未实现 部分实现 全部实现 d、文档格式: 不规范 基本规范 规范 2、出勤: 全勤 缺勤 次3、答辩: a、未能完全理解题目,答辩情况较差 b、部分理解题目,部分问题回答正确 c、理解题目较清楚,问题回答基本正确 d、理解题目透彻,问题回答流利 课程设计报告成绩: ,占总成绩比例: 50% 课程设计其它环节成绩:环节名称: 出勤 ,成绩: ,占总成绩比例: 20% 环节名称: 答辩 ,成绩: ,占总成绩比例: 30% 总 成 绩: 指导教师签字:年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报