床位的分配与回收_第1页
床位的分配与回收_第2页
床位的分配与回收_第3页
床位的分配与回收_第4页
床位的分配与回收_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、洛 阳 理 工 学 院课 程 设 计 说 明 书课程名称 数据结构 设计课题 模拟旅店管理系统床位的分配与回收 专 业 计算机科学与技术专业 班 级 B120506 学 号 B12050606 姓 名 翟 完成日期 2014年6月13号 课 程 设 计 任 务 书设计题目:模拟旅馆管理系统的一个功能床位的分配与回收 _设计内容与要求:某旅馆有n个等级的房间,第I等级有ai个房间,每个等级有bi个床位(1in)。试模拟旅馆管理系统中床位分配和回收的功能,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)的算法。基本要求(1)输入数据分配时,输入旅客姓名、年龄、性别、到达日期和所需房间等级

2、。回收时,输入房间等级、房间号和床位号。(2)输出数据分配成功时打印旅客姓名、年龄、到达日期、房间等级、房间号码和床位号码。分配不成功时,如所有等级均无床位,则打印“客满”信息;如旅客需要的等级均无空床位,则打印“是否愿意更换等级?”的询问信息。若旅客愿意更换,则重新输入有关信息,再进行分配,否则分配工作结束。 指导教师:张 新 颜 2014 年 6 月 3 日课 程 设 计 评 语 成绩: 指导教师:张 新 颜 年 月 日洛 阳 理 工 学 院 课 程 设 计 报 告一、【问题描述】 某旅馆有n个等级的房间,第I等级有ai个房间,每个等级有bi个床位(1in)。试模拟旅馆管理系统中床位分配和

3、回收的功能,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)的算法。二、【基本与要求】(1)输入数据分配时,输入旅客姓名、年龄、性别、到达日期和所需房间等级。回收时,输入房间等级、房间号和床位号。(2)输出数据分配成功时打印旅客姓名、年龄、到达日期、房间等级、房间号码和床位号码。分配不成功时,如所有等级均无床位,则打印“客满”信息;如旅客需要的等级均无空床位,则打印“是否愿意更换等级?”的询问信息。若旅客愿意更换,则重新输入有关信息,再进行分配,否则分配工作结束。三、【测试数据】 首先,初始化旅馆,定义为旅馆:房间等级为两个(1和2);定义级别为1的房间为一个,床位个数为一个;定义级

4、别为2的房间个数为两个,其中1号房有床位2个,2号房间床位个数也为2;然后开始测试。输入:分别输入信息如下表:房间级别姓名年龄性别(0女/1男)入住时间1Zhang2502014 06 082Wang2402014 06 082Li2502014 06 082Zhao2402014 06 092Liu2612014 06 10输出:每输入一个旅客的信息都会输出下表(第一位房客)旅客房间分配表姓名性别年龄等级房号床位时间zhang0251112014 06 08输入第二位房客后输出:旅客房间分配表姓名性别年龄等级房号床位时间wang0242112014 06 08输入第三位房客后输出:旅客房间分

5、配表姓名性别年龄等级房号床位时间li0252122014 06 08输入第四个房客后输出:旅客房间分配表姓名性别年龄等级房号床位时间zhao0242212014 06 09输入第五个房客后输出:旅客房间分配表姓名性别年龄等级房号床位时间liu1262222014 06 10如果再次输入功能选项“1”,则会输出“旅店客满,不能入住”退房操作:输入功能选项“2”执行退房操作,输入退房的等级“2”,输入房号“1”,输入床号“2”。则输出以下内容:此等级、此房间、此床位旅客的信息为:该名旅客的信息:姓名 性别 年龄 入住时间Li 0 25 2014-6-8输入功能选项“2”,继续退房,等级“2”,房号

6、“2”,床号“1”,则输出以下内容:此等级、此房间、此床位旅客的信息为:该名旅客的信息:姓名 性别 年龄 入住时间zhao 0 24 2014-6-9再次入住操作:输入功能键“1”,房间等级“2”然后输入以下表格信息:姓名年龄性别入住日期chen2402014 06 11则输出:旅客房间分配表姓名性别年龄等级号房号床位时间chen0242122014 06 11继续入住操作:输入功能键“1”,房间等级“2” 然后输入以下表格信息:姓名年龄性别入住时间hu2202014 06 12则输出旅客房间分配表姓名性别年龄等级号房号床位时间hu0222212014 06 12查询房客信息:输入“3”,然后

