数据结构与算法课程设计指导书.docx
《数据结构与算法课程设计指导书.docx》由会员分享,可在线阅读,更多相关《数据结构与算法课程设计指导书.docx(42页珍藏版)》请在冰豆网上搜索。
![数据结构与算法课程设计指导书.docx](https://file1.bdocx.com/fileroot1/2023-2/2/3f109194-8810-4eb0-bff7-599c3f80f8ff/3f109194-8810-4eb0-bff7-599c3f80f8ff1.gif)
数据结构与算法课程设计指导书
《数据结构与算法》课程设计指导书
一.目的
通过本课程设计,使同学更加系统地理解和掌握数据结构的基本概念;能自如地根据实际要求,设计相应的数据结构,并运用C或C++语言实现所设计的算法,能够利用所学的基本知识和技能,分析和解决简单的程序设计问题,为后续其它专业课程的学习和应用打下良好基础。
二.题目
根据指导教师的具体要求,从下面题目中选择1个来完成
1.学生成绩管理系统
2.简易客房管理系统
3.人事档案管理系统
4.进销存货物管理系统
5.图书管理系统
6.运动会分数统计
7.民航订票系统
8.校园导游咨询
9.大数相乘问题
10.长整数的加减法
11.表达式的求值
12.日历系统
13.钱币的转换
14.二叉树的应用——哈夫曼树
15.银行排队系统模拟
16.其他题目(需老师同意)
注意,在实现相关管理系统题目时,需要设计良好的数据结构,代码编写时不允许运用现有的数据库管理系统,具体功能应通过对文件的读写操作实现。
三.任务完成形式
1.完整的软件系统
最终必须向指导老师提交完整的程序源代码(.c和.cpp以及.h为后缀的文件)、数据文件以及使用说明文件等。
源代码文件要特别注意编程规范、代码风格,关键代码需有合理的注释,不含任何无用代码;数据文件内要求有一定数量的“真实”数据(如对于记录文件,需要有5条以上记录);使用说明文件的第一行,需要给出设计者的学号、姓名,后面为其它说明。
2.课程设计报告(详细要求请参考附录二)
课程设计报告总体上主要包括以下几个部分:
1)封面
2)目录
3)课程设计报告正文
4)使用说明
5)参考文献
四.总体要求
1.每道题目的程序代码总量不少于600行(其中不包括自动生成代码),有合理注释。
2.课程设计报告正文字数不少于8000字,概念清楚、叙述正确、内容完整、书写规范。
3.独立完成课程设计,不得抄袭他人。
4.功能正确、有一定实用性。
5.尽可能大量使用各种C或者C++语言程序设计技术,尤其在以下几个方面:
指针及其运算、结构、指针数组、数组指针、字符数组与字符串、内存空间动态申请与释放、文件访问与操作、合理的常量与全局变量及函数接口变量定义、数据输入与数据格式检查、数据类型转换、错误处理、工程设计技术(整个系统由一个工程文件、若干个程序文件、若干头文件、甚至库文件等组成)。
程序界面不做较高要求,但要考虑到用户使用的方便,有较好的交互界面。
6.可以使用VC编译环境开发程序,但不允许使用现成的数据库如access,SQLServer等完成上面的课程设计题目,否则成绩评定为不及格。
7.设计时适当考虑程序的可维护性与可扩充性。
8.提倡积极交流与讨论(同学间、bbs站点)、善于查阅资料、分析与借鉴他人编写的软件。
9.认真自觉以个人为单位完成自己的任务,代码和课设报告均严禁雷同,否则成绩为不及格。
验收时查看代码,并提出若干个跟程序代码有关的问题,并把问题回答情况计入总评成绩。
10、根据不同的数据结构,要求有一种数据结构算法(冒泡排序算法不包括)。
五.工作阶段与考核方法
大体上可分成五个阶段:
1.资料查阅准备阶段(15%)
2.分析设计阶段(35%)
3.编程调试阶段(40%)
4.课程设计报告书写阶段(10%)
5.验收阶段
考核方法:
只有程序验收通过后,才能按以下方法核定本次课程设计的总成绩,因未能独立完成设计(尤其是抄袭)或概念不清的同学,总成绩将核定为不及格。
总成绩由以下几个部分决定:
1.考勤、纪律、实验室卫生
2.工作量(代码量、功能多少、难度)
3.关键技术
4.实用性、创新
5.代码书写规范性
6.程序界面、新技术引用
7.课程设计报告(叙述、书写规范、字数)
8.动手能力、分析问题解决问题能力
六.任务具体要求
1、学生成绩管理系统
问题描述:
该系统实现对若干个大学生的学习成绩进行管理。
至少包括以下信息:
学号、姓名、科目、成绩,学期。
学期取值范围可为1-8。
功能要求:
1.使用中文菜单,界面设计和用户输入输出要人性化些;
2.将学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来,保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成,或者在相应的命令后,再将学生信息保存到文本文档中。
3.具有数据输入功能,输入的数据能最终保存在文件中;
4.具有数据删除功能,能最终从文件中删除;
5.排序功能,根据自己设计的数据结构,设计排序算法
6.具有多种查询(如按学号查询、按姓名查询、按成绩查询等)及输出功能;
7.其它功能(如各种统计,统计每个学生所有课程的平均分,统计某门课程所有学生的平均分等等)
8.学生信息的修改(比如修改学生姓名,修改学生某门课程的成绩)
说明:
(1)功能各方面越完善越好
(2)自定义的数据结构可以使用数组,链表,树等,可以使用多种数据结构来存放数据,然后在其上使用不同的排序算法。
(3)若用数组,必须动态分配空间(文本文件中最好有一行表示学生人数)
算法要点:
把问题看成是对线性表的操作。
将学生成绩组织成顺序表,则登记学生成绩即是建立顺序表操作;查询学生成绩、插入学生成绩、删除学生成绩即是在顺序表中进行查找、插入和删除操作。
2、简易客房管理系统
问题描述:
该系统能简单实现对客栈的住宿情况进行管理。
至少包括以下信息:
房号、房型、单价(每床)、已住人数;
住客姓名、性别、年龄、身份、身份证号码,房号,床号,入住日期、入住时间、离店日期、离店时间。
这些信息应存放在两个文件中,分别是客房信息文件、住客信息文件。
“房型”可取值1-3,分别表示单人间、双人间、通铺(可以住很多人的房间)
功能要求:
1.具有建立数据文件(客房信息文件、住客信息文件)功能;
2.具有数据输入功能;
3.具有数据修改功能;
4.具有数据删除功能;
5.能查询(查找)一些基本信息(如按房号查询、按姓名查询、空余客房查询等);
6.具有多种统计功能(要求有一定的实用性)
(如某客房当前有那些空床、某住客应付多少费用、某天住店总人数和总收入等)
7.能具有排序功能(比如在查询所有的客房信息时,能根据房间价格进行排序,方便客人挑选房间等等)
说明:
(1)功能各方面越完善越好
(2)自定义的数据结构可以使用数组,链表,树等,可以使用多种数据结构来存放数据,然后在其上使用不同的排序算法。
(3)若用数组,必须动态分配空间(文本文件中最好有一行来表示数组应该有多大,这样便于动态分配空间)
3、人事档案管理系统
问题描述:
该系统能简单实现对人事档案的管理。
该系统包括:
人员基本情况管理、工资管理和考勤管理等几个方面的功能。
用户通过输入工资、考勤、职工履历等基本信息,由系统自行生成相应的统计数据以供用户查询,能对这些基本信息进行更新和删除。
至少包括以下信息:
人员履历表:
员工编号,员工姓名,性别,年龄,部门,职位,受教育年限
职工工资表:
员工编号,基本工资,缺勤扣发工资,扣税,实发工资
月考勤登记表:
员工编号,月缺勤天数
注:
假设每个员工每天缺勤扣发工资的多少跟其基本工资存在一定关系,比如是该基本工资的20分之一;假设扣税金额=(基本工资-缺勤扣发工资-2000)×10%,而若基本工资-缺勤扣发工资-2000的值小于2000则扣税金额为0
功能要求:
1.具有建立数据文件(人员履历表文件、职工工资表文件、月考勤登记表)功能;
2.具有数据输入功能;
3.具有数据修改功能;
4.具有数据删除功能;
5.能查询(查找)一些基本信息(如按员工编号查询、按员工姓名和部门组合查询等,如生成各部门员工花名册);
6.具有多种统计功能(要求有一定的实用性)
(如不同部门的员工平均工资比较(除了用数字表示外,也可以用星号画图的方式来直观的表示);不同性别员工工资比较;某部门内部,不同职位员工工资比较;不同受教育水平人的平均工资比较;部门最高实发工资等等)
7.具有排序功能(比如将各部门职工工资平均值进行排序,将部门内部职工工资进行排序等等)
各个功能模块简要叙述(具体实现时,并不局限于这些功能,越完善越好)
✧人员基本情况管理:
提供对”人员履历表”数据输入、组合条件查询、统计功能;
✧职工工资管理:
提供对”职工工资表”数据的输入、查询、按统计、显示功能,完成每月对“职工工资表”数据的月统计,以此生成“职工工资总额构成情况表”实现该表的查询、显示功能。
✧职工考勤管理:
提供对各部门“月考勤登记表”数据的录入、查询、统计功能;
说明:
(1)功能各方面越完善越好
(2)自定义的数据结构可以使用数组,链表,树等,可以使用多种数据结构来存放数据,然后在其上使用不同的排序算法。
(3)若用数组,必须动态分配空间(文本文件中最好有一行来表示数组应该有多大,这样便于动态分配空间)
4、进销存货物管理系统
问题描述:
该系统能进行简单的货物管理,进货,销售货物,退货等管理
至少包括如下信息:
货物标号,货物名称,货物产地,入库价格,入库时间,现存货物数量,已经销售数量,销售平均单价
注:
每次销售后,都需要对现存货物数量进行更新,对已销售数量进行更新,也需要对销售平均单价进行更新
功能要求:
1.具有建立数据文件(货物管理表)的功能;
2.具有数据输入功能;
3.具有数据修改功能;
4.具有数据删除功能(当一些已经过时陈旧的商品被特价处理后,将其删除,不再进货);
5.能查询(查找)一些基本信息(如能查询剩余件数小于某个特定值的商品,以便于及时进货);
6.具有多种统计功能(要求有一定的实用性)
(如统计每种货物是否有盈利(将销售平均单价跟入库价格进行比较),所有货物的盈利或亏损等等)
7.具有排序功能(比如对货物盈利水平进行排序比较等等)
说明:
(1)功能各方面越完善越好
(2)自定义的数据结构可以使用数组,链表,树等,可以使用多种数据结构来存放数据,然后在其上使用不同的排序算法。
(3)若用数组,必须动态分配空间(文本文件中最好有一行来表示数组应该有多大,这样便于动态分配空间)
5、图书管理系统
问题描述:
该系统能进行简单的图书管理功能
至少包括如下信息:
图书编号,图书名称,作者,出版社,总共册数,在馆册数,现存地址,借阅次数
注:
现存地址是假设图书馆有多个书库,不同种类的书存放于不同的地方
功能要求:
1.具有建立数据文件(图书信息)的功能;
2.具有数据输入功能;
3.具有数据修改功能(借书或者还书都需要修改图书数量信息);
4.具有数据删除功能(当图书因为年代久远,或者遗失,也许需要对其进行删除操作);
5.能查询(查找)一些基本信息(这里的查询功能应该较为强大,能通过作者进行查询,书名查询,或者结合作者出版社一起进行查询等等)
6.具有多种统计功能(要求有一定的实用性)
(如统计每本书的借阅次数,方便将来新近图书。
统计每个书库中图书的数量等等)
7.具有排序功能(比如对每本图书的借阅次数进行排序)
各个功能模块简要叙述(具体实现时,并不局限于这些功能,越完善越好)
✧新近图书:
在图书信息表中添加相应信息;
✧旧书处理:
在图书信息表中删除相应信息;
✧借书还书:
对图书信息表进行修改,若在馆册书为0,则不允许继续借阅;
✧图书信息的统计
✧图书信息的排序
✧图书信息的查找
说明:
(1)功能各方面越完善越好
(2)自定义的数据结构可以使用数组,链表,树等,可以使用多种数据结构来存放数据,然后在其上使用不同的排序算法。
(3)若用数组,必须动态分配空间(文本文件中最好有一行来表示数组应该有多大,这样便于动态分配空间)
6、运动会分数统计
问题描述:
参加运动会有n个学校,学校编号为1……n.比赛分成m个男子项目,和w个女子项目.项目编号为男子1......m,女子m+1......m+w.不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由同学自己设定。
(m<=20,n<=20)
功能要求:
1.可以输入各个项目的前三名或前五名的成绩;
2.能统计各学校总分;
3.可以按学校编号、学校总分、男女团体总分排序输出;
4.可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
规定:
输入数据形式和范围:
20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)
输出形式:
有中文提示,各学校分数为整形
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
7、民航订票系统
任务:
通过此系统可以实现如下功能:
1.录入
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
2.查询
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况,最近一天航班的日期和余票额.;
3.订票业务;据顾客要求(航班号,订票额)查询该航班票额情况,若有余票,办理售票手续,输出座位号;若已满员或票额不足,则另询顾客要求.若需要,可预约登记排队等候.
4.退票业务:
根据顾客情况(日期,航班)为顾客办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一位的顾客,若退票额能满足他的要求,则为他办理退票手续,否则依次询问其他排队预约的顾客.
5.修改航班信息:
当航班信息改变可以修改航班数据文件。
基本要求:
1.根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能;
2.界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
8、校园导游咨询
问题描述:
设计校园导游程序,为来访的客人提供服务。
基本要求:
(1)假设有一所校园的平面图,所含景点不小于10个,请选择适当的坐标来表示出该图上的各个景点。
;
(2)为来访的客人提供从当前位置到其他景点的最短路径的咨询;
(3)必须具有校园平面图的修改和扩充功能(即某些景点坐标的修改和景点个数的增加)。
9、大数相乘问题
例如:
输入第一个数为:
132********172586,输入第二个数为:
2397567453241147则程序运行后输出13286754398172586*2397567453241147=正确答案。
10、长整数的加减运算
问题描述:
设计一个实现任意长的整数进行加法运算的演示程序
基本要求:
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。
任何整型变量的范围是-(215-1)~(215-1)。
输入输出形式:
按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开
更高要求:
(1)长整数的减法
(2)多个长整数的连续加减法,并带括号等。
具体方式可以参见表达式的求值部分,利用栈
测试数据:
(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;应输出“0”
(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)可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
11、表达式的求值
表达式求值要求:
例如,输入25*(12-27/3)+2*5=
则程序运行后输出25*(12-27/3)+2*5=85
设计要求:
以字符序列的形式从终端输入不含变量的算术表达式(整数和实数都要考虑),利用给定的算符优先关系,实现对算术四则混合运算表达式的求值,
基本要求:
(1)输入四则表达式(有括号和加减乘除,且表达式中有可能会出现带小数点的浮点数);
(2)判断表达式是否合法(括号是否匹配);
(3)按照运算符的优先级计算算术表达式的值。
更高要求:
(1)演示在求值过程中运算符栈、操作数栈的变化过程。
(2)判断表达式的语法是否正确(比如1++2就是错误的)
12、日历系统
功能要求:
1)输入任一年将显示出该年的所有月份日期,对应的星期
2)注意闰年情况
其显示格式要求如下:
1)月份:
中文英文都可以,
2)下一行显示星期,从周日到周六,中英文都可以
3)下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐
当输入2004显示如下:
输入要显示日历的年份:
2004
输入该年1月1日是星期几:
4
输出日历如下:
Thecalendaroftheyear2004.
Januray1February2
SunMonTueWedThuFriSatSunMonTueWedThuFriSat
1231234567
45678910891011121314
1112131415161715161718192021
1819202122232422232425262728
2526272829303129
======================================================
March3April4
SunMonTueWedThuFriSatSunMonTueWedThuFriSat
123456123
7891011121345678910
1415161718192011121314151617
2122232425262718192021222324
28293031252627282930
======================================================
13、钱币的转换
银行经常需要进行输入输出大小写的转换。
要求:
(1)编写程序实现将阿拉伯数字表示的钱币数,表示为用中文表示的钱币书:
比如输入10.2元,则输出拾元贰角三分
(2)编写程序实现将中文表示的钱币数表示为阿拉伯数字表示的钱币数:
比如输入三角,则输出0.3元
(3)需要注意:
100000,中文表示是拾万元;0.3元表示为三角。
希望大家把具体情况都能考虑清楚。
设计比较良好的用户提示界面。
14、二叉树的应用-哈夫曼树(电文的编码和译码)
哈夫曼编码/译码器
问题描述:
设计一个哈夫曼编码/译码系统,对字符串进行编码/译码
基本要求:
(1)从键盘输入字符串,以回车结束;
(2)根据字符串中字符出现的概率进行哈夫曼编码;)
(3)并输出编码结果和编码表;
(4)根据编码结果和编码表还原字符串;
(5)输出编码过程中构造的哈夫曼树。
内容:
理解二叉树的基本概念,并在读懂下面详细描述的算法的情况下,编写一个有关二叉树的简单应用程序-电文的编码和译码
具体实验题目和功能要求如下:
(1)电文编码:
假如有一份电文中共使用5个字符:
a、b、c、d、e,它们的出现频率依次为4、7、5、2、9,试画出对应的哈夫曼树(请按左子树根结点的权小于等于右子树根结点的权的次序构造),并求出每个字符的哈夫曼编码
其中:
得到的哈夫曼树和哈夫曼编码如下。
图1
要求自己编程实现若从键盘输入若干字符,同时并输入它们各自出现的频率,最后能计算并在屏幕上显示出每个字符的代码。
(2)电文译码:
给出一段二进制代码的电文,要求根据前面构造的huffman树进行译码。
在前面编码的基础上,键盘输入一段电文,则能在屏幕上显示出自动翻译好的电文。
比如根据图1显示的哈夫曼树,键盘输入电文如下:
1011010,屏幕上能显示自动翻译的结果为bed
说明事项:
1.通过上面的描述本课程设计题目包括
(1)电文的编码
(2)电文的译码,要求必须用哈夫曼树实现。
2.界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
并要明确,只有在使用哈夫曼树进行编码的前提下,才有可能进行译码。
3.考虑将此程序设计完善,比如可以将编码后的字符代码保存到文件中,将需要翻译的代码保存到另一个文件中,最后把自动翻译后的结果也保存到文本文档中等等。
在这个程序中,首先要构造一棵哈夫曼树,然后才能根据这棵哈夫曼树构造编码。
因此,步骤一:
构造哈夫曼树
步骤二:
根据哈夫曼树为每个字符编码
步骤三:
根据步骤二中构造好的哈夫曼树进行译码
提示:
具体算法见后面的有关哈夫曼树的基础知识介绍
部分代码(仅供参考)如下:
constintN=5;//叶子结点数目
constintTREENODENUM=2*N-1;//结点总数
//huffman树结点的结构
typedefchardataType;
typedefstruct
{
floatweight;
dataTypedata;
intlchild,rchild,parent;
}huffmanTreeNode;
//哈夫曼编码的结构
typedefstruct
{
charbits[N];//详细的编码,不过是反的,要从cnt开始读
intcnt;//记录这个字符数由几位bit表示的
dataTypedata;//编码要表示的字母
}codeType;
有关哈夫曼树的基础知识介绍
(1)哈夫曼树的定义
哈夫曼树:
设有
个权值
,构造一棵有
个叶子结点的二叉树,每个叶子结点的权值为
,则
最小的二叉树叫哈夫曼树
其中:
为权值
为结点到根到路径长度
为叶子结点数
(2)构造Huffman树的方法——Huffman算法
构造Huffman树步骤如下:
①根据给定的n个权值{w1,w2,……wn},构造n棵只有根结点的二叉树,令其权值为wj
②在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和
③在森林中删除这两棵树,同时将新得到的二叉树加入森林中
④重复上述两步,直到只含