数据结构课程设计题目及报告范例.docx
- 文档编号:25667255
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:53
- 大小:55.66KB
数据结构课程设计题目及报告范例.docx
《数据结构课程设计题目及报告范例.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计题目及报告范例.docx(53页珍藏版)》请在冰豆网上搜索。
数据结构课程设计题目及报告范例
1.
运动会分数统计
【问题描述】
参加运动会的n个学校编号为1〜n。
比赛分成m个男子项目和w个女子项目,项目编号分别为1〜m和m+1〜m+wo由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。
写一个统计程序产生各种成绩单和得分报表。
【基本要求】
1)可以输入各个项目的前三名或前五名的成绩;
2)能统计各学校总分,
3)可以按学校编号或名称、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
5)数据存入文件并能随时查询
6)规定:
输入数据形式和范围:
可以输入学校的名称,运动项目的名称输出形式:
有中文提示,各学校分数为整型。
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
测试数据:
【测试数据】
要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。
进行程序测试,以保证程序的稳定。
例如,对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。
【实现提示】
可以假设nw20,mw30,w<20,姓名长度不超过20个字符。
每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。
【选作内容】
允许用户指定某项目采取其他名次取法
2.集合的并、交和差运算
问题描述】
编制一个能演示执行集合的并、交和差运算的程序。
基本要求】
(1)集合的元素限定为小写字母字符[‘a'..'z']。
(2)演示程序以用户和计算机的对话方式执行。
测试数据】
(1)Set1="magazine",Set2="paper",
SetluSet2="aegimnprz",SetlnSet2="ae",Set1-Set2="gimnz"。
(2)Set1="012oper4a6tion89",Set2="errordata",
Set1uSet2="adeinoprt",SetlnSet2="aeort",Set1-Set2="inp"。
实现提示】
以有序链表表示集合。
【选作内容】
(1)集合的元素判定和子集判定运算。
(2)求集合的补集。
(3)集合的混合运算表达式求值。
(4)集合的元素类型推广到其他类型,甚至任意类型。
3.一元稀疏多项式计算器
【问题描述】
设计一个一元稀疏多项式简单计算器
【基本要求】
元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:
n,ci,e,C2,e2,…,cn,en,其
中n是多项式的项数,ci和e,分别是第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的导函数a。
(3)多项式a和b相乘,建立乘积多项式
ab。
(4)多项式的输出形式为类数学表达式。
例如,多项式-3x8+6x3-18的输出形式为
3x86x318,x15+(-8)x7—14的输出形式为x158x714。
注意,数
值为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$棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。
要求每个方格只进入一次,走遍棋盘上全部64个方格。
编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8>8的方阵,输出之。
7.魔王语言解释
【问题描述】
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能昕得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(2)(12n)nn11
在这两种形式中,从左到右均表示解释。
试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
【基本要求】
用下述两条具体规则和上述规则形式
(2)实现。
设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。
魔王语言可含人的词汇。
(1)BtAdA
(2)Asae
【测试数据】
B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
t
d
s
a
e
z
g
x
n
h
天
地
上
一只
鹅
追
赶
下
蛋
恨
【实现提示】
将魔王的语言自右至左进栈,总是处理栈顶字符。
若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。
其他情形较简单,请读者思考应如何处理。
应首先实现栈和队列的基本操作。
【选作内容】
(1)由于问题的特殊性,可以实现栈和队列的顺序存储空间共享。
(2)代换变量的数目不限,则在程序开始运行时首先读入一组第一种形式的规则,而不是把规则固定在程序中(第二种形式的规则只能固定在程序中)。
8.航空客运订票系统
【问题描述】
航空客运订票的业务活动包括:
查询航线、客票预订和办理退票等。
试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
【基本要求】
(1)每条航线所涉及的信息有:
终点站名、航班号、飞机号、飞行周日(星期
几)、乘员定额、余票量、已订票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票量);
(2)系统能实现的操作和功能如下:
1录入:
可以录入航班情况,全部数据可以只放在内存中,最好存储在文件中;
2查询航线:
根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
3承办订票业务:
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需重新询问客户要求。
若需要,可登记排队候补;
4承办退票业务:
根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。
【测试数据】
由读者自行指定。
【实现提示】
两个客户名单可分别由线性表和队列实现。
为查找方便,已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。
由于预约人数无法预计,队列也应以链表作存储结构。
整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。
每条航线是这张表上的一个记录,包含上述8个域、其中乘员名单域为指向乘员名单链表的头指针,等候替补的客户名单域为分别指向队头和队尾的指针。
【选作内容】
当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其他航线
情况。
读者还可充分发挥自己的想象力,增加你的系统的功能和其他服务项目。
9.药店的药品销售统计系统
【问题描述】设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号、单价、销售量或销售额做出排名。
【基本要求】
在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。
各药品的信息包括:
药品编号、药名、药品单价、销出数量、销售额。
药品编号共4位,采用字母和数字混合编号,如:
A125,前一位为大写字母,后三位为数字,
按药品编号进行排序时,可采用基数排序法。
对各药品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排序、冒泡排序、快速排序,直接选择排序等方法。
在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。
10.文学研究助手
【问题描述】文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为"文学研究助手"。
【基本要求】英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
【测试数据】
以你的C源程序模拟英文小说,C语言的保留字集作为待统计的词汇集。
【实现提示】
约定小说中的词汇一律不跨行。
这样,每读入一行,就统计每个词在这行中的出现次数。
出现位置所在行的行号可以用链表存储。
若某行中出现了不止一次,不必存多个相同的行号。
如果读者希望达到选做部分
(1)和
(2)所提出的要求,则首先应把KM算法改写成如下的等价形式,再将它推广到多个模式的情形。
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)模式匹配要基于KM算法。
(2)整个统计过程中只对小说文字扫描一遍以提高效率。
(3)假设小说中的每个单词或者从行首开始,或者前置一个空格符。
利用单词匹配特点另写一个高效的统计程序,与KM算法统计程序进行效率比较。
(4)推广到更一般的模式集匹配问题,并设待查模式串可以跨行(提示:
定义操作GetAChar)。
11.文本格式化
【问题描述】
输入文件中含有待格式化〈或称为待排版〉的文本,它由多行的文字组成,例如一篇英文文章。
每一行由一系列被一个或多个空格符所隔开的字①组成,
任何完整的字都没有被分割在两行(每行最后一个字与下一行的第一个字之间在逻辑上应该由空格分开),每行字符数不超过80。
除了上述文本类字符之外,还存在着起控制作用的字符:
符号"@"指示它后面的正文在格式化时应另起一段排放,即空一行,并在段首缩入8个字符位置。
"@"自成一个字。
一个文本格式化程序可以处理上述输入文件,按照用户指定的版面规格重排版面z实现页内调整、分段、分页等文本处理功能,排版结果存入输出文本文件中。
试写一个这样的程序。
【基本要求】
(1)输出文件中字与字之间只留一个空格符,即实现多余空格符的压缩。
(2)在输出文件中,任何完整的字仍不能分割在两行,行尾不齐没关系,但行首要对齐(即左对齐)。
(3)如果所要求的每页页底所空行数不少于3,则将页号印在页底空行中第2行的中间位置上,否则不印。
(4)版面要求的参数要包含:
页长(PageLength)—一每页内文字(不计页号)的行数。
页宽(PageWedth)一一每行内文字所占最大字符数。
左空白(LeftMargin)-一一每行文字前的固定空格数。
头长(HeadingLength)一一每页页顶所空行数。
脚长(FootingLength)—一每页页底所空行数(含页号行)。
起始页号(StartingPageNumber)一一首页的页号。
【测试数据】略。
注意在标点之后加上空格符。
【实现提示】
可以设:
左空白数x2+页宽<=160,即行印机最大行宽,从而只要设置这样大的一个行缓冲区就足够了,每加工完一行,就输出一行。
如果输入文件和输出文件不是由程序规定死,而是可由用户指定,则有两种做法:
一是像其他参量一样,将文件名交互地读入字符串变量中;更好的方式是让用户通过命令行指定,具体做法依机器的操作系统而定。
应该首先实现GetAWord(w)这一操作,把诸如行尾处理、文件尾处理、多余空格符压缩等一系列"低级"事务留给它处理,使系统的核心部分集中对付排版要求。
每个参数都可以实现缺省值②设置。
上述排版参数的缺省值可以分别取56,60,10,5,5和1。
【选作内容】
(1)输入文件名和输出文件名要由用户指定。
(2)允许用户指定是否右对齐,即增加一个参量"右对齐否
"(RightJustifying),缺省值可设为"y"(yes)。
右对齐指每行最后一个字的字尾要对齐,多余的空格要均匀分布在本行中各字之间。
(3)实现字符填充(characterstuffing)技术。
"@"作为分段控制符之后,限
制了原文中不能有这样的字。
现在去掉这一限制:
如果原文中有这样的字,改用两个"@"并列起来表示一个"@"字。
当然,如果原文中此符号夹在字中,就不必
特殊处理了。
(4)允许用户自动按多栏印出一页。
12.简单行编辑程序
【问题描述】
文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。
限制这些操作以行为单位进行的编辑程序称为行编辑程序。
被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的作法既不经济,也不总能实现。
一种解决方法是逐段地编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
试按照这种方法实现一个简单的行编辑程序。
设文件每行不超过320个字符,很少超过80个字符。
【基本要求】
实现以下4条基本编辑命令:
(1)行插入。
格式:
i<行号><回车><文本>.<回车>将<文本>插入活区中第<行号>行之后。
(2)行删除。
格式:
d<行号1>[<空格><亍号2>]<回车>
删除活区中第<行号1>行(到第<行号2>行)。
例如:
"d10"和"d1014"。
(3)活区切换。
格式*回车>
将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。
(4)活区显示。
格式:
p<回车>
逐页地(每页20行)显示活区内容,每显示一页之后请用户决定是否继续显示以后备页(如果存在)。
印出的每一行要前置行号和一个空格符,行号固定占4位,增量为1。
各条命令中的行号均须在活区中各行行号范围之内,只有插入命令的行号可以等于活区第一行行号减1,表示插入当前屏幕中第一行之前,否则命令参数非法。
【测试数据】
自行设定,注意测试将活区删空等特殊情况。
【实现提示】
(1)设活区的大小用行数ActiveMULen(可设为100)来描述。
考虑到文本文件
行长通常为正态分布,且峰值在60到70之间,用320xActiveMULen大小的字符数组实现存储将造成大量浪费。
可以以标准行块为单位为各行分配存储,每个标准行块可含81个字符。
这些行块可以组成一个数组,也可以利用动态链表连接起来。
一行文字可能占多个行块。
行尾可用一个特殊的ASCII字符(如(012)8)标
识。
此外,还应记住活区起始行号。
行插入将引起随后各行行号的顺序下推。
(2)初始化函数包括:
请用户提供输入文件名(空串表示无输入文件)和输出文件名,两者不能相同。
然后尽可能多地从输入文件中读入各行,但不超过ActiveMULen-LX的值可以自定,例如20。
(3)在执行行插入命令的过程中,每接收到一行时都要检查活区大小是否已
达ActiveMaxLen。
如果是,则为了在插入这一行之后仍保持活区大小不超过ActiveMaxLen应将插入点之前的活区部分中第一行输出到输出文件中;若插入
点为第一行之前,则只得将新插入的这一行输出。
(4)若输入文件尚未读完,活区切换命令可将原活区中最后几行留在活区顶部,以保持阅读连续性;否则,它意味着结束编辑或开始编辑另一个文件。
(5)可令前三条命令执行后自动调用活区显示。
【选作内容】
(1)对于命令格式非法等一切错误作严格检查和适当处理。
(2)加入更复杂的编辑操作,如对某行进行串替换;在活区内进行模式匹配
等,格式可以为S<行号>@串1>@串2><回车〉和m<$x回车>。
13.串基本操作的演示
【问题描述】
如果语言没有把串作为一个预先定义好的基本类型对待,又需要用该语言写一个涉及串操作的软件系统时,用户必须自己实现串类型。
试实现串类型,并写一个串的基本操作的演示系统。
【基本要求】
在教科书4.2.2节用堆分配存储表示实现HString串类型的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用C语言本身提供的串函数)。
参数合法性检查必须严格。
利用上述基本操作函数构造以下系统:
它是一个命令解释程序,循环往复地处理用户键入的每一条命令,直至终止程序的命令为止。
命令定义如下:
(1)赋值。
格式:
A<串标识><回车>
用<串标识>所表示的串的值建立新串,并显示新串的内部名和串值。
例:
A‘Hi!
'
(2)判相等。
格式:
E<串标识1><串标识2><回车>
若两串相等,则显示"EQUAL",否则显示"UNEQUAL。
(3)联接。
格式:
C<串标识1><串标识2><回车>
将两串拼接产生结果串,它的内部名和串值都显示出来。
⑷求长度。
格式:
L〈串标识><回车>显示串的长度。
(5)求子串。
格式:
S<串标识>+<数1>+<数2><回车>
如果参数合法,则显示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 题目 报告 范例