7、输入查询房客的名字“zhao ” 输出“未找到该旅客,请核实后再输入” 再次, 输入“3”,然后输入查询房客的名字“hu” 输出以下表格:旅客房间分配表姓名性别年龄等级号房号床位入住时间hu0222212014 06 12统计旅客信息:输入“4”,则输出:等级为1的房间入住人数为1 等级为2的房间入住人数为4退出本程序:输入“0”,则可以退出本程序。四、【算法思想】客人入住旅店是否已满所需房间等级房间是否已满打印客户信息房间分配成功打印房客表N重新输入结束1、客人入住:当入住的是某房间的第一个旅客,需要对其特别处理,以其客户信息作为本房间旅客链的第一个结点。若非第一位乘客,则要对空的床号进行查

8、找,首先设置一变量“i”,初始化i=1,使其与现有空房的旅客链的每位旅客的床号比较,若发现有床号与i相等,则i自加1,再进行与本房间所有旅客床号比较,若无旅客床号与i的值相等,则返回i,作为本次入住旅客的床号。2、旅客退房退房要退的房的等级等级?房间号房间?床号床号?旅客信息退房?退房成功重输入N重入N重入N返回菜单N退房,若是某房间第一个乘客退房,因为首位旅客信息单元是旅客链的第一的链单元,所以删除时应将下一位旅客的地址赋给本房间存储单元中存放客户指针的单元中,以防止客户链的丢失。 若非第一个旅客退房,则只需要将本旅客的下一位旅客的地址放到这位旅客的前一位旅客的next域里面,然后释放退出旅

9、客的信息单元就行了。五、【模块划分】重要模块:初始化旅馆信息主函数旅客入住旅客退房旅客信息查询旅客统计退出本程序判断是旅店是否已满分配房间床号入住是否有此旅客退出成功是否有此旅客显示旅客信息显示旅馆各等级房间入住人数主要功能函数:初始化函数: void Init(hotel_lv *L)(逐级进行初始化) 判断是否客满:int full(hotel_lv *L)(主机进行查询直到发现空床位截止)打印旅客信息:void Pr_divide(cus* p,fangjian* q )旅客住宿函数:void Pr_divide(cus* p,fangjian* q )(首先调用full()函数,若非满

10、,相应级别查找,有空床位则入住)旅客退房函数:cus* Delete(hotel_lv *L)(逐级查询直至床位,有次床位则删除)查询旅客信息:void cx_customer(hotel_lv *L)(按名字逐级顺序查询)统计旅店当前入住人数:void Tongji_cus(hotel_lv *L)(逐级按房间顺序统计)主函数:void main()(调用各功能函数)六、【数据结构】本次数据结构课程设计,做的是旅店管理系统,定义了三个结构体链表,给等级链表设置了一个头结点,采用链表嵌套方法,等级链表嵌套房间链表,房间链表再嵌套旅客链表。(1)对旅店结构体定义typedef struct ho

11、tel_lv int lv_num; /旅店等级号struct hotel_lv *next; /指向下一等级struct fangjian *fj_next; /指向房间hotel_lv;(2)房间结构体定义typedef struct fangjian int fj_num; /房间号int max; /房间的最大床位数目int mem_num; /房间内的当前人数struct fangjian *next; /指向下一房间struct customer *cus_next; /指向旅客fangjian;(3)对旅客结构体定义typedef struct customer char nam

12、e15; /旅客姓名int age; /旅客年龄int sex; /旅客性别 int lv; /旅客住宿时的等级号 int bed_num; /旅客的床位号int year; /住宿日期 int month; /住宿日期int day; /住宿日期struct customer* next; /指向下一旅客cus;七、【测试情况】八、【心得】 在开始这个课题之初,自己感觉对这个题目自己应该可以很好地完成这以课题,但到后来自己深入的研究了一下发现,这道题目还是很难得至少对于我来说,自己也曾有放弃的想法,但后来在指导老师的指导和帮助下最终完成了这个程序。首先,定义的结构体数组,进行编写。如果用顺序

13、表的话对于不同的旅馆是不适用的,因为各个旅馆的房间的级别、房间的个数、房间的床位都是不相同的,如果用链表就不一样了,所以改用链表来编写。对后面的处理在旅客进行入住情况中,在床位分配的时候,因为没有设置床位的头结点,所以要对第一个床位进行特别判断。然后经过多次调试与修改,最终能实现旅客的入住情况。旅客退房跟入住时一样,在床位回收的时候,因没有设置床位的头结点,所以要对第一个床位进行特别判断。再次对非空非满的房间进行入住的时候要进行判断,哪些床位是空的,对空的床位可以分配给相应的旅客。对退房的旅客同样需要对是否是第一位房客和非第一位房客区别开来进行修改指针。完成了这些,本程序的基本重要的问题都已解

14、决了。九、【源程序】#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct hotel_lv /旅店结构体int lv_num;struct hotel_lv *next;struct fangjian *fj_next;hotel_lv;typedef struct fangjian /房间结构体int fj_num;int max;int mem_num;struct fangjian *next;struct customer *cus_next;fangjian;type

