床位的分配与回收数据结构课程设计报告.doc
《床位的分配与回收数据结构课程设计报告.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; /将
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 床位 分配 回收 数据结构 课程设计 报告

链接地址:https://www.31ppt.com/p-3780076.html