数据结构课程设计报告模拟旅馆管理系统床位的分配与回收.docx
- 文档编号:23942477
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:26
- 大小:92.41KB
数据结构课程设计报告模拟旅馆管理系统床位的分配与回收.docx
《数据结构课程设计报告模拟旅馆管理系统床位的分配与回收.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告模拟旅馆管理系统床位的分配与回收.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告模拟旅馆管理系统床位的分配与回收
数据结构课程设计
实验报告
题目名称:
模拟旅馆管理系统——床位的分配与回收
指导教师:
林立新、漆华妹
姓名:
XX
学号:
090910XXXX
专业班级:
通信工程100X班
日期:
2012-7-3
前言
数据结构课程设计是配合数据结构基础课程与实验教学的一个非常重要的教学环节。
它是通信工程专业学生的重要基础实践课,能巩固程序编辑的理论知识,提高程序设计水平,加强综合分析问题和解决问题的能力,进一步培养学生的实验技能和动手能力,启发学生的创新意识及创新思维。
完成本次课程设计,对进行毕业设计及毕业后从事相关工作都有很大的帮助。
同时,《数据结构》在计算机科学中是一门综合性的专业基础课.数据结构的研究不仅涉及到计算机的硬件的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。
在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方面。
因此,可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程.在计算机科学中,数据结构不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其它系统程序和大型应用程序的重要基础。
可见,学好数据结构以及认真对待数据结构课程设计对我们十分重要,此次我们小组做的是“模拟旅馆管理系统的一个功能——床位的分配与回收”,为了能够保质保量的完成老师交给我们的任务,我小组积极查阅图书馆及网上的各项资源,认真对待每一次的上机课程,力求尽自己最大的努力,将这项课程设计做好。
前言……………………………………………………………………1
一、课题设计任务及要求……………………………………………3
1.问题描述……………………………………………………………3
2.基本要求……………………………………………………………3
3.实现提示……………………………………………………………3
二、需求分析…………………………………………………………4
三、系统的概要设计…………………………………………………4
1.功能模块的划分……………………………………………………4
2.参考的ADT…………………………………………………………5
四、程序设计思路……………………………………………………7
1.建立结构体及链表…………………………………………………7
2.算法的描述…………………………………………………………7
五、程序的调试与分析………………………………………………9
1.测试数据……………………………………………………………9
2.测试结果……………………………………………………………9
六、用户使用说明……………………………………………………10
1.程序运行环境……………………………………………………10
2.程序主界面………………………………………………………10
3.相关程序各项说明………………………………………………10
七、调试过程中出现的问题及心得体会……………………………12
八、心得体会…………………………………………………………13
附录:
程序的源代码…………………………………………………14
一、课题设计任务及要求
1.问题描述:
某旅馆有n个等级的房间,第i等级有
个房间,每个等级有
个床位(1≤I≤n)。
试模拟旅馆管理系统中床位分配和回收的功能,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)的算法。
2.基本要求:
(1)输入数据
对房间信息进行初始化,包括房间的类别、数量以及房间和床位的计费标准;
分配时,输入旅客姓名、年龄、性别、到达日期和所需房间等级;
回收时,输入房间等级、房间号和床位号。
(2)输出数据
分配成功时打印旅客姓名、年龄、到达日期、房间等级、房间号码和床位号码。
分配不成功时,如所有等级均无床位,则打印“客满”信息;如旅客需要的等级均无空床位,则打印“是否愿意更换等级?
”的询问信息。
若旅客愿意更换,则重新输入有关信息,再进行分配,否则分配工作结束。
(3)结帐管理
在旅客离开时计算房费,并打印账单,账单格式自行设计,要求信息齐全、清晰。
(4)对旅客信息和房间信息以及收费标准采用文件的形式存储也可以在程序中初始化。
3.实现提示:
数据结构:
主要采用顺序结构链接结构的线性表及堆栈。
每个房间用一个如下所示的具有五个字段的结点(房结点)表示:
性别
房间号
现有空床数
BTOP
RLINK
其中,性别:
0表示房间为空状态
1表示房间分配给女旅客
2表示房间分配给男旅客
现有空床数:
数据在0~bi之间,其中bi是第i等级一个房间的床位数,当现有空床数为bi时,表示房间为空;为0时,表示房间满。
RLINK:
当房间空时,用作空房栈的连接;当房间不空时,指向下一个房结点。
BTOP:
指向该房间的空床号栈栈顶。
一个房间对应一个顺序表示的空床号栈。
栈的容量为bi,栈中存放空床号。
分配时,从栈顶取出空床号,栈顶下移(BTOP=BTOP+1);回收时,栈顶上移(BTOP=BTOP-1),将回收的空床号填入栈顶。
每一个等级中的空房间构成一个空房栈;已住旅客的房间构成一个链栈(简称房链),其头结点结构如下:
可分配女床位总数
可分配男床位总数
ai
bi
TTOP
RLINK
其中:
ai:
第i等级中房间总数
bi第i等级中每个房间的床位数
可分配男、女床位的总数的初值等于ai*bi,因为开始时所有房间和床位既可以分配给男旅客,也可以分配给女旅客。
当在房链中分配一个床位给男(女)旅客,床位总数应减1;当从空房栈中取出一个房间作为男(女)旅客房间时,则可分配女(男)床位总数应减bi,当回收一个男(女)床位时,则可分配男(女)床位总数应加1;当回收一个男(女)空房至空房栈时,则可分配女(男)床位总数应加bi。
TTOP:
指向本级空房栈栈顶,当无空房间时,TTOP=^(NIL)。
RLINK:
指向本级房链第一个顶点,当房链为空时,RLINK=^(NIL)
顺序表s=(s0,s1,...,si,...sn),其中,s1-Sn顺序存放第1~n等级房间的头结点;
s0存放内容如下所示:
全店可分配女床总数
全店可分配女床总数
0
0
^
^
初始时,全店可分配男、女床总数相同,均为
,在分配或回收时,对各等级可分配男(女)床位总数处理的同时也要对全店可分配男(女)床总数作相应处理,当全店可分配男(女)床总数等于零时,表示客满。
二、需求分析
经分析,程序要有以下功能:
①对旅馆信息进行初始化;
②在旅客到来时记录旅客信息并为其分配床位;
③在旅客离开时为其打印账单,并回收其床位;
④在输入过程中对输入的数据进行检查,以防止输入超出范围的信息。
三、系统的概要设计
1.功能模块的划分
程序功能模块划分下图所示:
2.参考的ADT
ADT设计使用线性表和栈:
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系:
R1={
基本操作:
InitList(&L)
操作结果:
构造一个空的线性表L。
DestroyList(&L)
初始条件:
线性表L已存在。
操作结果:
销毁线性表L。
ListEmpty(L)
初始条件:
线性表L已存在。
操作结果:
若L为空表,则返回TRUE,否则返回FALSE。
ListLength(L)
初始条件:
线性表L已存在。
操作结果:
返回L中元素个数。
PriorElem(L,cur_e,&pre_e)
初始条件:
线性表L已存在。
操作结果:
若cur_e是L中的数据元素,则用pre_e返回它的前驱,
否则操作失败,pre_e无定义。
NextElem(L,cur_e,&next_e)
初始条件:
线性表L已存在。
操作结果:
若cur_e是L中的数据元素,则用next_e返回它的后继,
否则操作失败,next_e无定义。
GetElem(L,i,&e)
初始条件:
线性表L已存在,1≤i≤LengthList(L)。
操作结果:
用e返回L中第i个元素的值。
LocateElem(L,e,compare())
初始条件:
线性表L已存在,compare()是元素判定函数。
操作结果:
返回L中第1个与e满足关系compare()的元素的位序。
若这样的元素不存在,则返回值为0。
ListTraverse(L,visit())
初始条件:
线性表L已存在,visit()为元素的访问函数。
操作结果:
依次对L的每个元素调用函数visit()。
一旦visit()失败,则操作失败。
ClearList(&L)
初始条件:
线性表L已存在。
操作结果:
将L重置为空表。
PutElem(&L,i,&e)
初始条件:
线性表L已存在,1≤i≤LengthList(L)。
操作结果:
L中第i个元素赋值同e的值。
ListInsert(&L,i,e)
初始条件:
线性表L已存在,1≤i≤LengthList(L)+1。
操作结果:
在L的第i个元素之前插入新的元素e,L的长度增1。
ListDelete(&L,i,&e)
初始条件:
线性表L已存在且非空,1≤i≤LengthList(L)。
操作结果:
删除L的第i个元素,并用e返回其值,L的长度减1。
}ADTList
ADTStack{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系:
R1={
约定an端为栈顶,a1端为栈底。
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S。
DestroyStack(&S)
初始条件:
栈S已存在。
操作结果:
栈S被销毁。
ClearStack(&S)
初始条件:
栈S已存在。
操作结果:
将S清为空栈。
StackEmpty(S)
初始条件:
栈S已存在。
操作结果:
若栈S为空栈,则返回TRUE,否则返回FALSE。
StackLength(S)
初始条件:
栈S已存在。
操作结果:
返回栈S中元素个数,即栈的长度。
GetTop(S,&e)
初始条件:
栈S已存在且非空。
操作结果:
用e返回S的栈顶元素。
Push(&S,e)
初始条件:
栈S已存在。
操作结果:
插入元素e为新的栈顶元素。
Pop(&S,&e)
初始条件:
栈S已存在且非空。
操作结果:
删除S的栈顶元素,并用e返回其值。
StackTraverse(S,visit())
初始条件:
栈S已存在且非空,visit()为元素的访问函数。
操作结果:
从栈底到栈顶依次对S的每个元素调用函数visit(),
一旦visit()失败,则操作失败。
}ADTStack
四、程序设计思路
1.建立结构体及链表
①建立旅馆房间结构体及其信息类型,如下:
typedefstructnode
{
introomgrade;//房间等级
introomnumber;//房间号
intpeoplein;//入住人数
intbed[N];//床号
intsex;//性别
structnode*next;//结构体指针
}Room;
②建立空的房间链表
Room*creat()
{//建立房间的链表
建立指向房间的指针Room*head,*p,*q;
While(等级循环)
{
For(房间号在小于等级的情况下进行循环)
{
将p所指向的房间进行初始化,赋初值;
让q->next=p;
}
head为头结点;
将房间对等级循环建立整个空旅馆链表
}
2.算法的描述
初始化函数的建立
Voidchushihua(Room*head)
{
建立指向房间的room*p指针,
通过对每个房间的查找
并将其恢复赋初始值
}
订房函数的建立
Voiddingfang(Room*head)
{
//订房间
旅客信息的输入;
While(房间不为空)
{
If(房间所需等级存在并且房间入住的性别一致或者房间为空)
{
For(对等级进行循环)
{
If(床位为空)
{
将房间号、床位号赋值
}
If(如果找到了符合的房间)
跳出循环;
}
P指向下一个房间;
}
If(房间号和床位号都不为空)
打印:
客满;
Else
打印旅客入住信息;
}
退房函数的建立
voidtuifang(Room*head)
{//退房间
建立房间指针Room*p;
输入旅客退房的房间号,性别,床号;
While(房间不为空)
{
If(查找到的房间号与输入的一致)
If(性别与输入一致)
For(循环等级)
{
将此人的所有信息进行删除操作
}
P指向下一个房间;
}
}
显示函数的建立
voiddisplay(Room*head)
{//显示房间信息
建立房间指针room*p;
While(入住人数不为空)
{
打印旅客入住的相关信息
For(等级循环)
If(床位不为空)
打印已经入住的床位号;
P指向下一个房间
}
}
五、程序的调试与分析
1.测试数据
A.打开程序后在订房系统中订房,可按下图进行:
测试序号
行为
姓名
性别
年龄
房间等级
1
入住
A
0
35
3
2
入住
B
1
35
3
3
入住
C
0
35
3
然后进行显示函数的测试,将如上数据输入后,打印,看是否显示正确;
B.进行退房函数测试,将进行退房操作,打印看是否已经正确删除;
测试序号
行为
姓名
性别
年龄
房间等级
1
入住
A
0
35
3
C.进行初始化函数的测试,选择初始化操作,点击打印,看是否可以成功进行初始化;
D.进行退出函数的测试,点击退出选项,看是否可以成功退出。
2.测试结果
以上两项测试数据经过实际测试后,其返回值与预计返回值相同,证明程序在数据输入正确的情况下可以正常运行。
六、用户使用说明
1.程序运行环境
程序名为hotel.exe,运行环境为windowXP。
2.程序主界面
运行程序后首先显示图所示程序主界面:
选择1:
有旅客入住;
选择2:
有旅客退房;
选择3:
显示房间信息;
选择4:
删除所有信息;
选择5:
退出程序;
3.相关程序各项说明
①旅客入住:
选择此项后,程序提示下图所示界面:
按照提示依次输入旅客信息。
其中,性别一项0代表男、1代表女,性别取值0-1,年龄取值16-99,房间等级取初始时的房间等级范围;如果各项输入超出范围程序会要求重新输入。
当输入全部信息后,如果旅客选择的房间等级有空床位,则程序为旅客分配床位并,如果没有则询问是否更换房间等级;如果旅客愿意更换等级则输入新等级重新分配床位,如果如果旅客愿意更换等级则返回程序主界面。
当床位分配成功后程序显示图:
②旅客退房:
选择此项后,程序提示下图所示界面
按照提示依次输入旅客信息。
其中,性别一项0代表男、1代表女,性别取值0-1,房间号为已有房间号码,床位号码0-该级别每房间床位数;如果各项输入超出范围程序会要求重新输入。
当输入全部信息后,如果输入无误则可退房成功,否则要求重新输入数据。
③显示房间信息:
选择此项后,程序下图所示界面,该界面将显示各等级男女床位可用数、该级别床位价格,以及总男女床位可用数。
退出程序
选择此项后程序将退出。
七、调试过程中出现的问题及心得体会
调试程序,是软件开发过程中的一个必不可少的环节,是程序能否正常运行的关键。
在程序调试之前,需要熟练地掌握几门必要的汇编语言及熟悉开发环境,这样才能做到事半功倍。
以下是调试过程中遇到的主要问题及解决过程:
1.清屏问题
在程序设计中,想让界面显示美观,加入清屏函数,可是用clearscreen();或者system(”cls”);都不能实现该功能,经查证,看书等途径,才知道原来是头文件里没包含该函数的功能。
因此,我们将其头文件加入,则可以正常运行了。
2.数据结构设计
题目已经给了数据结构的提示,所以开始设计时直接使用了已有的结构。
但是在设计后续算法时发现,现有的结构对于已经住人但还没住满的房间和住满的房间没有区分,分配房间时要把所有房间都检查过以后才能找到一个空床位,这就导致了程序设计比较复杂。
后经过重新设计,决定分别使用一个空房间栈存储空房间信息,一个空床栈存储已经住人但还没住满的房间的信息,一个满床链存储已经住满人的房间信息;后经过改进,除空房栈外其余两个均为一个有两个元素的数组,分别存储男女房间信息,这个直接根据顾客性别即可到相应的链或栈寻找相关信息,省去了对已经住人的房间的性别判断,同时不用在房间结构体上记录该房间性别,当开设房间数量比较大以后可以节省一部分存储空间。
3.房间分配和回收算法
数据结构设计决定了这两个算法的思想是很简单的:
分配房间时如果有房间就先看有没有没住满的房间,有就直接分配没有就开一个空房分配;回收房间时如果房间还有其他人就将房间放到相应的空床栈,没有人就将房间回收到空房栈中。
不过在实现回收算法时发现要判断的东西比较多,程序分别到空床栈和满房链中寻找房间,而且这两个链/栈没有设置头结点,需要对第一个结点单独做判断,由此导致了回收房间的函数源代码有144行之多,难免会在编写时出现一些错误,带来了很大调试工作量。
八、心得体会
这次的课程设计使我懂得了理论与实际相结合是很非常重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在整个设计过程中,构思是很花费时间的。
调试时经常会遇到这样那样的错误,有的是因为粗心造成的语法错误。
当然,很多也时用错了方法,总是实现不了。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
根据我在课程设计中遇到得问题,我将在以后的学习过程中注意以下几点:
1、认真上好专业实验课,多在实践中锻炼自己。
2、写程序的过程中要考虑周到,严密。
3、在做设计的时候要有信心,有耐心,切勿浮躁。
4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。
5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。
每个实验通常都要花费很久的时间才能理清一个程序的思路,而且要不断的调试程序才能把程序调试正确,同时还要做到界面的输出也是需要美化的。
这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师的辛勤指导下,也完成了课程设计。
通过这次的课程设计,让我更加了解到数据结构的重要性。
以及它对我们专业的发展发挥的作用。
对我们而言,知识上的收获很重要,但精神上的丰收更加可喜。
让我知道了学无止境的道理。
我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆!
同时在做课程设计时要能够从多方面去考虑,去研究,用多种算法去实现要求。
此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,这些都让我受益非浅,今后的制作应该能够更轻松,自己也都能够解决并高质量的完成项目。
附录:
程序的源代码
#include
#defineN10//房间等级
#include
#include
#include
typedefstructnode{
introomgrade;
introomnumber;
intpeoplein;
intbed[N];
intsex;
structnode*next;//结构体指针
}Room;
Room*creat()
{//建立房间的链表
Room*head,*p,*q;
inti=1,j,m=0,h;
while(i<=N)
{
for(j=1;j<=i;j++)
{
if((i!
=1)||(j!
=1))
q=p;
p=new(Room);
if((i==1)&&(j==1))
head=p;
p->roomgrade=i;
p->roomnumber=m+1;
p->peoplein=0;
p->sex=-1;//表示一个人也没有
for(h=0;h
p->bed[h]=0;//0表示该床未住人,1表示住人
if((i!
=1)||(j!
=1))
q->next=p;
}
i++;m++;
}
p->next=NULL;
return(head);
}
voidchushihua(Room*head)
{//初始化
Room*p;
inti;
p=head;
while(p!
=NULL)
{
p->peoplein=0;
p->sex=-1;
for(i=0;i p->bed[i]=0; p=p->next; } printf("\n\n\n操作成功! \n"); } voiddingfang(Room*head) {//订房间 Room*p; inti,number=0,bednumber=0,s,grade; printf("\n\n*****欢迎使用订房系统*****\n\n"); printf("__________________
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 模拟 旅馆 管理 系统 床位 分配 回收