C语言酒店管理系统:完整源码与深度解析

酒店管理系统通过自动化流程提升酒店运营效率。本系统采用C语言开发,基于模块化设计思想,包含以下核心功能:

  1. 房间管理:初始化房间信息、查看房间状态
  2. 预订管理:按时间段预订房间、查询预订记录
  3. 入住管理:客户登记、自动分配房间
  4. 退房结算:时长费用计算、账单生成
  5. 查询统计:空闲房间统计、收入报表生成

系统采用文件持久化存储数据,确保程序重启后数据不丢失。

交互方式为命令行菜单,直观易操作。

二、系统设计与数据结构

1. 核心数据结构
cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define FLOORS 5      // 楼层数
#define ROOMS_PER_FLOOR 20  // 每层房间数
#define MAX_NAME_LEN 20
#define MAX_RESERVATIONS 5

// 房间状态枚举
typedef enum {
    VACANT,     // 空闲
    OCCUPIED,   // 已入住
    RESERVED    // 已预订
} RoomStatus;

// 房间结构体
typedef struct {
    char number[6];         // 房间号如"101"
    char type[10];          // 房间类型
    double price;           // 每晚价格
    RoomStatus status;      // 当前状态
    char guest[MAX_NAME_LEN]; // 入住客人
    int reservations[MAX_RESERVATIONS][2]; // 预订时间段
} Room;

// 全局酒店数组
Room hotel[FLOORS][ROOMS_PER_FLOOR];
2. 文件存储设计
  • 房间数据:rooms.dat(二进制存储)
  • 预订记录:reservations.dat
  • 账单历史:bills.dat

三、核心功能实现解析

1. 房间初始化与加载
cpp 复制代码
void initializeRooms() {
    for (int i = 0; i < FLOORS; i++) {
        for (int j = 0; j < ROOMS_PER_FLOOR; j++) {
            // 生成房间号如501
            sprintf(hotel[i][j].number, "%d%02d", i+1, j+1);
            
            // 按楼层分配房间类型
            if (i == 0) {
                strcpy(hotel[i][j].type, "经济房");
                hotel[i][j].price = 150.0;
            } else if (i < 3) {
                strcpy(hotel[i][j].type, "标准房");
                hotel[i][j].price = 300.0;
            } else {
                strcpy(hotel[i][j].type, "豪华房");
                hotel[i][j].price = 500.0;
            }
            
            hotel[i][j].status = VACANT;
            memset(hotel[i][j].reservations, -1, sizeof(hotel[i][j].reservations));
        }
    }
    saveRooms(); // 保存初始数据
}

void saveRooms() {
    FILE *fp = fopen("rooms.dat", "wb");
    if (fp) {
        fwrite(hotel, sizeof(Room), FLOORS*ROOMS_PER_FLOOR, fp);
        fclose(fp);
    }
}
2. 预订管理算法
cpp 复制代码
int reserveRoom(const char* roomNum, int startDay, int endDay, const char* guest) {
    // 查找房间位置
    int floor = roomNum[0] - '0' - 1;
    int room = atoi(roomNum + 1) - 1;
    
    // 验证预订日期冲突
    for (int i = 0; i < MAX_RESERVATIONS; i++) {
        int* period = hotel[floor][room].reservations[i];
        if (period[0] != -1 && 
            !(endDay < period[0] || startDay > period[1])) {
            return 0; // 日期冲突
        }
    }
    
    // 添加预订记录
    for (int i = 0; i < MAX_RESERVATIONS; i++) {
        if (hotel[floor][room].reservations[i][0] == -1) {
            hotel[floor][room].reservations[i][0] = startDay;
            hotel[floor][room].reservations[i][1] = endDay;
            strcpy(hotel[floor][room].guest, guest);
            hotel[floor][room].status = RESERVED;
            saveRooms();
            return 1; // 成功
        }
    }
    return -1; // 预订已满
}
3. 入住与退房结算
cpp 复制代码
// 入住登记
void checkIn(const char* roomNum, const char* guest) {
    int floor = roomNum[0] - '0' - 1;
    int room = atoi(roomNum + 1) - 1;
    
    if (hotel[floor][room].status == VACANT) {
        strcpy(hotel[floor][room].guest, guest);
        hotel[floor][room].status = OCCUPIED;
        hotel[floor][room].reservations[0][0] = time(NULL); // 记录入住时间
        saveRooms();
    }
}

