1、课 程 设 计 说 明 书 课程名称 数据结构课程设计 设计课题 模拟旅馆管理系统 课 程 设 计 任 务 书设计题目:模拟旅馆管理系统一个功效床位分配和回收设计内容和要求:某旅馆有n个等级房间,第I等级有ai个房间,每个等级有bi个床位(1in)。试模拟旅馆管理系统中床位分配和回收功效,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)算法。基础要求(1)输入数据分配时,输入旅客姓名、年纪、性别、抵达日期和所需房间等级。回收时,输入房间等级、房间号和床位号。(2)输出数据分配成功时打印旅客姓名、年纪、抵达日期、房间等级、房间号码和床位号码。分配不成功时,如全部等级均无床位,则打印“客
2、满”信息;如旅客需要等级均无空床位,则打印“是否愿意更换等级?”问询信息。若旅客愿意更换,则重新输入相关信息,再进行分配,不然分配工作结束。 年 12 月16日课 程 设 计 评 语成绩: 指导老师: 年 月 日【问题描述】某旅馆有n个等级房间,第I等级有ai个房间,每个等级有bi个床位(1in)。试模拟旅馆管理系统中床位分配和回收功效,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)算法。【基础要求】(1)输入数据 分配时,输入旅客姓名、年纪、性别、抵达日期和所需房间等级。回收时,输入房间等级、房间号和床位号。(2)输出数据分配成功时打印旅客姓名、年纪、抵达日期、房间等级、房间号码
3、和床位号码。分配不成功时,如全部等级均无床位,则打印“客满”信息;如旅客需要等级均无空床位,则打印“是否愿意更换等级?”问询信息。若旅客愿意更换,则重新输入相关信息,再进行分配,不然分配工作结束。【测试数据】旅客姓名:w性别:男 年纪:20入住时间: 3 4所需等级:1旅客姓名:d性别:男 年纪:22入住时间: 1 2所需等级:2【模块划分】本程序关键划分为四个模块 主函数旅客住房登记旅客退房管理旅客住房查询旅客住宿统计 【算法思想】 采取链表方法,进行旅店初始化操作。给旅店等级设置了头结点。该程序有三条链表,等级组成一条链表,房间组成一条链表,旅客组成一条链表。入住时,先输入旅客所需等级,判
4、定是否有该等级,依次判定有没有房间和床位。有该等级房间时,采取尾插法判定是否有空床位,有就进行旅客入住操作。床位没有设头结点,所以第一个床位要进行判定。退房时,需要输入等级号、房间号、床位号来进行查找,从而完成退房操作。查询时,经过输入旅客姓名进行查询,存在此人时,打印客人信息。统计宾馆人数时,先一个等级一个等级统计,统计这个等级每一个房间和每个房间目前全部些人数。旅客住宿登记是下一个房间旅客住宿无法入住输入所需等级分配客人返回主菜单 打印客人信息是否是否有房间是否有床位是是否更换等级否否无法入住是是否有客满否旅客退房否重新输入 是否退房退房成功 打印客人信息是否有该房号输入床位号是否有该床号
5、 输入房间号是否有该等级 输入退房等级 旅客退房重新输入否否是是是是是重新输入 打印客人信息否旅客信息查询输入旅客姓名是否有待查找人 未找到此人是否有待查等级是否有待查房间是是否否旅客信息查询旅客信息统计 统计下一个房间 统计人数是等级存在房间人数是否为0房间存在 结束否否是是旅客信息统计 。【数据结构】typedef struct traver/旅客结构体char name20;/姓名int sex; /性别int age; /年纪int g;/旅客住宿等级int bednum;/床号int year;int month;int day;struct traver*next;/下一个旅客tr
6、a;typedef struct hotel/旅店结构体int l_num;/旅店等级struct hotel*next;/下一个等级struct room*r_next;/指向房间hotel;typedef struct room/房间结构体int r_num;/房间号int max;/房间最大床位数int renshu;/房间目前人数struct room*next;/下一个房间struct traver*tra_next;/指向旅客room;【测试情况】 房间初始化。 旅客入住登记测试 旅客退房测试统计 查询测试 统计测试 【心得】这周是我们自己选题做课程设计时间,我选题目是做一个旅店管
7、理系统,对床位进行分配和回收。本程序采取了三个链表,刚拿到这个题目时,我认为很这个应该和学生管理系统差不多,不过,在对床位分配时,要采取链表。刚开始我原来想把房间作为一个数组,将床位组成一个单链表。当初,没有考虑到房间等级,最终又想了一下,改变了我原来想法。将房间等级、房间、旅客各组成一个链表,采取链表好处是节省空间,有多个人就申请多大空间,不会造成很大浪费。在编写代码过程中,先对旅馆每个等级每个房间进行初始化,旅客住宿这个函数对于我是最难,因为要先判定旅客所需等级房间存不存在,存在时,要判定这个房间有没有空床位,没有空床位时,链表指针指向下一个房间。假如没有这个等级房间时,咨询旅客是否要更换
8、房间等级。在她同意更换情况下,再反复上述过程进行登记。给旅客进行床位分配时,是根据床位号大小次序依次分配。假如这个房间全部床位全部住满话,再给相同级另一间房间进行分配。在写退房函数时,要输入等级、房间号、床位号,找到对应旅客打印旅客信息确定正确再进行退房操作。统计住宿人数时,统计相同级每一个房间全部旅客。旅客链表不空时,计数器就加加。 进行编程时候,一定要先清楚自己思绪,比如我写住宿函数,要入住就必需先判定有没有空房间和空床位,有话才能进行分配。该程序链表比较多,自己写时候,一个一个子函数写,写完调试好了再进行下一个函数编写。定义了三个结构体,一定要清楚每个结构体中所包含量,切不可混淆。编写时
9、if和else语句比较多,要清楚哪个和哪个对应,每个循环结束条件。调试代码时候有时就是一个很小错造成整个程序不能运行,每当程序错误时我全部很焦躁,甚至想到了放弃,但我最终还是一步一步慢慢来,经过无数次检验程序错误原因后慢慢知道了耐心是一个人成功肯定含有条件!同时,经过此次课程设计使我了解到数据结构能够说是计算机里一门基础课程,它需要把理论变为上机调试,所以一定要把基础知识学扎实。即使我现在还不会成功编写一个完整程序,不过在看程序过程中,不停上网查资料和翻阅相关书籍,经过不停模索,测试,发觉问题,处理问题和在老师帮助下一步一步慢慢正确运行程序。在本课程设计中,我明白了理论和实际应用相结合关键性,
10、并提升了自己组织数据及编写大型程序能力。培养了基础、良好程序设计技能和合作能力。这次课程设计一样提升了我综合利用所学知识能力。并对VC有了更深入了解。数据结构是一门实践性很强课程,上机实习是对学生全方面综合素质进行训练一个最基础方法,是和课堂听讲、自学和练习相辅相成、必不可少一个教学步骤。上机实习首先能使书本上知识变“活”,起到深化了解和灵活掌握教学内容目标;其次,上机实习是对学生软件设计综合能力训练,包含问题分析,总体结构设计,程序设计基础技能和技巧训练。另外,还有更关键一点是:机器是比任何老师更严厉检验者。所以,在“数据结构”学习过程中,必需严格根据老师要求,主动地、主动地、认真地做好每一
11、个试验,以不停提升自己编程能力和专业素质。【源程序】#include #include #include #include typedef struct traver/旅客结构体char name20;/姓名int sex; /性别int age; /年纪int g;/旅客住宿等级int bednum;/床号int year;int month;int day;struct traver*next;/下一个旅客tra;typedef struct hotel/旅店结构体int l_num;/旅店等级struct hotel*next;/下一个等级struct room*r_next;/指向房间
12、hotel;typedef struct room/房间结构体int r_num;/房间号int max;/房间最大床位数int renshu;/房间目前人数struct room*next;/下一个房间struct traver*tra_next;/指向旅客room;void menu_select()/菜单函数printf(*旅客管理查询系统*n); /菜单选择printf(1.进行订房登记服务n); printf(2.进行退房结账服务n);printf(3.查询旅客信息n); printf(4.统计旅客信息n); printf(*n); void Init(hotel*L)/旅店等级设置
13、头结点int i,j,k,n;/k床位数,j房间等级,n房间个数hotel*p,*q;room*p1,*p2,*p3;printf(请输入房间等级:n);scanf(%d,&j);q=L;for(i=1;inext=p;p-l_num=i;/房间等级赋值printf(请输入房间等级为%d房间个数:n,p-l_num);scanf(%d,&n);/输入该等级房间数if(n=0)/不存在该等级房间数时continue;else/初始化床位p2=(room*)malloc(sizeof(room);/为该等级房间申请空间p2-r_num=1;printf(请输入房间等级为%d房间号为1床位数:n,p
14、-l_num,k);scanf(%d,&(p2-max);/房号为l床位数p2-renshu=0;/房间目前人数为0p-r_next=p2;/指向该等级下一个房间p3=p2;for(k=2;knext=p1;p1-r_num=k;printf(请输入房间等级为%d房间号为%d床位数:n,p-l_num,k);scanf(%d,&(p1-max);p1-renshu=0;p3=p1;p3-next=NULL;/房间链表尾指针为空q=q-next;/指向下一个等级q-next=NULL;/等级链表尾指针为空system(cls);int full(hotel*L)/判定客满hotel*l;l=L-
15、next;room *t;while(l!=NULL)t=l-r_next;/指向房间while(t!=NULL)if(t-renshu!=t-max)return 0;else t=t-next;/指向下一个房间l=l-next;if(!l)return 1;void print(tra*s,room*p)printf(输出旅客信息:n);printf(姓名%s,性别%d,年纪%d,房间等级%d,房间号码%d,床号%d,入住时间%d,%d,%dn,s-name,s-sex,s-age,s-g,p-r_num,s-bednum,s-year,s-month,s-day);void zhusu(
16、hotel*L)tra *q1,*q2,*q3;char c;hotel*l;l=L-next;room *t;int i,g;if(full(L)printf(客满,不能入住!n);elseprintf(请输入房间等级n);/输入旅客所需要等级scanf(%d,&g);while(g!=NULL)/等级不空时if(l-l_num!=g)l=l-next;elset=l-r_next;/有该等级时while(t!=NULL)/房间不空if(t-renshu=t-max)/*是否有空床位t=t-next;/指向下一个房间if(t=NULL)getchar();printf(等级为全部房间均无空位
17、n是否愿意更换等级y/n,g);scanf(%c,&c);/是否更换等级if(c=y)zhusu(L);else return;else/进行旅客登记if(t-renshu=0)/床位没有设置头结点,所以要进行判定q1=(tra*)malloc(sizeof(tra);printf(请输客人姓名n);scanf(%s,q1-name);printf(请输入性别:1为男,0为女n);scanf(%d,&(q1-sex);printf(请输客人年纪n);scanf(%d,&(q1-age);printf(请输入旅客入住时间(如1990 12 13):);scanf(%d %d %d,&q1-yea
18、r,&q1-month,&q1-day);q1-g=g;/修改指针t-tra_next=q1;/t-renshu+;/房间人数加1q1-bednum=1;q1-next=NULL;/尾指针为空print(q1,t);break;elseq2=t-tra_next;q3=q2;i=1;for(;q3!=NULL;q3=q3-next)if(i=q3-bednum)+i;q3=q2;for(;q2-next!=NULL;q2=q2-next);q1=(tra*)malloc(sizeof(tra);printf(请输入旅客姓名:n);q1=(tra*)malloc(sizeof(tra);prin
19、tf(请输客人姓名n);scanf(%s,q1-name);printf(请输入性别:1为男,0为女n);scanf(%d,&(q1-sex);printf(请输客人年纪n);scanf(%d,&(q1-age);printf(请输入旅客入住时间:);scanf(%d %d %d,&q1-year,&q1-month,&q1-day);q1-g=g;q2-next=q1;q1-next=NULL;t-renshu+;q1-bednum=i;print(q1,t);break;system(cls);break;tra*tuifang(hotel*L)int g,hotel_num,bednum
20、;hotel*l;l=L-next;room *t;tra*p,*q;char c; printf(请输入该退房人房间等级号码:n); scanf(%d,&g); /输入退房人房间等级 getchar(); while(l!=NULL) if(l-l_num!=g) l=l-next; else /找到该等级 t=l-r_next; printf(请输入该退房人房间房间号码:n); scanf(%d,&hotel_num); /输入退房人房间号码 getchar(); while(t!=NULL) if(t-r_num!=hotel_num) t=t-next; else /找到该房间 p=t
21、-tra_next; q=t-tra_next; printf(请输入该退房人床位号码:n); scanf(%d,&bednum); /输入退房人床位号码 getchar(); while(q!=NULL) if(q-bednum!=bednum) q=q-next; else /查找该床位 if(bednum=p-bednum) /因为床位没有设置头结点,所以对于第一个结点要 尤其判定 /直接打印旅客信息printf(等级、房间、床位旅客信息为:n); printf(姓名t性别t年纪t入住时间n); printf(%st%dt%dt%d-%d-%dn,q-name,q-sex,q-age,q
22、-year,q-month,q-day); printf(是否和要退房人信息相符?y/nn); scanf(%c,&c); if(c=y) /做出是否退房选择 t-tra_next=q-next; t-renshu-; printf(退房成功!n); return(q); else return 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-
23、%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; t-renshu-; printf(退房成功!n); return(q); else return NULL; if(q=NULL) /假如该房间内床位为空 printf(未找到该床位号!n); if(t=NULL) /假如该等级房间为空 printf(未找到该房间号!n); if(l=NULL) /假如等级链表为空 printf(未找到该房间等级!n); vo
24、id chaxun(hotel *L) /查询旅客信息函数 char c15; hotel *l; room *t; tra *s; int flag=0;/设置标志量 printf(请输入要查询旅客姓名:n); scanf(%s,c); getchar(); l=L-next; while(l!=NULL) /等级不为空时,指向房间 t=l-r_next; while(t!=NULL)/房间不为空时,指向床位 if(t-renshu=0) /若此房间目前人数为零,指向下一房间 t=t-next; else s=t-tra_next; while(s!=NULL) if(!strcmp(s-n
25、ame,c) /假如找到该旅客 print(s,t); /打印信息s=s-next; /指向下一人,继续查找flag+; /标志量加1 else s=s-next; t=t-next; /指向下一个房间 l=l-next; /指向下一个等级 if(!flag) /标志量为零,则未查找到printf(未找到该旅客!n); void Tongji(hotel *L) /统计旅店目前住宿人数函数 char c15; hotel *l; room*t; tra *s; int i=0,j=0; int flag; l=L-next; while(l!=NULL) flag=0; i+; t=l-r_n
26、ext; while(t!=NULL)/房间不空 if(t-renshu=0) t=t-next; else s=t-tra_next; while(s!=NULL) /旅客不空 flag+; j=j+flag; s=s-next; t=t-next; printf(等级为%d房间入住人数为%dn,i,flag); l=l-next; if(!j) printf(此时无人住宿。n); void main() hotel*L;tra*p;L=(hotel*)malloc(sizeof(hotel);Init(L);int choice; int flag=1;menu_select();/调用菜
27、单函数while(flag) printf(请输入处理种类(1-4):n);scanf(%d,&choice);switch(choice) case 1:printf(进行订房登记服务:n);zhusu(L);menu_select();break;case 2:printf(进行退房结账服务:n);tuifang(L);system(cls);menu_select();break;case 3:printf(查询旅客信息:n);chaxun(L);system(cls);menu_select();break;case 4: printf(统计旅客信息:n);Tongji(L);system(cls);menu_select();break;flag=0;