数据结构课程设计题目及报告范例.docx
《数据结构课程设计题目及报告范例.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计题目及报告范例.docx(45页珍藏版)》请在冰豆网上搜索。
数据结构课程设计题目及报告范例
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.集合的并、交和差运算
【问题描述】
编制一个能演示执行集合的并、交和差运算的程序。
【基本要求】
(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)集合的混合运算表达式求值。
(4)集合的元素类型推广到其他类型,甚至任意类型。
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。
(5)计算器的仿真界。
4.池塘夜降彩色雨
【问题描述】
设计一个程序,演示美丽的“池塘夜雨”景色:
色彩缤纷的雨点飘飘洒洒地从天而降,滴滴入水有声,溅起圈圈微澜。
【基本要求】
(1)雨点的空中出现位置、降范过程的可见程度、入水位置、颜色、最大水圈等,都是随机确定的;
(2)多个雨点按照各自的随机参数和存在状态,同时演示在屏幕上。
【测试数据】
适当调整控制雨点密度、最大水圈和状态变化的时间间隔等参数。
【实现提示】
(1)每个雨点的存在周期可分为三个阶段:
从天而降、入水有声和圈圈微澜,需要一
个记录存储其相关参数、当前状态和下一状态的更新时刻。
(2)在图形状态编程。
雨点下降的可见程度应是断断续续、依稀可见;圈圈水波应是
由里至外逐渐扩大和消失。
(3)每个雨点发生时,生成其记录,并预置下一个雨点的发生时间。
(4)用一个适当的结构管理当前存在的雨点,使系统能利用它按时更新每个雨点的状态,一旦有雨点的水圈全部消失,就从结构中删去。
【选作内容】
(1)增加“电闪雷鸣”景象。
(2)增加风的效果,展现“风雨飘摇”的情景。
(3)增加雨点密度的变化:
时而“和风细雨”,时而“暴风骤雨”。
(4)将“池塘”改为“荷塘”,雨点滴在荷叶上的效果是溅起四散的水珠,响声也不同。
5.银行业务模拟
【问题描述】
客户业务分为两种。
第一种是申请从银行得到一笔资金,即取款或借款。
第二种是向银行投入一笔资金,即存款或还款。
银行有两个服务窗口,相应地有两个队列。
客户到达银行后先排第一个队。
处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。
每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。
注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。
任何时刻都只开一个窗口。
假设检查不需要时间。
营业时间结束时所有客户立即离开银行。
写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。
【基本要求】
利用动态存储结构实现模拟。
【测试数据】
一天营业开始时银行拥有的款额为10000(元),营业时间为600(分钟)。
其他模拟参
量自定,注意测定两种极端的情况:
一是两个到达事件之间的间隔时间很短,而客户的交易时间很长,另一个恰好相反,设置两个到达事件的间隔时间很长,而客户的交易时间很短。
【实现提示】
事件有两类:
到达银行和离开银行。
初始时银行现存资金总额为total。
开始营业后的第一今事件是客户到达,营业时间从0到closetime。
到达事件发生时随机地设置此客户的交易时间和距下一到达事件之间的时间间隔。
每个客户要办理的款额也是随机确定的,用负值和正值分别表示第一类和第二类业务。
变量total,closetime以及上述两个随机量的上下界均交互地从终端读入,作为模拟参数。
两个队列和一个事件表均要用动态存储结构实现。
注意弄清应该在什么条件下设置离开事件,以及第二个队列用怎样的存储结构实现时可以获得较高的效率。
注意:
事件表是按时间顺序有序的。
【选作内容】
自己实现动态数据类型。
例如对于客户结点,定义pool为
CustNodepoolfMAX];
//结构类型CustNode含四个域:
aITHIne,durtime,amount,next
或者定义四个同样长的,以上述域名为名字的数组。
初始时,将所有分量的next域链接起来,形成一个静态链找,设置一个楼顶元素下标指示量top,top=0表示找空。
动态存储分配函数可以取名为myMalloc,其作用是出钱,将钱顶元素的下标返回。
若返回的值为0,则表示无空间可分配。
归还函数可取名为myFree,其作用是把该分量入钱。
用FOR-TRAN和BASIC等语言实现时只能如此地自行组织。
6.马踏棋盘
【问题描述】
设计一个国际象棋的马踏遍棋盘的演示程序。
【基本要求】
将马随机放在国际象棋的8×8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。
要求每个方格只进入一次,走遍棋盘上全部64个方格。
编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。
7.魔王语言解释
【问题描述】
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能昕得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1)
(2)
在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
【基本要求】
用下述两条具体规则和上述规则形式
(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
(1)
(2)
【测试数据】
B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
t
d
s
a
e
z
g
x
n
h
天
地
上
一只
鹅
追
赶
下
蛋
恨
【实现提示】
将魔王的语言自右至左进栈,总是处理栈顶字符。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。
其他情形较简单,请读者思考应如何处理。
应首先实现栈和队列的基本操作。
【选作内容】
(1)由于问题的特殊性,可以实现栈和队列的顺序存储空间共享。
(2)代换变量的数目不限,则在程序开始运行时首先读入一组第一种形式的规则,而不是把规则固定在程序中(第二种形式的规则只能固定在程序中)。
8.航空客运订票系统
【问题描述】
航空客运订票的业务活动包括:
查询航线、客票预订和办理退票等。
试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
【基本要求】
(1)每条航线所涉及的信息有:
终点站名、航班号、飞机号、飞行周日(星期几)、乘员定额、余票量、已订票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票量);
(2)系统能实现的操作和功能如下:
①录入:
可以录入航班情况,全部数据可以只放在内存中,最好存储在文件中;
②查询航线:
根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
③承办订票业务:
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需重新询问客户要求。
若需要,可登记排队候补;
④承办退票业务:
根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。
【测试数据】
由读者自行指定。
【实现提示】
两个客户名单可分别由线性表和队列实现。
为查找方便,已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。
由于预约人数无法预计,队列也应以链表作存储结构。
整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。
每条航线是这张表上的一个记录,包含上述8个域、其中乘员名单域为指向乘员名单链表的头指针,等候替补的客户名单域为分别指向队头和队尾的指针。
【选作内容】
当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其他航线情况。
读者还可充分发挥自己的想象力,增加你的系统的功能和其他服务项目。
9.电梯模拟
【问题描述】
设计一个电梯模拟系统。
这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体“构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的。
在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。
【基本要求】
(1)模拟某校五层教学楼的电梯系统。
该楼有一个自动电梯,能在每层停留。
五个楼层由下至上依次称为地下层、第→层、第二层、第三层和第四层,其中第一层是大楼的迸出层,即是电梯的“本垒层“,电梯“空闲“时,将来到该层候命。
(2)乘客可随机地进出于任何层。
对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
(3)模拟时钟从0开始,时间单位为0.1秒。
人和电梯的各种动作均要耗费一定的时间单位(简记为t),比如:
有人进出时,电梯每隔40t测试一次,若无人进出,则关门;
关门和开门各需要20tg
每个人进出电梯均需要25h
如果电梯在某层静止时间超过300t,则驶回1层候命。
(4)按时序显示系统状态的变化过程:
发生的全部人和电梯的动作序列。
【测试数据】
模拟时钟Time的初值为0,终值可在500~10000范围内逐步增加。
【实现提示】
(1)楼层由下至上依次编号为0,1,2,3,4。
每层有要求Up(上)和Down(下〉的两个按钮,对应10个变量CaliUp[0..4]和CallDOWEl[0..4]。
电梯内5个目标层按钮对应变量Caucar[0..4]。
有人按下某个按钮时,相应的变量就置为1,一旦要求满足后,电梯就把该变量清为0。
(2)电梯处于三种状态之-zGoingUp(上行)、GoingDown(下行)和Idle(停候)。
如果电梯处于Idle状态且不在1层,则关门并驶回1层。
在1层停候时,电梯是闭门候命。
一旦收到往另一层的命令,就转入GoingUp或GoingDown状态,执行相应的操作。
(3)用变量Time表示模拟时钟,初值为0,时间单位。
)为0。
l秒。
其他重要的变量有:
Floor——电梯的当前位置(楼层);
DI——值为0,除非人们正在进入和离开电梯;
D2——值为0,如果电梯已经在某层停候30Ot以上;
D3——值为0,除非电梯门正开着又无人迸出电梯;
State——电梯的当前状态(GoingUp,GoingDOWEl,Idle)。
系统初始时,Floor=1,Dl=D2=D3=0,State=Idle。
(4)每个人从进入系统到离开称为该人在系统中的存在周期。
在此周期内,他有6种可能发生的动作:
M1.[进入系统,为下一人的出现作准备]产生以下数值:
InFloor——该人进入哪层楼;
011tFloor——他要去哪层楼;
GiveupTime——他能容忍的等候时间;
Inter-Time——下一人出现的时间间隔,据此系统预置下一人进入系统的时刻。
M2.[按电钮并等候]此时应对以下不同情况作不同的处理:
①Floor=InFloor且电梯的下一个活动是E6(电梯在本层,但正在关门〉;
②Floor=InFloor且D3手0(电梯在本层,正有人迸出);
③其他情况,可能D2=0或电梯处于活动El(在1层停候)。
M3.[进入排队]在等候队列Queue[InFloor]末尾插入该人,并预置在GiveupTime个t之后,他若仍在队列中将实施动作M4。
M4.[放弃]如果Floor手InFloor或Dl=0,则从Quem[InFloor]和系统删除该人。
如果Floor=InFloor且D1学0,他就继续等候(他知道马上就可进入电梯〉。
M5.[进入电梯]从Queue[InFloor〕删除该人,并把他插入到lElevator(电梯)校中。
置Cancar[011tFloor]为1。
M6.[离去]从Elevator和系统删除该人。
(5)电梯的活动有9种:
E1.[在1层停候]若有人按下一个按钮,则调用Controler将电梯转入活动E3或E60。
E2.[要改变状态?
]如果电梯处于GoingUp(或GoingDown〉状态,但该方向的楼层却无人等待,则要看反方向楼层是否有人等候,而决定置State为GoingDown(或GoingUp〉还是Idle。
E3.[开门]置DI和D2为非0值,预置300个t后启动活动E9和76个t后启动E5,然后预置20个t后转到目。
E4.[让人出入]如果Elevator不空且有人的011tFloor=Floor,则按进入的倒序每隔25个t让这类人立即转到他们的动作M6。
Elevator中不再有要离开的人时,如果Queue[Floor]不空,则以25个t的速度让他们依次转到MLQueue[Floor]空时,置Dl为0,D3手0,而且等候某个其他活动的到来。
E5.[关门]每隔40个t检查D1,直到是D1=O(若D1手0,则仍有人出入〉。
置D3为0并预置电梯再20个t后启动活动E6(再关门期间,若有人到来,则如M2所述,门再次打开)。
E6.[准备移动]置Caucar[Floor]为0,而且若State手GoingDown,则置CallUP
CFloor]为05若State手GoingUp,则置CallDownCFloor]为0。
调用Controler函数。
如果State=Idle,则即使已经执行了Controler,也转到E1。
否则,如果D2手0,则取消电梯活动E9。
最后,如果State=GoingUp,则预置15个t后(电梯加速〉转到E7;如果State=GoingDown,则预置15个t后(电梯加速)转到E8。
E7.[上升一层]置Floor加1并等候51个人如果现在Caucar[Floor〕=1或CallUp[Floor]=1,或者如果((Floor=1或CallDOWEl[Floor]=1)且CallUp[j]=CallDOWEl[j]=CallCar-0]=0对于所有j>Floor),则预置14个t后(减速)转到E2;否则重复E7。
E8.[下降一层]除了方向相反之外,与E7类似,但那里的51和14个t,此时分别改为61和23个t(电梯下降比上升慢)。
E9.[置不活动指示器]置D2为0并调用Controler函数(E9是由E3预置的,但几乎总是被E6取消了训。
(6)当电梯须对下一个方向作出判定时,便在若干临界时刻调用Controler函数。
该
函数有以下要点:
C1.[需要判断?
]若State手Idle,则返回。
C2.[应该开门?
]如果电梯处于E1且CallUp[1],CallDown[1]或Caucar[1]非0,则
预置20个t后启动E3,并返回。
C3.[有按钮按下?
]找最小的j手Floor,使得CallUp[j],CallDOWEl〔j]或Caucar[j]非0,并转到C4。
但如果不存在这样的j,那么,如果Controler正为E6所调用,则置j为1,否则返回。
C4.[置State]如果Floor>j,则置State为GoingDOWEl;如果FloorGoingUp。
C5.[电梯静止?
]如果电梯处于E1而且j手1,则预置20个t后启动E6。
返回。
(7)由上可见,关键是按时序管理系统中所有乘客和电梯的动作设计合适的数据结构。
【选作内容】
(l)增加电梯数量,模拟多梯系统。
(2)某高校的一座30层住宅楼有三部自动电梯,每梯最多载客15人。
大楼每层8户,每户平均3。
5人,每天早晨平均每户有3人必须在7时之前离开大楼去上班或上学。
模拟该电梯系统,并分析分别在一梯、二梯和三梯运行情况下,下楼高峰期间各层的住户应提前多少时间候梯下楼?
研究多梯运行最佳策略。
10.文学研究助手
【问题描述】
文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为"文学研究助手"。
【基本要求】
英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
【测试数据】
以你的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)整个统计过程中只对小说文字扫描一遍以提高效率。
(3)假设小说中的每个单词或者从行首开始,或者前置一个空格符。
利用单词匹配特点另写一个高效的统计程序,与KMP算法统计程序进行效率比较。
(4)推广到更一般的模式集匹配问题,并设待查模式串可以跨行(提示:
定义操作GetAChar)。
11.文本格式化
【问题描述】
输入文件中含有待格式化〈或称为待排版〉的文本,它由多行的文字组成,例如一篇英文文章。
每一行由一系列被一个或多个空格符所隔开的字①组成,任何完整的字都没有被分割在两行(每行最后一个字与下一行的第一个字之间在逻辑上应该由空格分开),每行字符数不超过80。
除了上述文本类字符之外,还存在着起控制作用的字符:
符号"@"指示它后面的正文在格式化时应另起一段排放,即空一行,并在段首缩入8个字符位置。
"@"自成一个字。
一个文本格式化程序可以处理上述输入文件,按照用户指定的版面规格重排版面z实现页内调整、分段、分页等文本处理功能,排版结果存入输出文本文件中。
试写一个这样的程序。
【基本要求】
(1)输出文件中字与字之间只留一个空格符,即实现多余空格符的压缩。
(2)在输出文件中,任何完整的字仍不能分割在两行,行尾不齐没关系,但行首要对齐(即左对齐)。
(3)如果所要求的每页页底所空行数不少于3,则将页号印在页底空行中第2行的中间位置上,否则不印。
(4)版面要求的参数要包含:
页长(PageLength)一一每页内文字(不计页号)的行数。
页宽(PageWedth)一一每行内文字所占最大字符数。
左空白(LeftMargin)-一一每行文字前的固定空格数。
头长(HeadingLength)一一每页页顶所空行数。
脚长(FootingLeng