C語言酒店管理系統:完整源碼與深度解析

酒店管理系統通過自動化流程提升酒店運營效率。本系統采用C語言開發,基于模塊化設計思想,包含以下核心功能:

  1. ?房間管理?:初始化房間信息、查看房間狀態
  2. ?預訂管理?:按時間段預訂房間、查詢預訂記錄
  3. ?入住管理?:客戶登記、自動分配房間
  4. ?退房結算?:時長費用計算、賬單生成
  5. ?查詢統計?:空閑房間統計、收入報表生成

系統采用文件持久化存儲數據,確保程序重啟后數據不丟失。

交互方式為命令行菜單,直觀易操作。

二、系統設計與數據結構

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++學習路線,就業咨詢,技術提升

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84412.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84412.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84412.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Gold-YOLO的聚合-分發機制改進YOLOv8教程

1. 引言 本文將詳細介紹如何將Gold-YOLO的核心創新——聚合-分發(Gather-and-Distribute, GD)機制集成到YOLOv8架構中。Gold-YOLO是一種創新的目標檢測架構,通過獨特的信息融合策略實現了低延遲和高準確性的理想平衡。 1.1 Gold-YOLO核心特性 Gold-YOLO的主要創新點包括…

blob 的使用 文件下載 圖片預覽 大文件分片上傳

1. 文件下載 function downloadFile(content, filename, type) {const blob new Blob([content], { type });const url URL.createObjectURL(blob);const a document.createElement(a);a.href url;a.download filename;a.click();URL.revokeObjectURL(url); }// 使用示例…

FlinkCDC-Hudi數據實時入湖原理篇

1.Hudi應用場景 面對海量數據開發場景&#xff0c;一種支持存儲多種原始數據格式、多種計算引擎、高效的元數據統一管理的存儲方式能極大的提高開發效率。所以在選擇技術選型的時候&#xff0c;這種存儲方式有以下幾個特點&#xff1a; 存儲原始數據&#xff0c;這些原始數據來…

sqldeveloper 創建新用戶并訪問其他空間特定表和視圖

創建用戶 右鍵選擇創建用戶 1.給用戶取一個名字 VIEW_TEST 2.設置密碼 123456&#xff08;建議用其他&#xff09; 3.選擇表空間和臨時空間 選擇角色 CONNECT 連接角色 選擇系統權限 然后點擊應用就可以了 然后在用戶哪里就能看到這個用戶了 登錄用戶 出現成功就說明可以…

家用電器3d掃描逆向建模中科米堆手持式藍光三維掃描儀數字建模

從廚房里的冰箱、微波爐&#xff0c;到客廳中的電視、空調&#xff0c;再到臥室的加濕器、空氣凈化器等&#xff0c;家用電器極大地提升了我們的生活品質。 家電市場的競爭日益激烈&#xff0c;產品更新換代速度加快&#xff0c;如何快速、精準地獲取現有家電產品的三維數據&a…

從“數據困境”到“數據生態”:DaaS重塑三甲醫院醫療數據治理

從“數據困境”到“數據生態”&#xff1a;DaaS如何重塑三甲醫院醫療數據治理 醫療數據治理的現狀剖析 在智慧醫療蓬勃發展的當下&#xff0c;三甲醫院憑借其豐富的臨床資源&#xff0c;積累了海量、多維度的醫療數據。這些數據猶如一座蘊藏著巨大價值的富礦&#xff0c;涵蓋了…

LVS +Keepalived 高可用群集

目錄 前言一. Keepalived 雙機熱備基礎知識1. Keepalived 概述及安裝&#xff08;1&#xff09;Keepalived 的熱備方式&#xff08;2&#xff09;Keepalived 的安裝與服務控制 2. 使用Keepalived 實現雙機熱備&#xff08;1&#xff09;主服務器的配置&#xff08;2&#xff09…

【Go語言基礎】對齊邊界與內存填充

文章目錄 一、內存對齊的核心概念二、Go語言的內存對齊規則三、內存對齊示例示例1&#xff1a;字段順序影響對齊示例2&#xff1a;指針與切片的對齊 四、如何查看內存對齊&#xff1f;五、內存對齊的優化建議六、總結&#xff1a;內存對齊的核心要點 在計算機科學中&#xff0c…

網絡核心 - CNI、Service 與 Ingress/Gateway API 解析

網絡核心 - CNI、Service 與 Ingress/Gateway API 解析 Kubernetes 的強大之處在于它極大地簡化了容器化應用的部署和管理,但其網絡模型的靈活性和復雜性也常常讓初學者感到困惑。作為 SRE,我們需要撥開迷霧,理解流量在 K8s 集群內部以及進出集群時,到底是如何流轉的。 Po…

20.jsBridge多頁面交互與原生事件監聽沖突問題