// 退房结算
double checkOut(const char* roomNum) {
    int floor = roomNum[0] - '0' - 1;
    int room = atoi(roomNum + 1) - 1;
    double total = 0.0;
    
    if (hotel[floor][room].status == OCCUPIED) {
        time_t checkInTime = hotel[floor][room].reservations[0][0];
        time_t now = time(NULL);
        
        // 计算入住天数(向上取整)
        int hours = (int)difftime(now, checkInTime) / 3600;
        int days = (hours + 24) / 24; 
        
        total = days * hotel[floor][room].price;
        
        // 重置房间状态
        hotel[floor][room].status = VACANT;
        hotel[floor][room].guest[0] = '\0';
        saveRooms();
    }
    return total;
}
4. 高级查询功能
cpp 复制代码
// 按时间段查询空闲房间
void findVacantRooms(int startDay, int endDay) {
    printf("在%d-%d期间空闲的房间:\n", startDay, endDay);
    for (int i = 0; i < FLOORS; i++) {
        for (int j = 0; j < ROOMS_PER_FLOOR; j++) {
            int isVacant = 1;
            
            // 检查预订冲突
            for (int k = 0; k < MAX_RESERVATIONS; k++) {
                int* period = hotel[i][j].reservations[k];
                if (period[0] != -1 && 
                    !(endDay < period[0] || startDay > period[1])) {
                    isVacant = 0;
                    break;
                }
            }
            
            if (isVacant && hotel[i][j].status == VACANT) {
                printf("%s\t%s\t%.2f\n", 
                    hotel[i][j].number,
                    hotel[i][j].type,
                    hotel[i][j].price);
            }
        }
    }
}

四、完整系统源码

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

// 常量、结构体定义见上文

// 函数声明
void initializeRooms();
void saveRooms();
void loadRooms();
int reserveRoom(const char* roomNum, int startDay, int endDay, const char* guest);
void checkIn(const char* roomNum, const char* guest);
double checkOut(const char* roomNum);
void displayRoomStatus();
void findVacantRooms(int startDay, int endDay);

int main() {
    loadRooms();
    
    while(1) {
        system("cls");
        printf("\n===== 酒店管理系统 =====\n");
        printf("1. 显示所有房间状态\n");
        printf("2. 预订房间\n");
        printf("3. 办理入住\n");
        printf("4. 办理退房\n");
        printf("5. 按时间段查询空闲房\n");
        printf("0. 退出\n");
        printf("=======================\n");
        
        int choice;
        scanf("%d", &choice);
        
        switch(choice) {
            case 1: 
                displayRoomStatus();
                break;
            case 2: {
                char roomNum[6], guest[MAX_NAME_LEN];
                int start, end;
                printf("输入房间号: ");
                scanf("%s", roomNum);
                printf("输入起止日(例:20240620 20240625): ");
                scanf("%d %d", &start, &end);
                printf("客人姓名: ");
                scanf("%s", guest);
                if(reserveRoom(roomNum, start, end, guest)) {
                    printf("预订成功!\n");
                } else {
                    printf("预订失败!\n");
                }
                break;
            }
            case 3: {
                char roomNum[6], guest[MAX_NAME_LEN];
                printf("房间号: ");
                scanf("%s", roomNum);
                printf("客人姓名: ");
                scanf("%s", guest);
                checkIn(roomNum, guest);
                printf("入住登记完成!\n");
                break;
            }
            case 4: {
                char roomNum[6];
                printf("退房间号: ");
                scanf("%s", roomNum);
                double amount = checkOut(roomNum);
                printf("需支付: %.2f元\n", amount);
                break;
            }
            case 5: {
                int start, end;
                printf("输入查询时间段(例:20240620 20240625): ");
                scanf("%d %d", &start, &end);
                findVacantRooms(start, end);
                break;
            }
            case 0:
                saveRooms();
                exit(0);
        }
        system("pause"); // 按任意键继续
    }
    return 0;
}

// 其他函数实现详见上文

资源推荐:

C/C++学习交流君羊 << 点击加入

C/C++教程

C/C++学习路线,就业咨询,技术提升

相关推荐
oioihoii3 分钟前
C++11 Thread-Local Storage:从入门到精通
java·开发语言·c++
雨中散步撒哈拉8 分钟前
3、做中学 | 二年级上期 Golang数据类型和常量/变量声明使用
开发语言·后端·golang
YuTaoShao12 分钟前
Java八股文——Redis「淘汰删除篇」
java·开发语言·redis
意疏15 分钟前
全面掌握 C++ 基础:关键特性与进化
开发语言·c++
love530love1 小时前
【笔记】解决部署国产AI Agent 开源项目 MiniMax-M1时 Hugging Face 模型下载缓存占满 C 盘问题:更改缓存位置全流程
开发语言·人工智能·windows·笔记·python·缓存·uv
狐凄1 小时前
Python实例题:基于 Apache Kafka 的实时数据流处理平台
开发语言·python
好奇的菜鸟2 小时前
Rust 中的宏与函数
开发语言·后端·rust
好奇的菜鸟2 小时前
Rust 项目文档生成之旅:cargo doc
开发语言·后端·rust
范纹杉想快点毕业2 小时前
Qt实现文本编辑器光标高亮技术
java·开发语言·c++·算法·系统架构
LBJ辉3 小时前
9. CSS 引入方式
开发语言·前端·css