航班管理系统【C语言版】单文件编写

开发环境

  • 操作系统:Windows 11专业版
  • 开发工具:Visual Studio Code
  • 编程语言:C

项目考核验收表

1. 设计目标

本项目的目标是设计并实现一个简易的航班管理系统。该系统应具备以下功能:

  • 添加航班信息
  • 查询航班信息
  • 显示所有航班信息
  • 修改航班信息
  • 删除航班信息
  • 对航班信息进行排序
  • 保存和加载航班信息
  • 用户管理,包括管理员和普通用户两种类型
  • 登录功能

2. 功能描述

系统功能包括以下几点:

  • 用户管理:管理员可以添加新用户,并进行用户权限的设置(管理员或普通用户)。
  • 航班管理:管理员可以添加、修改、删除航班信息,普通用户可以查看和查询航班信息。
  • 数据存储:系统支持将航班信息和用户信息保存到文件,并从文件加载数据。
  • 排序功能:用户可以根据起飞时间或价格对航班进行排序。

3. 设计方案

系统采用模块化设计,主要功能分为以下几个模块:

  • 用户模块:包含用户登录、用户添加等功能。
  • 航班模块:包含航班信息的增删改查、排序等功能。
  • 文件模块:负责数据的保存和加载。
  • 菜单模块:根据用户类型显示不同的功能菜单。

4. 系统框架

系统框架图示如下:

+---------------------+
|      Main         |
|   - 初始化用户数据  |
|   - 加载文件数据    |
|   - 调用登录函数    |
+---------+-----------+|v
+---------------------+
|      Login          |
|   - 输入用户名和密码|
|   - 验证用户身份    |
|   - 调用菜单函数    |
+---------+-----------+|v
+---------------------+
|      Menu           |
|   - 显示功能菜单    |
|   - 根据用户选择调用|
|     相应的功能模块  |
+---------+-----------+|v
+---------------------+
|      Flight         |
|   - 添加航班信息    |
|   - 修改航班信息    |
|   - 删除航班信息    |
|   - 查询航班信息    |
|   - 显示航班信息    |
|   - 航班信息排序    |
+---------+-----------+|v
+---------------------+
|      File           |
|   - 保存数据到文件  |
|   - 从文件加载数据  |
+---------------------+

5. 实现过程

  1. 功能规划:确定系统需要实现的各项功能,并进行模块划分。
  2. 代码编写:
    • 实现用户管理功能,包括登录验证和用户添加。
    • 实现航班管理功能,包括增删改查和排序。
    • 实现数据的保存和加载功能。
  3. 测试与调试:对各个功能模块进行单元测试,发现并修复存在的bug。
  4. 集成测试:将所有功能模块集成在一起,进行整体测试,确保系统各部分协同工作。

6. 心得体会

