#include #include#include#include
intlevels,rooms,beds;
typedefstruct tm *tim; //time函数库里的结构体//床
typedef structbed
{char name[20];charsex;intage;intfull;
tim p;//时间
} bed;//房间
typedef structroom
{intbeds;intlevel;intnum;
bed Bed[10];int full; //满了则为1;
struct room *next;
} room;//房间等级
typedef structlevel
{introoms;intlevelNum;intfull;
room*fRoom; //房间的头地址;
struct level *next;
} level;//宾馆
structhotel
{intlevels;
level*fLevel; //level的头地址;
} myhotel; //创建一个旅馆;
int oppositeSex(room *guestRoom,charsex);int ifFull(intdlevel);//入住
int creat(char name[],char sex,int age,tim p,intselectedLevel)
{int count_room=0; //统计一个level中的房间数;//在指定的Level中给他找一个房间,并在Bed中把他的信息都放进去;
level *guestLevel = myhotel.fLevel->next; //头结点不能用,得用他后面的第一个有意义的结点
room *guestRoom=NULL;//先查看这个level是否满人了
while(ifFull(selectedLevel))
{
printf("这个level人已经满了,请再选一个level:");
scanf("%d",&selectedLevel);
}int guestBed=0;int count=0;while(guestLevel!=NULL)
{if(guestLevel->levelNum!=selectedLevel) //选择适合客人的level的指针;
{
guestLevel=guestLevel->next;
}else{
guestRoom= guestLevel->fRoom->next; //获得这个level里所有房间的头指针//找到一个有空位置的房间;
while(guestRoom->full)
guestRoom=guestRoom->next;//看房间里是否有异性
while(!oppositeSex(guestRoom,sex))
{
guestRoom=guestRoom->next; //不能接受就换下一个房间
}//客人已经找到适合的房间了,现在找一个空床位
for(int i=0; ibeds; i++)
{if(!guestRoom->Bed[i].full)
{
guestBed= i; //找到了适合客人的空床
break;
}
}//将客人的信息填入这个床的信息中
strcpy(guestRoom->Bed[guestBed].name,name);
guestRoom->Bed[guestBed].sex =sex;
guestRoom->Bed[guestBed].age =age;
guestRoom->Bed[guestBed].p =p;
guestRoom->Bed[guestBed].full = 1;//验证房间里是否满人,满人则full变1,未满则full变0
for(int i=0; ibeds; i++)
{if(guestRoom->Bed[i].full)
count++;
}if(count==guestRoom->beds)
guestRoom->full=1;elseguestRoom->full=0;break; //跳出循环
}
}
printInfo(guestRoom,guestBed);
}void printInfo(room *groom,intbed)
{
printf("**************************************************");
printf("* Infomation of Guest");
printf("* Name:%s",groom->Bed[bed].name);
printf("* Sex:%c",groom->Bed[bed].sex);
printf("* Age:%d",groom->Bed[bed].age);
printf("* 门牌号:%d0%d床号:%d",groom->level,groom->num,bed);
printf("* Time OF Checking in:%d-%d-%d %d:%d:%d",1900+groom->Bed[bed].p->tm_year,1+groom->Bed[bed].p->tm_mon,groom->Bed[bed].p->tm_mday,
groom->Bed[bed].p->tm_hour,groom->Bed[bed].p->tm_min,groom->Bed[bed].p->tm_sec);
printf("**************************************************");
}//输出所有房间
voidprintAll()
{
level*guestLevel = myhotel.fLevel->next; //头结点不能用,得用他后面的第一个有意义的结点
room *guestRoom=NULL;while(guestLevel!=NULL)
{
guestRoom=guestLevel->fRoom->next;while(guestRoom!=NULL)
{for(int i=0; ibeds; i++)
{if(guestRoom->Bed[i].full==1)
printInfo(guestRoom,i);
}
guestRoom=guestRoom->next;
}
guestLevel=guestLevel->next;
}
}//退房
void checkOut(int droom,intbed)
{int outLevel = (int)droom/100;int outroom = (int)droom%100;
level*guestLevel = myhotel.fLevel->next;
room*guestRoom=NULL;while(guestLevel!=NULL)
{if(guestLevel->levelNum!=outLevel) //选择适合客人的level的指针;
guestLevel=guestLevel->next;else{
guestRoom= guestLevel->fRoom->next;while(guestRoom->num!=outroom)
guestRoom=guestRoom->next;
guestRoom->Bed[bed].full=0;
guestRoom->full=0;break;
}
}
printf("已成功退房!");
}//查询
void Query(int droom,intbed)
{int outLevel = (int)droom/100;int outroom = (int)droom%100;
level*guestLevel = myhotel.fLevel->next;
room*guestRoom=NULL;while(guestLevel!=NULL)
{if(guestLevel->levelNum!=outLevel) //选择适合客人的level的指针;
guestLevel=guestLevel->next;else{
guestRoom= guestLevel->fRoom->next;while(guestRoom->num!=outroom)
guestRoom=guestRoom->next;
printInfo(guestRoom,bed);break;
}
}
}//查看这个楼层是否满人
int ifFull(intdLevel)
{int count_room=0;
level*guestLevel = myhotel.fLevel->next; //头结点不能用,得用他后面的第一个有意义的结点
room *guestRoom =NULL;while(guestLevel!=NULL)
{if(guestLevel->levelNum!=dLevel) //进入指定的楼层;
{
guestLevel=guestLevel->next;
}else{if(guestLevel->full) //如果满人了,直接返回1
return 1;else{
guestRoom= guestLevel->fRoom->next; //获得这个level的第一个房间
for(int i=0; irooms; i++)
{if(guestRoom->full)
count_room++; //遍历每个房间
guestRoom=guestRoom->next;
}if(count_room==guestLevel->rooms) //如果满人的房间数=这个level的指定房间数,则房间数已满,使level=1
{
guestLevel->full=1;return 1;
}elseguestLevel->full=0;break;
}
}
}return 0;
}//查看房间里是否有异性,并返回1或0;
int oppositeSex(room *guestRoom,charsex)
{int could=1;//如果这个房间有人
for(int i=0; i<10; i++)
{if(guestRoom->Bed[i].full)
{if(guestRoom->Bed[i].sex!=sex) //如果房间里有异性,询问其能否接受;
{
printf("Could you stand having the opposite sex in the room?(Yes:1 or No:0)");
scanf("%d",&could);returncould;
}
}
}return could; //如果循环结束没有触发if,则房间里没有异性,默认接受
}intmain()
{int select;
room*findRoom,*r;
level*findLevel,*l;//输入旅馆的基本信息
printf("How many levels does Hotel have?:");
scanf("%d",&levels);
printf("How many rooms does a level have?:");
scanf("%d",&rooms);
printf("How many beds does a room have?:");
scanf("%d",&beds);
printf("%d %d %d",levels,rooms,beds);
findLevel= (level *)malloc(sizeof(level)); //level中的头节点;
findLevel->fRoom =NULL;
findLevel->next =NULL;//健全旅馆信息
myhotel.levels=levels;
myhotel.fLevel=findLevel;for(int i=0; i
{
findRoom= (room*)malloc(sizeof(room)); //room中的头节点;
findRoom->next =NULL;//建立level链表
l=(level *)malloc(sizeof(level));
l->fRoom = findRoom; //将每一个level里的房间链表中的头节点的地址赋给fRoom;
l->rooms=rooms; //将房间数赋给Level;
l->full=0;
l->levelNum=i+1;
findLevel->next=l;
findLevel=l;//建立room链表
for(int j=1; j<=rooms; j++)
{
r=(room*)malloc(sizeof(room));for(int k=0; k
{
r->Bed[k].full=0;
}
r->full=0; //房间初始的时候都设为未满;
r->level=i+1; //房间level;
r->beds=beds;
r->num=j; //房间号,用它和Level创建门牌号;
findRoom->next=r; //将新结点接在头节点的后面;
findRoom=r; //头节点变为下一个结点;
}
r->next=NULL;
}
l->next=NULL;while(1)
{
printf("********************HOTEL*************************");
printf("*----------------1>Check In----------------------*");
printf("*----------------2>Check Out---------------------*");
printf("*----------------3>PrintAll----------------------*");
printf("*----------------4>Query-------------------------*");
printf("*----------------5>Exit--------------------------*");
printf("------------Please Input Number-------------------");int roomNum=0, bedNum=0;intlevel,age;charsex;char name[20],date[20];
scanf("%d",&select);switch(select)
{case 1://输入基本信息
printf("Please Input Your Information:");
printf("Name:");
scanf("%s",name);
printf("Room Level(1-%d):",levels);
scanf("%d",&level);
printf("Age:");
scanf("%d",&age);
printf("Sex(M or F):");
getchar();
scanf("%c",&sex);//获得时间
time_t t;
tim p;
time(&t);
p=localtime(&t);//获得当地的时间
creat(name,sex,age,p,level);break;case 2:
printf("请输入要退的房间号:");
scanf("%d",&roomNum);
printf("请输入要退的床号:");
scanf("%d",&bedNum);
checkOut(roomNum,bedNum);break;case 3:
printAll();break;case 4:
printf("请输入要查询的房间号:");
scanf("%d",&roomNum);
printf("请输入要查询的床号:");
scanf("%d",&bedNum);
Query(roomNum,bedNum);break;case 5:
printf("Exited Successfully!.");return 0;default:break;
}
}return 0;
}