C语言航班信息管理系统来了!
之前在我写好了代码后发布了一篇文章,但是那时候还没有公开代码。
之前的文章http://t.csdn.cn/MsADA
今天答辩完了,那么我就公开代码了。
项目地址在https://gitee.com/superverybest/FIMS
答辩PPT也在这里。
我承认!!代码是有点凌乱......
目录
概述
系统功能实现
初始化
加载
容量检查
登录
浏览航班信息
添加航班信息
查询航班信息
删除航班信息
修改航班信息
保存航班信息
关于
退出
代码实现
FIMS(Flight Information Management System)是一款航班信息管理系统软件。该软件基于C语言,在Visual Studio 2019环境下开发。其本质是增删查改,可以实现对航班信息的浏览、添加、查询、删除、修改以及保存。此软件具有用户界面友好、易操作的特点,助力航班相关工作人员提高工作效率。
作者熟练Git,并且常在Git上更新代码,所以决定将此设计在答辩后分享到自己的Gitee中,项目地址为https://gitee.com/superverybest/FIMS。为防止抄袭,作者选择在答辩完成前不公开代码。
采用结构体存储航班信息。用结构体套用结构体,一个结构体用于存放航班的具体信息,另一个结构体用来说明当前容量、已存放的航班信息的数量。
采用动态内存管理,向系统申请一定数量的空间。为了节省空间,软件默认向程序申请3个航班信息结构体大小的空间。并且置size的值为0,置capacity的值为3。
此功能紧随初始化功能,在初始化后读取.dat文件。如果.dat文件不存在就会有错误提示,存在的话就会将文件中已存放的航班信息加载到程序中。在加载期间还会进行容量检查。
用于检查已开辟的空间是否足够使用,若不满足使用就扩容。
主要采用判断语句和循环语句实现密码的输入,使用三目操作符来判断密码的正确性,并且用“*”来遮掩密码,以确保系统和数据的安全。
用于浏览航班信息,若size值为0则会提示航班信息为空,否则就显示航班信息。采用冒泡排序,对航班号进行排序并显示。
用户首先要键入航班号,以确保不能添加相同班次号航班信息。若存在则提示不能添加,若不存在则接着输入其它信息。
这里提供了两个选择,一个是按航班号扫查询,一个是按目的地查询。如果查找到了相关航班信息,则会对航班信息使用冒泡排序法按单价排序,然后显示出来。
用户输入航班号之后,程序先是检查航班是否存在,若存在就找到航班信息在结构体数组中的下标,然后遍历将它后边的信息往前覆盖。
用户输入航班号之后,程序先是检查航班是否存在,若存在则进一步更改航班信息。在更改航班信息的过程中,也要对预期的航班号进行检查,检查其是否存在,然后进一步修改其它信息。
此功能将程序中现存的信息保存到.dat文件中。如果.dat文件不存在就报错,如果存在就能成功保存信息。
显示软件的相关信息,如版本、作者、项目地址等。
并非简单地退出,而是带有保存功能的退出。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include
#include< conio.h>
#include
#define DEFAULT_SZ 3
void CheckCapacity(struct List* ps);
void Destroy(struct List* ps);
void Save(struct List* ps);
void menu();
enum Option
{
EXIT,
GLANCEOVER,
ADD,
SEARCH,
DEL,
MODIFY,
SAVE,
PASSWORD,
ABOUT,
};
typedef struct FlightInfo
{
long Number;
char Depature[20];
char Destination[20];
int StartTime_hour;
int StartTime_min;
int ArriveTime_hour;
int ArriveTime_min;
int volume;
float price;
}FlightInfo;
typedef struct List
{
struct FlightInfo *data;
int size;
int capacity;
}List;
typedef struct List_SortByPrice
{
struct FlightInfo data[1000];
int size;
}List_SortByPrice;
struct List_SortByPrice sortbyprice;
void Load(struct List* ps)
{
FlightInfo tmp = { 0 };
FILE* PfRead = fopen("plane.dat","rb");
if (PfRead == NULL)
{
printf("Load:%s\n", strerror(errno));
return;
}
while (fread(&tmp, sizeof(FlightInfo), 1, PfRead))
{
CheckCapacity(ps);
ps->data[ps->size] = tmp;
ps->size++;
}
fclose(PfRead);
PfRead = NULL;
}
void ReturnOrEnd(struct List* ps)
{
int RETURN = 2;
while (RETURN != 1 && RETURN != 0)
{
printf("请选择(0)返回主页菜单 (1)保存航班信息并退出系统\n");
scanf("%d", &RETURN);
if (RETURN == 0)
{
system("cls");
return;
}
else if (RETURN == 1)
{
Save(ps);
Destroy(ps);
printf("退出系统\n");
exit(0);
}
else
{
system("cls");
printf("选择错误!请重新选择\n");
}
}
}
void InitList(struct List* ps)
{
ps->data = (struct FlightInfo*)malloc(DEFAULT_SZ * sizeof(struct FlightInfo));
if (ps->data == NULL)
{
return;
}
ps->size = 0;
ps->capacity = DEFAULT_SZ;
Load(ps);
}
void Destroy(struct List* ps)
{
free(ps->data);
ps->data = NULL;
}
int FindByNumber( struct List* ps,long search_Number)
{
int i = 0;
for (i = 0;i < ps->size;i++)
{
if (ps->data[i].Number == search_Number)
{
return i;
}
}
return -1;
}
int FindByDestination(struct List* ps, char search_Destination[20])
{
int i = 0;
int j = 0;
for (i = 0;i < ps->size;i++)
{
if (strcmp(ps->data[i].Destination,search_Destination)==0)
{
sortbyprice.data[j] = ps->data[i];
j++;sortbyprice.size++;
}
}
if (sortbyprice.size == 0)
return -1;
}
void Del(struct List* ps)
{
system("cls");
long del_Number;
printf("请输入要删除航班的航班号:\n");
scanf("%ld", &del_Number);
int pos = FindByNumber(ps, del_Number);
if (pos == -1)
{
printf("要删除的航班信息不存在!\n");
}
else
{
int j = 0;
for (j = pos;j < ps->size;j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->size--;
printf("删除成功\n");
}
ReturnOrEnd(ps);
}
void Search(struct List* ps)
{
system("cls");
int n = 2;
while (n != 1 && n != 0)
{
printf("请选择\n(0)按照航班号查询 (1)按照目的地查询\n");
scanf("%d", &n);
if (n == 0)
{
long search_Number;
printf("请输入要查找的航班的航班号\n");
scanf("%ld", &search_Number);
int pos = FindByNumber(ps, search_Number);
if (pos == -1)
{
printf("要查找的航班不存在\n");
}
else
{
printf("%8s %10s %10s %s %s %s %s\n", "航班号", "出发地", "目的地", "出发时间", "到达时间", "额定载客量", "单价");
printf("%8ld %10s %10s %2d:%2d %2d:%2d %-8d %-10.2f\n", ps->data[pos].Number,
ps->data[pos].Depature, ps->data[pos].Destination, ps->data[pos].StartTime_hour, ps->data[pos].StartTime_min
, ps->data[pos].ArriveTime_hour, ps->data[pos].ArriveTime_min, ps->data[pos].volume, ps->data[pos].price
);
}
}
else if (n == 1)
{
char search_Destination[20];
printf("请输入要查找的航班的目的地\n");
scanf("%s", &search_Destination);
int pos = FindByDestination(ps, search_Destination);
if (pos == -1)
{
printf("要查找的航班不存在\n");
}
else
{
struct FlightInfo sort;
int i = 0;
int j = 0;
for (i = 0;i < sortbyprice.size - 1; i++)
{
for (j = i;j < sortbyprice.size - 1;j++)
{
if (sortbyprice.data[j].price >sortbyprice.data[j + 1].price)
{
sort = sortbyprice.data[j];
sortbyprice.data[j] = sortbyprice.data[j + 1];
sortbyprice.data[j + 1] = sort;
}
}
}
printf("%8s %10s %10s %s %s %s %s\n", "航班号", "出发地", "目的地", "出发时间", "到达时间", "额定载客量", "单价");
for (i = 0;i < sortbyprice.size;i++)
{
printf("%8ld %10s %10s %2d:%2d %2d:%2d %-8d %-10.2f\n", sortbyprice.data[i].Number,
sortbyprice.data[i].Depature,
sortbyprice.data[i].Destination,
sortbyprice.data[i].StartTime_hour,
sortbyprice.data[i].StartTime_min,
sortbyprice.data[i].ArriveTime_hour,
sortbyprice.data[i].ArriveTime_min,
sortbyprice.data[i].volume,
sortbyprice.data[i].price);
}
}
sortbyprice.size = 0;
}
else
{
printf("选择错误,请重新选择!\n");
}
}
ReturnOrEnd(ps);
}
void Modify(struct List* ps)
{
system("cls");
long modify_Number;
printf("请输入要修改的航班的航班号\n");
scanf("%ld", &modify_Number);
int pos=FindByNumber(ps, modify_Number);
if (pos == -1)
{
printf("要修改的航班信息不存在\n");
}
else
{
long search_Number = 0;
printf("请输入要添加的航班号:\n");
scanf("%ld", &search_Number);
int pos = FindByNumber(ps, search_Number);
if (pos != -1)
{
printf("此航班信息已存在,您不能重复添加。您可以对其进行删除或修改\n");
ReturnOrEnd(ps);
}
else
{
printf("航班信息为空,您可以写入航班信息\n\n");
printf("请输入信息:\n");
printf("分别为出发地、目的地、出发时间、到达时间、额定载客量、单价\n");
printf("以空格为间隔\n");
printf("注意!时间输入格式如下:23 15表示二十三时十五分\n");
ps->data[ps->size].Number = search_Number;
scanf("%s", ps->data[pos].Depature);
scanf("%s", ps->data[pos].Destination);
scanf("%d", &(ps->data[pos].StartTime_hour));
scanf("%d", &(ps->data[pos].StartTime_min));
scanf("%d", &(ps->data[pos].ArriveTime_hour));
scanf("%d", &(ps->data[pos].ArriveTime_min));
scanf("%d", &(ps->data[pos].volume));
scanf("%f", &(ps->data[pos].price));
printf("修改完成\n");
}
}
ReturnOrEnd(ps);
}
void Save(struct List* ps)
{
FILE* pfWrite = fopen("plane.dat", "wb");
if (pfWrite == NULL)
{
printf("Save:%s", strerror(errno));
return ;
}
int i = 0;
for (i = 0;i < ps->size;i++)
{
fwrite(&(ps->data[i]), sizeof(FlightInfo), 1, pfWrite);
}
system("cls");
printf("保存成功\n");
fclose(pfWrite);
pfWrite = NULL;
}
void GlanceOver( struct List* ps)
{
system("cls");
if (ps->size == 0)
{
printf("航班信息为空\n");
}
else
{
int i = 0;
int j = 0;
int total = 0;
printf("%8s %10s %10s %s %s %s %s\n", "航班号", "出发地", "目的地", "出发时间", "到达时间", "额定载客量", "单价");
struct FlightInfo sort;
for (i = 0;i < ps->size-1; i++)
{
for (j = i;j < ps->size-1;j++)
{
if (ps->data[j].Number < ps->data[j + 1].Number)
{
sort = ps->data[j];
ps->data[j] = ps->data[j+1];
ps->data[j + 1] = sort;
}
}
}
for (i = 0;i < ps->size;i++)
{
printf("%8ld %10s %10s %2d:%2d %2d:%2d %-8d %-10.2f\n",ps->data[i].Number,
ps->data[i].Depature, ps->data[i].Destination, ps->data[i].StartTime_hour, ps->data[i].StartTime_min
, ps->data[i].ArriveTime_hour, ps->data[i].ArriveTime_min, ps->data[i].volume, ps->data[i].price
);
if ((i+1) % 20 == 0)
{
total += 2;
printf("已显示%d条航班信息,按任意键继续显示",total*10);
system("pause");
}
}
}
ReturnOrEnd(ps);
}
void CheckCapacity(struct List* ps)
{
if (ps->size == ps->capacity)
{
struct FlightInfo*ptr= realloc(ps->data,(ps->capacity+2)*sizeof(struct FlightInfo));
if (ptr != NULL)
{
ps->data = ptr;
ps->capacity += 2;
printf("增容成功\n");
}
else
{
printf("增容失败\n");
}
}
}
void Add(struct List* ps)
{
system("cls");
long search_Number = 0;
CheckCapacity(ps);
printf("请输入要添加的航班号:\n");
scanf("%ld",&search_Number);
int pos = FindByNumber(ps, search_Number);
if (pos != -1)
{
printf("此航班信息已存在,您不能重复添加。您可以对其进行删除或修改\n");
ReturnOrEnd(ps);
}
else
{
printf("航班信息为空,您可以写入航班信息\n\n");
printf("请输入信息:\n");
printf("分别为出发地、目的地、出发时间、到达时间、额定载客量、单价\n");
printf("以空格为间隔\n");
printf("注意!时间输入格式如下:23 15表示二十三时十五分\n");
ps->data[ps->size].Number = search_Number;
//scanf("%ld", &(ps->data[ps->size].Number));
scanf("%s", ps->data[ps->size].Depature);
scanf("%s", ps->data[ps->size].Destination);
scanf("%d", &(ps->data[ps->size].StartTime_hour));
scanf("%d", &(ps->data[ps->size].StartTime_min));
scanf("%d", &(ps->data[ps->size].ArriveTime_hour));
scanf("%d", &(ps->data[ps->size].ArriveTime_min));
scanf("%d", &(ps->data[ps->size].volume));
scanf("%f", &(ps->data[ps->size].price));
ps->size++;
printf("添加成功\n");
ReturnOrEnd(ps);
}
}
void Password(struct List* ps)
{
system("cls");
printf("由于作者能力有限,无法解决安全性问题,\n");
printf("若想修改系统密码,请自行进入此项目仓库下载程序代码并修改密码\n");
printf("项目地址:https://gitee.com/superverybest/FIMS \n");
ReturnOrEnd(ps);
}
void About(struct List* ps)
{
system("cls");
printf("********************************************************\n\n");
printf(" 关于FIMS \n\n\n");
printf("FIMS由三位在校本科生大一期间创建。\n");
printf("FIMS本来只是他们的课程设计,当他们完成这个项目后,并没有把它据为己有,\n");
printf("作者深知未来必将是更加开发和开源的时代,所以决定在完成答辩后将其开源。\n");
printf("虽然只是很不起眼的小项目,但在软件工程师的世界里,有一种精神,叫做开源精神。\n");
printf("它的本质,就是“我做了一个东西,大家来用吧!”");
printf("这样一种Geek的精神,同时也有让世界变得更加美好的愿望。\n\n");
printf("软件名称:Flight Information Management System\n");
printf("简称:FIMS\n");
printf("版本:0.0.0.1\n");
printf("日期:2022_12_27\n");
printf("编译及测试环境:Visual Studio 2019\n");
printf("作者:王逸飞、汪帅桦、李珅\n");
printf("此项目为公开开源项目,项目地址https://gitee.com/superverybest/FIMS\n\n");
printf(" 联系我们 \n\n");
printf("作者邮箱:[email protected]\n");
printf("作者博客:https://blog.csdn.net/m0_60464690 \n");
printf("作者Gitee(代码仓库):https://gitee.com/superverybest \n");
printf("********************************************************\n");
ReturnOrEnd(ps);
}
int login()
{
char word[10] = { 0 };
char c;
char password[10] = "123456789";
int i = 0;
printf("\n\n");
printf("\t--------------------------------------------------------\n");
printf("\t-------------------- FIMS登录页面---------------------\n");
printf("\t--------------------------------------------------------\n");
printf("\n\n");
printf("\t请输入密码.\n");
printf("\t密码:\n\t按下回车键结束输入\n\t");
while (1)
{
c = _getch();
if (c == '\r')
{
break;
}
else if (c == '\b')
{
printf("\b \b");
--i;
}
else
{
word[i++] = c;
printf("*");
}
}
system("cls");
return((strcmp(password, word) == 0) ? 1 : 0);
}
void menu()
{
printf("********************************************************\n\n");
printf(" 欢迎使用FIMS \n");
printf(" Flight Information Management System \n\n\n");
printf(" 1.浏览班次信息 \n\n");
printf(" 2.添加航班信息 \n\n");
printf(" 3.查询航班信息 \n\n");
printf(" 4.删除航班信息 \n\n");
printf(" 5.修改航班信息 \n\n");
printf(" 6.保存航班信息 \n\n");
printf(" 7.系统密码问题 \n\n");
printf(" 8.关于 \n\n");
printf(" 0.退出 \n\n\n");
printf("********************************************************\n");
}
int main()
{
struct List list;
int input = 0;
InitList(&list);
if (login() == 1)
{
}
else
{
printf("密码错误,为防止暴力破解密码系统已关闭!\n");
printf("您可以重新打开程序再次尝试\n");
return 0;
}
do
{
menu();
scanf("%d", &input);
switch (input)
{
case GLANCEOVER:
GlanceOver(&list);
break;
case ADD:
Add(&list);
break;
case SEARCH:
Search(&list);
break;
case DEL:
Del(&list);
break;
case MODIFY:
Modify(&list);
break;
case EXIT:
Save(&list);
Destroy(&list);
printf("退出系统\n");
break;
case SAVE:
Save(&list);
break;
case ABOUT:
About(&list);
break;
case PASSWORD:
Password(&list);
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}