资源描述
word数据结构课程设计报告实验名称 : 宾馆订房和退房系统姓 名 : 胡山权学 号 : 111714110学 院 : 计算机科学与技术学院专 业 : 网络工程指导教师 : 建新一需求分析1.实验题目:宾馆订房和退房系统2.根本要求:1实现宾馆的订房业务2实现退房业务3实现统计业务4实现查询业务二概要设计本程序主要有以下几个功能模块void main () /主函数void tongji_cus (hotel_lv *L) /统计当前客人人数函数void cx_customer (hotel_lv *L) /查询客人信息函数cus* Delete (hotel_lv *L) /退房函数void input (hotel_lv *L) /订房函数void Pr_divide(cus *p,fangjian *q) /打印客人信息函数void Init(hotel_lv *L) /初始化函数typedef struct customer /客人结构体定义typedef struct hotel_lv /宾馆结构体定义typedef struct fangjian /房间结构体定义本程序通过主函数调用void main ()主函数,主函数再调用其他几个功能模块,其中客房数量通过初始化函数来实现,输入客房的数量和床位的数量来确定。 三详细设计宾馆客房初始化Main录入客人信息查询客人信息统计入住情况退出系 统查询入住情况某某是入住流程是否客满是不能入住否输入所需等级是否有床位否打印客人信息年龄性别入住时间分配房间成功返回主菜单3退房业务某某是否是退房业务输入要退房的房间等级是否有该等级否是否是输入房间号是否有该房间号否输入床位号是否有该床位号否打印客人信息年龄性别入住时间是否退房返回主菜单退房成功4查询业务不为空不为空不为空客人信息查询输入客人某某遍历各等级遍历各房间遍历各床位不为空遍历各床位是否有该客人返回主菜单某某性别年龄入住时间5 统计业务不为空不为空不为空统计当前客房入住人数遍历各等级遍历个房间遍历各床位计数器conut+打印信息返回主菜单(1) .主菜单Init (L);while (1) /进入菜单项选择项system (cls);printf (nnn);printf (*n);printf(* *n);printf (* 欢迎进入宾馆客房管理系统 *n);printf(* *n); printf (*n);printf (*工程学院 计算机学院 1117141班 胡山权*nn);printf (-所有,侵权必究n);printf ( 1 录入客人信息n);printf ( 2 退房业务 n );printf ( 3 查询客人信息n);printf ( 4 统计客人信息n);printf ( 0 退出系统 n);printf ( 请选择你要办理的业务 n);scanf (%d,&c); / 做选择getchar ();switch (c)case 1: input (L); break;case 2: p=Delete (L);free (p);break; case 3: cx_customer (L);break;case 4: tongji_cus (L);break;case 0: return;(2) 统计当前客人人数函数void tongji_cus (hotel_lv *L) hotel_lv *l;fangjian *f;cus *t;int i=0,j=0;int flag;l=L-next;while (l!=NULL)flag=0;i+;f=l-fj_next;while (f!=NULL)if (f-mem_num=0)f=f-next;elset=f-cus_next;while (t!=NULL)flag+;j=j+flag;t=t-next;f=f-next;printf (等级为%d的房间的入住人数为%dn,i,flag);l=l-next;if (!j)printf (此时无人入住。n);system (pause);(3).退房业务cus* Delete (hotel_lv *L) cus *p,*q;char c;fangjian *f;int lv,hotel_num,bed_num;hotel_lv *l;l=L-next;printf (请输入该退房客人的房间等级:n);scanf (%d,&lv); getchar ();while (l!=NULL) .f-mem_num-;printf (退房成功!n);system (pause);return (q);elsereturn NULL;if (q=NULL) /如果该房间床位为空 printf (没有找到该床位,请核对信息后重新输入。n);if (f=NULL) /如果该等级的房间为空printf (没有找到该房间号,请从新输入。n);if (l=NULL) /如果等级链表为空printf (没有找到该房间等级,请核对后输入!n);system (pause);(4) 查询客人信息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) /假设此房间当前人数为0,走向下一见房f=f-next;elset=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) /标志量为0,如此未查找到printf (没有找到该客人,请核对再输入。n);system (pause); /统计函数与查询函数根本类似(5) 入住函数void input (hotel_lv *L) char c;int i,lv;fangjian *p1;cus *s,*p2,*p3;hotel_lv *l;l=L-next;if (full (L) /判断是否客满printf (房间已满,不能入住。n);system (pause);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=NULL)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 请输入客人的:);scanf (%s,s-name);printf(n 请输入客人年龄:);scanf (%d,&(s-age);printf (n 请输入客人的性别如:男1;女0:);scanf (%d,&(s-sex); printf (n 请输入客人入住的时间如:1990 10 11:);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;else p2=p1-cus_next;p3=p2;i=1;while (imem_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 入住客人信息:);printf(n 请输入客人的:);scanf (%s,s-name);printf(n 请输入客人年龄:);scanf (%d,&(s-age);printf (n 请输入客人的性别如:男1;女0:);scanf (%d,&(s-sex);printf (n 请输入客人入住的时间如:1990 10 11:);scanf (%d %d %d,&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-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 请输入客人入住的时间如:1990 10 11:);scanf (%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;(6) 初始化函数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;inext=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房间号为l的床位个数的最大值:n,p-lv_num,k);scanf (%d,&(p2-max); /输入房间l的床位数目p2-mem_num=0; /该房间当前人数赋值为0p-fj_next=p2;p3=p2;for (k=2;knext=p1;p1-fj_num=k;printf (请输入房间等级为%d房间号为%d的床位的个数的最大值;n,p-lv_num,k);scanf (%d,&(p1-max); /输入房间K的床位数目p1-mem_num=0; /该房间的当前人数赋值为0p3=p1;p3-next=NULL; /房间链表尾指针为空q=q-next;q-next=NULL; /等级链表尾指针域为空system (pause);(7) 打印客人信息void Pr_divide(cus *p,fangjian *q) printf (*nn);printf ( 宾馆房间分配系统 nn);printf (*nn);printf (| | 性别 | 年龄 | 等级号 | 房间号 | 床位号 | 入住时间 |n);printf (| %6s | %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); 四程序截图说明(1) 程序主菜单:(2) 录入客人信息3查询客人信息4统计业务5 退房业务五分析总结:1. 出现问题与解决方法:刚开始,我想宾馆管理系统的算法和学生宿舍管理系统一样,所以开始,我定义的结构体数组,进展编写。可是在初始化的时候因为宾馆和宿舍的情况不一样,而且数组大小也不能用变量来指示,所以在用数组进展初始化的时候遇到了麻烦,有想到,如果用链表来编写的话,不用定义链表的长度,所以改用链表来编写。在客人入住的情况中,开始没有设置头结点,写到后面觉得不对劲,因为有好多情况要进展考虑,如:判断是否客满,是否需要的等级有空位等,所以又参加头结点。在床头分配的时候,因为没有设置床头的头结点,所以要对第一个床位进展特别判断。然后进展屡次修改,最终实现客人的入住。退房更入住时候一样,需要考虑很多情况,在床位回收的时候,还是因为没有设置头结点,所以要对第一个床位进展特别判断,还有就是一开始我把那个输入退房人的房间号和床位号的语句放在的循环体,出现了一次循环要输入一次,后来经过调试发现了问题,移出来虹欧解决了这个问题。最后进展住函数的界面编写,查询操作比拟简单,没有出现什么问题,由于自己不会文件的保存与读取函数的编写,所以没有采取文件的存储与读取。:能够很好的实现入住,查询,统计,退房等功能,但是不能实现文件的保存与读取。六致:转眼间,八周的课程设计完毕了,感教师为我们提供的每周数次的到机房上机调试的机会,在那里,教师将为我们解决各种难题,同学之间也可以相互讨论,这才有了今天的成果,特别是教师的宝贵的意见,给了我很大的启示,同时也要感那些给予过我帮助的同学们。七源程序代码#include #include #include #include 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 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,&j); /输入房间分为几个等级q=L;for (i=1;inext=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房间号为l的床位个数的最大值:n,p-lv_num,k);scanf (%d,&(p2-max); /输入房间l的床位数目p2-mem_num=0; /该房间当前人数赋值为0p-fj_next=p2;p3=p2;for (k=2;knext=p1;p1-fj_num=k;printf (请输入房间等级为%d房间号为%d的床位的个数的最大值;n,p-lv_num,k);scanf (%d,&(p1-max); /输入房间K的床位数目p1-mem_num=0; /该房间的当前人数赋值为0p3=p1;p3-next=NULL; /房间链表尾指针为空q=q-next;q-next=NULL; /等级链表尾指针域为空system (pause);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) /如果有房间的当前人数不等于房间的最大人数,如此返回0return 0;elsef=f-next;l=l-next;if (!l) /否如此返回1return 1; else return 0;void Pr_divide(cus *p,fangjian *q) /打印客人信息printf (*nn);printf ( 宾馆房间分配系统 nn);printf (*nn);printf (| | 性别 | 年龄 | 等级号 | 房间号 | 床位号 | 入住时间 |n);printf (| %6s | %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) /入住函数char c;int i,lv;fangjian *p1;cus *s,*p2,*p3;hotel_lv *l;l=L-next;if (full (L) /判断是否客满printf (房间已满,不能入住。n);system (pause);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=NULL)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 请输入客人的:);scanf (%s,s-name);printf(n 请输入客人年龄:);scanf (%d,&(s-age);printf (n 请输入客人的性别如:男1;女0:);scanf (%d,&(s-sex);printf (n 请输入客人入住的时间如:1990 10 11:);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;else p2=p1-cus_next;p3=p2;i=1;while (imem_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 入住客人信息:);printf(n 请输入客人的:);scanf (%s,s-name);printf(n 请输入客人年龄:);scanf (%d,&(s-age);printf (n 请输入客人的性别如:男1;女0:);scanf (%d,&(s-sex);printf (n 请输入客人入住的时间如:1990 10 11:);scanf (%d %d %d,&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-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 请输入客人入住的时间如:1990 10 11:);scanf (%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;cus* Delete (hotel_lv *L) /退房cus *p,*q;char c;fangjian *f;int lv,hotel_num,bed_num;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=1) /因为床位没有设置头结点,所以对第一个结点要特别判断 /直接打印客人信息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,&c);if (c=y) /做出是否退房的选择f-mem_num-;printf (退房成功!n);system (pause);return (q);elsereturn NULL;else /如果床位不为1while (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);printf (是否与退房人的信息一样?y/nn);scanf (%c,&c);if (c=y) /做出是否退房的选择f-mem_num-;printf (退房成功!n);system (pause);return (q);elsereturn NULL;if (q=NULL) /如果该房间床位为空 printf (没有找到该床位,请核对信息后重新输入。n);if (f=NULL) /如果该等级的房间为空printf (没有找到该房间号,请从新输入。n);if (l=NULL) /如果等级链表为空printf (没有找到该房间等级,请核对后输入!n);system (pause);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) /假设此房间当前人数为0,走向下一见房f=f-next;elset=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) /标志量为0,如此未查找到printf (没有找到该客人,请核对再输入。n);system (pause); /统计函数与查询函数根本类似 void tongji_cus (hotel_lv *L) /统计当前客人人数函数hotel_lv *l;fangjian *f;cus *t;int i=0,j=0;int flag;l=L-next;while (l!=NULL)flag=0;i+;f=l-fj_next;while (f!=NULL)if (f-mem_num=0)f=f-next;elset=f-cus_next;while (t!=NULL)flag+;j=j+flag;t=t-next;f=f-next;printf (等级为%d的房间的入住人数为%dn,i,flag);l=l-next;if (!j)printf (此时无人入住。n);system (pause);void main () /主函数hotel_lv *L;cus *p;int c;L=(hotel_lv *)malloc (sizeof(hotel_lv);printf (初始化旅店信息:n);Init (L);while (1) /进入菜单项选择项system (cls);printf (nnn);printf (*n);printf (* *n);printf (* 欢迎进入宾馆客房管理系统 *n);printf (* *n);printf (*n);printf (*工程学院 计算机学院 1117141班 胡山权*nn);printf (-所有,侵权必究n);printf ( 1 录入客人信息n);printf ( 2 退房业务 n );printf ( 3 查询客人信息n);printf ( 4 统计客人信息n);printf ( 0 退出系统 n);printf ( 请选择你要办理的业务 n);scanf (%d,&c); / 做选择getchar ();switch (c)case 1: input (L); break;case 2: p=Delete (L);free (p);break;case 3: cx_customer (L);break;case 4: tongji_cus (L);break;case 0: return;getchar ();30 / 30
展开阅读全文