《床位的分配与回收数据结构课程设计报告.doc》由会员分享,可在线阅读,更多相关《床位的分配与回收数据结构课程设计报告.doc(39页珍藏版)》请在三一办公上搜索。
1、模拟旅馆管理系统的一个功能-床位的分配与回收一、问题描述1.1问题的描述某旅馆有n个等级的房间,第i等级有ai个房间,每个等级有bi床位(1in)。试模拟旅馆管理系统中床位分配和回收的功能,设计能为单个旅客分配床位,在其离店便回收床位(供下次分配)的算法。1.2输入数据 对房间信息进行初始化,包括房间的类别、数量以及房间和床位的计费标准;分配时,输入旅客姓名、年龄、性别、到达日期和所需房间等级;回收时,输入房间等级、房间号和床位号。1.3输出数据分配成功时打印旅客姓名、年龄、到达日期、房间等级、房间号码和床位号码。分配不成功时,如所有等级均无床位,则打印“客满”信息;如旅客需要的等级均无空床位
2、,则打印“是否愿意更换等级?”的询问信息。若旅客愿意更换,则重新输入有关信息,再进行分配,否则分配工作结束。二、需求分析2.1需求分析经过分析,程序要有以下几个功能:程序启动的时候应该能够对旅馆的信息进行初始化,并且可以让不同的进行手动初始化;当客户到来的时候,可以登录客户的信息,并且根据旅馆的情况和客户的要求进行分配床位;当客户结账的时候,可以打印其账单,并且将床位回收;在进行输入信息的时候,应该有检查错误的功能,防止输入的信息超出正常范围。三、概要设计3.1功能模块的划分主函数初始化显示客户登记床位分配客户退房床位回收保存信息退出3.2功能模块的描述(1)初始化模块:应该包括两种初始化,第
3、一种是每次打开程序的时候,自动完成对旅馆信息的初始化。第二种是由用户输入旅馆的信息,完成旅馆信息的初始化。(2)显示模块:显示模块是人机交互的必要模块,用于显示主菜单、旅馆的当前住宿情况、床位分配情况、账单等等,方便用户进行下一步操作。(3)客户登记及床位分配模块:用来登记客户的信息以及床位的分配。(4)客户退房及床位回收模块:用来登记退房客户的信息以及床位的回收,住宿费的计算。(5)保存信息模块:用来保存旅馆的相关信息,包括手动初始化之后的客房信息,以及退出程序之前的保存工作。(6)退出:退出程序。3.3数据结构3.3.1主要采用的数据结构:链表和栈。(1)链表ADT List 数据对象:D
4、 ai | ai ElemSet, i=1,2,.,n, n0 数据关系:R1 | ,D, i=2,.,n 基本操作:InitList( &L )操作结果:构造一个空的线性表 L 。DestroyList( &L )初始条件:线性表 L 已存在。操作结果:销毁线性表 L 。ListEmpty( L )初始条件:线性表L已存在。操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE。ListLength( L )初始条件:线性表 L 已存在。操作结果:返回 L 中元素个数。PriorElem( L, cur_e, &pre_e )初始条件:线性表 L 已存在。操作结果:若 cur_e
5、是 L 中的数据元素,则用 pre_e 返回它的前驱,否则操作失败,pre_e 无定义。NextElem( L, cur_e, &next_e )初始条件:线性表 L 已存在。操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返回它的后继,否则操作失败,next_e 无定义。GetElem( L, i, &e )初始条件:线性表 L 已存在,1iLengthList(L)。操作结果:用 e 返回 L 中第 i 个元素的值。LocateElem( L, e, compare( ) )初始条件:线性表 L 已存在,compare( ) 是元素判定函数。操作结果:返回 L 中第1个
6、与 e 满足关系 compare( ) 的元素的位序。若这样的元素不存在,则返回值为0。ListTraverse(L, visit( )初始条件:线性表 L 已存在,visit( ) 为元素的访问函数。操作结果:依次对 L 的每个元素调用函数 visit( )。一旦 visit( ) 失败,则操作失败。ClearList( &L )初始条件:线性表 L 已存在。操作结果:将 L 重置为空表。PutElem( &L, i, &e )初始条件:线性表L已存在,1iLengthList(L)。操作结果:L 中第 i 个元素赋值同 e 的值。ListInsert( &L, i, e )初始条件:线性表
7、 L 已存在,1iLengthList(L)+1。操作结果:在 L 的第 i 个元素之前插入新的元素 e,L 的长度增1。ListDelete( &L, i, &e )初始条件:线性表 L 已存在且非空,1iLengthList(L)。操作结果:删除 L 的第 i 个元素,并用 e 返回其值,L 的长度减1。 ADT List(2) 栈ADT Stack 数据对象:Dai| aiElemSet, i=1,2,.,n, n0 数据关系:R1 | ai-1, ai-D, i=2,.,n 约定an端为栈顶,a1端为栈底。基本操作:InitStack(&S)操作结果:构造一个空栈 S。DestroyS
8、tack(&S)初始条件:栈 S 已存在。操作结果:栈 S 被销毁。ClearStack(&S)初始条件:栈 S 已存在。操作结果:将 S 清为空栈。StackEmpty(S)初始条件:栈 S 已存在。操作结果:若栈 S 为空栈,则返回TRUE,否则返回FALSE。StackLength(S)初始条件:栈 S 已存在。操作结果:返回栈 S 中元素个数,即栈的长度。GetTop(S, &e)初始条件:栈 S 已存在且非空。操作结果:用 e 返回S的栈顶元素。Push(&S, e)初始条件:栈 S 已存在。操作结果:插入元素 e 为新的栈顶元素。Pop(&S, &e)初始条件:栈 S 已存在且非空
9、。操作结果:删除 S 的栈顶元素,并用 e 返回其值。StackTraverse(S, visit( )初始条件:栈 S 已存在且非空,visit( )为元素的访问函数。操作结果:从栈底到栈顶依次对S的每个元素调用函数visit( ),一旦visit( )失败,则操作失败。 ADT Stack四、详细设计4.1具体数据结构(1)每级房间的头结点采用一个顺序表s=(),其中,顺序存放第1n等级房间的头结点;存放内容如下所示:可以分配的男床位总数可以分配的女床位总数000(2)每级房间的头结点结构如下图:可以分配的男床位数可以分配的女床位数aibipriceTTOPRLINKtypedef str
10、uct ROOMHEAD /每个级别的房间的头结点结构体int women_num; /每个级别可以分配的女床数目int men_num; /每个级别可以分配的男床数目int a; /每个级别含有的房间数目,头结点此处用来存储房间级别数目int b; /每个房间含有的床位数int price; /每一级别房间的价格room * TTOP; /空房栈的栈顶room * RLINK; /指向已住房间的栈顶 roomhead;(3)房间节点的结构:性别房间号剩余空床数目BTOPBTOP1RILNKtypedef struct ROOM /房间信息结构体int sex; /非配的性别 0表示房空 1代
11、表分配/给了男性 2代表分配给了女性int room_num; /房间号码int bed_num; /这个房间里还有的空床位数目bed * BTOP; /指向这个房间里的空床位栈结构bed * BTOP1; /已经住人的床位栈结构,用来和客户进/行连接struct ROOM * RLINK; /指向下一个房间 room;(4)床位节点的结构:床位号对应的客户信息的地址BLINKtypedef struct BED /床位的信息,用来构成空床的栈结构int num; /床位的号码consumer * data; /每个床位对应的客户信息struct BED * BLINK; /指向下一个空床位
12、bed;(5)客户节点的结构:姓名年龄性别日期等级房间号床位号typedef struct CONSUMER /客户的信息char name20; /客户姓名int age; /客户年龄char sex; /客户性别 w-women女 m-men男int data3; /日期int rank; /住房的等级int room_num;/分配好的房间号码int bed_num; /分配好的床位号码 consumer;4.2程序流程图(1) void menu()主菜单打印函数1初始化户信息入住选项退房选项保存住宿情况开始主菜单界面输入选择(1-6)初始化户信息2住宿情况3456(2)char In
13、itiate1()初始化函数1,用来每次重启之后的初始化开始打开data.data文件YESNO读取文件信息aj,bj跳回主菜单,选择1,存储信息初始化s+j头结点信息初始化s+j等级房间信息初始化s+j等级房间床位信息j+janb初始化旅馆住房信息表结束(3)void Initiate2()初始化函数2,用来用户的手动初始化开始输入房间级别rank_numjRank_numT初始化s指针数组初始化j等级头指针TFJb)TnbFTF床位初始化,空床位入栈打印初始化信息调用save()函数保存结束(4)char CheckIn();/登记函数开始调用Getin(p)函数,P-sexP-sexs-
14、women_num=0s-men_num=0Flag1调用Checkin()结束该房间出空房栈入住房栈中打印分配表Flag1该房间出空房栈入住房栈中Flag1调用Checking()Flag1结束TM2121122TW输入flag1输入flag1输入flag1输入flag(5)void Getin( consumer * p)客户信息的输入开始输入客户的信息存储信息到data.data文件姓名性别年龄要求房间等级结束(6) print1( consumer * p)此打印函数用于打印用户刚刚登陆的信息,以确认输入信息是否正确开始Consumer *pp-sex男客户信息表女客户信息表输入inf
15、Flag调用Getin(p)结束MW214.3代码描述(1)主函数main()char s; /定义n,来获取用户的操作信息Initiate1(); /每次重新启动的时候初始化客房信息while(1)menu(); /打印主菜单scanf(%d,&s); /获取用户的操作信息while(s4|s1)printf(您输入的信息有错,请重新输入您要进行的操作:);scanf(%d,&s);switch(s)case 1: Initiate2(); /调用初始化客房信息函数,由用户输入/房间级别数目n,break; /还有每一个级别所包含的房间数ai/以及每个房间包含的床位bicase 2: Pri
16、ntdata(); /调用住宿登陆信息函数break;case 3: CheckIn(); /调用退房函数break;case 4: CheckOut(); /调用退房函数break;case 5: Save(); /保存信息break;case 6: exit(0);break;(2)初始化自动初始化char Initiate1()FILE * fp; /定义文件工作指针,指向data.datFILE * fp1; /定义文件工作指针,指向consumer.datconsumer * con;int k,k1,j,rank_num,women_num,men_num; /循环变量和临时变量i
17、nt a4,b4,price4; /存储临时变量int m,n; /循环变量,循环技术的时候使用room * p; /工作指针,用来衔接指针之间的连接工作bed * q; /工作指针,用来衔接指针之间的连接工作if(fp=fopen(data.dat,r)=NULL|fscanf(fp,%d,&rank_num)=EOF) /防止打开文件时出错printf(您是首次使用,请您按Enter键进入主菜单后输入1并初始化客房信息!n);/提示信息getchar(); /等待读取enter键return 0; /返回0else /正常打开之后,读出各个数据for(k=1;ka=rank_num; /将
18、房间级别的数目存储到头结点的a中s-b=0; /默认为0s-men_num=men_num; /总的男床位可分配数目s-women_num=women_num; /总的女床位可分配数目s-price=0; /默认为0值s-TTOP=NULL; /不用的指针初始化为空值s-RLINK=NULL; /不用的指针赋空值s-room_num=0;for(j=1;jwomen_num=women_num;/每一级房间可以分配的女床总数(s+j)-men_num=men_num;/每一级房间可以分配的男床总数(s+j)-a=aj; /输入每一级的房间数目(s+j)-b=bj; /输入每一个房间的床位数目(
19、s+j)-price=pricej; /输入房间间信息fscanf(fp1,%d,&m); /剩余的空房间数目(s+j)-room_num=m;if(m=0)(s+j)-TTOP=NULL; /若没有空房间,空房栈的栈顶赋空值if(m!=0) /若不为空值,建立空房栈(s+j)-TTOP=(room *)malloc(sizeof(room);/分配空间p=(s+j)-TTOP; /利用p来衔接下面的建栈过程p-sex=0; /初始化为0,代表为空房间fscanf(fp1,%d,&p-room_num) /对房间进行编号,如100p-bed_num=(s+j)-b; /初始化房间可以分配的床位
20、数目/初始化床位信息p-BTOP=(bed *)malloc(sizeof(bed);/建立空床的栈结构q=p-BTOP; /利用q来衔接建立栈结构的过程q-num=1; /床位号码q-data=NULL; /初始床位对应的客户信息为空q-BLINK=NULL;for(n=1;nBLINK=(bed *)malloc(sizeof(bed); /分配存储空间q=q-BLINK; /将工作指针q后移q-num=n+1; /房间号码q-data=NULL; /初始的客户信息为空q-BLINK=NULL; /最后一个指针赋空值p-RLINK=NULL; /最后一个指针赋空值for(k=1;kRLIN
21、K=(room *)malloc(sizeof(room);/分配存储空间p=p-RLINK; /将工作指针p后移p-sex=0; /初始房间为空fscanf(fp1,%d,&p-room_num);/对房间进行编号,如100,101,102,202等等p-bed_num=(s+j)-b; /房间可以分配的床位数目p-BTOP=(bed *)malloc(sizeof(bed);/建立空床的栈结构q=p-BTOP; /利用q来衔接建立栈结构的过程q-num=1; /床位号码q-data=NULL; /初始床位对应的床位信息为空q-BLINK=NULL;for(n=1;nb;n+)/对每一个床位
22、进行分配存储空间并进行初始化信息q-BLINK=(bed *)malloc(sizeof(bed); /分配存储空间q=q-BLINK; /讲工作指针q后移q-num=n+1; /房间号码q-data=NULL; /初始的客户信息为空q-BLINK=NULL; /最后一个指针赋空值p-BTOP1=NULL; /最后一个指针赋空值p-RLINK=NULL; /最后一个指针赋空值if(s+j)-a-m=0) /如果全是空房间,那么已住房间栈为空(s+j)-RLINK=NULL; /栈顶赋空值if(s+j)-a-m!=0) /如果有已住的房间,建立已住房间的栈结构(s+j)-RLINK=(room
23、*)malloc(sizeof(room);/对于每一级房间,构建一个已住房间栈结构p=(s+j)-RLINK; /利用p来衔接下面的建栈过程fscanf(fp1,%d,%d,%d,&(p-sex),&(p-room_num),&(p-bed_num);/每个房间的性别,房间号,现有的空床位数目if(p-bed_num=0) /如果空床位数目为0,空床位栈写空p-BTOP=NULL; /栈顶赋空值if(p-bed_num!=0) /如果空床位不为0,建立空床栈结构p-BTOP=(bed *)malloc(sizeof(bed);/建立空床的栈结构q=p-BTOP; /利用q来衔接建立栈结构的过
24、程fscanf(fp1,%d,&q-num); /床位号码q-data=NULL; /初始床位对应的客户信息为空for(n=1;nbed_num;n+)q-BLINK=(bed *)malloc(sizeof(bed); /分配空间q=q-BLINK; /指针后移fscanf(fp1,%d,&q-num); /床位号码q-data=NULL; /初始床位对应的客户信息为空q-BLINK=NULL; /最后一个指针赋空值if(s+j)-b-p-bed_num=0) /如果非空床位数目为0,赋空值p-BTOP1=NULL; /赋空值if(s+j)-b-p-bed_num!=0)/如果不为0,就要建
25、立非空床位的栈结构p-BTOP1=(bed *)malloc(sizeof(bed);/建立非空床的栈结构q=p-BTOP1; /利用q来衔接建立栈结构的过程con=(consumer * )malloc(sizeof(consumer);/分配空间fscanf(fp1,%s%d,%d-%d-%d,%d,con-name,&(con-age),&(con-data0),&(con-data1),&(con-data2),&(con-bed_num);/读出信息switch(p-sex) /初始化客户的性别case 1 : con-sex=m;break;case 2: con-sex=w;br
26、eak;con-rank=j; /所住的房间等级con-room_num=p-room_num; /所住的房间号码q-num=con-bed_num; /给床位号赋初值q-data=con; /床位指向对应的客户q-BLINK=NULL; /指针赋空值for(n=1;nb-p-bed_num);n+)/其他的已经住人的床位初始化q-BLINK=(bed *)malloc(sizeof(bed); /分配存储空间q=q-BLINK; /工作指针后移con=(consumer * )malloc(sizeof(consumer);/为客户的指针分配存储空间fscanf(fp1,%s%d,%d-%d
27、-%d,%d,con-name,&(con-age),&(con-data0),&(con-data1),&(con-data2),&(con-bed_num);/读取信息switch(p-sex) /初始化客户的性别case 1 : con-sex=m;break;case 2: con-sex=w;break;con-rank=j; /初始化客户住的房间等级con-room_num=p-room_num; /初始化客户住的房间号码q-num=con-bed_num;/初始化床位号码q-data=con; /床位指向客户q-BLINK=NULL; /最后一个指针赋空值for(k1=1;k1a
28、-m;k1+)p-RLINK=(room *)malloc(sizeof(room);/对于每一级房间,构建一个已住房间栈结构p=p-RLINK; /利用p来衔接下面的建栈过程fscanf(fp1,%d,%d,%d,&(p-sex),&(p-room_num),&(p-bed_num);/每个房间的性别,房间号,现有的空床位数目if(p-bed_num=0) /如果空床位数目为0,空床位栈写空p-BTOP=NULL; /栈顶赋空值if(p-bed_num!=0) /如果空床位不为0,建立空床栈结构p-BTOP=(bed *)malloc(sizeof(bed);/建立空床的栈结构q=p-BTO
29、P; /利用q来衔接建立栈结构的过程fscanf(fp1,%d,&q-num); /床位号码q-data=NULL; /初始床位对应的客户信息为空for(n=1;nbed_num;n+)q-BLINK=(bed *)malloc(sizeof(bed); /分配空间q=q-BLINK; /指针后移fscanf(fp1,%d,&q-num); /床位号码q-data=NULL; /初始床位对应的客户信息为空q-BLINK=NULL; /最后一个指针赋空值if(s+j)-b-p-bed_num=0) /如果非空床位数目为0,赋空值p-BTOP1=NULL; /赋空值if(s+j)-b-p-bed_
30、num!=0)/如果不为0,就要建立非空床位的栈结构p-BTOP1=(bed *)malloc(sizeof(bed);/建立非空床的栈结构q=p-BTOP1; /利用q来衔接建立栈结构的过程con=(consumer * )malloc(sizeof(consumer);/分配空间fscanf(fp1,%s%d,%d-%d-%d,%d,con-name,&(con-age),&(con-data0),&(con-data1),&(con-data2),&(con-bed_num);/读出信息switch(p-sex) /初始化客户的性别case 1 : con-sex=m;break;cas
31、e 2: con-sex=w;break;con-rank=j; /所住的房间等级con-room_num=p-room_num; /所住的房间号码q-num=con-bed_num; /给床位号赋初值q-data=con; /床位指向对应的客户q-BLINK=NULL; /指针赋空值for(n=1;nb-p-bed_num);n+)/其他的已经住人的床位初始化q-BLINK=(bed *)malloc(sizeof(bed); /分配存储空间q=q-BLINK; /工作指针后移con=(consumer * )malloc(sizeof(consumer);/为客户的指针分配存储空间fsca
32、nf(fp1,%s%d,%d-%d-%d,%d,con-name,&(con-age),&(con-data0),&(con-data1),&(con-data2),&(con-bed_num);/读取信息switch(p-sex) /初始化客户的性别case 1 : con-sex=m;break;case 2: con-sex=w;break;con-rank=j; /初始化客户住的房间等级con-room_num=p-room_num; /初始化客户住的房间号码q-num=con-bed_num;/初始化床位号码q-data=con; /床位指向客户q-BLINK=NULL; /最后一个
33、指针赋空值p-RLINK=NULL; /最后一个指针赋空值system(cls); /清屏并打印刚刚用户输入的信息printf(成功初始化旅馆客房信息,请按Enter键继续!);getchar();return 1;手动初始化void Initiate2()int rank_num; /用来存储房间级别数目int j; /循环变量,循环计数的时候/使用system(cls); /清除屏幕printf(请输入您的旅馆中的房间等级的数目:); /提醒用户/的信息scanf(%d,&rank_num); /输入房间级别的数目s=(roomhead *)malloc(rank_num+1)*sizeo
34、f(roomhead); /为s分配存储空间s-a=rank_num; /将房间级别的数目存储/到头结点的a中for(j=1;ja); /输入每一级的房间数目printf(请输入第%d级每间房间中的床位数目:,j);scanf(%d,&(s+j)-b); /输入每一个房间的床位数目printf(请输入每一级房间的单价(如30元,请输入30):);scanf(%d,&(s+j)-price); /输入单间信息(s+j)-women_num=(s+j)-a)*(s+j)-b);/可分配女床总数(s+j)-men_num=(s+j)-a)*(s+j)-b);/可分配的男床数目s-women_num+
35、=(s+j)-women_num;/改变总数目s-men_num+=(s+j)-men_num; /改变总数目(s+j)-TTOP=(room *)malloc(sizeof(room);/建立空房栈p=(s+j)-TTOP; /开始建栈p-sex=0; /初始化为0,代表为空房间p-room_num=j*100; /对房间进行编号,如100,101,102,202p-bed_num=(s+j)-b; /初始化房间可以分配的床位数目p-BTOP=(bed *)malloc(sizeof(bed);/建立空床的栈结构q=p-BTOP; /利用q来衔接建立栈结构的过程q-num=0; /床位号码q-data=NULL; /初始床位对应的床位信息为空for(n=1;nb;n+)/对每一个床位进行