問題如下:
*****************************************************************************
某客店有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也有很多相似之處呢.