C语言航班信息管理系统_增删查改

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 <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include< conio.h>
#include<windows.h>

#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("作者邮箱:superverybest@outlook.com\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;
}
  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值