数据结构旅店管理系统课程设计报告_第1页
数据结构旅店管理系统课程设计报告_第2页
数据结构旅店管理系统课程设计报告_第3页
数据结构旅店管理系统课程设计报告_第4页
数据结构旅店管理系统课程设计报告_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上课 程 设 计 报 告 课程名称 数据结构 设计题目 旅店管理系统床位的分配与回收 专 业 计算机与信息工程系 班 级 学 号 姓 名 完成日期 2012年6月8日 课 程 设 计 任 务 书设计题目: 模拟旅馆管理系统的一个功能床位的分配与回收 _设计内容与要求:1.【问题描述】某旅馆有n个等级的房间,第I等级有ai个房间,每个等级有bi个床位(1in)。试模拟旅馆管理系统中床位分配和回收的功能,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)的算法。2.【基本要求】(1)输入数据分配时,输入旅客姓名、年龄、性别、到达日期和所需房间等级。回收时,输入房间等

2、级、房间号和床位号。(2)输出数据分配成功时打印旅客姓名、年龄、到达日期、房间等级、房间号码和床位号码。分配不成功时,如所有等级均无床位,则打印“客满”信息;如旅客需要的等级均无空床位,则打印“是否愿意更换等级?”的询问信息。若旅客愿意更换,则重新输入有关信息,再进行分配,否则分配工作结束。 指导教师: 2012年 6月 8日课 程 设 计 评 语 成绩: 指导教师:_ 年 月 日3. 数据结构本次数据结构课程设计,做的是旅店管理系统,定义了三个结构体链表,给等级链表设置了一个头结点,采用链表嵌套方法,等级链表嵌套房间链表,房间链表再嵌套旅客链表。(1)对旅客结构体定义typedef stru

3、ct customer char name15; /旅客姓名int age; /旅客年龄int sex; /旅客性别 int lv; /旅客住宿时的等级号 int bed_num; /旅客的床位号int year; /开始住宿日期:年 int month; /开始住宿日期:月int day; /开始住宿日期:日struct customer* next; /指向下一旅客cus;(2)对旅店结构体定义typedef struct hotel_lv int lv_num; /旅店等级号struct hotel_lv *next; /指向下一等级struct fangjian *fj_next; /

4、指向房间hotel_lv;(3)房间结构体定义typedef struct fangjian int fj_num; /房间号int max; /房间的最大床位数目int mem_num; /房间内的当前人数struct fangjian *next; /指向下一房间struct customer *cus_next; /指向旅客fangjian;4. 总体设计(1) 主函数初始化旅店main主函数旅 客 入 住 事 件旅客住宿情况查询旅 客 退 房 事 件 统计旅店当前住宿人数退 出 管 理 系 统(2) 有旅客来住宿时:否否是打印旅客信息姓名性别年龄开始入住时间分配房间成功打印房间分配表是

5、重新输入旅客入住事件是否有空床位输入所需房间等级是否客满无法入住返回主菜单(3) 有旅客来退房时:是打印旅客信息姓名性别年龄开始入住时间是重新输入否重新输入否是重新输入否是否是否退房是否有该房间是否有该床位是否有该等级输入要退房的房间等级输入房间号输入床位号旅客退房事件返回主菜单退房成功(4)查询旅客信息时:打印旅客信息姓名性别年龄开始入住时间是否返回主菜单遍历各房间不为空是不为空是输入要查询旅客的姓名遍历各等级遍历各床位不为空是否有待查找人旅客信息查询 (5)统计旅店当前入住人数:遍历各房间不为空是不为空是遍历各等级遍历各床位不为空计数器count+统计旅店当前入住人数打印信息返回主菜单(5

6、)各函数名初始化函数:void Init(hotel_lv *L) 判断是否客满:int full(hotel_lv *L)打印旅客信息:void Pr_divide(cus* p,fangjian* q )旅客住宿函数:void Pr_divide(cus* p,fangjian* q )旅客退房函数:cus* Delete(hotel_lv *L)查询旅客信息:void cx_customer(hotel_lv *L)统计旅店当前入住人数:void Tongji_cus(hotel_lv *L)主函数:void main()5. 详细设计关键步骤设计(1) 初始化旅店函数采用链表方式,进行

