数据结构优秀课程设计.docx
- 文档编号:16093385
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:25
- 大小:313.39KB
数据结构优秀课程设计.docx
《数据结构优秀课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构优秀课程设计.docx(25页珍藏版)》请在冰点文库上搜索。
数据结构优秀课程设计
课程设计说明书
课程名称数据结构课程设计
设计课题模拟旅馆管理系统
课程设计任务书
设计题目:
模拟旅馆管理系统一个功效——床位分配和回收
设计内容和要求:
某旅馆有n个等级房间,第I等级有ai个房间,每个等级有bi个床位(1≤i≤n)。
试模拟旅馆管理系统中床位分配和回收功效,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)算法。
[基础要求]
(1)输入数据
分配时,输入旅客姓名、年纪、性别、抵达日期和所需房间等级。
回收时,输入房间等级、房间号和床位号。
(2)输出数据
分配成功时打印旅客姓名、年纪、抵达日期、房间等级、房间号码和床位号码。
分配不成功时,如全部等级均无床位,则打印“客满”信息;如旅客需要等级均无空床位,则打印“是否愿意更换等级?
”问询信息。
若旅客愿意更换,则重新输入相关信息,再进行分配,不然分配工作结束。
年12月16日
课程设计评语
成绩:
指导老师:
年月日
【问题描述】
某旅馆有n个等级房间,第I等级有ai个房间,每个等级有bi个床位(1≤i≤n)。
试模拟旅馆管理系统中床位分配和回收功效,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)算法。
【基础要求】
(1)输入数据
分配时,输入旅客姓名、年纪、性别、抵达日期和所需房间等级。
回收时,输入房间等级、房间号和床位号。
(2)输出数据
分配成功时打印旅客姓名、年纪、抵达日期、房间等级、房间号码和床位号码。
分配不成功时,如全部等级均无床位,则打印“客满”信息;如旅客需要等级均无空床位,则打印“是否愿意更换等级?
”问询信息。
若旅客愿意更换,则重新输入相关信息,再进行分配,不然分配工作结束。
【测试数据】
旅客姓名:
w性别:
男年纪:
20入住时间:
34所需等级:
1
旅客姓名:
d性别:
男年纪:
22入住时间:
12所需等级:
2
【模块划分】
本程序关键划分为四个模块
【算法思想】
采取链表方法,进行旅店初始化操作。
给旅店等级设置了头结点。
该程序有三条链表,等级组成一条链表,房间组成一条链表,旅客组成一条链表。
入住时,先输入旅客所需等级,判定是否有该等级,依次判定有没有房间和床位。
有该等级房间时,采取尾插法判定是否有空床位,有就进行旅客入住操作。
床位没有设头结点,所以第一个床位要进行判定。
退房时,需要输入等级号、房间号、床位号来进行查找,从而完成退房操作。
查询时,经过输入旅客姓名进行查询,存在此人时,打印客人信息。
统计宾馆人数时,先一个等级一个等级统计,统计这个等级每一个房间和每个房间目前全部些人数。
旅客住宿登记
旅客退房
旅客信息查询
旅客信息统计
。
【数据结构】
typedefstructtraver//旅客结构体
{charname[20];//姓名
intsex;//性别
intage;//年纪
intg;//旅客住宿等级
intbednum;//床号
intyear;
intmonth;
intday;
structtraver*next;//下一个旅客
}tra;
typedefstructhotel//旅店结构体
{intl_num;//旅店等级
structhotel*next;//下一个等级
structroom*r_next;//指向房间
}hotel;
typedefstructroom//房间结构体
{intr_num;//房间号
intmax;//房间最大床位数
intrenshu;//房间目前人数
structroom*next;//下一个房间
structtraver*tra_next;//指向旅客
}room;
【测试情况】
房间初始化。
旅客入住登记测试
旅客退房测试统计
查询测试
统计测试
【心得】
这周是我们自己选题做课程设计时间,我选题目是做一个旅店管理系统,对床位进行分配和回收。
本程序采取了三个链表,刚拿到这个题目时,我认为很这个应该和学生管理系统差不多,不过,在对床位分配时,要采取链表。
刚开始我原来想把房间作为一个数组,将床位组成一个单链表。
当初,没有考虑到房间等级,最终又想了一下,改变了我原来想法。
将房间等级、房间、旅客各组成一个链表,采取链表好处是节省空间,有多个人就申请多大空间,不会造成很大浪费。
在编写代码过程中,先对旅馆每个等级每个房间进行初始化,旅客住宿这个函数对于我是最难,因为要先判定旅客所需等级房间存不存在,存在时,要判定这个房间有没有空床位,没有空床位时,链表指针指向下一个房间。
假如没有这个等级房间时,咨询旅客是否要更换房间等级。
在她同意更换情况下,再反复上述过程进行登记。
给旅客进行床位分配时,是根据床位号大小次序依次分配。
假如这个房间全部床位全部住满话,再给相同级另一间房间进行分配。
在写退房函数时,要输入等级、房间号、床位号,找到对应旅客打印旅客信息确定正确再进行退房操作。
统计住宿人数时,统计相同级每一个房间全部旅客。
旅客链表不空时,计数器就加加。
进行编程时候,一定要先清楚自己思绪,比如我写住宿函数,要入住就必需先判定有没有空房间和空床位,有话才能进行分配。
该程序链表比较多,自己写时候,一个一个子函数写,写完调试好了再进行下一个函数编写。
定义了三个结构体,一定要清楚每个结构体中所包含量,切不可混淆。
编写时if和else语句比较多,要清楚哪个和哪个对应,每个循环结束条件。
调试代码时候有时就是一个很小错造成整个程序不能运行,每当程序错误时我全部很焦躁,甚至想到了放弃,但我最终还是一步一步慢慢来,经过无数次检验程序错误原因后慢慢知道了耐心是一个人成功肯定含有条件!
同时,经过此次课程设计使我了解到数据结构能够说是计算机里一门基础课程,它需要把理论变为上机调试,所以一定要把基础知识学扎实。
即使我现在还不会成功编写一个完整程序,不过在看程序过程中,不停上网查资料和翻阅相关书籍,经过不停模索,测试,发觉问题,处理问题和在老师帮助下一步一步慢慢正确运行程序。
在本课程设计中,我明白了理论和实际应用相结合关键性,并提升了自己组织数据及编写大型程序能力。
培养了基础、良好程序设计技能和合作能力。
这次课程设计一样提升了我综合利用所学知识能力。
并对VC有了更深入了解。
《数据结构》是一门实践性很强课程,上机实习是对学生全方面综合素质进行训练一个最基础方法,是和课堂听讲、自学和练习相辅相成、必不可少一个教学步骤。
上机实习首先能使书本上知识变“活”,起到深化了解和灵活掌握教学内容目标;其次,上机实习是对学生软件设计综合能力训练,包含问题分析,总体结构设计,程序设计基础技能和技巧训练。
另外,还有更关键一点是:
机器是比任何老师更严厉检验者。
所以,在“数据结构”学习过程中,必需严格根据老师要求,主动地、主动地、认真地做好每一个试验,以不停提升自己编程能力和专业素质。
【源程序】
#include
#include
#include
#include
typedefstructtraver//旅客结构体
{charname[20];//姓名
intsex;//性别
intage;//年纪
intg;//旅客住宿等级
intbednum;//床号
intyear;
intmonth;
intday;
structtraver*next;//下一个旅客
}tra;
typedefstructhotel//旅店结构体
{intl_num;//旅店等级
structhotel*next;//下一个等级
structroom*r_next;//指向房间
}hotel;
typedefstructroom//房间结构体
{intr_num;//房间号
intmax;//房间最大床位数
intrenshu;//房间目前人数
structroom*next;//下一个房间
structtraver*tra_next;//指向旅客
}room;
voidmenu_select()//菜单函数
{
printf("************旅客管理查询系统************\n");//菜单选择
printf("1.进行订房登记服务\n");
printf("2.进行退房结账服务\n");
printf("3.查询旅客信息\n");
printf("4.统计旅客信息\n");
printf("****************************************\n");
}
voidInit(hotel*L)//旅店等级设置头结点
{inti,j,k,n;//k床位数,j房间等级,n房间个数
hotel*p,*q;
room*p1,*p2,*p3;
printf("请输入房间等级:
\n");
scanf("%d",&j);
q=L;
for(i=1;i<=j;i++)//初始化房间等级
{p=(hotel*)malloc(sizeof(hotel));
q->next=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->l_num,k);
scanf("%d",&(p2->max));//房号为l床位数
p2->renshu=0;//房间目前人数为0
p->r_next=p2;//指向该等级下一个房间
p3=p2;
for(k=2;k<=n;k++)//房间号为2房间信息初始化
{p1=(room*)malloc(sizeof(room));
p3->next=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");}
intfull(hotel*L)//判定客满
{hotel*l;
l=L->next;
room*t;
while(l!
=NULL)
{t=l->r_next;//指向房间
while(t!
=NULL)
{if(t->renshu!
=t->max)
return0;
elset=t->next;}//指向下一个房间
l=l->next;}
if(!
l)
return1;}
voidprint(tra*s,room*p)
{printf("输出旅客信息:
\n");
printf("姓名%s,性别%d,年纪%d,房间等级%d,房间号码%d,床号%d,入住时间%d,%d,%d\n",s->name,s->sex,s->age,s->g,p->r_num,
s->bednum,s->year,s->month,s->day);}
voidzhusu(hotel*L)
{tra*q1,*q2,*q3;
charc;
hotel*l;
l=L->next;
room*t;
inti,g;
if(full(L))
{printf("客满,不能入住!
\n");}
else
{printf("请输入房间等级\n");//输入旅客所需要等级
scanf("%d",&g);
while(g!
=NULL)//等级不空时
{if(l->l_num!
=g)
l=l->next;
else
{t=l->r_next;//有该等级时
while(t!
=NULL)//房间不空
{if(t->renshu==t->max)//*是否有空床位
{t=t->next;//指向下一个房间
if(t==NULL)
{getchar();
printf("等级为全部房间均无空位\n是否愿意更换等级[y/n]",g);
scanf("%c",&c);//是否更换等级
if(c=='y')
zhusu(L);
elsereturn;}}
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("请输入旅客入住时间(如19901213):
");
scanf("%d%d%d",&q1->year,&q1->month,&q1->day);
q1->g=g;//修改指针
t->tra_next=q1;//
t->renshu++;//房间人数加1
q1->bednum=1;
q1->next=NULL;//尾指针为空
print(q1,t);
break;}
else
{
q2=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));
printf("请输客人姓名\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)
{intg,hotel_num,bednum;
hotel*l;
l=L->next;
room*t;
tra*p,*q;
charc;
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->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("%s\t%d\t%d\t%d-%d-%d\n",q->name,q->sex,q->age,q->year,q->month,q->day);
printf("是否和要退房人信息相符?
[y/n]\n");
scanf("%c",&c);
if(c=='y')//做出是否退房选择
{t->tra_next=q->next;
t->renshu--;
printf("退房成功!
\n");
return(q);}
else
returnNULL;}
else//假如床位不为1
{while(p->next!
=q)//指向下一床位
p=p->next;//打印旅客信息
printf("等级、房间、床位旅客信息为:
\n");
printf("该名用户信息:
\n");
printf("姓名\t性别\t年纪\t入住时间\n");
printf("%s\t%d\t%d\t%d-%d-%d\n",q->name,q->sex,q->age,q->year,q->month,q->day);
printf("是否和要退房人信息相符?
[y/n]\n");
scanf("%c",&c);
if(c=='y')//做出是否退房选择
{p->next=q->next;
t->renshu--;
printf("退房成功!
\n");
return(q);}
else
returnNULL;}}}
if(q==NULL)//假如该房间内床位为空
{printf("未找到该床位号!
\n");}}}
if(t==NULL)//假如该等级房间为空
{printf("未找到该房间号!
\n");}}}
if(l==NULL)//假如等级链表为空
{printf("未找到该房间等级!
\n");}}
voidchaxun(hotel*L)//查询旅客信息函数
{charc[15];
hotel*l;
room*t;
tra*s;
intflag=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->name,c))//假如找到该旅客
{print(s,t);//打印信息
s=s->next;//指向下一人,继续查找
flag++;//标志量加1
}
else
s=s->next;
}
t=t->next;//指向下一个房间
}}
l=l->next;//指向下一个等级
}
if(!
flag)//标志量为零,则未查找到
{printf("未找到该旅客!
\n");}}
voidTongji(hotel*L)//统计旅店目前住宿人数函数
{charc[15];
hotel*l;
room*t;
tra*s;
inti=0,j=0;
intflag;
l=L->next;
while(l!
=NULL)
{flag=0;
i++;
t=l->r_next;
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房间入住人数为%d\n",i,flag);
l=l->next;}
if(!
j)
printf("此时无人住宿。
\n");}
voidmain()
{hotel*L;
tra*p;
L=(hotel*)malloc(sizeof(hotel));
Init(L);
intchoice;
intflag=1;
menu_select();//调用菜单函数
while(flag)
{
printf("请输入处理种类(1-4):
\n");
scanf("%d",&choice);
switch(choice)
{
case1:
printf("进行订房登记服务:
\n");zhusu(L);menu_select();break;
case2:
printf("进行退房结账服务:
\n");tuifang(L);system("cls");menu_select();break;
case3:
printf("查询旅客信息:
\n");chaxun(L);system("cls");menu_select();break;
case4:
printf("统计旅客信息:
\n");Tongji(L);system("cls");menu_select();break;
flag=0;}
}}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 优秀 课程设计