C语言实现简单酒店管理系统(含完整源码)

方予
方予
发布时间:2026-10-13 | 3人浏览过
原创

通过C语言开发一个简易酒店管理系统,实现房间的登记入住、状态查询、实时费用计算及退房结账功能,并利用文件IO保存数据。

一、系统设计与基本需求

本系统旨在模拟酒店日常运营的核心流程,主要包含以下功能模块:

  • 登记入住:记录顾客选择的房间类型、楼层及房号,并保存入住时间。
  • 查询入住情况:根据房间类型列出当前可用或已入住的房间状态。
  • 查询当前费用:根据入住时间与当前时间的差值,结合不同房型单价计算预估费用。
  • 办理退房:确认退房后显示最终费用,并将房间状态重置为空闲。
  • 数据持久化:所有操作对数据的修改(增删改)均同步写入本地 roommessage.dat 文件,确保程序重启后数据不丢失。

二、核心数据结构与初始化

系统采用数组结合结构体的方式管理10层每层10间的客房数据,共计100个房间节点。

  1. 房间信息结构:struct room_message 包含房间号、入住状态(people)、楼层(floor)以及入住时间戳(time_t)。
  2. 常量定义:定义了不同楼层对应房型的单价,如钟点房、标准间、商务间等。
  3. 初始化函数 BuildRoom:
  4. 若文件不存在,则以写模式创建 roommessage.dat,遍历循环填充默认的空闲房间数据并写入文件。
  5. 若文件存在,则以读模式加载已有数据至内存数组中。
#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. 提示用户输入楼层和房号,并进行范围校验(1-10层,1-10号)。
  2. 读取文件数据至 ROOM 数组。
  3. 检查目标房间 ROOM[(a-1)*10+(b-1)].people == 0 是否为空。
  4. 若为空,提示输入预计入住人数,更新该节点的时间为 time(NULL),人数为输入值。
  5. 重新打开文件以写模式覆盖旧数据,将更新后的全部房间信息回写到磁盘。
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()

目的:展示房间状态并根据时间差计算费用。

步骤说明:

  1. 状态查询:用户选择房型后,程序遍历对应楼层的房间数组,判断 people 字段打印“已入住”或“未入住”。注意在 ScanRoom 的代码中存在一处格式错误:`printf("房间已入住,请重新选择);` 缺少闭合引号,实际编译时需注意修正为 `printf("房间已入住,请重新选择");`。
  2. 费用计算:用户输入具体房号,程序解析出楼层和房间索引。调用 Printpay 函数,获取 ROOM[...].time 与当前系统时间 time(NULL) 的差值。对于钟点房按小时计费(加1向上取整),其他房型按天计费。

第3步:实现退房处理 CheckOut()

目的:完成收费确认,释放房间资源。

步骤说明:

  1. 接收用户输入的房号,解析楼层与房间号,并进行边界校验。
  2. 根据楼层判断房型并获取单价 fee。
  3. 二次确认是否退房。
  4. 若确认,调用 Printpay 显示费用详情。
  5. 将目标房间节点的 people 置为 0,time 置为 0(表示空闲)。
  6. 全量刷新 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语言基础教程与文件操作的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表