# 航班管理系统 **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; ``` image-20240414153709607 ###### 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; ``` image-20240414153825245 ##### 2. 主程序流程图 ![image-20240414214153273](./img/image-20240414214153273.png) ##### 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 欢迎使用航班管理系统界面 ![image-20240414213427156](./img/image-20240414213427156.png) ###### 4.2 登录验证界面 ![image-20240414214353286](./img/image-20240414214353286.png) ###### 4.3 管理员功能选择界面 ![image-20240414215237184](./img/image-20240414215237184.png) ###### 4.3 增加航班信息界面 ![image-20240414214924499](./img/image-20240414214924499.png) ###### 4.4 浏览航班路线界面 ![image-20240414215547586](./img/image-20240414215547586.png) ###### 4.5 查询航班路线 1. 查询方式选择界面界面 ![image-20240414215658883](./img/image-20240414215658883.png) 2. 根据时间班次查询航班界面 ![image-20240414220003366](./img/image-20240414220003366.png) 3. 根据终点站查询航班界面 ![image-20240414220422377](./img/image-20240414220422377.png) ###### 4.6 修改航班信息界面 ![image-20240414220801130](./img/image-20240414220801130.png) ###### 4.7 删除航班信息界面 ![image-20240414221013346](./img/image-20240414221013346.png) ###### 4.8 排序当日航班界面 ![image-20240414221230302](./img/image-20240414221230302.png) ###### 4.9 用户功能选择界面 ![image-20240414221453308](./img/image-20240414221453308.png) ###### 4.10 购买机票界面 ![image-20240414221727650](./img/image-20240414221727650.png) ###### 4.11 退订机票界面 ![image-20240414222040207](./img/image-20240414222040207.png) ##### 5. 总结 航班信息时间固定不符合要求,项目其余要求基本完成。