数据结构客房管理系统实验报告
- 格式:doc
- 大小:640.25 KB
- 文档页数:22
沈阳理工大学应用技术学院《数据结构》综合实验报告班级:113012学号:********姓名:***成绩:实验一一、实验题目用数据结构设计一个小型管理信息系统二、实验时间地点日期:2012年11月3日实验地点:6#503三、实验目的本课程设计任务的目的是要求学生按照分析、设计、编码、调试和测试的软件开发过程独立完成,必须利用数据结构实现管理系统,以及C语言算法的掌握,并能最终实现本系统的功能要求,通过这个程序可以学习到以前调试短程序没有的经验。
四、实验内容宾馆订房和退房系统设计1)实现宾馆的订房业务2)实现退房业务3)实现统计业务4)实现查询业务五、预习内容六、算法描述(流程图与说明)1.程序运行流程图2.入住流程图统计当前客房入住人遍历各等不为空遍历个房间不为空遍历各床位不为空计数器conut++打印信息返回主菜单七、运行结果(抓图)与分析(1)程序开始运行:1. 首先初始化旅店信息,将房间分为几个等级:2. 各个等级房间含有的最多床位数:(2)进入程序主菜单(3)录入客人信息:(3)查询客人信息(4)统计客人信息:(5)退房业务:八、源程序代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <malloc.h>typedef struct customer //客人结构体{char name[15];int age;int sex;int lv;int bed_num;int year;int month;int day;struct customer* next;}cus;typedef struct hotel_lv //宾馆结构体{int lv_num;struct hotel_lv *next;struct fangjian *fj_next;}hotel_lv;typedef struct fangjian //房间结构体{int fj_num;int max;int mem_num;struct fangjian *next;struct customer *cus_next;}fangjian;void Init(hotel_lv *L) //初始化函数{int i,j,k,l;hotel_lv *p,*q;fangjian *p1, *p2,*p3;printf ("请输入房间分为几个等级:\n");scanf ("%d",&j); //输入房间分为几个等级q=L;for (i=1;i<=j;i++){p= (hotel_lv*) malloc (sizeof(hotel_lv));q->next=p;p->lv_num=i; //给房间等级赋值printf ("请输入房间等级为%d的房间个数:\n",p->lv_num);scanf ("%d",&l); //输入该等级房间的数目if (l==0)continue;else //初始化该房间的床位{p2= (fangjian*)malloc(sizeof(fangjian));p2->fj_num=1;printf ("请输入房间等级为%d房间号为l的床位个数的最大值:\n",p->lv_num,k);scanf ("%d",&(p2->max)); //输入房间l的床位数目p2->mem_num=0; //该房间内当前人数赋值为0p->fj_next=p2;p3=p2;for (k=2;k<=1;k++){p1=(fangjian*)malloc(sizeof(fangjian));p3->next=p1;p1->fj_num=k;printf ("请输入房间等级为%d房间号为%d的床位的个数的最大值;\n",p->lv_num,k);scanf ("%d",&(p1->max)); //输入房间K的床位数目p1->mem_num=0; //该房间内的当前人数赋值为0p3=p1;}p3->next=NULL; //房间链表尾指针为空}q=q->next;}q->next=NULL; //等级链表尾指针域为空system ("pause");}int full (hotel_lv *L) //判断是否客满{hotel_lv *l;fangjian *f;l=L->next;while (l!=NULL){f=l->fj_next;while (f!=NULL){if (f->mem_num!=f->max) //如果有房间的当前人数不等于房间的最大人数,则返回0return 0;elsef=f->next;}l=l->next;}if (!l) //否则返回1return 1;elsereturn 0;}void Pr_divide(cus *p,fangjian *q) //打印客人信息{printf("********************************************************************\n\n");printf (" 宾馆房间分配系统\n\n");printf("********************************************************************\n\n");printf ("| 姓名| 性别| 年龄| 等级号| 房间号| 床位号| 入住时间|\n");printf ("| %6s | %d | %2d | %2d | %2d | %2d | %4d-%2d-%2d | \n", p->name,p->sex,p->age,p->lv,q->fj_num,p->bed_num,p->year,p->month,p->day);printf("*********************************************************************\n");printf ("\n");system ("pause");}void input (hotel_lv *L) //入住函数{char c;int i,lv;fangjian *p1;cus *s,*p2,*p3;hotel_lv *l;l=L->next;if (full (L)) //判断是否客满{printf ("房间已满,不能入住。
\n");system ("pause");}else{printf ("请输入旅客所需的房间等级:");scanf ("%d",&lv);while (l!=NULL) //等级不为空时{if (l->lv_num!=lv)l=l->next;else //有此等级时{p1=l->fj_next;while (p1!=NULL) //房间不为空{if (p1->mem_num==p1->max) //是否有空床位{p1=p1->next;if (p1==NULL){getchar ();printf ("此等级为%d的所有房间均无空位\n是否愿意更好等级[y/n]",lv);scanf ("%c",&c); //选择if (c=='y')input (L);elsereturn;}}else //客人信息登记{ //因为床位没有设置头结点,所以对于第一个结点要特别判断if(p1->mem_num==0){s=(cus*)malloc(sizeof(cus));printf ("\n---------------------------------\n");printf ("\n 入住客人信息:");printf("\n 请输入客人的姓名:");scanf ("%s",s->name);printf("\n 请输入客人年龄:");scanf ("%d",&(s->age));printf ("\n 请输入客人的性别(如:男1;女0):");scanf ("%d",&(s->sex));printf ("\n 请输入客人入住的时间(如:1990 10 11):");scanf ("%d %d %d",&s->year,&s->month,&s->day);s->lv=lv; //指针修改p1->cus_next=s;p1->mem_num++; //房间当前最大人数加1s->bed_num=1;s->next=NULL; //尾指针设置为空Pr_divide (s,p1); //打印房间分配表system ("cls");break;}else{p2=p1->cus_next;p3=p2;i=1;while (i<=p1->mem_num){if (i==p3->bed_num){p3=p3->next;i++;}else{i++;break;}}if (p3==NULL){s=(cus*)malloc(sizeof(cus));printf("\n--------------------------------------\n");printf ("\n 入住客人信息:");printf("\n 请输入客人的姓名:");scanf ("%s",s->name);printf("\n 请输入客人年龄:");scanf ("%d",&(s->age));printf ("\n 请输入客人的性别(如:男1;女0):");scanf ("%d",&(s->sex));printf ("\n 请输入客人入住的时间(如:1990 10 11):");scanf ("%d %d %d",&s->year,&s->month,&s->day);s->lv=lv;while (p2->next!=p3)p2=p2->next;p2->next=s;p1->mem_num++;s->bed_num=i;s->next=NULL;Pr_divide (s,p1);system("cls");break;}else{while(p2->bed_num==i)p2=p2->next;s=(cus*)malloc(sizeof(cus));printf("\n--------------------------------------\n");printf ("\n 入住客人信息:");printf("\n 请输入客人的姓名:");scanf ("%s",s->name);printf("\n 请输入客人年龄:");scanf ("%d",&(s->age));printf ("\n 请输入客人的性别(如:男1;女0):");scanf ("%d",&(s->sex));printf ("\n 请输入客人入住的时间(如:1990 10 11):");scanf ("%d %d %d",&s->year,&s->month,&s->day);s->lv=lv;s->next=p2->next;p2->next=s;p1->mem_num++;s->bed_num=i-1;Pr_divide(s,p1);system("cls");break;}}}}break;}}}}cus* Delete (hotel_lv *L) //退房{cus *p,*q; c har c;fangjian *f;int lv,hotel_num,bed_num;hotel_lv *l;l=L->next;printf ("请输入该退房客人的房间等级号码:\n");scanf ("%d",&lv); //输入退房人的房间等级getchar ();while (l!=NULL){if (l->lv_num!=lv)l=l->next;else //找到该等级{f=l->fj_next;printf("请输入退房客人的房间号码:\n");scanf ("%d",&hotel_num); //输入退房人的房间号码getchar ();while (f!=NULL){if (f->fj_num!=hotel_num)f=f->next;else //找到该房间{p=f->cus_next;q=f->cus_next;printf("请输入该客人的床位号:\n");scanf ("%d",&bed_num); //输入退放入的床位号getchar ();while (q!=NULL){if (q->bed_num!=bed_num)q=q->next;else //查找该床位{if (bed_num==1) //因为床位没有设置头结点,所以对第一个结点要特别判断{ //直接打印客人信息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') //做出是否退房的选择{f->mem_num--;printf ("退房成功!\n");system ("pause");return (q);}elsereturn NULL;}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') //做出是否退房的选择{f->mem_num--;printf ("退房成功!\n");system ("pause");return (q);}elsereturn NULL;}}}if (q=NULL) //如果该房间内床位为空{printf ("没有找到该床位,请核对信息后重新输入。