# 航班管理系统
**Repository Path**: LiHongMingLL/flight-management-system
## Basic Information
- **Project Name**: 航班管理系统
- **Description**: 编写一个基于航班信息管理系统的文本应用程序
- **Primary Language**: C
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-04-14
- **Last Updated**: 2024-04-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 航班管理系统
#### 介绍
编写一个基于航班信息管理系统的文本应用程序。
#### 软件架构
1. LINUX 操作系统。
2. 编码工具:vscode gedit vim等。
3. 开发语言:C语言。
#### 项目背景概述
某机场每天有n个航班,每个航班具有唯一的班次号(1、2、3…n),并且具有固定的起飞时间、固定的路线(起始站、终点站),也包含大致的飞行时间,以及固定的载客量。本系统需要设计相应的数据结构,实现对该机场航班的管理功能,需要包含添加班次、浏览班次信息、查询航班路线、购票与退票功能,其中的购票与退票操作仅可以提前十天进行。系统的数据需要在文件中进行保存,考虑到数据的维护代价、扩展性以及存取代价,本系统采用双向循环链表保存系统数据,每条航班信息通过结构体进行存储。
#### 项目功能要求
1. 单用户登录功能:登录界面,用户名,密码。(管理员账户,单链表,所有功能单用户即可。)用户信息可用文件存储。
2. 增加航班信息功能:该功能实现了增加详细航班信息后,添加该信息到系统中。
3. 浏览航班信息功能:该功能实现了将系统中所有的航班信息全部输出到屏幕上的功能。
4. 查询航班路线功能:该功能包含两种选择,一是根据用户选择的班次信息输出对应的航班信息;二是根据用户输入的终点站,输出所有到达该站点的航班信息。(根据部分信息查询全部信息)
5. 修改航班信息功能:该功能可以修改指定航班的某项信息,以实时更新航班信息。
6. 删除航班信息功能:该功能实现了可以删除某项航班信息的功能。
7. 排序航班信息功能:该功能实现了根据起飞时间进行排序功能。
8. 购票功能:该功能实现了当用户指定日期与班次信息时,相应地为该航班增加售出记录,但是如果该航班已经起飞或者该航班的机票已经售空,用户将购买失败,系统会给予用户相应的提示。
9. 退票功能:退票功能类似与购票功能,当用户指定日期与班次以后,将减少该班次的售出记录,同样的如果该班次已经起飞或者没有售出记录,则退票操作失败,系统会给予用户相应的提示。
10. 系统所有航班信息存储在文件中功能。
11. 其他自定义功能。
#### 概要设计
根据上述内容,确定主程序的流程、各模块之间的层次(调用)关系,说明程序中关键部分所采用的抽象数据类型、数据结构、数据库表结构以及尽可能高效的算法设计方案(尤其在数据量很大时)。画出主程序流程图、模块层次关系或调用图、数据库表结构等。
##### 1. 数据结构
###### 1.1 航班信息
根据航班信息日期不同,构建日期单链表,包含日期、数据域、指针域。数据域指向双向循环链表,内容包含航班数据结构体、指针域。
```c
// 日期链表头结点
typedef struct Link_list {
date_Node* head;
} date_Link_list;
// 日期链表节点结构体
typedef struct dNode {
filght_cir_double_Link_List * data; // 数据域 用于存储当前节点的数据
struct dNode* next; // 指针域 指向下一个节点
char date[30];
} date_Node;
// 双向循环链表头结点
typedef struct cir_double_Link_List
{
node_t * head;
}filght_cir_double_Link_List;
// 航班信息节点 - 双向循环链表
typedef struct fnode
{
struct fnode *before;
flight_t data;
struct fnode *after;
} node_t;
// 航班数据结构体
typedef struct flight
{
int id; // 航班班次
char flightNUM; // 航班代号
char flighttype[20]; // 飞机机型
char startcity[20]; // 航班起点站
int starttime[2]; // 起飞时间 时:分
char arrivecity[20]; // 航班终点站
int arrivetime[2]; // 到达时间 时:分
char flytime[20]; // 飞行时间
int value; // 票价
int maxNUM; // 额定载客量,
int leftbuyersa; // 剩余座位数量
char whetherfly; // 是否起飞 ‘y’ ‘n’
} flight_t;
```
###### 1.2 用户登录信息
构建用户登录单链表,有数据域、指针域;数据域指向用户数据结构体。
```c
// 用户数据节点 - 单链表
typedef struct unode
{
user_t *userm;
struct unode *next;
} unode_t;
// 用户数据结构体
typedef struct user
{
char name[64]; // 用户名
char passwd[64]; // 用户密码
int IDcard; // 用户身份信息
int sheet; // 票数
char date[10][30]; // 已购航班日期
flight_t ticket[10]; // 已购航班信息
} user_t;
```
##### 2. 主程序流程图

