床位分配问题C语言数组实现

37次阅读

共计 5898 个字符,预计需要花费 15 分钟才能阅读完成。

写在前面

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

题目:床位分配

某客店有 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;
                
        }
    }
}

正文完
 0