15、def struct customer /旅客结构体char name15;int age;int sex; int lv; int bed_num;int year;int month;int day;struct customer* next;cus;void Init(hotel_lv *L) /初始化函数 int i,j,k,l;hotel_lv *p,*q; fangjian *p1,*p2,*p3;printf("请输入房间分为几个等级:n"); scanf("%d",&j); /输入房间共分为几个等级q=L;for(i=1;i<

16、;=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房间

17、号为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);

18、scanf("%d",&(p1->max); /输入房间k的床位数目 p1->mem_num=0; /该房间内的当前人数赋为零 p3=p1;p3->next=NULL; /房间链表尾指针赋为空q=q->next; q->next=NULL; /等级链表尾指针域赋为int full(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

19、) /如果有房间的当前人数不等于房间的最大人数,则返回0return 0; elsef=f->next;l=l->next;if(!l) /否则返回1return 1;void Pr_divide(cus* p,fangjian* q ) /打印旅客信息 printf(" n");printf(" 旅客房间分配表 n");printf(" n"); printf(" 姓名 性别年龄等级号房间号床位号 入住时间 n");printf(" n");printf(" %12s %

20、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");void input(hotel_lv *L) /旅客入住函数char c;int lv;static int i;cus *s,*p2,*p3;fangjian *p1;hotel_lv *l;l=L->next; if(

21、full(L) /判断是否旅店客满printf("旅店客满,不能入住。n");elseprintf("请输入旅客所需的房间等级:"); /输入旅客所需的等级 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=NU

22、LL)getchar(); printf("此等级为%d的所有房间均无空位n是否愿意更换等级y/n",lv); scanf("%c",&c); /做出选择 if(c='y')input(L);elsereturn ;else /进行旅客登记 /第一个结点要特别判断if(p1->mem_num=0)s=(cus*)malloc(sizeof(cus);printf("n-n");printf("n 旅客的信息: ");printf("n 请输入旅客姓名:");scan

23、f("%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; /修改指针

24、p1->cus_next=s;p1->mem_num+; /房间当前人数加1s->bed_num=1;s->next=NULL; /尾指针置为空Pr_divide(s,p1); /打印房间分配表break;elsep2=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");p

25、rintf("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->

26、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) /旅客退房函数 int lv,hotel_num,bed_num;char c;cus *p,*q;fangjian *f; hotel_lv *l;l=L->next;printf("请输入该退房人房间的等级号码:n");scanf(&qu

27、ot;%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-

28、>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) /第一结点特别判断 /直接打印旅客信息printf("此等级、此房间、此床位旅客的信息为:n"); printf("该名顾客的信息:n"); printf("

29、姓名t性别t年龄t入住时间n"); printf("%st%dt%dt%d-%d-%dn",q->name,q->sex,q->age,q->year,q->month,q->day); printf("是否与要退房人信息相符?y/nn"); scanf("%c",&c); if(c='y') /做出是否退房的选择 f->cus_next=q->next; f->mem_num-;printf("退房成功!n"); return

30、(q); elsereturn NULL;else /如果床位不为1 while(p->next!=q) /指向下一床位p=p->next; /打印旅客信息printf("此等级、此房间、此床位旅客的信息为:n"); printf("该名顾客的信息:n"); printf("姓名t性别t年龄t入住时间n"); printf("%st%dt%dt%d-%d-%dn",q->name,q->sex,q->age,q->year,q->month,q->day); prin

31、tf("是否与要退房人信息相符?y/nn"); scanf("%c",&c); if(c='y') /做出是否退房的选择p->next=q->next;f->mem_num-;printf("退房成功!n"); return(q); else return NULL;if(q=NULL) /如果该房间内床位为空printf("未找到该床位号,请核实信息后重新输入n");if(f=NULL) /如果该等级的房间为空printf("未找到该房间号,请核实信息后重新输入

32、。n");if(l=NULL) /如果等级链表为空printf("未找到该房间等级,请核实信息后重新输入。n");void cx_customer(hotel_lv *L) /查询旅客信息函数char s15;hotel_lv *l;fangjian *f;cus *t;int flag=0; /设置标志量printf("请输入要查询的旅客姓名:n");scanf("%s",s); /输入要查找旅客的姓名getchar();l=L->next;while(l!=NULL) /等级不为空时,走向房间f=l->fj_next;while(f!=NULL) /房间不为空时,走向床位 if(f->mem_num=0) /若此房间当前人数为零,走向下一房间f=f->next;else t=f->cus_next;while(t!=NULL)if(!strcmp(t->name,s) /如果找到该旅客 Pr_divide(t,f); /打印信息t=t->next; /指向下一人,继续查找flag+; /标志量加1elset=t->next;f=f->next;l=l->next;if(!flag) /标志量为零,则未查找到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论