C语言实现简单酒店管理系统(含完整源码)
通过C语言开发一个简易酒店管理系统,实现房间的登记入住、状态查询、实时费用计算及退房结账功能,并利用文件IO保存数据。
一、系统设计与基本需求
本系统旨在模拟酒店日常运营的核心流程,主要包含以下功能模块:
- 登记入住:记录顾客选择的房间类型、楼层及房号,并保存入住时间。
- 查询入住情况:根据房间类型列出当前可用或已入住的房间状态。
- 查询当前费用:根据入住时间与当前时间的差值,结合不同房型单价计算预估费用。
- 办理退房:确认退房后显示最终费用,并将房间状态重置为空闲。
- 数据持久化:所有操作对数据的修改(增删改)均同步写入本地
roommessage.dat文件,确保程序重启后数据不丢失。
二、核心数据结构与初始化
系统采用数组结合结构体的方式管理10层每层10间的客房数据,共计100个房间节点。
- 房间信息结构:
struct room_message包含房间号、入住状态(people)、楼层(floor)以及入住时间戳(time_t)。 - 常量定义:定义了不同楼层对应房型的单价,如钟点房、标准间、商务间等。
- 初始化函数
BuildRoom: - 若文件不存在,则以写模式创建
roommessage.dat,遍历循环填充默认的空闲房间数据并写入文件。 - 若文件存在,则以读模式加载已有数据至内存数组中。
#include<stdio.h>
#include<stdlib.h>
#include<time.h> //调用系统的时间,通过时间的增减计算费用
#include<string.h>
#include<windows.h>
#define N 10
#define HOURROOM 10
#define NORMALROOM 120
#define BIGROOM 300
#define WORTHROOM 500
#define GREATROOM 800
struct room_message{
int number; //房间号
int people; //有无入住
int floor; //楼层数(不同楼层房间类型不同)
time_t time; //入住时间,无人住则置空
}ROOM[100];
三、关键功能实现解析
第1步:实现入住登记 CheckIn()
目的:获取用户输入,校验可用性,更新内存并保存文件。
操作步骤:
- 提示用户输入楼层和房号,并进行范围校验(1-10层,1-10号)。
- 读取文件数据至
ROOM数组。 - 检查目标房间
ROOM[(a-1)*10+(b-1)].people == 0是否为空。 - 若为空,提示输入预计入住人数,更新该节点的时间为
time(NULL),人数为输入值。 - 重新打开文件以写模式覆盖旧数据,将更新后的全部房间信息回写到磁盘。
void CheckIn(){ //入住函数,记录时间,更改入住情况
int a,b,c,i,j;
FILE *fp=NULL;
do{
printf("\n请输入您想入住的房间层数(1~10)");
printf("\n1~2为钟点房");
// ...省略中间部分菜单输出...
scanf("%d",&a);
if(a<1||a>10){
printf("您的输入有误,请在1-10之间重新输入\n");
}
}while(a<1||a>10);
PrintRoomFee(a);
do{
printf("\n请输入您想入住的房间号(1~10):");
scanf("%d",&b);
if(b<1||b>10){
printf("您的输入有误,请在1-10之间重新输入\n");
}
}while(b<1||b>10);
if((fp=fopen("roommessage.dat","rb"))!=NULL){ //打开文件
if(ROOM[(a-1)*10+(b-1)].people==0){ //判断房间是否可住
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
fread(&ROOM[i*10+j],sizeof(struct room_message),1,fp);
}
}
fclose(fp);
printf("\n请输入计划入住的人数:");
scanf("%d",&c);
ROOM[(a-1)*10+b-1].people=c;
ROOM[(a-1)*10+b-1].time=time(NULL);
fp=fopen("roommessage.dat","w");
for(a=0;a<N;a++){
for(b=0;b<N;b++){
fwrite(&ROOM[a* 10+b],sizeof(struct room_message),1,fp);
}
}
}
else{
printf("\n抱歉,该房间已经有人入住\n");
printf("请选择其他的房间入住\n");
}
}
fclose(fp);
}
第2步:实现查询与计费逻辑 ScanRoom() 与 CalFee()
目的:展示房间状态并根据时间差计算费用。
步骤说明:
- 状态查询:用户选择房型后,程序遍历对应楼层的房间数组,判断
people字段打印“已入住”或“未入住”。注意在ScanRoom的代码中存在一处格式错误:`printf("房间已入住,请重新选择);` 缺少闭合引号,实际编译时需注意修正为 `printf("房间已入住,请重新选择");`。 - 费用计算:用户输入具体房号,程序解析出楼层和房间索引。调用
Printpay函数,获取ROOM[...].time与当前系统时间time(NULL)的差值。对于钟点房按小时计费(加1向上取整),其他房型按天计费。
第3步:实现退房处理 CheckOut()
目的:完成收费确认,释放房间资源。
步骤说明:
- 接收用户输入的房号,解析楼层与房间号,并进行边界校验。
- 根据楼层判断房型并获取单价
fee。 - 二次确认是否退房。
- 若确认,调用
Printpay显示费用详情。 - 将目标房间节点的
people置为 0,time置为 0(表示空闲)。 - 全量刷新
roommessage.dat文件以保持数据一致性。
四、主界面与程序流程
系统通过 main 函数进入循环主菜单,用户可选择登记、查询、费用、退房或退出。程序使用 system("cls") 清屏以提升交互体验,利用 switch-case 分发不同业务逻辑。值得注意的是,代码中包含重复的 ChangeRoom 函数逻辑但未被 main 直接调用,实际执行入口为 main 中的 switch 分支。
int main()
{
int step;
BuildRoom();
do{ //主程序循环
do{ //选择界面循环
system("cls");
printf("\t\t * 欢迎使用酒店管理系统 * \n");
// ... 菜单打印 ...
五、运行与维护建议
由于代码使用了 windows.h 和 system 指令,建议在 Windows 环境下(如 MinGW GCC 或 Visual Studio)进行编译测试。对于 C 语言初学者而言,此案例展示了基础的 CRUD 操作以及 fread/fwrite 二进制文件读写技巧,但在实际应用前需优化输入验证、修复部分打印语句的字符串缺失问题,并考虑多线程冲突或更大规模数据的性能瓶颈。
以上就是C语言实现简单酒店管理系统的详细内容,更多关于C语言基础教程与文件操作的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













