床位的分配与回收.docx
《床位的分配与回收.docx》由会员分享,可在线阅读,更多相关《床位的分配与回收.docx(33页珍藏版)》请在冰豆网上搜索。
床位的分配与回收
洛阳理工学院
课程设计说明书
课程名称数据结构
设计课题模拟旅店管理系统—床位的分配与回收
专业计算机科学与技术专业
班级B120506
学号B12050606
姓名翟
完成日期2014年6月13号
课程设计任务书
设计题目:
模拟旅馆管理系统的一个功能——床位的分配与回收
_________________________________________________
设计内容与要求:
某旅馆有n个等级的房间,第I等级有ai个房间,每个等级有bi个床位(1≤i≤n)。
试模拟旅馆管理系统中床位分配和回收的功能,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)的算法。
[基本要求]
(1)输入数据
分配时,输入旅客姓名、年龄、性别、到达日期和所需房间等级。
回收时,输入房间等级、房间号和床位号。
(2)输出数据
分配成功时打印旅客姓名、年龄、到达日期、房间等级、房间号码和床位号码。
分配不成功时,如所有等级均无床位,则打印“客满”信息;如旅客需要的等级均无空床位,则打印“是否愿意更换等级?
”的询问信息。
若旅客愿意更换,则重新输入有关信息,再进行分配,否则分配工作结束。
指导教师:
张新颜
2014年6月3日
课程设计评语
成绩:
指导教师:
张新颜
年月日
一、【问题描述】
某旅馆有n个等级的房间,第I等级有ai个房间,每个等级有bi个床位(1≤i≤n)。
试模拟旅馆管理系统中床位分配和回收的功能,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)的算法。
二、【基本与要求】
(1)输入数据
分配时,输入旅客姓名、年龄、性别、到达日期和所需房间等级。
回收时,输入房间等级、房间号和床位号。
(2)输出数据
分配成功时打印旅客姓名、年龄、到达日期、房间等级、房间号码和床位号码。
分配不成功时,如所有等级均无床位,则打印“客满”信息;如旅客需要的等级均无空床位,则打印“是否愿意更换等级?
”的询问信息。
若旅客愿意更换,则重新输入有关信息,再进行分配,否则分配工作结束。
三、【测试数据】
首先,初始化旅馆,定义为旅馆:
房间等级为两个(1和2);定义级别为1的房间为一个,床位个数为一个;定义级别为2的房间个数为两个,其中1号房有床位2个,2号房间床位个数也为2;然后开始测试。
输入:
分别输入信息如下表:
房间级别
姓名
年龄
性别(0女/1男)
入住时间
1
Zhang
25
0
20140608
2
Wang
24
0
20140608
2
Li
25
0
20140608
2
Zhao
24
0
20140609
2
Liu
26
1
20140610
输出:
每输入一个旅客的信息都会输出下表(第一位房客)
旅客房间分配表
姓名
性别
年龄
等级
房号
床位
时间
zhang
0
25
1
1
1
20140608
输入第二位房客后输出:
旅客房间分配表
姓名
性别
年龄
等级
房号
床位
时间
wang
0
24
2
1
1
20140608
输入第三位房客后输出:
旅客房间分配表
姓名
性别
年龄
等级
房号
床位
时间
li
0
25
2
1
2
20140608
输入第四个房客后输出:
旅客房间分配表
姓名
性别
年龄
等级
房号
床位
时间
zhao
0
24
2
2
1
20140609
输入第五个房客后输出:
旅客房间分配表
姓名
性别
年龄
等级
房号
床位
时间
liu
1
26
2
2
2
20140610
如果再次输入功能选项“1”,则会输出“旅店客满,不能入住”
退房操作:
输入功能选项“2”执行退房操作,输入退房的等级“2”,输入房号“1”,输入床号“2”。
则输出以下内容:
此等级、此房间、此床位旅客的信息为:
该名旅客的信息:
姓名性别年龄入住时间
Li0252014-6-8
输入功能选项“2”,继续退房,等级“2”,房号“2”,床号“1”,则输出以下内容:
此等级、此房间、此床位旅客的信息为:
该名旅客的信息:
姓名性别年龄入住时间
zhao0242014-6-9
再次入住操作:
输入功能键“1”,房间等级“2”然后输入以下表格信息:
姓名
年龄
性别
入住日期
chen
24
0
20140611
则输出:
旅客房间分配表
姓名
性别
年龄
等级号
房号
床位
时间
chen
0
24
2
1
2
20140611
继续入住操作:
输入功能键“1”,房间等级“2”然后输入以下表格信息:
姓名
年龄
性别
入住时间
hu
22
0
20140612
则输出
旅客房间分配表
姓名
性别
年龄
等级号
房号
床位
时间
hu
0
22
2
2
1
20140612
查询房客信息:
输入“3”,然后输入查询房客的名字“zhao”
输出“未找到该旅客,请核实后再输入”
再次,输入“3”,然后输入查询房客的名字“hu”
输出以下表格:
旅客房间分配表
姓名
性别
年龄
等级号
房号
床位
入住时间
hu
0
22
2
2
1
20140612
统计旅客信息:
输入“4”,
则输出:
等级为1的房间入住人数为1
等级为2的房间入住人数为4
退出本程序:
输入“0”,则可以退出本程序。
四、【算法思想】
客人入住
旅店是否已满
所需房间等级
房间是否已满
打印客户信息
房间分配成功
打印房客表
N
重新输入
结束
1、客人入住:
当入住的是某房间的第一个旅客,需要对其特别处理,以其客户信息作为本房间旅客链的第一个结点。
若非第一位乘客,则要对空的床号进行查找,首先设置一变量“i”,初始化i=1,使其与现有空房的旅客链的每位旅客的床号比较,若发现有床号与i相等,则i自加1,再进行与本房间所有旅客床号比较,若无旅客床号与i的值相等,则返回i,作为本次入住旅客的床号。
2、旅客退房
退房
要退的房的等级
等级?
房间号
房间?
床号
床号?
旅客信息
退房?
退房成功
重输入
N
重入
N
重入
N
返回菜单
N
退房,若是某房间第一个乘客退房,因为首位旅客信息单元是旅客链的第一的链单元,所以删除时应将下一位旅客的地址赋给本房间存储单元中存放客户指针的单元中,以防止客户链的丢失。
若非第一个旅客退房,则只需要将本旅客的下一位旅客的地址放到这位旅客的前一位旅客的next域里面,然后释放退出旅客的信息单元就行了。
五、【模块划分】
重要模块:
主要功能函数:
初始化函数:
voidInit(hotel_lv*L)(逐级进行初始化)
判断是否客满:
intfull(hotel_lv*L)(主机进行查询直到发现空床位截止)
打印旅客信息:
voidPr_divide(cus*p,fangjian*q)
旅客住宿函数:
voidPr_divide(cus*p,fangjian*q)(首先调用full()函数,若非满,相应级别查找,有空床位则入住)
旅客退房函数:
cus*Delete(hotel_lv*L)(逐级查询直至床位,有次床位则删除)
查询旅客信息:
voidcx_customer(hotel_lv*L)(按名字逐级顺序查询)
统计旅店当前入住人数:
voidTongji_cus(hotel_lv*L)(逐级按房间顺序统计)
主函数:
voidmain()(调用各功能函数)
六、【数据结构】
本次数据结构课程设计,做的是旅店管理系统,定义了三个结构体链表,给等级链表设置了一个头结点,采用链表嵌套方法,等级链表嵌套房间链表,房间链表再嵌套旅客链表。
(1)对旅店结构体定义
typedefstructhotel_lv
{
intlv_num;//旅店等级号
structhotel_lv*next;//指向下一等级
structfangjian*fj_next;//指向房间
}hotel_lv;
(2)房间结构体定义
typedefstructfangjian
{
intfj_num;//房间号
intmax;//房间的最大床位数目
intmem_num;//房间内的当前人数
structfangjian*next;//指向下一房间
structcustomer*cus_next;//指向旅客
}fangjian;
(3)对旅客结构体定义
typedefstructcustomer
{
charname[15];//旅客姓名
intage;//旅客年龄
intsex;//旅客性别
intlv;//旅客住宿时的等级号
intbed_num;//旅客的床位号
intyear;//住宿日期
intmonth;//住宿日期
intday;//住宿日期
structcustomer*next;//指向下一旅客
}cus;
七、【测试情况】
八、【心得】
在开始这个课题之初,自己感觉对这个题目自己应该可以很好地完成这以课题,但到后来自己深入的研究了一下发现,这道题目还是很难得至少对于我来说,自己也曾有放弃的想法,但后来在指导老师的指导和帮助下最终完成了这个程序。
首先,定义的结构体数组,进行编写。
如果用顺序表的话对于不同的旅馆是不适用的,因为各个旅馆的房间的级别、房间的个数、房间的床位都是不相同的,如果用链表就不一样了,所以改用链表来编写。
对后面的处理在旅客进行入住情况中,在床位分配的时候,因为没有设置床位的头结点,所以要对第一个床位进行特别判断。
然后经过多次调试与修改,最终能实现旅客的入住情况。
旅客退房跟入住时一样,在床位回收的时候,因没有设置床位的头结点,所以要对第一个床位进行特别判断。
再次对非空非满的房间进行入住的时候要进行判断,哪些床位是空的,对空的床位可以分配给相应的旅客。
对退房的旅客同样需要对是否是第一位房客和非第一位房客区别开来进行修改指针。
完成了这些,本程序的基本重要的问题都已解决了。
九、【源程序】
#include
#include
#include
typedefstructhotel_lv//旅店结构体
{
intlv_num;
structhotel_lv*next;
structfangjian*fj_next;
}hotel_lv;
typedefstructfangjian//房间结构体
{
intfj_num;
intmax;
intmem_num;
structfangjian*next;
structcustomer*cus_next;
}fangjian;
typedefstructcustomer//旅客结构体
{
charname[15];
intage;
intsex;
intlv;
intbed_num;
intyear;
intmonth;
intday;
structcustomer*next;
}cus;
voidInit(hotel_lv*L)//初始化函数
{
inti,j,k,l;
hotel_lv*p,*q;
fangjian*p1,*p2,*p3;
printf("请输入房间分为几个等级:
\n");
scanf("%d",&j);//输入房间共分为几个等级
q=L;
for(i=1;i<=j;i++)//初始化该等级的房间
{
p=(hotel_lv*)malloc(sizeof(hotel_lv));
q->next=p;
p->lv_num=i;//给房间等级赋值
printf("请输入房间等级为%d的房间个数:
\n",p->lv_num);
scanf("%d",&l);//输入该等级的房间数目
if(l==0)
continue;
else//初始化该房间内的床位
{
p2=(fangjian*)malloc(sizeof(fangjian));
p2->fj_num=1;
printf("请输入房间等级为%d房间号为1的床位个数的最大值:
\n",p->lv_num,k);
scanf("%d",&(p2->max));//输入房间1的床位数目
p2->mem_num=0;//该房间内当前人数赋为零
p->fj_next=p2;
p3=p2;
for(k=2;k<=l;k++)
{
p1=(fangjian*)malloc(sizeof(fangjian));
p3->next=p1;
p1->fj_num=k;
printf("请输入房间等级为%d房间号为%d的床位个数的最大值:
\n",p->lv_num,k);
scanf("%d",&(p1->max));//输入房间k的床位数目
p1->mem_num=0;//该房间内的当前人数赋为零
p3=p1;
}
p3->next=NULL;//房间链表尾指针赋为空
}
q=q->next;
}
q->next=NULL;//等级链表尾指针域赋为
}
intfull(hotel_lv*L)//判是否客满
{
hotel_lv*l;fangjian*f;
l=L->next;
while(l!
=NULL)
{
f=l->fj_next;
while(f!
=NULL)
{
if(f->mem_num!
=f->max)//如果有房间的当前人数不等于房间的最大人数,则返回0
return0;
else
f=f->next;
}
l=l->next;
}
if(!
l)//否则返回1
return1;
}
voidPr_divide(cus*p,fangjian*q)//打印旅客信息
{
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃旅客房间分配表┃\n");
printf("┣━━━━━━┳━━┳━━┳━━━┳━━━┳━━━┳━━━━━━━┫\n");
printf("┃姓名┃性别┃年龄┃等级号┃房间号┃床位号┃入住时间┃\n");
printf("┣━━━━━━╋━━╋━━╋━━━╋━━━╋━━━╋━━━━━━━┫\n");
printf("┃%12s┃%d┃%2d┃%2d┃%2d┃%2d┃%4d-%2d-%2d┃\n",
p->name,p->sex,p->age,p->lv,q->fj_num,p->bed_num,p->year,p->month,p->day);
printf("┗━━━━━━┻━━┻━━┻━━━┻━━━┻━━━┻━━━━━━━┛\n");
printf("\n");
}
voidinput(hotel_lv*L)//旅客入住函数
{
charc;
intlv;
staticinti;
cus*s,*p2,*p3;fangjian*p1;
hotel_lv*l;
l=L->next;
if(full(L))//判断是否旅店客满
{
printf("旅店客满,不能入住。
\n");
}
else
{
printf("请输入旅客所需的房间等级:
");//输入旅客所需的等级
scanf("%d",&lv);
while(l!
=NULL)//等级不为空时
{
if(l->lv_num!
=lv)
l=l->next;
else//有此等级时
{
p1=l->fj_next;
while(p1!
=NULL)//房间不为空
{
if(p1->mem_num==p1->max)//是否有空床位
{
p1=p1->next;
if(p1==NULL)
{
getchar();
printf("此等级为%d的所有房间均无空位\n是否愿意更换等级[y/n]",lv);
scanf("%c",&c);//做出选择
if(c=='y')
input(L);
else
return;
}
}
else//进行旅客登记
{//第一个结点要特别判断
if(p1->mem_num==0)
{
s=(cus*)malloc(sizeof(cus));
printf("\n------------------------------------\n");
printf("\n旅客的信息:
");
printf("\n请输入旅客姓名:
");
scanf("%s",s->name);
printf("\n请输入旅客年龄:
");
scanf("%d",&(s->age));
printf("\n请输入旅客性别(如:
男1:
女0):
");
scanf("%d",&(s->sex));
printf("\n请输入旅客住宿开始日期;”);
scanf("%d%d%d",&s->year,&s->month,&s->day);
s->lv=lv;//修改指针
p1->cus_next=s;
p1->mem_num++;//房间当前人数加1
s->bed_num=1;
s->next=NULL;//尾指针置为空
Pr_divide(s,p1);//打印房间分配表
break;
}
else
{
p2=p1->cus_next;
p3=p2;
i=1;
for(;p3!
=NULL;p3=p3->next)
{
if(i==p3->bed_num)
{
++i;
p3=p2;
}
}
for(;p2->next!
=NULL;p2=p2->next);
s=(cus*)malloc(sizeof(cus));
printf("\n------------------------------------\n");
printf("\n旅客的信息:
");
printf("\n请输入旅客姓名:
");
scanf("%s",s->name);
printf("\n请输入旅客年龄:
");
scanf("%d",&s->age);
printf("\n请输入旅客性别");
scanf("%d",&s->sex);
printf("\n请输入旅客住宿开始日期");
scanf("%d%d%d",&s->year,&s->month,&s->day);
s->lv=lv;
p2->next=s;
s->next=NULL;
p1->mem_num++;
s->bed_num=i;
Pr_divide(s,p1);
break;
}
}
}
break;
}
}
}
}
cus*Delete(hotel_lv*L)//旅客退房函数
{
intlv,hotel_num,bed_num;
charc;
cus*p,*q;
fangjian*f;
hotel_lv*l;
l=L->next;
printf("请输入该退房人房间的等级号码:
\n");
scanf("%d",&lv);//输入退房人的房间等级
getchar();
while(l!
=NULL)
{
if(l->lv_num!
=lv)
l=l->next;
else//找到该等级
{
f=l->fj_next;
printf("请输入该退房人房间的房间号码:
\n");
scanf("%d",&hotel_num);//输入退房人的房间号码
getchar();
while(f!
=NULL)
{
if(f->fj_num!
=hotel_num)
f=f->next;
else//找到该房间
{
p=f->cus_next;
q=f->cus_next;
printf("请输入该退房人的床位号码:
\n");
scanf("%d",&bed_num);//输入退房人的床位号码
getchar();
while(q!
=NULL)
{
if(q->bed_num!
=bed_num)
q=q->next;
else//查找该床位
{
if(bed_num==p->bed_num)//第一结点特别判断
{//