通过本次项目的设计和实现,我对C语言的应用有了更深的理解,特别是在结构体、文件操作和字符串处理等方面的应用。此外,在实际开发过程中,我体会到模块化设计的重要性,它不仅让代码更易于管理和维护,也使得功能扩展变得更加方便。遇到的最大挑战是处理用户输入和文件操作部分,这也促使我深入学习相关的知识,提升了编程能力。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>#define MAX_FLIGHTS 100 // 定义最大航班数量
#define MAX_USERS 10    // 定义最大用户数量static int flight_num = 0; // 当前航班的数量
static int user_num = 0;   // 当前用户的数量typedef struct airplane
{char number[10];     // 航班号char Start_City[20]; // 起飞城市char End_City[20];   // 到达城市char Start_Time[20]; // 起飞时间char End_Time[20];   // 到达时间float Price;         // 机票价格float Discount;      // 机票折扣int Tickets;         // 机票剩余数量
} Plane;typedef struct user
{char name[20];     // 用户名char password[20]; // 密码int isAdmin;       // 用户类型 0普通用户   1管理员
} User;Plane flights[MAX_FLIGHTS]; // 存储航班信息的数组
User users[MAX_USERS];      // 存储用户信息的数组void Menu(int isAdmin); // 菜单
void addFlight();       // 添加
void findFlight();      // 查询
void displayFlights();  // 显示所有
void modifyFlight();    // 修改
void deleteFlight();    // 删除
void Sort();            // 排序
void saveToFile();      // 保存到文件
void loadFromFile();    // 从文件加载
void addUser();         // 添加用户/*功能:  显示菜单信息参数:  isAdmin - 是否管理员返回值:无
*/
void Menu(int isAdmin)
{int choice;loadFromFile(); // 启动时从文件加载数据while (1){if (isAdmin){printf("        航班管理系统(管理员)        \n");printf("------------------------------------\n");printf("|1、显示所有航班信息                |\n");printf("|2、查询航班信息                    |\n");printf("|3、排序航班信息                    |\n");printf("|4、添加航班信息                    |\n");printf("|5、修改航班信息                    |\n");printf("|6、删除航班信息                    |\n");printf("|7、保存航班信息                    |\n");printf("|8、添加用户                        |\n");printf("|0、退出                            |\n");printf("------------------------------------\n");}else{printf("        航班管理系统(普通用户)      \n");printf("------------------------------------\n");printf("|1、显示所有航班信息                |\n");printf("|2、查询航班信息                    |\n");printf("|3、排序航班信息                    |\n");printf("|0、退出                            |\n");printf("------------------------------------\n");}printf("请输入相应的序号选择!               \n");scanf("%d", &choice);getchar();switch (choice){case 1:displayFlights();break;case 2:findFlight();break;case 3:Sort();break;case 4:if (isAdmin)addFlight();elseprintf("无权限访问该功能!\n");break;case 5:if (isAdmin)modifyFlight();elseprintf("无权限访问该功能!\n");break;case 6:if (isAdmin)deleteFlight();elseprintf("无权限访问该功能!\n");break;case 7:if (isAdmin)saveToFile();elseprintf("无权限访问该功能!\n");break;case 8:if (isAdmin)addUser();elseprintf("无权限访问该功能!\n");break;case 0:saveToFile(); // 退出前保存数据exit(0);break;default:printf("无效的选择,请重试!\n");}// 暂停操作printf("\n");system("pause"); // 这行代码会使程序等待用户按下任意键system("cls");   // 清屏操作}
}/*功能:  添加航班信息参数:  无返回值:无
*/
void addFlight()
{if (flight_num >= MAX_FLIGHTS){printf("无法添加更多航班,已达到最大限制!\n");return;}Plane newFlight;printf("请输入航班号: ");gets(newFlight.number);printf("请输入起飞城市: ");gets(newFlight.Start_City);printf("请输入到达城市: ");gets(newFlight.End_City);printf("请输入起飞时间: ");gets(newFlight.Start_Time);printf("请输入到达时间: ");gets(newFlight.End_Time);printf("请输入机票价格: ");scanf("%f", &newFlight.Price);getchar();printf("请输入机票折扣: ");scanf("%f", &newFlight.Discount);getchar();printf("请输入剩余票数: ");scanf("%d", &newFlight.Tickets);getchar();flights[flight_num++] = newFlight; // 将新航班添加到数组中printf("航班添加成功!\n");
}/*功能:  显示所有航班信息参数:  无返回值:无
*/
void displayFlights()
{if (flight_num == 0){ // 检查是否有航班信息printf("没有可显示的航班信息!\n");return;}printf("航班号\t\t起飞城市\t到达城市\t起飞时间\t\t到达时间\t\t机票价格\t优惠折扣\t剩余票数\n");for (int i = 0; i < flight_num; i++){printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%.2f\t\t%.2f\t\t%d\n",flights[i].number, flights[i].Start_City, flights[i].End_City,flights[i].Start_Time, flights[i].End_Time,flights[i].Price, flights[i].Discount, flights[i].Tickets);}
}/*功能:  查询航班信息参数:  无返回值:无
*/
void findFlight()
{if (flight_num == 0){ // 检查是否有航班信息printf("没有可查询的航班信息!\n");return;}char fnum[10];printf("请输入要查询的航班号:");fgets(fnum, sizeof(fnum), stdin);fnum[strcspn(fnum, "\n")] = '\0'; // 去除换行符for (int i = 0; i < flight_num; i++){if (strcmp(fnum, flights[i].number) == 0){printf("航班号\t\t起飞城市\t到达城市\t起飞时间\t\t到达时间\t\t机票价格\t优惠折扣\t剩余票数\n");printf("%s\t\t%s\t\t%s\t\t%s\t%s\t%.2f\t\t%.2f\t\t%d\n",flights[i].number, flights[i].Start_City, flights[i].End_City,flights[i].Start_Time, flights[i].End_Time,flights[i].Price, flights[i].Discount, flights[i].Tickets);return;}}printf("未找到该航班!\n");
}/*功能:  修改航班信息参数:  无返回值:无
*/
void modifyFlight()
{if (flight_num == 0){ // 检查是否有航班信息printf("没有修改的航班信息!\n");return;}printf("请输入要修改的航班号:");char fnum[10];int flag = 0;fgets(fnum, 10, stdin);fnum[strcspn(fnum, "\n")] = 0; // 去掉换行符for (int i = 0; i < flight_num; i++){if (strcmp(fnum, flights[i].number) == 0){flag = 1;printf("修改开始\n请输入航班号: ");gets(flights[i].number);printf("请输入起飞城市: ");gets(flights[i].Start_City);printf("请输入到达城市: ");gets(flights[i].End_City);printf("请输入起飞时间: ");gets(flights[i].Start_Time);printf("请输入到达时间: ");gets(flights[i].End_Time);printf("请输入机票价格: ");scanf("%f", &flights[i].Price);getchar();printf("请输入机票折扣: ");scanf("%f", &flights[i].Discount);getchar();printf("请输入剩余票数: ");scanf("%d", &flights[i].Tickets);getchar();printf("航班修改成功!\n");break;}}if (flag == 0){printf("未找到该航班号对应的航班信息!\n");}
}/*功能:  删除航班信息参数:  无返回值:无
*/void deleteFlight()
{if (flight_num == 0){ // 检查是否有航班信息printf("没有可删除的航班信息!\n");return;}printf("请输入要删除的航班号:");char fnum[10];int flag = 0;fgets(fnum, sizeof(fnum), stdin);fnum[strcspn(fnum, "\n")] = 0;for (int i = 0; i < flight_num; i++){if (strcmp(fnum, flights[i].number) == 0){flag = 1;for (int j = i; j < flight_num - 1; j++){flights[j] = flights[j + 1];}flight_num--;printf("航班删除成功!\n");break;}}if (flag == 0){printf("未找到该航班号对应的航班信息!\n");}
}/*功能:  排序航班信息参数:  无返回值:无
*/void Sort()
{if (flight_num == 0){printf("没有航班信息可供排序!\n");return;}int choice;printf("请选择排序方式:\n1.按起飞时间升序\n2.按价格升序\n");scanf("%d", &choice);getchar();if (choice == 1){// 按起飞时间升序排序for (int i = 0; i < flight_num - 1; i++){for (int j = 0; j < flight_num - i - 1; j++){if (strcmp(flights[j].Start_Time, flights[j + 1].Start_Time) > 0){Plane temp = flights[j];flights[j] = flights[j + 1];flights[j + 1] = temp;}}}printf("航班信息已按起飞时间升序排序!\n");}else if (choice == 2){// 按价格升序排序for (int i = 0; i < flight_num - 1; i++){for (int j = 0; j < flight_num - i - 1; j++){if (flights[j].Price > flights[j + 1].Price){Plane temp = flights[j];flights[j] = flights[j + 1];flights[j + 1] = temp;}}}printf("航班信息已按价格升序排序!\n");}else{printf("无效的选择,请重试!\n");}
}/*功能:  保存航班信息到文件参数:  无返回值:无
*/
/*功能:  保存航班信息到文件参数:  无返回值:无
*/
void saveToFile()
{FILE *file = fopen("flights.txt", "wb");if (file == NULL){printf("无法打开文件进行写入!\n");return;}fwrite(&flight_num, sizeof(int), 1, file);        // 先保存航班数量fwrite(flights, sizeof(Plane), flight_num, file); // 再保存航班信息fwrite(&user_num, sizeof(int), 1, file);          // 保存用户数量fwrite(users, sizeof(User), user_num, file);      // 保存用户信息fclose(file);printf("航班信息已保存到文件!\n");
}/*功能:  从文件读取航班信息参数:  无返回值:无
*/
void loadFromFile()
{FILE *file = fopen("flights.txt", "rb");if (file == NULL){printf("无法打开文件进行读取,可能是文件不存在!\n");return;}fread(&flight_num, sizeof(int), 1, file);        // 先读取航班数量fread(flights, sizeof(Plane), flight_num, file); // 再读取航班信息fread(&user_num, sizeof(int), 1, file);          // 读取用户数量fread(users, sizeof(User), user_num, file);      // 读取用户信息fclose(file);printf("航班信息已从文件加载!\n");
}/*功能:  登录功能参数:  无返回值:无
*/
void login()
{char username[20];char password[20];printf("请输入用户名: ");fgets(username, sizeof(username), stdin);username[strcspn(username, "\n")] = '\0'; // 去除换行符printf("请输入密码: ");fgets(password, sizeof(password), stdin);password[strcspn(password, "\n")] = '\0'; // 去除换行符for (int i = 0; i < user_num; i++){if (strcmp(users[i].name, username) == 0 && strcmp(users[i].password, password) == 0){printf("登录成功!\n");Menu(users[i].isAdmin);return;}}printf("用户名或密码错误,请重试!\n");exit(1); // 登录失败,退出程序
}void addUser()
{if (user_num >= MAX_USERS){printf("无法添加更多用户,已达到最大限制!\n");return;}User newUser;printf("请输入用户名: ");fgets(newUser.name, sizeof(newUser.name), stdin);newUser.name[strcspn(newUser.name, "\n")] = '\0'; // 去除换行符printf("请输入密码: ");fgets(newUser.password, sizeof(newUser.password), stdin);newUser.password[strcspn(newUser.password, "\n")] = '\0'; // 去除换行符printf("用户类型 (0普通用户/1管理员): ");scanf("%d", &newUser.isAdmin);getchar(); // 捕获并丢弃多余的换行符或空格等字符users[user_num++] = newUser; // 将新用户添加到数组中printf("用户添加成功!\n");
}int main()
{// 初始化一个管理员用户strcpy(users[user_num].name, "admin");strcpy(users[user_num].password, "admin123");users[user_num].isAdmin = 1;user_num++;loadFromFile(); // 启动时从文件加载数据login();        // 登录验证return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动标签的艺术:sklearn中的聚类标签自动分配技术

自动标签的艺术&#xff1a;sklearn中的聚类标签自动分配技术 在机器学习领域&#xff0c;聚类是一种无监督学习方法&#xff0c;它将数据集中的样本分组&#xff0c;使得同一组内的样本相似度高&#xff0c;而不同组之间的样本相似度低。与有监督学习不同&#xff0c;聚类不依…

前端经验:使用sheetjs导出CSV文本为excel

应用场景 很多web表格组件没有提供直接的导出excel功能&#xff0c;但提供了导出CSV的功能。 如果能想办法拿到CSV的内容&#xff0c;就可以利用sheetjs生成excel并导出。 实施步骤 1.拿到CSV的内容字符 每种表格组件都有各自的CSV生成方法&#xff0c;不管用什么方法&…

[python] 利用opencv显示对比试验效果

利用 opencv 显示 对比实验效果 选择有效区域 import os import random import uuidfrom tqdm import tqdm import cv2 import numpy as np import matplotlib.pyplot as plt GT_Dir"results_compare/GT/" Bicubic_dir"results_compare/Bicubic4x/" Phase…

服务器证书基于 OpenSSL一键颁发脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

vue使用了代理跨域,部署上线,使用Nginx配置出现问题,访问不到后端接口

1、如果路由的mode是history模式的要加上框框里的哪句&#xff0c;然后配置下面的location router location / {root /usr/local/app/dist/; #vue文件dist的完整路径try_files $uri $uri/ router;index index.html index.htm;}#error_page 500 502 503 504 /50x.html;lo…

数据分析入门指南:数据库入门(五)

本文将总结CDA认证考试中数据库中部分知识点&#xff0c;内容来源于《CDA模拟题库与备考资料PPT》 。 CDA认证&#xff0c;作为源自中国、面向全球的专业技能认证&#xff0c;覆盖金融、电信、零售、制造、能源、医疗医药、旅游、咨询等多个行业&#xff0c;旨在培养能够胜任数…

RK3328 Debian安装OpenMediaVault

手头有RK3328板卡&#xff0c;自己编译了Debian并烧录跑起来了&#xff0c;拿它来作为NAS使用&#xff0c;在网上找了一些开源的NAS系统&#xff0c;最终敲定使用OpenMediaVault这套&#xff0c;下面是在RK3328 Debian系统下的安装过程&#xff1a; 0、先打开一个Terminal终端…

CVE-2023-33440(任意文件上传)

简介 Faculty Evaluation System v1.0 存在未授权任意文件上传漏洞漏洞 过程 打开靶场 进行目录扫描 发现后台login.php&#xff0c;进入查看 弱口令进行测试&#xff0c;无效&#xff0c;无法进入 根据提示是未授权访问文件上传 &#xff0c;应该是不需要登录就能触发漏洞…

分布式Session共享的5类技术方案,与优劣势比较

分布式Session共享是分布式系统中常见的问题&#xff0c;主要解决在多个服务器之间共享用户会话信息的需求。以下是五种常见的分布式Session共享技术方案及其优劣势比较&#xff1a; 1. Session复制 设计思路&#xff1a; 多个Web服务器之间相互同步Session&#xff0c;每个W…

Apple Vision Pro 开发资源大全

Apple Vision Pro 是一款强大的视觉处理设备,为开发者提供了丰富的应用场景和开发资源。以下是与 Apple Vision Pro 相关的应用程序、开发者资源、社区和文章的集合,旨在帮助开发者更好地利用这一平台。 1. Vision Pro 使用技巧 技巧和窍门:提供一系列实用的使用技巧,帮助…

http 协议中GET如何传递参数(Query String)?

因为项目需要&#xff0c;最近在手搓一个Http Connection&#xff0c;目的是实现最简单的Http访问&#xff0c;能通过Get或则Post方法向数数的日志服务器传递数据。之前看过数数提供的开发包&#xff0c;因为服务器用的是C&#xff0c;而数数提供的C/C开发包简陋的吓人&#xf…

openstack设置IP直接登录,不需要加dashboard后缀

openstack 实验环境&#xff0c;openstack-t版&#xff0c;centos2009 修改配置文件 [rootcontroller ~]# vim /WEBROOT /etc/openstack-dashboard/local_settings #将dashboard去掉 WEBROOT /dashboard/ #改为 WEBROOT /[rootcontroller ~]# vim /etc/httpd/conf.d/openst…

深度学习每周学习总结N4:中文文本分类-Pytorch实现(基本分类(熟悉流程)、textCNN分类(通用模型)、Bert分类(模型进阶))

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结&#xff1a;1. 基础模型a. 数据加载b. 数据预处理c. 模型搭建与初始化d. 训练函数e. 评估函数f.拆分数据集运行模型g. 结果可…

C++STL初阶(7):list的运用与初步了解

在了解了vector之后&#xff0c;我们只需要简单学习List与vector不一样的接口即可 1.list的基本接口 1.1 iterator list中&#xff0c;与vector最大的区别就是迭代器由随机迭代器变成双向迭代器 string和vector中的迭代器都是随机迭代器&#xff0c;支持-等&#xff0c;而LIS…

达梦数据库 MPP集群搭建(带主备)

MPP集群搭建&#xff08;带主备&#xff09; 1.背景2.操作内容和要求3. 具体步骤3.1 搭建过程3.1.1 集群搭建3.1.2 准备工作3.1.2.1 初始化3.1.2.2 备份数据库 3.1.3 配置主库EP013.1.3.1 配置dm.ini3.1.3.2 配置dmmal.ini3.1.3.3 配置dmarch.ini3.1.3.4 配置dmmpp.ctl3.1.3.5 …

Seata 面试题及答案整理,最新面试题

Seata 是如何解决分布式事务问题的? Seata通过事务协调器、事务管理器和资源管理器三个核心组件来解决分布式事务问题。 1、事务协调器(TC): TC作为全局事务的协调者,负责维护全局和分支事务的状态,并协调全局提交或回滚。 2、事务管理器(TM): TM负责定义全局事务的范…

百度文心大模型4.0 Turbo面向企业开放 多款旗舰模型降价

在2024年世界人工智能大会期间&#xff0c;百度副总裁谢广军宣布了文心一言4.0Turbo模型对企业用户的全面开放&#xff0c;并介绍了其定价策略。文心一言4.0Turbo的输入定价为0.03元/千Tokens&#xff0c;输出定价为0.06元/千Tokens。谢广军指出&#xff0c;如果按照3:1的输入输…

ArcGIS Pro SDK (九)几何 7 多点

ArcGIS Pro SDK &#xff08;九&#xff09;几何 7 多点 文章目录 ArcGIS Pro SDK &#xff08;九&#xff09;几何 7 多点1 构造多点 - 从映射点的枚举2 构造多点 - 使用 MultipointBuilderEx3 修改多点的点4 从多点检索点、2D 坐标、3D 坐标 环境&#xff1a;Visual Studio 2…

Golang | Leetcode Golang题解之第263题丑数

题目&#xff1a; 题解&#xff1a; var factors []int{2, 3, 5}func isUgly(n int) bool {if n < 0 {return false}for _, f : range factors {for n%f 0 {n / f}}return n 1 }

Linux云计算 |【第一阶段】SERVICES-DAY4

主要内容&#xff1a; DHCP概述、PXE批量装机、配置PXE引导、Kickstart自动应答、Cobbler装机平台 一、DHCP服务概述及原理 DHCP动态主机配置协议&#xff08;Dynamic Host Configuration Protocol&#xff09;&#xff0c;由IETF&#xff08;Internet网络工程师任务小组&…