数据结构课程设计任务书.docx
《数据结构课程设计任务书.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计任务书.docx(40页珍藏版)》请在冰豆网上搜索。
数据结构课程设计任务书
《数据结构》课程设计任务书
一、设计题目
1、约瑟夫环
2、集合的并、交和差运算
3、一元稀疏多项式计算器
4、停车场管理
5、车厢调度
6、文学研究助手
7、哈夫曼编/译码器
8、图遍历的演示
9、最小生成树问题
10、哈希表设计
二、设计目的
数据结构课程设计是计算机专业的集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。
其目的在于加深对数据结构的理解和掌握,使学生更好地掌握数据结构的特点、存储表示、运算方法及其应用,训练学生选用合适的数据结构编写质量高、风格好的应用程序的能力。
三、设计任务
每班每人按照学号的顺序依次选择1-10号设计题目,独立完成课题。
(即1、11、21号学生完成1号课题,2、12、22号学生完成2号题,以此类推)
四、时间安排
课程名称
班级
周次
星期
节次
时间
实验室
数据结构课设
1
全周
上午
2012.9.2-2012.9.6
数据结构课设
1
全周
上午
2012.9.2-2012.9.6
数据结构课设
1
全周
下午
2012.9.2-2012.9.6
数据结构课设
1
全周
下午
2012.9.2-2012.9.6
五、设计内容
1.约瑟夫环
【问题描述】
约瑟夫(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。
此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。
【选作内容】
向上述程序中添加在顺序结构上实现的部分。
2.集合的并、交和差运算
【问题描述】
编制一个能演示执行集合的并、交和差运算的程序。
【基本要求】
(1)集合的元素限定为小写字母字符[‘a’..’z’]。
(2)演示程序以用户和计算机的对话方式执行。
【测试数据】
(1)Set1="magazine",Set2="paper",
Set1∪Set2="aegimnprz",Setl∩Set2="ae",Set1-Set2="gimnz"。
(2)Set1="012oper4a6tion89",Set2="errordata",
Set1∪Set2="adeinoprt",Setl∩Set2="aeort",Set1-Set2="inp"。
【实现提示】
以有序链表表示集合。
【选作内容】
(1)集合的元素判定和子集判定运算。
(2)求集合的补集。
3.一元稀疏多项式计算器
【问题描述】
设计一个一元稀疏多项式简单计算器。
【基本要求】
一元稀疏多项式简单计算器的基本功能是:
(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。
4.停车场管理
【问题描述】
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内己停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开人;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
【基本要求】
以桟模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
钱以顺序结构实现,队列以链表结构实现。
【测试】
设n=2,输入数据为:
(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
其中,‘A’表示到达(Arrival);‘D’表示离去(Departure);‘E’表示输入结束(End)。
【实现提示】
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。
输入数据按到达或离去的时刻有序。
栈中每个元素表示一辆汽车,包含两个数据项:
汽车的牌照号码和进入停车场的时刻。
5.车厢调度
【问题描述】
假设停在铁路调度站入口处的车厢序列编号依次为1,2,3,……,n。
设计一个程序求出所有可能由此输出的长度为n的车厢序列。
【基本要求】
首先在教科书3.1.2节中提供的栈的顺序存储结构SqStack之上实现栈的基本操作,即实现栈类型。
程序对栈的任何存取(即更改,读取和状态判别等操作)必须借助于基本操作进行。
【测试数据】
分别取n=1,2,3,4
【实现提示】
一般的说,在操作过程的任何状态下都有两种可能的操作:
“入”和“出”。
每个状态下处理问题的方法都是相同的,这说明问题本身具有天然的递归特性,可以考虑用递归算法实现。
输入序列可以仅由一对整型变量表示,即给出序列头/尾编号。
输出序列用栈实现是方便的。
6.文学研究助手
【问题描述】
文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为"文学研究助手"。
【基本要求】
英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
【测试数据】
以你的C源程序模拟英文小说,C语言的保留字集作为待统计的词汇集。
【实现提示】
约定小说中的词汇一律不跨行。
这样,每读入一行,就统计每个词在这行中的出现次数。
出现位置所在行的行号可以用链表存储。
若某行中出现了不止一次,不必存多个相同的行号。
如果读者希望达到选做部分
(1)和
(2)所提出的要求,则首先应把KMP算法改写成如下的等价形式,再将它推广到多个模式的情形。
i=1;j=1;
while(i!
=s.curlen+1&&j!
=t.curlerl十1)
{
while(j!
=0&&s.ch[i]!
=t.ch[j])
j=next[j];//j==O或s.ch[i]==t.ch[j]
j++;i++;//每次进入循环体,i只增加一次
}
【选作内容】
(1)模式匹配要基于KMP算法。
(2)整个统计过程中只对小说文字扫描一遍以提高效率。
7.哈夫曼编/译码器
【问题描述】
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼码的编/译码系统。
【基本要求】
该系统应具有以下功能:
(1)I:
初始化(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
(2)E:
编码(Encoding)。
利用已建好的哈夫曼树,对输入的报文(字符串)进行编码,然后输出编码结果。
(3)D:
译码(Decoding)。
利用已建好的哈夫曼树对输入的密文进行译码,输出结果。
(4)T:
打印哈夫曼树(Treeprinting)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上。
【测试数据】
可以选用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现报文的编码和译码。
如,对报文"PROGRAM"进行编码。
字符
A
B
C
D
E
F
G
H
I
J
K
L
M
频度
64
13
22
32
103
21
15
47
57
1
5
32
20
字符
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
频度
57
63
15
1
48
51
80
23
8
18
1
16
1
【选作内容】
(1)将各字符的哈夫曼编码写入文件Code中;
(2)对密文进行编码后的结果存于文件CodeFile中;
(3)对文件CodeFile中的代码进行译码,结果存于文件TextFile中;
(4)打印哈夫曼树。
将已在内存中的哈夫曼树以直观的方式显示在终端上。
8.图遍历的演示
【问题描述】
很多涉及图上操作的算法都是以图的遍历操作为基础的。
试写一个程序,演示在连通的无向图上访问全部结点的操作。
【基本要求】
以邻接多重表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。
【测试数据】
教科书图7.33。
暂时忽略里程,起点为北京。
【实现提示】
设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。
通过输入图的全部边(存于数据文件中,从文件读写)输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。
注意,生成树的边是有向边,端点顺序不能颠倒。
【选作内容】
(1)借助于栈类型(自己定义和实现),用非递归算法实现深度优先遍历。
(2)以邻接表为存储结构,建立深度优先生成树和广度优先生成树,再按凹入表或树形打印生成树。
9.最小生成树问题
【问题描述】
若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。
如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。
【基本要求】
(1)利用克鲁斯卡尔算法求网的最小生成树。
(2)实现教科书6.5节中定义的抽象数据类型MFSet。
以此表示构造生成树过程中的连通分量。
(3)以文本形式输出生成树中各条边以及他们的权值。
【实现提示】
通信线路一旦建立,必然是双向的。
因此,构造最小生成树的网一定是无向网。
设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,可由用户通过键盘输入。
10.哈希表设计
【问题描述】
针对班级同学的“名字”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
【基本要求】
假设人名为中国人姓名的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。
【测试数据】
取班级同学的30个人的姓名。
【实现提示】
如果随机函数自行构造,则应首先调整好随机函数,使其分布均匀。
人名的长度均不超过19个字符(最长的人名:
如庄双双(Zhangshuangshuang)。
字符的取码方法可直接利用C语言中的toascii函数,并可对过长的人名先作折叠处理。
六、工作要求
1.上机前认真使用C语言编写好程序,采用VisualC++6.0作为编译环境;上机时认真独立完成任务;任务完成后现场验收和提问;
2.根据具体任务要求,提交源程序电子档和纸质课程设计说明书。
源代码和相关数据,放到一个目录下,目录名以学号加姓名方式命名。
课程设计报告统一用A4纸打印,并装订成册,封面格式参见所附文档,正文格式要求参见附录1。
课程设计报告内容具体要求如下:
1.课程设计实验报告内容总体要求
1)给出问题分析过程
根据自身对课程的掌握程度,充分分析和理解问题的设计要求,给出较为明确、简洁的设计思路。
2)给出数据结构描述
根据要解决的问题,考虑各种可能的数据结构类型,从中选择一种较为有效的方法,并写出采用的数据结构描述及其功用。
3)给出相应算法设计
根据问题分析的结果,并确立好所选的数据结构描述,然后写出合理的算法设计过程,特别要注意所使用函数间的调用与被调用关系。
4)给出详细程序清单
根据算法的内容,用计算机语言(如C语言)编写完整的程序,并将程序在机器上反复调试,直到结果正确为止,程序要求附上详细注解。
特别要注意算法与程序的区别以及上下层模块间的接口处理。
5)给出程序运行结果
利用典型的测试用例,将数据输入到程序执行过程中去,记下执行过程中屏幕显示情况与相应结果。
2.具体内容要求:
报告包括以下7个内容:
1)以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?
并明确规定:
(1)输入的形式和输入值的范围;
(2)输出的形式;
(3)程序所能达到的功能;
(4)测试数据:
包括正确的输入及其输出结果和含有错误的输入及其输出结果。
2)概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3)详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:
按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数和过程的调用关系图。
4)调试分析
内容包括:
(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
(2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)
(3)改进设想;
(4)经验和体会等。
5)用户使用说明
说明如何使用你编写的程序,详细列出每一步的操作步骤。
6)测试结果
列出你的测试结果,包括输入和输出。
这里的测试数据应该完整和严格,最好多于需求分析中所列。
7)附录
带注释的源程序,如果提交程序,可以只列出程序文件名的清单。
七、成绩评定标准
由指导教师根据学生完成任务的情况、课程设计说明书的质量和课程设计过程中的态度等综合打分。
1.课程设计说明书:
30%
包括设计说明书内容的全面性、正确性,文字表述的准确性和条理性,以及书写的工整程度等。
2.平时:
30%
平时主要包括考勤和操作练习的实际情况。
3.设计末考核:
40%
包括上机验收结果和现场提问结果。
成绩评定标准:
Ø优(90-100):
能很好地完成实验所要求的任务,达到任务书中规定的全部要求,设计说明书能对整个任务进行全面、系统的总结,并能运用学过的理论知识对某些问题加以分析,在考核时能很圆满地回答问题,并有某些独到见解。
学习态度很端正。
Ø良(80-89):
能较好地完成实验所要求的任务,达到任务书中规定的全部要求,设计说明书能对整个系统内容进行比较全面、系统的总结。
考核时能较圆满地回答问题,学习态度较端正。
Ø中(70-79):
达到实验任务书中规定的主要要求,设计说明书能对整个系统内容进行比较全面的总结,在考核时能正确地回答主要问题,学习态度端正。
Ø差(60-69):
完成了实验任务书的主要任务,达到任务书中规定的基本要求,能够完成设计说明书,内容基本正确但不够完整、系统,考核中能回答主要问题。
学习态度基本端正。
Ø不及格(<60):
未达到实验任务书中规定的基本要求,设计说明书马虎潦草或内容有明显错位;考核时不能回答主要问题或有原则性错误。
学习态度不端正。
附:
①凡是上机未到者,每次扣除5分。
②上机时间内,做与本课程设计无关事情者,予以警告。
屡教不改者当次上机视为旷课。
处理办法见第①条。
③上机时间内,无正当理由离开实验室长达半小时者,当次上机视为旷课。
处理办法见第①条。
④课程设计整个过程中,如果请假超过5次,即5次上机未能前来者,请速去系办公室办理缓考事宜。
七、主要参考资料
[1]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,1997.4
[2]严蔚敏,吴伟民,米宁.数据结构题集(C语言版).北京:
清华大学出版社,1999.2
附录1武汉工业学院课程设计说明书(报告)撰写规范
(一)正文:
汉字应采用《简化汉字总表》规定的简化字,并严格执行汉字的规范。
所有文字字面清晰,不得涂改。
要求文字通顺,语言流畅,无错别字,不得使用铅笔书写。
正文内容层次序号为:
1、1.1、1.1.1……。
正文内容一般为:
1、选题背景:
说明本课题应解决的主要问题及应达到的技术要求;简述本设计的指导思想。
2、方案论证:
说明设计原理并进行方案选择,阐明为什么要选择这个设计方案以及所采用方案的特点。
3、过程(设计或实验)论述:
对设计工作的详细表述。
要求层次分明、表达确切。
4、结果分析:
对研究过程中所获得的主要的数据、现象进行定性或定量分析,得出结论和推论。
5、结论或总结:
对整个研究工作进行归纳和综合。
(二)表格
说明书(报告)的表格可以统一编序(如:
表15),也可以逐章单独编序(如:
表2.5),采用哪种方式应和插图及公式的编序方式统一。
表序必须连续,不得重复或跳跃。
表格的结构应简洁。
表格中各栏都应标注量和相应的单位。
表格内数字须上下对齐,相邻栏内的数值相同时,不能用‘同上’、‘同左’和其它类似用词,应一一重新标注。
表序和表题置于表格上方中间位置,无表题的表序置于表格的左上方或右上方(同一篇论文位置应一致)。
(三)图
插图要精选。
图序可以连续编序(如图52),也可以逐章单独编序(如图6.8),采用哪种方式应与表格、公式的编序方式统一,图序必须连续,不得重复或跳跃。
仅有一图时,在图题前加‘附图’字样。
课程设计中的插图以及图中文字符号应打印,无法打印时一律用钢笔绘制和标出。
由若干个分图组成的插图,分图用a,b,c,……标出。
图序和图题置于图下方中间位置。
(四)公式
说明书中重要的或者后文中须重新提及的公式应注序号并加圆括号,序号一律用阿拉伯数字连续编序(如:
(45))或逐章编序(如(6.10)),序号排在版面右侧,且距右边距离相等。
公式与序号之间不加虚线。
(五)数字用法
公历世纪、年代、年、月、日、时间和各种计数、计量,均用阿拉伯数字。
年份不能简写,如1999年不能写成99年。
数值的有效数字应全部写出,如:
0.50:
2.00不能写作0.5:
2。
(六)软件
软件流程图和原程序清单要按软件文档格式附在说明书(报告)后面,特殊情况可在成绩评定时展示,不附在说明书(报告)内。
(七)工程图按国标规定装订
图幅小于或等于3#图幅时应装订在说明书(报告)内,大于3#图幅时按国标规定单独装订作为附图。
(八)计量单位的定义和使用方法按国家计量局规定执行。
(九)排版与封面要求
1、排版
用word排版,具体格式如下:
版面要求:
页边距:
上2.5cm,下2.5cm,左3cm,右2.5cm;
字体:
正文宋体、小四,章节标题宋体、小三;
行距:
固定值20;
页码:
居中、底部。
2、封面
武汉工业学院
数学与计算机学院
《数据结构》
课程设计说明书
题目:
专业:
班级:
学号:
姓名:
指导老师:
林菁
年 月 日
附录2VisualC++6.0简介
考虑到目前大多数初学者使用的都是PC机和Windows操作系统,我们以VisualC++作为推荐的C++编译器。
1.VisualC++集成开发环境
VisualC++软件包包含了许多独立的组件,如编辑器、编译器、调试器,以及各种各样为开发Windows环境下的C/C++程序而设计的工具。
其中最重要的是一个名为DeveloperStudio的集成开发环境。
DeveloperStudio把所有的VisualC++工具结合在一起,集成为一个由窗口、对话框、菜单、工具栏、快捷键及宏组成的和谐系统,通过该集成环境,程序员可以观察和控制整个开发进程。
1显示了一个典型的DeveloperStudio主窗口。
它分为几个部分:
窗口顶部是菜单和工具栏,左面的一个子窗口是工作区窗口,工作区的右面是编辑子窗口。
最下面是输出子窗口。
值得注意的是,上述各种部件,包括子窗口、菜单栏和工具栏的位置不是一成不变的,可以根据个人的喜好重新安排。
图1 典型的DeveloperStudio窗口
(1)菜单和工具栏
DeveloperStudio中有一个MenuBar(菜单栏,通常停靠在开发环境窗口的顶部),其中的菜单项有File(文件处理)、Edit(编辑功能)、View(查看)、Insert(插入)、Project(项目管理)、Built(编译)、Tools(工具)、Window(窗口)和Help(帮助)等,分别对应一个下拉子菜单。
除菜单栏外,开发环境中还有几个工具栏,一般均放在开发环境的顶部,菜单栏的下方,如Standard(标准工具栏,用于文件管理、编辑和查看等),WizardBar(向导工具栏)和BuildMiniBar(建立工具栏,用于编译、连接等)。
工具栏上有常用命令的图标。
一般来说,工具栏上的命令在菜单中均有对应选项,但工具栏使用更方便,只要用鼠标左键点击工具栏中的相应图标即可调用相应的功能。
开发环境的各种菜单栏和工具栏均为停靠式,