7、旅店的初始化操作,给旅店等级设置了头结点。输入房间等级,每个等级的房间数目,每个房间的床位数目。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<=j;i+)/初始化该等级的房间p=(hotel_lv*)malloc(sizeof(hotel_lv);q->next=p;p->lv_num=i;

8、 /给房间等级赋值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的床位数

9、目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=

10、p1;p3->next=NULL; /房间链表尾指针赋为空q=q->next; q->next=NULL; /等级链表尾指针域赋为空(2)旅客住宿情况采用尾插法,判断是否有空床位,有就进行旅客的入住操作。void input(hotel_lv *L)char c;cus *s,*p2,*p3;hotel_lv *l;l=L->next; fangjian *p1;int i,lv;if(full(L) /判断是否旅店客满printf(" 旅店客满,不能入住。n");system("pause");elseprintf("

11、请输入旅客所需的房间等级:"); /输入旅客所需的等级 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);

12、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 请输入旅客姓名:");scanf("%s",s->name);printf("n 请输入旅客年

13、龄:");scanf("%d",&(s->age);printf("n 请输入旅客性别(如:男1:女0):");scanf("%d",&(s->sex);printf("n 请输入旅客住宿开始日期(如:1991 10 21):");scanf("%d %d %d",&s->year,&s->month,&s->day);s->lv=lv; /修改指针p1->cus_next=s;p1->mem_nu

14、m+; /房间当前人数加1s->bed_num=1;s->next=NULL; /尾指针置为空Pr_divide(s,p1); /打印房间分配表system("cls"); break;elsep2=p1->cus_next;p3=p2;i=1;while(i<=p1->mem_num)if(i=p3->bed_num)p3=p3->next;i+;elsei+;break;if(p3=NULL)s=(cus*)malloc(sizeof(cus); printf("n-n"); printf("n 旅

15、客的信息: "); printf("n 请输入旅客姓名:"); scanf("%s",s->name); printf("n 请输入旅客年龄:"); scanf("%d",&s->age); printf("n 请输入旅客性别(如:男1:女0):"); scanf("%d",&s->sex); printf("n 请输入旅客住宿开始日期(如:1991 10 21):"); scanf("%d %d %d

16、",&s->year,&s->month,&s->day); s->lv=lv; while(p2->next!=p3)p2=p2->next;p2->next=s;p1->mem_num+;s->bed_num=i;s->next=NULL;Pr_divide(s,p1);system("cls"); break;elsewhile(p2->bed_num=i)p2=p2->next;s=(cus*)malloc(sizeof(cus);printf("n-

17、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 请输入旅客住宿开始日期(如:1991 10 21):");sca

18、nf("%d %d %d",&s->year,&s->month,&s->day);s->lv=lv;s->next=p2->next;p2->next=s;p1->mem_num+;s->bed_num=i-1;Pr_divide(s,p1);system("cls"); break;break; (3)旅客退房情况输入退房旅客的房间等级号、房间号码、床位号码,进行查找。完成旅客退房操作。cus* Delete(hotel_lv *L) int lv,hotel_num,be

19、d_num; hotel_lv *l;l=L->next;fangjian *f;cus *p,*q;char c;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);

20、/输入退房人的房间号码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=1) /因为床位没有设置

21、头结点,所以对于第一个结点要特别判断 /直接打印旅客信息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); printf("是否与要退房人信息相符?y/nn"); scanf("%c",&

22、amp;c); if(c='y') /做出是否退房的选择f->mem_num-;printf("退房成功!n");system("pause"); return(q); elsereturn NULL;else /如果床位不为1 while(p->next!=q) /指向下一床位p=p->next; /打印旅客信息printf("此等级、此房间、此床位旅客的信息为:n"); printf("该名顾客的信息:n"); printf("姓名t性别t年龄t入住时间n"

23、); 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') /做出是否退房的选择p->next=q->next;f->mem_num-;printf("退房成功!n");system("pause"); return

24、(q); else return NULL;if(q=NULL) /如果该房间内床位为空printf("未找到该床位号,请核实信息后重新输入。n");if(f=NULL) /如果该等级的房间为空printf("未找到该房间号,请核实信息后重新输入。n");if(l=NULL) /如果等级链表为空printf("未找到该房间等级,请核实信息后重新输入。n");system("pause");6. 测试与调试(1)编写时出现的问题刚开始,我想旅店管理系统的算法思想与刚做过的学生宿舍管理系统一样,所以最开始,我定义的结构

25、体数组,进行编写。可是在初始化的时候,因为旅店跟旅店的情况不一样,而数组大小有不能用变量来指示,所以在用数组进行初始化的时候遇到了麻烦。又想到如果用链表的话,不用定义链表的长度,所以改用链表来编写。在旅客进行入住情况中,开始没有设置头结点,写到后面越来越不对劲,因为有好多种情况要进行考虑(如:判断是否客满、是否所需等级无空床位等)所以又加入头结点。在床位分配的时候,因为没有设置床位的头结点,所以要对第一个床位进行特别判断。然后经过多次调试与修改,最终能实现旅客的入住情况。旅客退房跟入住时一样,有好多种情况要考虑。在床位回收的时候,还是因为没有设置床位的头结点,所以要对第一个床位进行特别判断。还

26、有就是一开始我把那个输入退房人房间号和床位号的语句放在了循环体内,出现了循环一次要输入一个。后来经过调试发现了问题,移出来后没有再出现这个问题。最后进行主函数的界面编写。查询操作与统计操作比较简单,没有出现什么问题。由于自己不会文件的保存与读取函数的编写,向其他同学请教的时候,他们也没有写出来。所以就没有加入文件保存与读取函数。(2) 测试数据与结果初始化输入旅客 本测试数据共输入了五名旅客(1)第一人旅客所需的房间等级无空位情况(2)第二人(3)第三人(4)第四人(5)第五人旅店已客满,无法入住统计旅店当前入住人数旅客退房情况(1)正常退房退房之后又有人入住且与以助旅客同名(2)退房输入错误

27、时候查询旅客信息时候(1) 无旅客同名时:(2) 有旅客同名时(3) 查询错误时候7. 源程序清单#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct customer /旅客结构体char name15;int age;int sex; int lv; int bed_num;int year;int month;int day;struct customer* next;cus;typedef struct hotel_lv /旅店结构体int lv_num;struct

28、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;void Init(hotel_lv *L) /初始化函数 int i,j,k,l;hotel_lv *p,*q; fangjian *p1,*p2,*p3;printf("请输入房间分为几个等级:n"); scanf("%d"

29、;,&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->

30、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的

31、床位个数的最大值: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; /等级链表尾指针域赋为空system("pause");int full(hotel_lv *L) /判是否客满hotel_lv *l;l=L->next;fangjian *f;while(l!=NULL

32、)f=l->fj_next;while(f!=NULL)if(f->mem_num!=f->max) /如果有房间的当前人数不等于房间的最大人数,则返回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(" 姓名 性别年龄等级号房间号床位号

33、入住时间 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");system("pause");void input(hotel_lv *L) /旅客入住函数c

34、har c;cus *s,*p2,*p3;hotel_lv *l;l=L->next; fangjian *p1;int i,lv;if(full(L) /判断是否旅店客满printf(" 旅店客满,不能入住。n");system("pause");elseprintf("请输入旅客所需的房间等级:"); /输入旅客所需的等级 scanf("%d",&lv); while(l!=NULL) /等级不为空时 if(l->lv_num!=lv) l=l->next; else /有此等级时p1

35、=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);elsereturn ;else /进行旅客登记 /因为床位没有设置头结点,所以对于第一个结点要特别判断if(p1->mem_num=0)s

36、=(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(&q

37、uot;n 请输入旅客住宿开始日期(如:1991 10 21):");scanf("%d %d %d",&s->year,&s->month,&s->day);s->lv=lv; /修改指针p1->cus_next=s;p1->mem_num+; /房间当前人数加1s->bed_num=1;s->next=NULL; /尾指针置为空Pr_divide(s,p1); /打印房间分配表system("cls"); break;elsep2=p1->cus_next;p3=p2;i=1;while(i<=p1->mem_num)if(i=p3->bed_num)p3=p3->next;i+;elsei+;break;if(p3=NULL)

温馨提示

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

评论

0/150

提交评论