问题如下:
*****************************************************************************
某客店有N个等级的房间,第k级客房有A(k)个,每个房间有B(k)个单人床,以菜单:床位分配,查找,统计,调用方式设计为单身旅客分配床位以及离店时收回床位的程序。要求分配成功时,印出旅客姓名、年龄、性别、到达日期、客房等级、房间号及床位号;分配不成功时,允许更改房间等级,若不更改等级,印出“满客”提示。
#考虑性别
***********************************************************
#include <stdio.h> #include <stdlib.h> #include<string.h> #include<time.h> int levels,rooms,beds; typedef struct tm *tim; //time函数库里的结构体 //床 typedef struct bed { char name[20]; char sex; int age; int full; tim p; //时间 } bed; //房间 typedef struct room { int beds; int level; int num; bed Bed[10]; int full; //满了则为1; struct room *next; } room; //房间等级 typedef struct level { int rooms; int levelNum; int full; room *fRoom; //房间的头地址; struct level *next; } level; //宾馆 struct hotel { int levels; level *fLevel; //level的头地址; } myhotel; //创建一个旅馆; int oppositeSex(room *guestRoom,char sex); int ifFull(int dlevel); //入住 int creat(char name[],char sex,int age,tim p,int selectedLevel) { int count_room=0; //统计一个level中的房间数; //在指定的Level中给他找一个房间,并在Bed中把他的信息都放进去; level *guestLevel = myhotel.fLevel->next; //头结点不能用,得用他后面的第一个有意义的结点 room *guestRoom=NULL; //先查看这个level是否满人了 while(ifFull(selectedLevel)) { printf("这个level人已经满了,请再选一个level:\n"); 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; i<guestRoom->beds; 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; i<guestRoom->beds; i++) { if(guestRoom->Bed[i].full) count++; } if(count==guestRoom->beds) guestRoom->full=1; else guestRoom->full=0; break; //跳出循环 } } printInfo(guestRoom,guestBed); } void printInfo(room *groom,int bed) { printf("**************************************************\n"); printf("* Infomation of Guest \n"); printf("* Name:%s \n",groom->Bed[bed].name); printf("* Sex:%c \n",groom->Bed[bed].sex); printf("* Age:%d \n",groom->Bed[bed].age); printf("* 门牌号:%d0%d\t床号:%d \n",groom->level,groom->num,bed); printf("* Time OF Checking in:%d-%d-%d %d:%d:%d \n", 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("**************************************************\n"); } //输出所有房间 void printAll() { level *guestLevel = myhotel.fLevel->next; //头结点不能用,得用他后面的第一个有意义的结点 room *guestRoom=NULL; while(guestLevel!=NULL) { guestRoom=guestLevel->fRoom->next; while(guestRoom!=NULL) { for(int i=0; i<guestRoom->beds; i++) { if(guestRoom->Bed[i].full==1) printInfo(guestRoom,i); } guestRoom=guestRoom->next; } guestLevel=guestLevel->next; } } //退房 void checkOut(int droom,int bed) { 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("已成功退房!\n"); } //查询 void Query(int droom,int bed) { 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(int dLevel) { 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; i<guestLevel->rooms; i++) { if(guestRoom->full) count_room++; //遍历每个房间 guestRoom=guestRoom->next; } if(count_room==guestLevel->rooms) //如果满人的房间数=这个level的指定房间数,则房间数已满,使level=1 { guestLevel->full=1; return 1; } else guestLevel->full=0; break; } } } return 0; } //查看房间里是否有异性,并返回1或0; int oppositeSex(room *guestRoom,char sex) { 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)\n "); scanf("%d",&could); return could; } } } return could; //如果循环结束没有触发if,则房间里没有异性,默认接受 } int main() { 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<levels; 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<beds; 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("\n********************HOTEL*************************"); printf("\n*----------------1>Check In----------------------*"); printf("\n*----------------2>Check Out---------------------*"); printf("\n*----------------3>PrintAll----------------------*"); printf("\n*----------------4>Query-------------------------*"); printf("\n*----------------5>Exit--------------------------*"); printf("\n------------Please Input Number-------------------\n"); int roomNum=0, bedNum=0; int level,age; char sex; char name[20],date[20]; scanf("%d",&select); switch(select) { case 1: //输入基本信息 printf("\nPlease Input Your Information:"); printf("\nName:"); scanf("%s",name); printf("\nRoom Level(1-%d):",levels); scanf("%d",&level); printf("\nAge:"); scanf("%d",&age); printf("\nSex(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("\n请输入要退的房间号:"); scanf("%d",&roomNum); printf("\n请输入要退的床号:"); scanf("%d",&bedNum); checkOut(roomNum,bedNum); break; case 3: printAll(); break; case 4: printf("\n请输入要查询的房间号:"); scanf("%d",&roomNum); printf("\n请输入要查询的床号:"); scanf("%d",&bedNum); Query(roomNum,bedNum); break; case 5: printf("Exited Successfully!."); return 0; default : break; } } return 0; }
可能是写惯了Java的原因,最后居然写出了Java的感觉,不过没事,其实C的结构体和Java的Class也有很多相似之处呢.