数据结构毕业课程设计题目及报告范例文档格式.docx
《数据结构毕业课程设计题目及报告范例文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构毕业课程设计题目及报告范例文档格式.docx(65页珍藏版)》请在冰点文库上搜索。
7.表达式类型的实现32
8.全国交通咨询模拟33
ch6存储管理、查找和排序35
1.伙伴存储管理系统演示35
2.哈希表设计36
3.图书管理37
4.平衡二叉树操作的演示37
5.英语词典的维护和识别38
6.内部排序算法比较38
7.多关键字排序39
ch7文件操作40
1.文件索引40
2.成绩分析问题40
附录1:
课程设计报告范例-集合的并、交和差运算41
ch0绪
一、概述
上机实习是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通常,实习题中的问题比平时的习题复杂得多,也更接近实际。
实习着眼于原理与应用的结合点,使读者学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;
另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的练习较偏重于如何编写功能单一的“小”算法,而实习题是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。
此外,还有很重要的一点是:
机器是比任何教师都严厉的检查者。
为了达到上述目的,本书安排了六个主实习单元,各单元的训练重点在于基本的数据结构,而不强调面面俱到。
各实习单元与教科书的各章只具有粗略的对应关系,一个实习题常常涉及几部分教学内容。
每个实习题采取了统一的格式,由问题描述、基本要求、测试数据、实现提示和选做内容五个部分组成。
问题描述旨在为读者建立问题提出的背景环境,指明问题“是什么”。
基本要求则对问题进一步求精,划出问题的边界,指出具体的参量或前提条件,并规定该题的最低限度要求。
测试数据部分旨在为检查学生上机作业提供方便,在完成实习题时应自己设计完整和严格的测试方案,当数据输入量较大时,提倡以文件形式向程序提供输入数据。
在实现提示部分,对实现中的难点及其解法思路等问题作了简要提示。
选做部分向那些尚有余力的读者提出了更严峻的挑战,同时也能开拓其他读者的思路,在完成基本要求时力求避免就事论事的不良思想方法,尽可能寻求具有普遍意义的解法,使得程序结构合理,容易修改扩充。
不难发现,这里与传统的做法不同,题目设计得非常详细。
会不会限制读者的想象力,影响创造力的培养呢?
回答是:
软件发展的一条历史经验就是要限制程序设计者在某些方面的创造性,从而使其创造能力集中地用到特别需要创造性的环节之上。
实习题目本身就给出了问题说明和问题分解求精的范例,使读者在无形中学会模仿,它起到把读者的思路引上正轨的作用,避免坏结构程序和坏习惯,同时也传授了系统划分方法和程序设计的一些具体技术,保证实现预定的训练意图,使某些难点和重点不会被绕过去,而且也便于教学检查。
题目的设计策略是:
一方面使其难度和工作量都较大,另一方面给读者提供的辅助和可以模仿的成份也较多。
当然还应指出的是,提示的实现方法未必是最好的,读者不应拘泥于此,而应努力开发更好的方法和结构。
本书的一个特点是为实习制定了严格的规范(见下一节)。
一种普遍存在的错误观念是,调试程序全凭运气。
学生花两个小时的上机时间只找出一个错误,甚至一无所获的情况是常见的。
其原因在于,很多人只认识到找错误,而没有认识到努力预先避免错误的重要性,也不知道应该如何努力。
实际上,结构不好、思路和概念不清的程序可能是根本无法调试正确的。
严格按照实习步骤规范进行实习不但能有效地避免上述种种问题,更重要的是有利于培养软件工作者不可缺少的科学工作方法和作风。
二、实习步骤
随之计算机性能的提高,它所面临的软件开发的复杂度也日趋增加。
然而,编制一个10,000行的程序的难度绝不仅仅是一个5,000行的程序两倍,因此软件开发需要系统的方法。
一种常用的软件开发方法,是将软件开发过程划分为分析、设计、实现和维护四个阶段。
虽然数据结构课程中的实习题的复杂度远不如(从实际问题中提出来的)一个“真正的“软件,但为了培养一个软件工作者所应具备的科学工作的方法和作风,我们制订了如下所述完成实习的五个步骤:
(一)问题分析和任务定义
通常,实习题目的陈述比较简洁,或者说是有模棱两可的含义。
因此,在进行设计之前,首先应该充分地分析和理解问题,明确问题要求做什么?
限制条件是什么。
注意本步骤强调的是做什么?
而不是怎么做。
对问题的描述应避开算法和所涉及的数据类型,而是对所需完成的任务作出明确的回答。
例如:
输入数据的类型、值的范围以及输入的形式;
输出数据的类型、值的范围及输出的形式;
若是会话式的输入,则结束标志是什么?
是否接受非法的输入?
对非法输入的回答方式是什么等。
这一步还应该为调试程序准备好测试数据,包括合法的输入数据和非法形式的输入数据。
(二)数据类型和系统设计在设计这一步骤中需分概要设计和详细设计两步实现。
概要设计指的是,对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型;
详细设计则为定义相应的存储结构并写出各函数的伪码算法。
在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。
作为概要设计的结果,应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的规格说明),各个主要模块的算法,并画出模块之间的调用关系图。
详细设计的结果是对数据结构和基本操作的规格说明作出进一步的求精,写出数据存储结构的类型定义,按照算法书写规范用类C语言写出函数形式的算法框架。
在求精的过程中,应尽量避免陷入语言细节,不必过早表述辅助数据结构和局部变量。
(三)编码实现和静态检查编码是把详细设计的结果进一步求精为程序设计语言程序。
程序的每行不要超过60个字符。
每个函数体,即不计首部和规格说明部分,一般不要超过40行,最长不得超过60行,否则应该分割成较小的函数。
要控制if语句连续嵌套的深度。
如何编写程序才能较快地完成调试是特别要注意的问题。
对于编程很熟练的读者,如果基于详细设计的伪码算法就能直接在键盘上输入程序的话,则可以不必用笔在纸上写出编码,而将这一步的工作放在上机准备之后进行,即在上机调试之前直接用键盘输入。
然而,不管你是否写出编码的程序,在上机之前,认真的静态检查是必不可少的。
多数初学者在编好程序后处于以下两种状态之一:
一种是对自己的“精心作品“的正确性确信不疑;
另一种是认为上机前的任务已经完成,纠查错误是上机的工作。
这两种态度是极为有害的。
事实上,非训练有素的程序设计者编写的程序长度超过50行时,极少不含有除语法错误以外的错误。
上机动态调试决不能代替静态检查,否则调试效率将是极低的。
静态检查主要有两种方法,一是用一组测试数据手工执行程序(通常应先分模块检查);
二是通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,在这个过程中再加入一些注解和断言。
如果程序中逻辑概念清楚,后者将比前者有效。
(四)上机准备和上机调试
上机准备包括以下几个方面:
(1)高级语言文本(体现于编译程序用户手册)的扩充和限制。
例如,常用的BorlandC(C++)和MicrosoftC(C++)与标准C(C++)的差别,以及相互之间的差别。
(2)如果使用C或C++语言,要特别注意与教科书的类C语言之间的细微差别。
(3)熟悉机器的操作系统和语言集成环境的用户手册,尤其是最常用的命令操作,以便顺利进行上机的基本活动。
(4)掌握调试工具,考虑调试方案,设计测试数据并手工得出正确结果。
上机调试程序时要带一本高级语言教材或手册。
调试最好分模块进行,自底向上,即先调试低层函数。
必要时可以另写一个调用驱动程序。
这种表面上麻烦的工作实际上可以大大降低调试所面临的复杂性,提高调试工作效率。
调试中遇到的各种异常现象往往是预料不到的,此时不应“冥思苦想”,而应动手确定疑点,通过修改程序来证实它或绕过它。
调试正确后,认真整理源程序及其注释,印出带有完整注释的且格式良好的源程序清单和结果。
(五)总结和整理实习报告
三、实习报告规范
实习报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下七个内容:
1.需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?
明确规定:
(1)输入的形式和输入值的范围;
(2)输出的形式;
(3)程序所能达到的功能;
(4)测试数据:
包括正确的输入及其输出结果和含有错误的输入及其输出结果。
2.概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;
对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:
按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);
画出函数的调用关系图。
4.调试分析
内容包括:
(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
(2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;
(3)经验和体会等。
5.用户使用说明
说明如何使用你编写的程序,详细列出每一步的操作步骤。
6.测试结果
列出你的测试结果,包括输入和输出。
这里的测试数据应该完整和严格,最好多于需求分析中所列。
7.附录
带注释的源程序。
可以只列出程序文件名的清单。
在以下提供了实习报告实例。
值得注意的是,实习报告的各种文档资料,如:
上述中的前三部分要在程序开发的过程中逐渐充实形成,而不是最后补写(当然也可以应该最后用实验报告纸誉清或打印)。
ch1线性表及其应用
本次实习的主要目的在于帮助学生熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用作为重点内容。
1.运动会分数统计
【问题描述】
参加运动会的n个学校编号为1~n。
比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。
由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;
还有些项目只取前三名,得分顺序为5,3,2。
写一个统计程序产生各种成绩单和得分报表。
【基本要求】
1)可以输入各个项目的前三名或前五名的成绩;
2)能统计各学校总分,
3)可以按学校编号或名称、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;
可以按项目编号查询取得前三或前五名的学校。
5)数据存入文件并能随时查询
6)规定:
输入数据形式和范围:
可以输入学校的名称,运动项目的名称
输出形式:
有中文提示,各学校分数为整型。
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
测试数据:
【测试数据】
要求使用1、全部合法数据;
2、整体非法数据;
3、局部非法数据。
进行程序测试,以保证程序的稳定。
例如,对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。
【实现提示】
可以假设n≤20,m≤30,w≤20,姓名长度不超过20个字符。
每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。
【选作内容】
允许用户指定某项目采取其他名次取法。
2.约瑟夫环
约瑟夫(Joseph)问题的一种描述是:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
m的初值为20;
n=7,7个人的密码依次为:
3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为6,1,4,7,2,3,5)。
程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。
可设n≤30。
此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。
【选作内容】
向上述程序中添加在顺序结构上实现的部分。
3.集合的并、交和差运算(此题目不能选,因为报告范例对应的就是该题目)
编制一个能演示执行集合的并、交和差运算的程序。
(1)集合的元素限定为小写字母字符[‘a’..’z’]。
(2)演示程序以用户和计算机的对话方式执行。
(1)Set1="
magazine"
,Set2="
paper"
,
Set1∪Set2="
aegimnprz"
,Setl∩Set2="
ae"
,Set1-Set2="
gimnz"
。
(2)Set1="
012oper4a6tion89"
errordata"
adeinoprt"
aeort"
inp"
以有序链表表示集合。
(1)集合的元素判定和子集判定运算。
(2)求集合的补集。
(3)集合的混合运算表达式求值。
(4)集合的元素类型推广到其他类型,甚至任意类型。
4.长整数四则运算
设计一个实现任意长的整数进行加法运算的演示程序。
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。
任何整型变量的范围是-(215-l)~(215-1)。
输入和输出形式:
按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
(1)0;
0;
应输出"
0"
。
(2)-2345,6789;
-7654,3211;
-1,0000,0000"
(3)-9999,9999;
1,0000,0000,0000;
9999,0000,0001"
(4)1,0001,0001;
-1,0001,0001;
(5)1,0001,0001;
-1,0001,0000;
1"
(6)-9999,9999,9999;
-9999,9999,9999;
应输出"
-1,9999,9999,9998"
(7)1,0000,9999,9999;
1;
1,0001,0000,0000"
(1)每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存放,即相当于按32768进制数存放,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数的4位,即不超过9999的非负整数,整个链表表示为万进制数。
(2)可以利用头结点数据域的符号代表长整数的符号。
相加过程中不要破坏两个操作数链表。
不能给长整数位数规定上限。
【选作内容】
(1)实现长整数的四则运算;
(2)实现长整数的乘方和阶乘运算;
(3)整型量范围是-(2n-1)~(2n-1),其中,n是由程序读人的参量。
输入数据的分
组方法可以另行规定。
5.一元稀疏多项式计算器
设计一个一元稀疏多项式简单计算器。
一元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:
n,cl,el,c2,e2,…,cn,en,其中n是多项式的项数,ci和ei,分别是第i项的系数和指数,序列按指数降序排列;
(3)多项式a和b相加,建立多项式a+b;
(4)多项式a和b相减,建立多项式a-b。
(1)(2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.lx11+11x9+2x+7)
(2)(6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)
=(-7.8x15-1.2x9+12x-3-x)
(3)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)
(4)(x+x3)+(-x-x3)=0
(5)(x+x100)+(x100+x200)=(x+2x100+x200)
(6)(x+x2+x3)+0=x+x2+x3
(7)互换上述测试数据中的前后两个多项式
用带表头结点的单链表存储多项式。
(1)计算多项式在x处的值。
(2)求多项式a的导函数。
(3)多项式a和b相乘,建立乘积多项式ab。
(4)多项式的输出形式为类数学表达式。
例如,多项式-3x8+6x3-18的输出形式为
,x15+(-8)x7-14的输出形式为。
注意,数值为1的非零次项的输出形式中略去系数1,如项1x8的输出形式为x8,项-1x3的输出形式为-x3。
(5)计算器的仿真界。
6.池塘夜降彩色雨
设计一个程序,演示美丽的“池塘夜雨”景色:
色彩缤纷的雨点飘飘洒洒地从天而降,滴滴入水有声,溅起圈圈微澜。
(1)雨点的空中出现位置、降范过程的可见程度、入水位置、颜色、最大水圈等,都是随机确定的;
(2)多个雨点按照各自的随机参数和存在状态,同时演示在屏幕上。
适当调整控制雨点密度、最大水圈和状态变化的时间间隔等参数。
(1)每个雨点的存在周期可分为三个阶段:
从天而降、入水有声和圈圈微澜,需要一
个记录存储其相关参数、当前状态和下一状态的更新时刻。
(2)在图形状态编程。
雨点下降的可见程度应是断断续续、依稀可见;
圈圈水波应是
由里至外逐渐扩大和消失。
(3)每个雨点发生时,生成其记录,并预置下一个雨点的发生时间。
(4)用一个适当的结构管理当前存在的雨点,使系统能利用它按时更新每个雨点的状态,一旦有雨点的水圈全部消失,就从结构中删去。
(1)增加“电闪雷鸣”景象。
(2)增加风的效果,展现“风雨飘摇”的情景。
(3)增加雨点密度的变化:
时而“和风细雨”,时而“暴风骤雨”。
(4)将“池塘”改为“荷塘”,雨点滴在荷叶上的效果是溅起四散的水珠,响声也不同。
ch2栈和队列及其应用
仅仅认识到栈和队列是两种特殊的线性表是远远不够的,本次实习的目的在于使读者深入了解钱和队列的特性,以便在实际问题背景下灵活运用他们;
同时还将巩固对这两种结构的构造方法的理解。
编程技术训练要点有:
基本的“任务书“观点及其典型用法(见本实习2。
2);
问题求解的状态表示及其递归算法(2.3,2.4和2.9);
利用栈实现表达式求值的技术(2.5);
事件驱动的模拟方法(2.63.8);
以及动态数据结构的实现(2.6,2.7和2.8)。
1.停车场管理
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内己停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开人;
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
以桟模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达“或“离去“信息、汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;
若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
钱以顺序结构实现,队列以链表结构实现。
2.魔王语言解释
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能昕得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1)
(2)
在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
用下述两条具体规则和上述规则形式
(2)实现。
设大写字母表示魔王语言的词汇;
小写字母表示人的语言词汇;
希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
t
d
s
a
e
z
g
x
n
h
天
地
上
一只
鹅
追
赶
下
蛋
恨
将魔王的语言自右至左进栈,总是处理栈顶字符。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。
其他情形较简单,请读者思考应如何处理。
应首先实现栈和队列的基本操作。
(1)由于问题的特殊性,可以实现栈和队列的顺序存储空间共享。
(2)代换变量的数目不限,则在程序开始运行时首先读入一组第一种形式的规则,而不是把规则固定在程序中(第二种形式的规则只能固定在程序中)。
3.马踏棋盘
设计一个国际象棋的马踏遍棋盘的演示程序。
将马随机放在国际象棋的8×
8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。
要求每个方格只进入一次,走遍棋盘上全部