# 基于C语言实现的宾馆住宿信息管理系统
# 一、系统需求分析
本课程设计的名称为宾馆住宿信息管理系统。该系统能够处理宾馆运营过程中产生的客房分类信息、客房基本信息以及客人住宿信息。本系统包括三个主要功能模块:数据维护、数据查询以及数据统计,两个辅助功能模块:文件模块以及帮助模块,同时本系统还提供良好的人机交互界面,在程序运行时更会给予大量的提示帮助管理者更好的使用本系统,本系统还提供数据的存储功能,能够将系统运行时产生的数据存入到相应的数据文件中。
具体功能如下图1.1:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/e03739d85e9b1be2a2bdd447cb33ca87.writebug)
# 二、总体设计
- **第一步**:加载文件中存储的三类基本数据到系统内存中,将有关数据存入链表
- **第二步**:文本菜单界面初始化,包括主菜单的显示,子菜单弹出窗口的设计,相应鼠标操作的热区设置
- **第三步**:系统各个功能函数的选择和运行,该模块用到一个循环机制,当用户在子菜单中选择功能,调用相应的功能函数,若该功能函数返回一个返回值,该返回值作为循环的条件,若为TRUE,则函数执行完后清屏继续下一循环,若为FALSE,说明用户选择退出系统,退出循环,该模块结束
- **第四步**:处理退出系统后的数据,询问用户是否保存相关数据到文件中,清理系统内存,释放节点空间,关闭输入输出句柄
![](http://www.writebug.com/myres/static/uploads/2021/10/19/f0ec178053a50db04bf54f27c11a531e.writebug)
# 三、数据结构设计
## 3.1 客人基本信息链节点结构
```c++
typedef struct hoteler_node {
char ID_number[20]; /*身份证号*/
char name[20]; /*客人姓名*/
char hotel_number[6]; /*入住房间房间编号*/
char time[18]; /*入住时间*/
char exit_time[18]; /*退房时间,空串代表在住*/
float day_num; /*入住天数,0表示在住*/
float fee; /*应缴费用*/
float charged; /*实缴费用*/
struct hoteler_node *next; /*指向下一结点的指针*/
}HOTELER_NODE;
```
## 3.2 客房基本信息链节点结构
```c++
typedef struct room_node {
char hotel_number[6]; /*房间编号*/
char tel_number[20]; /*房间电话号码*/
char type; /*房间类别,'2'表示双人间,'1'表示单人间,'T'表示豪华套间*/
float area; /*房间面积*/
float price; /*每日住宿单价*/
char enroll; /*是否有客人入住,'y'or'n'*/
struct hoteler_node *hnext; /*指向客人基本信息支链*/
struct room_node *next; /*指向下一结点的指针*/
}ROOM_NODE;
```
## 3.3 客房分类信息链节点结构
```c++
typedef struct type_node {
char type; /*客房类别,'2'表示双人间*/
int max_number; /*最多入住人数*/
int num; /*客房套数*/
int unfilled_num; /*客房未住满套数*/
struct room_node *rnext; /*指向客房基本信息支链*/
struct type_node *next; /*指向下一结点的指针*/
}TYPE_NODE;
```
## 3.4 屏幕窗口信息链节点结构
```c++
typedef struct layer_node {
char LayerNo; /*弹出窗口层数*/
SMALL_RECT rcArea; /*弹出窗口区域坐标*/
CHAR_INFO *pContent; /*弹出窗口区域字符单元原信息存储缓冲区*/
char *pScrAtt; /*弹出窗口区域字符单元原属性值存储缓冲区*/
struct layer_node *next; /*指向下一结点的指针*/
}LAYER_NODE;
```
## 3.5 标签束结构
```c++
typedef struct label_bundle {
char **ppLabel; /*标签束字符串数组首地址*/
COORD *pLoc; /*标签定位数组首地址*/
int num; /*标签个数*/
}LABEL_BUNDLE;
```
标签束信息包括标签字符串数组内容,标签位置,标签个数。用一个字符型的二重指针变量ppLabel指向标签字符串数组内容,用一个COORD类型的字符指针变量pLoc指向标签串数组输出时的首位置坐标,用整型变量num表示标签的个数。
## 3.6 热区结构
```c++
typedef struct hot_area {
SMALL_RECT *pArea; /*热区定位数组首地址*/
char *pSort; /*热区类别(按键、文本框、选项框)数组首地址*/
char *pTag; /*热区序号数组首地址*/
int num; /*热区个数*/
}HOT_AREA;
```
热区信息包括热区的位置,类别,序号及个数。因此用一个SMALL\_RECT结构类型的指针变量pArea指向热区的定位范围;用字符指针变量pSort指向热区的类别类型,其中数字’0’表示按钮型热区,’1’表示文本框热区,’2’表示选项框热区;用字符指针变量pTag指向热区的序号,热区编号一般为1,2,3,4,5......这些自然数表示多个热区的排列顺序,整型变量num表示热区个数。
## 3.7 客房分类信息
| 中文字段名 | 类型及长度 | 举例 |
| ------ | ----- | ------------------- |
| 客房类别 | char | ‘2’ 双人间,’T’ 豪华套间 |
| 最多入住人数 | int | 2 |
| 客房套数 | int | 36 |
| 客房未住套数 | int | 12 |
## 3.8 客房基本信息
| 中文字段名 | 类型及长度 | 举例 |
| ------- | -------- | -------------------- |
| 房间编号 | char[6] | “10312” 一号楼312房间 |
| 电话号码 | char[20] | “02787541258-312” |
| 房间类别 | char | ‘2’ 双人间 |
| 房间面积 | float | 23.5 |
| 每日住宿单价 | float | 238.0 |
| 是否有客人入住 | char | ‘y’ 已有客人入住 ‘n’ 未住 |
## 3.9 客人住宿信息
| 中文字段名 | 类型及长度 | 举例 |
| ----- | -------- | -------------------- |
| 身份证号 | char[20] | “420101198505050005” |
| 客人姓名 | char[20] | “zhangming” |
| 入住房间 | char[6] | “10312” 一号楼312房间 |
| 入住时间 | char[18] | “2008/03/05-13:00” |
| 退房时间 | char[18] | “” 空串表示在住 |
| 入住天数 | float | 0 表示在住 |
| 应缴费用 | float | |
| 实缴费用 | float | |
## 3.10 三方向的十字链表
![](http://www.writebug.com/myres/static/uploads/2021/10/19/394e47f466b76a3211c65872abff55f0.writebug)
# 四、详细设计
数据保存见下图,其中p1、p2、p3分别为客房分类信息节点、客房基本信息节点、客人住宿信息节点,写入记录时分别写入对应的存储数据文件。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/8d3e0bf08b605f2f1892f8ab5d1e1a5f.writebug)
数据备份功能和数据保存功能类似,只不过在用fwrite函数写入文件记录时应该写入相应的备份数据文件。
数据恢复功能可拆解成两个子模块。第一个模块,创建链表,将备份数据文件中的数据加载到链表中,第二个模块,调用已有的数据保存功能,将链表中数据保存入存储数据文件中。其中,创建链表的流程图如下:为排版方便,图中简化了流程图,其中遍历主链为一个循环,从链表头指针遍历到尾指针,遍历支链也为一个循环语句,从主链的每一条支链的头指针遍历到尾指针直到结束或者发现满足条件的节点退出循环。其中h\_t是链表节点成员hotel\_number的缩写,即宾馆编号。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/02858d6c9b38891478233387b0f1c9a7.writebug)
**录入客房分类信