模拟旅馆管理系统的一个功能床位的分配与回收.docx
- 文档编号:5228254
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:15
- 大小:122.71KB
模拟旅馆管理系统的一个功能床位的分配与回收.docx
《模拟旅馆管理系统的一个功能床位的分配与回收.docx》由会员分享,可在线阅读,更多相关《模拟旅馆管理系统的一个功能床位的分配与回收.docx(15页珍藏版)》请在冰豆网上搜索。
模拟旅馆管理系统的一个功能床位的分配与回收
实验报告
课程名称数据结构
实验名称床位的分配与回收
实验类型_综合型
实验地点计405机房实验日期2017.5.20
指导教师海平
专业软件工程
班级软件1601
学号1611030102
寇春雷
石油化工大学计算机与通信工程学院
数据结构实验报告评分表
项目
要求
分数
有无项目(√)
得分
预习报告
(30分)
实验目的明确
5
实验容理解透彻
5
实验方案设计完整合理
程序总体框架设计完整
10
完成相关辅助代码
5
测试方案合理
5
实验过程
(30分)
发现问题
5
问题的分析
15
问题的解决方法
10
实验报告
(20分)
容翔实无缺漏
5
如实记录实验过程
10
撰写规整
5
实验总结
(10分)
实验结果的分析
5
按照结果对原实验方案的改进意见
5
实验体会
(10分)
实验的收获
5
实验容的发散考虑
5
总分
实验四模拟旅馆管理系统的一个功能——床位的分配与回收
题目:
模拟旅馆管理系统的一个功能——床位的分配与回收
1问题描述:
某旅馆有n个等级的房间,第I等级有
个房间,每个等级有
个床位(1≤I≤n)。
试模拟旅馆管理系统中床位分配和回收的功能,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)的算法。
⒉基本要求
(1)输入数据
分配时,输入旅客、年龄、性别、到达日期和所需房间等级。
回收时,输入房间等级、房间号和床位号。
2)输出数据
分配成功时打印旅客、年龄、到达日期、房间等级、房间和床位。
分配不成功时,如所有等级均无床位,则打印“客满”信息;如旅客需要的等级均无空床位,则打印“是否愿意更换等级?
”的询问信息。
若旅客愿意更换,则重新输入有关信息,再进行分配,否则分配工作结束。
⒊实现提示
(1)数据结构
主要采用顺序结构结构的线性表及堆栈。
a)每个房间用一个如下所示的具有五个字段的结点(房结点)表示:
性别
房间号
现有空床数
BTOP
RLINK
其中,性别:
0表示房间为空状态
1表示房间分配给女旅客
2表示房间分配给男旅客
现有空床数:
数据在0~
之间,其中
是第i等级一个房间的床位数,当现有空床数为
时,表示房间为空;为0时,表示房间满。
RLINK:
当房间空时,用作空房栈的连接;当房间不空时,指向下一个房结点。
BTOP:
指向该房间的空床号栈栈顶。
一个房间对应一个顺序表示的空床号栈。
栈的容量为
,栈中存放空床号。
分配时,从栈顶取出空床号,栈顶下移(BTOP=BTOP+1);回收时,栈顶上移(BTOP=BTOP-1),将回收的空床号填入栈顶。
每一个等级中的空房间构成一个空房栈;已住旅客的房间构成一个链栈(简称房链),其头结点结构如下:
可分配女床位总数
可分配男床位总数
TTOP
RLINK
其中:
:
第i等级中房间总数
第i等级中每个房间的床位数
可分配男、女床位的总数的初值等于
*
,因为开始时所有房间和床位既可以分配给男旅客,也可以分配给女旅客。
当在房链中分配一个床位给男(女)旅客,床位总数应减1;当从空房栈中取出一个房间作为男(女)旅客房间时,则可分配女(男)床位总数应减
,当回收一个男(女)床位时,则可分配男(女)床位总数应加1;当回收一个男(女)空房至空房栈时,则可分配女(男)床位总数应加
。
TTOP:
指向本级空房栈栈顶,当无空房间时,TTOP=^(NIL)。
RLINK:
指向本级房链第一个顶点,当房链为空时,RLINK=^(NIL)
顺序表s=(
),其中,
顺序存放第1~n等级房间的头结点;
存放容如下所示:
全店可分配女床总数
全店可分配女床总数
0
0
^
^
初始时,全店可分配男、女床总数相同,均为
,在分配或回收时,对各等级可分配男(女)床位总数处理的同时也要对全店可分配男(女)床总数作相应处理,当全店可分配男(女)床总数等于零时,表示客满。
(2)需求分析
经过分析,程序要有以下几个功能:
a.程序启动的时候应该能够对旅馆的信息进行初始化,并且可以让不同的进行手动初始化;
b.当客户到来的时候,可以登录客户的信息,并且根据旅馆的情况和客
户的要求进行分配床位;
c.当客户结账的时候,可以打印其账单,并且将床位回收;
d.在进行输入信息的时候,应该有检查错误的功能,防止输入的信息超出正常围.
4、概要设计
主函数
初始化
显示
客户登记
床位分配
客户退房
床位回收
保存信息
退出
功能模块的划分
功能模块的描述:
1.信息的初始化:
应该包括两种初始化,第一种是每次打开程序的时候,自动完成对旅馆信息的初始化。
第二种是由用户输入旅馆的信息,完成旅馆信息的初始化。
2.显示模块.显示模块是人机交互的必要模块,用于显示主菜单、旅馆的当前住宿情况、
床位分配情况、账单等等,方便用户进行下一步操作。
3.客户登记及床位分配模块:
用来登记客户的信息以及床位的分配。
4.客户退房及床位回收模块:
用来登记退房客户的信息以及床位的回收。
5.保存信息模块:
用来保存旅馆的相关信息,包括手动初始化之后的客房信息,以及退出程序之前的保存工作。
6.退出:
退出程序。
4.源程序代码:
#include"stdafx.h"
#include
usingnamespacestd;
#include
#include
#include
#include
#include
#defineN7//房间等级
#defineNUM4//每个等级的房间数
#defineM2//每个房间的床位数
typedefstructcustomer{//顾客结构
stringname;
intage;
intsex;
intday,month,year;//到期时间
intbednumber;//该顾客的床号
}customer;
typedefstructroom{//房间结构
customerperson[M];
introomgrade;//该房间的房间等级
introomnumber;//该房间的房间号
intpeoplein;//该房间的房间入住人数
intbed[M];//该房间的总床位
structroom*next;//结构体指针
}Room;
Room*creat(){//建立房间的链表
Room*head,*p,*q;
inti=1,j,k,m=0,h;
head=new(Room);//生成头结点
head->next=NULL;
q=head;//正位序插在表尾
while(i<=N){//从第一等级开始一立单链表
for(j=1;j<=NUM;j++){//进入该等级,建立不同房间
p=new(Room);
for(k=0;k p->person[k].sex=-1;//表示一个人也没有 p->person[k].age=0;//客人信息置为0 p->person[k].day=0; p->person[k].month=0; p->person[k].year=0; //名字无需初始化 p->person[k].bednumber=0;//该顾客的床号 } p->roomgrade=i;//该房间的基本信息初始化 p->roomnumber=j;//房间号 p->peoplein=0;//入住人数 for(h=0;h q->next=p; q=q->next; } i++; } q->next=NULL; return(head); } voidinit(Room*head)//初始化 { Room*p=head; inti,k; //p=head; while(p! =NULL) { for(k=0;k p->person[k].age=0; p->person[k].day=0; p->person[k].month=0; p->person[k].sex=-1; p->person[k].year=0;//顾客无需初始化 p->person[k].bednumber=0;//该顾客的床号 } p->peoplein=0;//房价基本信息初始化 for(i=0;i p->bed[i]=0; p=p->next;//下一个房间搜索 } printf("\n------操作成功! ------\n"); printf("**********************************************\n"); } voidcheckin(Room*head) {//订房间 Room*p; inti,j,bednumber=0,sex,roomgrade;// printf("\n------欢迎使用订房系统------\n"); printf("**********************************************\n"); //输入性别,及房间等级 //,年龄 stringname;intage,day,month,year; printf("请输入: "); cin>>name; intlen=name.length(); if(name[0]<65){ printf("Error! 请重新输入。 \n"); return; } printf("请输入年龄: "); scanf_s("%d",&age); printf("请输入性别(1为男,0为女): "); scanf_s("%d",&sex); printf("请输入房的截至日期: "); printf("年=");scanf_s("%d",&year); printf("月=");scanf_s("%d",&month); printf("日=");scanf_s("%d",&day); printf("请输入房间等级: (1-%d): ",N); scanf_s("%d",&roomgrade); p=head; intfangjianhao=0;//标记床号,房间号 intflag=0;//标记是否分配成功 while(p! =NULL){//一个房间一个房间搜索,订房 if(p->roomgrade==roomgrade){ for(i=1;i<=NUM;i++){//进入该等级,查找房间 for(j=0;j if(p->bed[j]==0){//查找到次床位 flag=1;//标记分配成功 bednumber=j+1;//标记床号 fangjianhao=p->roomnumber; p->person[j].name=name;//写入顾客信息 p->person[j].age=age; p->person[j].sex=sex; p->person[j].year=year; p->person[j].month=month; p->person[j].day=day; p->person[j].bednumber=j+1;//该顾客的床号 p->bed[j]=1;//标记此房间的词此床位已住人 p->peoplein++;//此房间的入住人数+1 break;//找到床位跳出循环 } if(flag==1)break; } if(flag==1)break; }//进入该等级,查找房间 if(flag==1)break; } p=p->next;//继续下一个房间的搜索 }//while() printf("**********************************************\n"); if(flag==0) printf("\n该等级的房间已满,请重新另外等级房间! \n"); if(flag==1) printf("\n您分配的房间信息为: \n房间等级: %d\n房间号: %d\n床号: %d\n",roomgrade,fangjianhao,bednumber); printf("**********************************************\n"); } voidcheckout(Room*head){//退房间 Room*p; introomnumber,roomgrade,bednumber,j; intflag=0;//标志位 printf("------欢迎使用退房系统------\n"); printf("**********************************************\n"); printf("请输入房间等级: "); scanf_s("%d",&roomgrade); printf("请输入房间号: "); scanf_s("%d",&roomnumber); printf("请输入床号: "); scanf_s("%d",&bednumber); p=head;//p标记头节点 while(p! =NULL){//搜索房间号,性别,房间等级 if(p->roomgrade==roomgrade&&p->roomnumber==roomnumber){ for(j=0;j if(p->person[j].bednumber==bednumber){//查找到此床位 flag=1;//标记查找成功 p->person[j].name="";//清除顾客信息 p->person[j].age=0; p->person[j].sex=-1; p->person[j].year=0; p->person[j].month=0; p->person[j].day=0; p->person[j].bednumber=0; p->bed[j]=0;//标记此房间的词此床位未住人 p->peoplein--;//此房间的入住人数-1 //p->roomnumber=0; break;//找到床位跳出循环 }if(flag==1)break; }if(flag==1)break; }if(flag==1)break; p=p->next;//继续下一个房间的搜索 } if(flag==1)printf("----------删除信息成功! ---------\n"); if(flag==0)printf("----------删除信息失败! ---------\n"); printf("**********************************************\n"); } voiddisplay(Room*head) {//显示房间信息 Room*p; inti,k; p=head; printf("\n\n--------已订房间查询--------\n\n"); printf("**********************************************\n"); while(p->next! =NULL){//搜索 if(p->roomgrade<=5&&p->roomgrade>=1) for(k=0;k if(p->person[k].bednumber! =0){ printf("\n房间等级: %d,房间号: %d,",p->roomgrade,p->roomnumber); printf("顾客: "); cout< printf(",顾客性别: %d该房间已住人数: %d,房间到期日期: %d年,%d月,%d日,",p->person[k].sex,p->peoplein,p->person[k].year,p->person[k].month,p->person[k].day); printf("该房间已住人的床号为: "); for(i=0;i if(p->bed[i]==1) printf("%d,",i+1); } } p=p->next;//继续下一个房间的搜索 } printf("\n**********************************************\n"); } voidmain() { intn,k=1;//k为判断循环的条件 Room*head; head=creat();//creat()返回room结构类型 while(k==1){ printf("欢迎您的光临,很高兴为您服务\n"); printf("------系统功能-------\n"); printf("1: 订房\n"); printf("2: 退房\n"); printf("3: 显示房间分配情况\n"); printf("4: 删除所有信息\n"); printf("5: 退出系统\n"); printf("请您选择功能(请输入1-5的数字): "); scanf_s("%d",&n); switch(n){ case1: checkin(head);break; case2: checkout(head);break; case3: display(head);break; case4: init(head);break; case5: k=0;break;//结束 default: printf("输入的信息错误! 请重新输入! ");break; } } } 5.程序截图: 6.实验总结 (1)本次课程设计的题目是模拟旅馆的一个功能——床位的分配与回收。 我采用的是链表和栈的结构形式进行编程,基本完成题目的要求,既对链表和栈的相关知识有了更加深刻的理解,而且又熟练了c语言编程。 (2)我们定义了一个顺序表来存储每一级房间的头结点。 然后义了三个结构体,房间节点的结构体,床位节点的结构体,客户节点的结构体,分别用来存放房间、床位、客户的相关信息。 然后用了链式存储结构的栈结构,分别为空房栈、已住房栈、空床位栈、已住床位栈。 (3)本次实验涉及到的主要是链表的和栈的运算,包括有链表的建立,插入,删除,栈主要是进栈,出栈,栈节点的查找等,进一步加深了对数据结构的了解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 旅馆 管理 系统 一个 功能 床位 分配 回收