酒店管理系統通過自動化流程提升酒店運營效率。本系統采用C語言開發,基于模塊化設計思想,包含以下核心功能:
- ?房間管理?:初始化房間信息、查看房間狀態
- ?預訂管理?:按時間段預訂房間、查詢預訂記錄
- ?入住管理?:客戶登記、自動分配房間
- ?退房結算?:時長費用計算、賬單生成
- ?查詢統計?:空閑房間統計、收入報表生成
系統采用文件持久化存儲數據,確保程序重啟后數據不丟失。
交互方式為命令行菜單,直觀易操作。
二、系統設計與數據結構
1. 核心數據結構
#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. 房間初始化與加載
void initializeRooms() {for (int i = 0; i < FLOORS; i++) {for (int j = 0; j < ROOMS_PER_FLOOR; j++) {// 生成房間號如501sprintf(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. 預訂管理算法
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. 入住與退房結算
// 入住登記
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. 高級查詢功能
// 按時間段查詢空閑房間
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);}}}
}
四、完整系統源碼
#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++學習路線,就業咨詢,技術提升