数据结构课程设计-算术表达式求值的实现.doc_第1页
数据结构课程设计-算术表达式求值的实现.doc_第2页
数据结构课程设计-算术表达式求值的实现.doc_第3页
数据结构课程设计-算术表达式求值的实现.doc_第4页
数据结构课程设计-算术表达式求值的实现.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

课课 程程 设设 计计 报报 告告 课程设计名称:数据结构课程设计 课程设计题目:算术表达式求值的实现 院(系):* 专 业:* 班 级:* 学 号:* 姓 名:* 指导教师:* 沈阳航空航天大学课程设计报告 i 目目 录录 1 1 课程设计介绍课程设计介绍.1 1.1 课程设计内容1 1.2 课程设计要求1 2 2 课程设计原理课程设计原理.2 2.1 课设题目粗略分析2 2.2 原理图介绍2 2.2.1 功能模块图2 2.2.2 流程图分析3 3 数据结构分析数据结构分析.5 3.1 存储结构5 3.2 算法描述5 4 4 调试与分析调试与分析.7 4.1 调试过程7 4.2 程序执行过程7 参考文献参考文献.8 附附 录(关键部分程序清单)录(关键部分程序清单).9 沈阳航空航天大学课程设计报告 1 1 1 课程设计介绍课程设计介绍 1.11.1 课程设计内容课程设计内容 编写算法能够进行整型和实型数的表达式求值,能够根据运算的数据选 择正确的运算结果的数据类型,表达式的运算符为:+,*,/, (, ) ,且 括号可以嵌套。 1.21.2 课程设计要求课程设计要求 1.给出必要的输入、输出信息和提示信息。 2.参考相应的资料,独立完成课程设计任务。 3.交规范课程设计报告和软件代码。 沈阳航空航天大学课程设计报告 2 2 2 课程设计原理课程设计原理 2.12.1 课设题目粗略分析课设题目粗略分析 根据课设题目要求,拟将整体程序分为三大模块。此三个模块相互独立,没 有嵌套调用的情况,以下是三个模块的大体分析: 1.首先依次定义字符类型栈、整型栈、运算符栈和操作数栈,构造运算符栈 和操作数栈,然后运算符、操作数依次入栈。 2. 依次读入表达式,若是操作符即进 opnd 栈,若是运算符即进 optr 栈。 顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素, 同时附设指针 top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈 中,它始终指向栈底,即 top=base 可作为栈空的标记,每当插入新的栈顶元素 时,指针 top 增 1,删除栈顶元素时,指针 top 减 1。 3. 按照运算符的优先级别对表达式进行求值运算。 2.22.2 原理图介绍原理图介绍 该功能模块图介绍了这个程序的主要功能。 2.2.12.2.1 功能模块图功能模块图 算术表达式求值 存储 读取 计算 操 作 数 入 栈 操 作 符 入 栈 操 作 数 出 栈 操 作 数 出 栈 字符 转换 成浮 点数 + - * / 计 算 图 2.1 功能模块图 沈阳航空航天大学课程设计报告 3 如图 2.1 所示, 要实现表达式的求值,即必须要实现存储、读取和计算三项 功能。存储即运算符、操作数的入栈;读取即运算符、操作数的出栈;计算即 +、*、/的运算。 2.2.22.2.2 流程图分析流程图分析 1precede(char c1,char c2) 判断运算符优先权,返回优先权高的。 算符间的优先关系如下: 表 2.1 运算符优先关系列表 +-*/()# + - * / ( #: 操作数栈头2个数进行运算 图 2.2 主要操作函数流程图 沈阳航空航天大学课程设计报告 4 3.入栈出栈主要流程。 开始 运算符栈插入ch为新的栈顶元素 操作数栈插入ch为新的栈顶元素 删除运算符栈s的栈顶元素,用p返回其值 删除操作数栈s的栈顶元素,用p返回其值 用p返回运算符栈s的栈顶元素 用p返回运算符栈s的栈顶元素 结束 图 2.3 入栈出栈主要流程图 沈阳航空航天大学课程设计报告 5 3 数据结构分析数据结构分析 3.13.1 存储结构存储结构 因为表达式是由操作符,运算符和界限符组成的。如果只用一个 char 类型 栈,不能满足 2 位以上的整数,所以还需要定义一个 int 类型的栈用来寄存操作 数。 /* 定义字符类型栈 */ typedef struct int stacksize; char *base; char *top; stack; /* 定义整型栈 */ typedef struct int stacksize; int *base; int *top; stack2; 3.23.2 算法描述算法描述 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.其它功能分析。 沈阳航空航天大学课程设计报告 6 (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()主要操作函数运算功能。 沈阳航空航天大学课程设计报告 7 4 4 调试与分析调试与分析 4.14.1 调试过程调试过程 在调试程序是主要遇到一下几类问题: 1.在括号,分号,引号,或者数据类型上总发生错误。 2.在写 evalexpr()函数时,忘了指针的地址符值不用加*号。 3.运行程序时由于忘记更改中英文输入法,导致输入中文() ,程序无法正 cha 常执行。 4.程序开始编写时我仅仅编写了整型数的计算,通过修改后改成浮点类型的 运算,使程序可操作性更强。 4.2 程序执行过程程序执行过程 1.请输入正确的表达式以#结尾:4*(7-2)# 表达式结果为:20.000000 press any key to continue 2.请输入正确的表达式以#结尾:11+123*4# 表达式结果为:503.000000 press any key to continue 3.请输入正确的表达式以#结尾:4.2*(5+1.2)# 表达式结果为:26.040000 press any key to continue 4.请输入正确的表达式以#结尾:42.6/(3.2+2.8)# 表达式结果为:7.100000 press any key to continue 沈阳航空航天大学课程设计报告 8 参考文献参考文献 1 严蔚敏,吴伟民. .数据结构m.北京:清华大学出版社,2007. 2 张长海,陈娟. .c 程序设计m.北京:高等教育出版社,2004. 3 谭浩强. .c 程序设计m.北京:清华大学出版社,2005. . 4 丁峻岭.c 语言程序设计m.北京:中国铁道出版社,2006. 5 徐孝凯.数据结构实用教程m.清华大学出版社,2006. 沈阳航空航天大学课程设计报告 9 附附 录(关键部分程序清单)录(关键部分程序清单) 程序代码程序代码 #include #include #include #define null 0 #define ok 1 #define error -1 #define stack_init_size 100 #define stackincrement 20 /* 定义字符类型栈 */ typedef struct int stacksize; char *base; char *top; stack; /* 定义整型栈 */ typedef struct int stacksize; float *base; float *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; 沈阳航空航天大学课程设计报告 10 int initstack2(stack2 *s) /构造操作数栈 s-base=(float *)malloc(stack_init_size*sizeof(float); if(!s-base) return error; s-stacksize=stack_init_size; s-top=s-base; return ok; int in(char ch) /判断字符是否是运算符,运算符即返回 1 return(ch=+|ch=-|ch=*|ch=/|ch=(|ch=)|ch=#); int push(stack *s,char ch) /运算符栈插入 ch 为新的栈顶元素 *s-top=ch; s-top+; return 0; int push2(stack2 *s,float ch)/操作数栈插入 ch 为新的栈顶元素 *s-top=ch; s-top+; return 0; char pop(stack *s) /删除运算符栈 s 的栈顶元素,用 p 返回其值 char p; s-top-; p=*s-top; return p; float pop2(stack2 *s)/删除操作数栈 s 的栈顶元素,用 p 返回其值 float p; s-top-; p=*s-top; return p; char gettop(stack s)/用 p 返回运算符栈 s 的栈顶元素 char p=*(s.top-1); return p; 沈阳航空航天大学课程设计报告 11 float gettop2(stack2 s) /用 p 返回操作数栈 s 的栈顶元素 float p=*(s.top-1); return p; /* 判断运算符优先权,返回优先权高的 */ char precede(char c1,char c2) int i=0,j=0; static char array49= , , , , , , , , , , , , , , , , , , , , , , , , !, , , : theta=pop( b=pop2( a=pop2( push2( break; return gettop2(opnd); int main( ) printf(“请输入正确的表达式以#结尾:“); do gets(expr); while(!*expr); initstack( /* 初始化运算符栈 */ push( /* 将#压入运算符栈 */ initstack2( /* 初始化操作数栈 */ printf(“表达式结果为:%fn“, evalexpr(); getchar(); return 0; 课程设计总结:课程设计总结: 这次课程设计让我更加了解大一学到的 c 和这个学期学到的数据结构。课 设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的 思维和动手能力和更加了解编程思想和编程技巧。 这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的 是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号, 引号,或者数据类型上

温馨提示

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

最新文档

评论

0/150

提交评论