一、問題描述 ? 安卓原生頁面調起 H5A 頁面&#xff1b; ? H5A 頁面跳轉到 H5B 頁面&#xff1b; ? 在 H5B 頁面點擊“附件上傳”&#xff0c;通過 JS Bridge 調用安卓的附件上傳功能&#xff0c;彈出附件彈窗&#xff1b; ? 然后 返回 到 H5A 頁面&#xff0c;附件上傳彈窗…

產品經理的自我救贖

思考自己的商業模式 很多人可能會奇怪&#xff0c;作為一個產品經理&#xff0c;為什么要思考商業模式呢&#xff1f;這個問題有點繞&#xff0c;但看完這一小節肯定大家就明白了。 首先&#xff0c;我們做產品經理&#xff0c;一般來說是為了掙錢&#xff0c;從掙一個月的錢…

DeepSeek提示詞指南:從基礎到高階的全面解析

引言 在人工智能技術迅猛發展的今天&#xff0c;DeepSeek作為新一代智能大模型&#xff0c;正在為各行各業帶來革命性的變革。而要充分發揮DeepSeek的潛力&#xff0c;掌握其提示詞的使用技巧是關鍵。本指南旨在為用戶提供一份全面、系統、實用的DeepSeek提示詞指南&#xff0…

Linux tail 命令

Linux 的 tail 命令是一個非常實用的工具&#xff0c;用于查看文件的末尾內容&#xff0c;默認顯示文件的最后 10 行。它在系統管理和日志監控中尤為常用&#xff0c;以下是其核心功能和用法總結&#xff1a; 一、基本語法 tail [選項] [文件]二、常用選項 選項功能示例-n 或…

【案例拆解】米客方德 SD NAND 在車聯網中(有方模塊)的應用:破解傳統 TF 卡振動脫落與壽命短板

&#x1f468;?&#x1f393;博主簡介 &#x1f3c5;CSDN博客專家 ??&#x1f3c5;云計算領域優質創作者 ??&#x1f3c5;華為云開發者社區專家博主 ??&#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社區&#xff1a;運維交流社區 歡迎大家的加入&#xff01…

中泰制造企業組網新方案:中-泰企業國際組網專線破解泰國工廠訪問國內 OA/ERP 卡頓難題

在東南亞開廠的中國制造企業&#xff0c;估計都遇到過這個糟心事&#xff1a;泰國工廠的員工想訪問國內總部的 OA、ERP 系統&#xff0c;結果頁面加載半天沒反應&#xff0c;文件傳輸慢得像蝸牛&#xff0c;視頻會議還時不時卡成 PPT。以前大家常用的 MPLS 專線&#xff0c;雖然…

【二進制安全作業】250617課上作業4 - start

文章目錄 前言一、使用環境二、pwndbg介紹1. 命令介紹2. 界面介紹 三、反匯編分析四、Shellcode五、解題思路六、編寫EXP結語 前言 作業3遇到了很嚴重的問題&#xff0c;一直沒搞定&#xff0c;先略過了&#xff0c;要講的東西也一起放到這里講吧。 這道題是 pwnable 的第一道…

【vivado中實現時序仿真】

這里寫自定義目錄標題 如何在vivado中實現時序仿真準備工作設計輸入與管理綜合與實現仿真與調試IP核與重用硬件編程與配置設計分析與優化跨平臺支持與兼容性編寫測試激勵代碼運行時序仿真查看和分析結果高級技巧 如何在vivado中實現時序仿真 在Vivado中進行時序仿真&#xff0…

運維常用命令

目錄 一、系統監控與性能分析 vmstat命令 一、命令語法及核心參數 二、輸出字段解析&#xff08;關鍵列&#xff09; 三、工作場景案例 1. 排查 CPU 瓶頸 2. 內存不足導致 Swap 頻繁 3. 磁盤 I/O 性能問題 4. 系統卡頓實時監控 5. 高級用法&#xff1a;統計內存事件 …

代碼隨想錄day10棧和隊列1

文章目錄 數組模擬棧棧的應用 單調棧棧(stack) 數組模擬隊列隊列stl(queue)雙端隊列stl(deque)滑動窗口單調隊列 232.用棧實現隊列225. 用隊列實現棧20. 有效的括號1047. 刪除字符串中的所有相鄰重復項 數組模擬棧 題目鏈接 #include <iostream> #include <cstdio&g…

Unity 把廣告收入(revenue)上報到AppsFlyer

文章目錄 第一步第二步 官方文檔 第一步 升級版本 如果你的AppsFlyer版本大于文檔中要求的6.15以上&#xff0c;即可跳過第一步 在unity這里可以看到AppsFlyer版本 下載最新版本地址 在這個位置&#xff0c;單獨下載這個unitypackage包就行 如果是用srict-mode(嚴格模式)…