##### 3. 功能设计分析
###### 3.1 日期链表和航班双向循环链表初始化
```c
// 日期链表的创建
date_Link_list * init_date_Link_list(int days);
// 航班双向循环链表的创建
filght_cir_double_Link_List* init_filght_cir_double_Link_List(date_Node *list, FILE * fp);
```
步骤:
1. 创建头结点。
2. 创建节点。链表每次创建节点进行安全判断,是否创建成功。不成功则销毁节点。
###### 3.2 航班信息文件导入到日期链表和航班双向循环链表
```c
// 航班动态信息文件写入链表
void init_fligh_info_to_list(date_Link_list * D, FILE *fp , char *File_Name, int days);
```
步骤:
1. 只读方式打开航班信息文件。
2. 航班信息文件导入日期链表和航班双向循环链表。
3. 关闭航班信息文件。
###### 3.3 初始化登录信息链表
```c
// 登录链表的创建
unode_t* init_log_in_Link_List();
// 登录链表的节点增加
unode_t * insert_log_in_Node(FILE *fp);
```
步骤:
1. 创建头结点。
2. 创建节点。链表每次创建节点进行安全判断,是否创建成功。不成功则销毁节点。
###### 3.4 登录信息文件导入到登录链表
```c
// 登录信息文件写入登录链表
void init_log_in_info_to_list(unode_t *list, char *File_Name, int user_number);
```
步骤:
1. 只读方式打开登录文件。
2. 登录信息文件导入到登录链表。
3. 关闭登录信息文件。
###### 3.5 登录验证
```c
// 用于获取密码和账号 用于判断登陆 用户输入密码和账号从函数内输入
unode_t * log_in(unode_t *list);
// 循环判断 账号
unode_t * lon_decide_Account(unode_t * __C, const char * name);
```
步骤:
1. 与链表比对账号。若比对失败3次,返回账号错误。重新登录。
2. 当前账号与链表比对密码。若比对失败3次,返回密码错误。重新登录。
3. 登录成功,返回该账号登录链表节点。
###### 3.6 不同用户身份进入不同功能选择界面
###### 3.7 增加航班信息
```c
// 增加航班信息
bool add_fligh_info_to_list(date_Link_list * D);
```
步骤:
1. 输入航班日期,返回该日期的航班双向循环链表。若日期匹配失败,返回功能选择界面。
2. 进入指定航班日期的航班信息节点,尾加航班信息节点。
3. 输入需要增加的航班信息。若信息错误,重新输入航班信息,直至正确。
4. 返回功能选择界面。
###### 3.8 浏览航班路线
```c
// 浏览航班动态信息
void browse_flight_info(date_Link_list *D);
```
步骤:
1. 依次遍历打印日期和航班动态信息。
2. 返回功能选择界面。
###### 3.9 查询航班路线
```c
// 航班班次查询航班信息
void id_inquire_fligh_info_to_list(date_Link_list * D);
// 航班终点站查询航班信息
void arrivecity_inquire_fligh_info_to_list(date_Link_list * D);
```
航班班次查询航班信息步骤:
1. 输入航班日期,返回该日期的航班双向循环链表。若日期匹配失败,返回功能选择界面。
2. 获取需要查询的航班班次。若班次匹配失败,返回功能选择界面。
3. 打印该日期该班次航班信息。
4. 返回功能选择界面。
航班终点站查询航班信息步骤:
1. 输入航班终点站。若终点站匹配失败,返回功能选择界面。
2. 打印到达该终点站的所有航班信息。
3. 返回功能选择界面。
###### 3.10 修改航班信息
```c
// 查询日期-->查询航班班次-->修改航班信息
void modify_fligh_info_to_list(date_Link_list * D);
```
步骤:
1. 输入航班日期,返回该日期的航班双向循环链表。若日期匹配失败,返回功能选择界面。
2. 获取需要查询的航班班次。若班次匹配失败,返回功能选择界面。
3. 输入需要修改的航班信息。
4. 打印修改信息后的航班信息。
5. 返回功能选择界面。
###### 3.11 删除航班信息
```c
// 查询日期-->查询航班班次-->删除航班信息
void delete_fligh_info_to_list(date_Link_list * D);
```
步骤:
1. 输入航班日期,返回该日期的航班双向循环链表。若日期匹配失败,返回功能选择界面。
2. 获取需要查询的航班班次。若班次匹配失败,返回功能选择界面。
3. 释放改航班班次节点。
4. 返回功能选择界面。
###### 3.12 排序当日航班
```c
// 根据航班信息起飞时间排序当日航班
void sort_fligh_info_to_list(date_Link_list * D);
```
步骤:
1. 输入航班日期,返回该日期的航班双向循环链表。若日期匹配失败,返回功能选择界面。
2. 新建链表存入该日期的航班双向循环链表的数据。
3. 按起飞时间排序,并打印。
4. 释放新建的链表。
5. 返回功能选择界面。
###### 3.13 购买机票
```c
// 购票
void buy_ticket(date_Link_list *D, unode_t *__C);
// 打印当前用户已购票信息
void printf_user_ticket_info(unode_t *__A);
```
步骤:
1. 输入航班日期,返回该日期的航班双向循环链表。若日期匹配失败,返回功能选择界面。
2. 打印该日期的所有航班信息。
3. 选择需要购买的航班班次。
4. 判断选择该航班班次、航次余票、用户已购航票数是否满足条件。若不满足,返回功能选择界面。
5. 该用户节点存入该航班班次信息,用户节点已购航票数加一,该日期的航班双向循环链表的该航班班次剩余座位减一。
6. 打印当前用户已购票信息。
7. 返回功能选择界面。
###### 3.14 退订机票
```c
// 打印当前用户已购票信息
void printf_user_ticket_info(unode_t *__A);
// 退票
void refund_ticket(date_Link_list *D, unode_t *__C);
// 打印当前用户已购票信息
void printf_user_ticket_info(unode_t *__A);
```
步骤:
1. 打印当前用户已购票信息。
2. 输入航班日期,返回该日期的航班双向循环链表。若日期匹配失败,返回功能选择界面。
3. 选择需要退订的航班班次。
4. 判断航班是否起飞、航班是否退票量大于额定量。若不满足,返回功能选择界面。
5. 该用户节点删除该航班班次信息,用户节点已购航票数减一,该日期的航班双向循环链表的该航班班次剩余座位加一。
6. 打印当前用户已购票信息。
7. 返回功能选择界面。
###### 3.15 普通用户退出登录
```c
// 登录链表写入登录文件
void log_in_Link_List_to_File(unode_t *list, char *File_Name);
// 航班双向循环链表写入航班文件
void fprintf_flight_info(date_Link_list * D, FILE *fp , char *File_Name, int days);
```
步骤:
1. 判断用户链表是否存在。若不存在,返回功能选择界面。
2. 判断登录文件是否以只写方式打开成功。若不成功,返回功能选择界面。
3. 遍历登录链表节点,将节点数据域写入登录文件。
4. 关闭登录文件。
5. 打开航班信息文件。
6. 遍历日期链表和航班双向循环链表,将数据域写入航班信息文件。
7. 关闭航班信息文件。
8. 返回欢迎使用航班管理系统界面。
###### 3.16 管理员用户退出登录
```c
// 航班双向循环链表写入航班文件
void fprintf_flight_info(date_Link_list * D, FILE *fp , char *File_Name, int days);
```
步骤:
1. 打开航班信息文件。
2. 遍历日期链表和航班双向循环链表,将数据域写入航班信息文件。
3. 关闭航班信息文件。
4. 返回欢迎使用航班管理系统界面。
###### 3.17 makefile文档
```makefile
test: main.o log_in.o flight_file.o flight_operate.o ticket.o
gcc -o test main.o log_in.o flight_file.o flight_operate.o ticket.o
main.o: main.c
gcc -c main.c -o main.o
log_in.o: log_in.c
gcc -c log_in.c -o log_in.o
flight_file.o: flight_file.c
gcc -c flight_file.c -o flight_file.o
flight_operate.o: flight_operate.c
gcc -c flight_operate.c -o flight_operate.o
ticket.0: ticket.c
gcc -c ticket.c -o ticket.o
clean:
rm main.o log_in.o flight_file.o flight_operate.o ticket.o
```
1. 命令==make==:生成test可执行文件和依赖文件。
2. 命令==make clean==:清除依赖文件。
##### 4. 测试与运行
###### 4.1 欢迎使用航班管理系统界面

###### 4.2 登录验证界面

###### 4.3 管理员功能选择界面

###### 4.3 增加航班信息界面

###### 4.4 浏览航班路线界面

###### 4.5 查询航班路线
1. 查询方式选择界面界面

2. 根据时间班次查询航班界面

3. 根据终点站查询航班界面

###### 4.6 修改航班信息界面

###### 4.7 删除航班信息界面

###### 4.8 排序当日航班界面

###### 4.9 用户功能选择界面

###### 4.10 购买机票界面

###### 4.11 退订机票界面

##### 5. 总结
航班信息时间固定不符合要求,项目其余要求基本完成。