数据结构课程设计.docx
- 文档编号:2394322
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:10
- 大小:136.84KB
数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
数据结构课程设计
学院:
信息科学与工程学院
专业:
计算机科学与技术
班级:
计1008
学号:
20101221149
学生姓名:
刘成启
指导教师:
潘玉奇
2012年3月12日
算术表达式求值演示
目录
一概述……………………………………………………………3
二总体设计分析…………………………………………………3
三概要设计………………………………………………………5
四详细设计………………………………………………………6
五调试分析与测试………………………………………………7
六自我评析与总结………………………………………………8
一概述
课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
㈠实现题目:
算术表达式求值演示。
㈡问题描述:
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。
设计一个程序,演示用算符优先法对算术表达式求值的过程。
深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。
㈢基本要求:
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。
利用教科书表3.1给出的算符优先关系,实现对算数四则混合运算表达式的求值,并仿照教科书的例3-1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
㈣实现提示:
①设置运算符栈和运算数栈辅助分析算符优先关系。
②在读入表达式的字符序列的同时,完成运算符和运算数(整数)的识别处理,以及相应的运算。
③在识别出运算数的同时,要将其字符序列形式转换成整数形式。
④在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容。
㈤选做内容:
①扩充运算符集,如增加乘方、单目减、赋值等运算。
②运算量可以是变量。
③运算量可以是实数类型。
④计算器的功能和仿真界面。
二总体设计分析
㈠实验的环境:
指硬件和软件环境
1.硬件环境:
Intel奔腾双核T2390双核处理器(1.86GHz主频/1MB二级缓存/533MHz前端总线),RAM:
2G.
2.软件环境:
操作系统:
windowsvista
编译软件:
MicrosoftViualC++6.0
3.软件环境介绍:
VisualC++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
VisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。
VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。
㈢程序流程图:
三概要设计
1、算法设计
1)算符的优先级比较函数Precede(chara,charb)
算法的基本思想:
通过已知的算符间的优先关系写出算符的优先级算法。
任意两个相继出现的算符c1和c2之间的优先关系至多是下面3种关系之一:
c1 c1=c2c1的优先权等于c2 c1>c2c1的优先权高于c2 算法步骤: Step1: 如果输入符号为“+”或“-” 1.1如果栈顶元素为“(”、“#”,此时栈顶符号优先级低,返回“<” 1.2否则,栈顶符号优先级高,返回“>” Step2: 如果输入符号为“*”或“/” 2.1如果栈顶元素为“)”、“*”、“/”,此时栈顶符号优先级高,返回“>” 2.2否则,栈顶符号优先级低,返回“<” Step3: 如果输入符号为“(”,则直接返回“<” Step4: 如果输入符号为“)” 4.1如果栈顶元素为“(”,此时优先级同,返回“=” 4.2否则,栈顶符号优先级高,返回“>” Step5: 输入符号为其他 5.1栈顶元素为“#”,此时优先级同,返回“=” 5.2否则,栈顶符号优先级高,返回“>” 2)确定如何入栈函数StackCharOPTR,StackFloatOPND 算法的基本思想: a.首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素; b.依次读入表达式中每个字符,若是操作数则进运算数栈,若是运算符则和运算符栈的栈顶运算符比较优先后作相应操作,直至整个表达式求值完毕(即运算符的栈顶元素和当前读入的字符均为“#”)。 算法步骤: Step1: 将‘#’入栈,作为低级运算符 Step2: 输入不含变量的表达式 Step3: 如果c! ='#'||GetTop1(OPTR)! ='#' 3.1如果输入的字符如果不是运算符号,则继续输入直到输入的是运算符为止,将非运算符转换成浮点数 3.2如果输入的是运算符 遇到运算符,则将之前输入的操作数进栈 比较运算符的优先级: ①栈顶元素优先级低,则入栈且继续输入 ②栈顶元素优先级相等,脱括号并接收下一字符 ③栈顶元素优先级高,则退栈并将运算结果入栈 Step4: 显示表达式最终结果 四详细设计 一、栈类型: 1、运算符栈结构定义: typedefstruct { SElemType*base;//栈底指针 SElemType*top;//栈顶指针 intstacksize;//栈当前可使用的最大容量 }StackChar; 2、运算数栈结构定义: typedefstruct { ElemType*base;//栈底指针 ElemType*top;//栈顶指针 intstacksize;//栈当前可使用的最大容量 }StackFloat2; 首先定义的两个栈都是顺序结构,将它定义为顺序结构而不是链式结构是由于对于运算符和操作数的操作都很有规律,压栈和弹栈的过程也很简单,没有必要定义成链式结构,同时顺序结构没有指针域的开销,节省空间,维护方便。 3、栈的抽象数据类型定义 ADTStack{ 数据对象: D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0} 数据关系: R1={ 约定其中ai端为栈底,an端为栈顶。 基本操作: InitStack1(&OPTR)InitStack2(&OPND) 操作结果: 构造一个空栈OPTR、OPND Push1(&OPTR,e);Push2(&OPND,e); 初始条件: 栈OPTR、栈OPND已存在 操作结果: 在栈OPTR、栈OPND的栈顶插入新的栈顶元素 Pop1(&OPTR,&e);Pop2(&OPND,&e); 初始条件: 栈OPTR、栈OPND已存在 操作结果: 删除OPTR、OPND的栈顶元素,并以e返回其值 GetTop1(OPTR,&e);GetTop2(OPND,&e); 初始条件: 栈OPTR、栈OPND已存在 操作结果: 若栈OPTR、栈OPND不空,则以e返回栈顶元素 DispStack1(&OPTR);DispStack2(&OPND); 操作结果: 从栈底到栈顶输出各元素 Precede(chara,charb); 操作结果: 比较a和b的优先级,返回优先级关系符 Operate(floata,chartheta,floatb); 操作结果: 对表达式进行相关求值,并返回结果 4、各个函数之间的调用关系 五调试分析与测试 一、调试分析: 本次作业比较简单,核心算法就是建立两个栈,一个运算符栈和一个运算数栈,但在调试表达式计算和输出相应入栈、出栈等操作时还是出现了一些问题,但经过不断的查找,调试,我终于解决了这些问题,成功调试出了该程序。 二、运行结果分析: (1)程序能够接受浮点数并正确表达式的值 (2)程序能够识别单目运算符 (3)当输入非法字符时,程序退出并提示表达式不符合要求 (4)程序可以识别除数为零的情况,并返回一个系统默认值 (5)程序能够运算乘方,还能输出入栈、出栈及主要操作过程的内容 (6)程序可以运行含变量的算术表达式并进行赋值求结果 三、测试结果: 举例说明: 运算量中含变量: a+b 2.3^2+10 10/4-(12+7) 六自我评析与总结 1)心得体会: 通过两个周的编程调试,我终于顺利的完成了我的实验题目,刚拿到题目时还有些不知该如何下手,但是经过一番琢磨,看清题目要求,然后根据上学期所学的基本知识,我开始分析该程序所需要运用到的知识点有哪些,要怎样构造函数才能实现这个任务呢? ! 我开始慢慢进入角色,把自己当成一名正在公司办公的程序员,接到上级领导给的任务,然后开始了紧张而又有趣的调试过程。 我发现通过这两个周的训练,我感觉自身进步挺大的,学会了学以致用,培养了自己找问题并独立解决的能力,让我对《数据结构》C语言有了更进一步的认识和了解,也让我知道,要想学好它要重在实践,理论与实际应用相结合,提高了自己组织数据及编写大型程序的能力,培养了基本的、良好的程序设计技能以及合作能力。 通过实际操作,我也发现我的好多不足之处: 1.对学过的知识没有灵活运用,但是经过查阅资料和同学共同探讨,让我学会了很多知识,也掌握了不少。 2.对一些看似简单的东西掌握不够熟练,比如由于函数的调用参数问题不熟而造成了调试的困难。 对于语法的掌握也欠缺成熟,需要进一步掌握。 3.常常因为一些小错误而不知所措,浪费了一些不该浪费的时间。 但是我觉得我有值得高兴的地方,那就是,在这次实验中大部分问题都是靠自己独立解决的,这一点让我有了很大的自信心,我觉得我所学的专业知识还是很有用的。 每调试出一个小问题,我都会在心里默默欣喜,为自己加油鼓劲,这样的感觉真好,很珍惜这次的实验机会,希望每学期都会有这样的机会,到那时我会更加认真地去完成我的任务,让自己成为一个优秀的编程者,呵呵! 2)总结: 我认为数据结构的研究不仅涉及到计算机硬件的研究,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。 在研究信息检索时也必须考虑如何组织数据,以便使查找和存取数据元素更为方便。 在课程设计中,应该力求算法简明易懂,而易于转换为上机程序;如果程序反复多次使用,则应该尽可能选用快速的算法;如果待解决的问题数据量极大,机器的存储空间较小,则在编写算法时应该考虑如何节省空间。 以后在编写程序时就应该注意到所编写程序的时间复杂度,以及是否运用了良好的算法,而不能只是像以前编写程序时单纯使用C语言的知识,要充分考虑程序的性能
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)