写在前面

写的好辛苦~但是范老师却连运行都没让我运行~我枯了!
采用的是结构体数组的存储方式。

题目:床位分配

某客店有N个等级的房间,第k级客房有A(k)个,每个房间有B(k)个单人床,以菜单调用方式设计为单身旅客分配床位以及离店时收回床位的程序。要求分配成功时,印出旅客姓名、年龄、性别、到达日期、客房等级、房间号及床位号;分配不成功时,允许更改房间等级,若不更改等级,印出“满客”提示。

吐槽与说明

因为懒,就不注释了。
除了time库里面的结构体之外,有Guest、Bed、Room和Level四种结构体。写出了面向对象的感觉。
没有按照题目要求那样每个房间床位数还不一样~我觉得那样太臃肿了。
以及“不可建造多余10个房间等级”的原因仅仅是因为我的房间号“X0X”不好设计……(。
退房操作仅仅是将名字置NULL。
获取系统时间方面主要就是对字符串进行了各种操作。

完整代码

#include <stdio.h>
#include <time.h>

int levelNum, roomNum, bedNum;

typedef struct tm *tim;

typedef struct Guest{
    int level, room, bed;
    char name[20],date[20];
    int age;
    int sex;
}Guest;
 
typedef struct Bed{
    int bedNumber;
    Guest guest;
}Bed;
 
typedef struct Room{
    int sex;
    int bedNum;
    int peopleNum;
    int roomNumber;
    Bed *bed;
}Room;

typedef struct Level{
    Room *room;
    int roomNum;
}Level;


Level* BuildHotel(int levelNum, int roomNum, int bedNum){
    Level* level;
    int i, j, k;
    level = (Level*)malloc(sizeof(Level)*levelNum);
    for(i=0;i<levelNum;i++){
        level[i].room = (Room*)malloc(sizeof(Room)*roomNum);
        for(j=0;j<roomNum;j++){
            level[i].room[j].roomNumber = j + 1;
            level[i].room[j].peopleNum = 0;
            level[i].room[j].sex = 3;
            level[i].room[j].bed = (Bed*)malloc(sizeof(struct Bed)*bedNum);
            for(k=0;k<bedNum;k++){
                level[i].room[j].bed[k].bedNumber = k;
                strcpy(level[i].room[j].bed[k].guest.name, "");
            }
        }
    }
    return level;
}


int CheckIn(Level* hotel){
    int i, j, level, room, bed;
    int sex, flag = 0;
    printf("\n*本店共有1-%d等级的房间,请输入您要入住的等级:",levelNum);
    scanf("%d",&i);
    level = i - 1;
    printf("\n*请登记您的性别( F=0 / M=1 ):"); 
    scanf("%d",&sex);
    
    if(flag == 0){
        for(i=0;i<roomNum;i++){
            for(j=0;j<bedNum;j++){
                if( hotel[level].room[i].sex==sex && strcmp(hotel[level].room[i].bed[j].guest.name, "")==0 ){
                    room = i;
                    bed = j;
                    hotel[level].room[i].peopleNum += 1; 
                    flag = 1;
                    break;
                }
            }
            if(flag == 1) break;
        }
    }
    
    if(flag == 0){
        for(i=0;i<roomNum;i++){    
            if( hotel[level].room[i].sex==3 ){
                room = i;
                bed = 0;
                hotel[level].room[i].sex = sex;
                hotel[level].room[i].peopleNum += 1; 
                flag = 1;
                break;
            }
        }
    }
    
    if(flag == 0){
        return 0;
    }
    
    hotel[level].room[room].bed[bed].guest.room = room;
    hotel[level].room[room].bed[bed].guest.bed = bed;
    hotel[level].room[room].bed[bed].guest.sex = sex;
    
    char name[20],date[20];
    int age;
    printf("\n**请登记您的其他个人信息:\n"); 
    printf("*姓名:"); scanf("%s",&name);
    strcpy(hotel[level].room[room].bed[bed].guest.name, name);
    printf("*年龄:"); scanf("%d",&age);
    hotel[level].room[room].bed[bed].guest.age = age;
    
    time_t t;
    struct tm * lt;
    char y[20],m[20],d[20],h[20],f[20],s[20];
    time (&t);//获取Unix时间戳
    lt = localtime (&t);//转为时间结构
    ltoa(lt->tm_year+1900,y,10);
    ltoa(lt->tm_mon+1,m,10);
    ltoa(lt->tm_mday,d,10);
    ltoa(lt->tm_hour,h,10);
    ltoa(lt->tm_min,f,10);
    ltoa(lt->tm_sec,s,10);

    strcat(y,"/");strcat(y,m);strcat(y,"/");strcat(y,d);strcat(y," ");
    strcat(y,h);strcat(y,":");strcat(y,f);strcat(y,":");strcat(y,s);
    strcpy(hotel[level].room[room].bed[bed].guest.date, y);
    
    printf("\n**以下是您的个人信息:\n");
    PrintGuest(hotel, level, room, bed);
    return 1;
}


void PrintGuest(Level* hotel, int level, int room, int bed){
    printf("***************************************************\n");
    printf("*\n");
    printf("**   等级:%d\t\t房号:%d0%d\t床号:No.%d\n",level+1, level+1, room+1, bed+1);
    printf("**   姓名:%s\t", hotel[level].room[room].bed[bed].guest.name);
    if(hotel[level].room[room].bed[bed].guest.sex==0) printf("性别:女\t");
    else printf("性别:男\t");
    printf("年龄:%d\n", hotel[level].room[room].bed[bed].guest.age);
    printf("**   入住时间:%s\n", hotel[level].room[room].bed[bed].guest.date);
    printf("*\n");
    printf("***************************************************\n\n");
}


int CheckOut(Level* hotel){
    int i, j, level, room, bed;
    char name[20]; 
    printf("*请输入您的房间号:"); scanf("%d", &i);
    level = i/100 -1;
    room = i%10 -1;
    printf("*请输入您的床号:"); scanf("%d", &j);
    bed = j - 1;
    
    if( strcmp(hotel[level].room[room].bed[bed].guest.name, "")!=0 ){
        printf("*请输入您的名字:"); scanf("%s", &name);
        if( strcmp(hotel[level].room[room].bed[bed].guest.name, name)==0 ){
            printf("\n**以下是您的个人信息:\n");
            PrintGuest(hotel, level, room, bed);
            strcpy(hotel[level].room[room].bed[bed].guest.name, "");
            hotel[level].room[room].peopleNum -= 1;
            return 1;
        } 
        else{
            printf("\n*您的名字与房号不匹配!\n");
            return 0; 
        }
    } 
    else{
        printf("\n*您输入的房号或床号为空!\n");
        return 0;
    }
}


int Query(Level* hotel){
    int i, j, level, room, bed;
    char name[20]; 
    printf("*请输入您查询的房间号:"); scanf("%d", &i);
    level = i/100 -1;
    room = i%10 -1;
    printf("*请输入您查询的床号:"); scanf("%d", &j);
    bed = j - 1;
    
    if( strcmp(hotel[level].room[room].bed[bed].guest.name, "")==0 ){
        printf("\n*您查询的房号或床号为空!\n");
        return 0;
    }
    else {
        printf("\n**以下是您查询的信息:\n");
        PrintGuest(hotel, level, room, bed);
        return 1;
    } 
}


void PrintAll(Level* hotel){
    int i, j, k, sum = 0;
    for(i=0;i<levelNum;i++){
        for(j=0;j<roomNum;j++){
            for(k=0;k<bedNum;k++){
                if( strcmp(hotel[i].room[j].bed[k].guest.name, "")!=0 ){
                    PrintGuest(hotel, i, j, k);
                    sum++;
                }
            }
        }
    }
    printf("***************************************************\n\n");
    printf("*CK客栈入住情况:\n");
    for(i=0;i<levelNum;i++){
        printf("\n******等级%d******\n", i+1);
        for(j=0;j<roomNum;j++){
            printf("*房间%d0%d:\t", i+1, j+1);
            if(hotel[i].room[j].sex==0) printf("女性房间\t"); 
            else if(hotel[i].room[j].sex==1) printf("男性房间\t");
            else printf("未入住房间\t");
            printf("剩余%d个床位\n", bedNum - hotel[i].room[j].peopleNum);
        }
    }
    printf("\n*CK客栈目前共入住%d人,剩余床位数%d。\n", sum, levelNum*roomNum*bedNum-sum);
    printf("***************************************************\n\n");
}


/********************************************/
int main(){
    
    int select, level, room, bed, sum;
    int age;
    char sex;
    char name[20];
    
    printf("CK客栈一共有几个房间等级?");
    scanf("%d",&levelNum);
    printf("CK客栈每个等级有几个房间?");
    scanf("%d",&roomNum);
    printf("CK客栈每个房间有几个床位?");
    scanf("%d",&bedNum);
    if(levelNum>10 || roomNum>10) {
        printf("由于资金和场地有限,本旅馆不可建造多余10个等级及房间!");
        levelNum = 9;
        roomNum = 9; 
    } 
    Level* hotel = BuildHotel(levelNum, roomNum, bedNum);
    
    while(1){
        printf("\n\n*******欢迎来到CK客栈*******");
        printf("\n***----1>入住------------***");
        printf("\n***----2>退房------------***");
        printf("\n***----3>查询房客--------***");
        printf("\n***----4>打印房间情况----***");
        printf("\n***----5>退出系统--------***");
        printf("\n****************************");
        printf("\n*请输入数字:");
        scanf("%d",&select);
        printf("\n");
        switch(select){
            case 1:
                if( CheckIn(hotel) ){
                    printf("*入住成功!\n");
                }
                else printf("\n*该等级房间已满!请重新选择!\n"); 
                break;
            case 2:
                if( CheckOut(hotel) ){
                    printf("*退房成功!\n");
                }
                else printf("*退房失败!\n");
                break;
            case 3:
                if( Query(hotel) ){
                    printf("*查询成功!\n");
                }
                else printf("*查询失败!\n");
                break;
            case 4:
                PrintAll(hotel);
                break;
            case 5:
                printf("*欢迎下次光临CK客栈!祝您一路顺风!");
                return 0;
            default:
                printf("*输入错误!请重新输入!\n");
                break;
                
        }
    }
}

ShadowCK
51 声望9 粉丝

这个人是个萌新,什么都没有留下。