⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 飞机订票系统.c

📁 飞机订票系统设计: 要求: 假定民航机场共有n个航班
💻 C
字号:
/***************************************************************
飞机订票系统设计:
要求:
假定民航机场共有n个航班,每个航班有一航班号、确定的航线(起始站、终点站)、
确定的飞行时间(星期几)和一定的成员订额。试设计一飞机订票系统,使之能提供下列服务: 
1、航班信息录入功能(航班信息用文件保存) 
2、航班信息浏览功能 
3、查询航线:(至少一种查询方式)
	1按航班号查询
	2按起点站查询
	3按终点站查询
	4按飞行时间查询

***************************************************************/


#include<stdio.h>		
#include<string.h>	
#include<stdlib.h>
#include<conio.h>
#define DATA "flight.dat"	//数据库	
#define N 100				//最大数据量
#define PAGE 10				//浏览一次显示数据量
#define PRHEAD printf("\n  航班号  |   起始站   |   终点站   |飞行时间|预售票总数|已售票数\n")
#define PRINFO(i) printf("%8s  |%10s  |%10s  |%5d   |%7d   |%5d   \n",i.num,i.start,i.finish,i.time,i.ticket,i.buy_num)
#define LEN sizeof(FLIGHT)
typedef struct 		//定义航班结构体数组
{
 char num[7];			//航班号:国内为6位,例如CZ3151;国外航班为5位BA038
 char start[20];		//起始站	
 char finish[20];		//终点站	
 int time;				//飞行时间:1-7分别表示星期一到星期天
 int ticket;			//预售票总数
 int buy_num;			//已售票数
}FLIGHT;
FLIGHT fltinfo[N];
int n;
/*********************定义模块******************/
int msgbox(char *);				//模拟msgbox确定框
void modify(FLIGHT *);			//修改数据子函数
void input(FLIGHT *);			//航班信息录入功能模块
void save(char *,FLIGHT *,int);	//航班信息保存功能模块
int read(char *,FLIGHT *);		//航班信息读取功能模块
void list(FLIGHT *,int);		//航班信息浏览功能模块
void searth(FLIGHT *);			//航班信息查询功能模块


int main()
{	
	if(n=read(DATA,fltinfo))//读取航班数据
	{
		printf("\n\n\t\t共读取%d个已有航班数据\n",n);
	}
	else
	{
		printf(
			"\n\n\t\t欢迎您第一次进入本飞机订票系统\n"
			"\t\t该程序由陈秋炜制作\n");
	}
	
	getch();
	while(1)
	{
		//显示主界面
		system("cls");
		printf(
			"------------------------------"
			"飞机订票系统"
			"-------------------------------\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t1.信息录入\t\t\t\t|\n"
			"|\t\t\t\t2.信息浏览\t\t\t\t|\n"
			"|\t\t\t\t3.信息查询\t\t\t\t|\n"
			"|\t\t\t\t4.保存数据库\t\t\t\t|\n"
			"|\t\t\t\t0.离开系统\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"-------------------------------"
			"请选择(0-4)"
			"-------------------------------\n"
		);
		
		switch(getch())//获取键盘ascii码值
		{
		case '1':
			input(fltinfo);break;
		case '2':
			list(fltinfo,n);break;
		case '3':
			searth(fltinfo);break;
		case '4':
			save(DATA,fltinfo,n);break;
		case '0':
			if(msgbox("退出前是否保存数据库?"))
				save(DATA,fltinfo,n);
			exit(0);break;
		default:break;
		}
		
	}
	return 0;
}
/*********************************************
航班数据录入模块
提供数据全部录入及数据追加功能
并具有菜单。
 ********************************************/
void input(FLIGHT *flt)
{
	int i,j;
	FLIGHT *p=(FLIGHT *)malloc(LEN);
	
	while(1)
	{
		//显示录入界面
		system("cls");
		printf(
			"------------------------------"
			"信息录入功能"
			"-------------------------------\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t1.信息录入(!覆盖原有信息!)\t\t\t|\n"
			"|\t\t\t2.追加航班数据\t\t\t\t\t|\n"
			"|\t\t\t0.返回主菜单\t\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"-------------------------------"
			"请选择(0-2.)"
			"-------------------------------\n"
		);
		
		switch(getch())//获取键盘ascii码值
		{
		case '1':
			{
				printf("\n\n\t请输入航班数量(小于%d)(0取消操作):",N);
				while(scanf("%d",&j)!=1)
				{
					flushall();
					printf("\t输入出错,重新输入:");
				}
				system("cls");
				
				for(i=0;i<j;i++)
				{
					flushall();
					printf("\n\n\t当前输入数据:%d/%d\n\t可以直接全部输入",i+1,j);
					modify(p);
					if(msgbox("数据是否写入?"))flt[i]=*p;
					else i--;
					system("cls");
					n=j;
				}
				free(p);
				
			}
			break;
		case '2':
			{
			
				if(msgbox("确定追加新航班数据"))
				{
					n++;
					if(n>N)
					{
						printf("程序数据量已经超过%d",N);
						break;
					}
					printf("\n\n\t当前输入数据:%d/%d\n\t可以直接全部输入",n,n);
					modify(p);
					if(msgbox("\t\t数据是否写入?"))memcpy(&flt[n-1],p,LEN);
				}
				
			}
			break;
		case '0':return;break;
		default:break;
		}
		system("cls");
	}
	
	
}
/*********************************************
文件读取写入模块
 ********************************************/
void save(char *file,FLIGHT *from,int n)
{
	FILE *fp;
	if((fp=fopen(file,"wb"))==NULL)//打开文件
	{
		printf("\n\t\t保存失败。文件可能被写保护!\n ",file);//打印出错提示
		getch();
		return;
	}
	fwrite(&from[0],LEN,n,fp);
	printf("\n\t\t保存到%s,共数据%d个",file,n);
	getch();
	fclose(fp);//关闭文件
}

int read(char *file,FLIGHT *to)
{
	int i;
	FILE *fp;
	if((fp=fopen(file,"rb"))==NULL)//打开文件
	{
		return 0;
	}
	
	for(i=0;!feof(fp);i++)
	{
		fread(&to[i],LEN,1,fp);
	}
	fclose(fp);//关闭文件
	return (i-1);//最后读取为文件结束标志,故返回i-1;
}
/*********************************************
航班数据浏览模块
分页显示数据,每页显示总数由宏PAGE控制
 ********************************************/
void list(FLIGHT *flt,int n)
{
	int i,page;
	system("cls");
	PRHEAD;
	for(i=0,page=1;i<n;)
	{	
		//每页打印头
		if(i!=0&&i%PAGE==0)
		{	
			system("cls");
			PRHEAD;
		}
		PRINFO(flt[i]);

		if(++i%PAGE==0&&i!=n)
		{	
			
			printf("当前浏览第%d页。",page++);
			getch();
		}
		
	}
	printf("当前浏览第%d页。",page++);
	printf("\n浏览结束,点击任意键进入主菜单!");
	getch();
}
/*********************************************
航班数据结构体修改模块
提供数据结构体修改,并简单判定数据是否正确。
 ********************************************/
void modify(FLIGHT *p)
{
	printf("\n\t请输入航班号:");
	scanf("%s",p->num);

	printf("\t请输入起始站:");
	scanf("%s",p->start);
		
	printf("\t请输入终点站:");
	scanf("%s",p->finish);
		
	printf("\t请输入飞行时间(1-7):");
	while(scanf("%d",&p->time)!=1)
	{
		flushall();
		printf("\t输入出错,重新输入:");
	}
		
	printf("\t请输入预售票总数:");
	while(scanf("%d",&p->ticket)!=1)
	{
		flushall();
		printf("\t输入出错,重新输入:");
	}
		
	printf("\t请输入已售票数:");
	while(scanf("%d",&p->buy_num)!=1)
	{
		flushall();
		printf("\t输入出错,重新输入:");
	}

	PRHEAD;
	PRINFO((*p));
	if(p->time<1||p->time>7||p->buy_num>=p->ticket)
		printf("\n\t数据可能出现错误,请检查");
	
}
/*********************************************
信息查询模块
提供4种信息查询
并具有菜单。
 ********************************************/
void searth(FLIGHT *flt)
{
	char temp[20];
	int tmp;
	int i,j;
	while(1)
	{
		system("cls ");
		printf(
			"------------------------------"
			"飞机航线查询"
			"-------------------------------\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t1.按航班号查询\t\t\t\t|\n"
			"|\t\t\t\t2.按起点站查询\t\t\t\t|\n"
			"|\t\t\t\t3.按终点站查询\t\t\t\t|\n"
			"|\t\t\t\t4.按飞行时间查询\t\t\t|\n"
			"|\t\t\t\t0.返回菜单\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"|\t\t\t\t\t\t\t\t\t|\n"
			"-------------------------------"
			"请选择(0-4)"
			"-------------------------------\n"
		);
		switch(getch())
		{
		case '1':
			{
				printf("请输入要查询的航班号:");
				scanf("%s",temp);
				PRHEAD;
				for(i=0,j=0;i<N;i++)
				{
					if(strcmp(flt[i].num,temp)==0)
					{
						PRINFO(flt[i]);
						j++;
					}	
				}
				if(j==0)printf("\n\t没有相关资料!");
				printf("\n\t共查询到%d条资料\n\t点击任意键返回......",j);
				getch();
			}
			break;
		case '2':
			{
				printf("请输入要查询的起点站:");
				scanf("%s",temp);
				PRHEAD;
				for(i=0,j=0;i<N;i++)
				{
					if(strcmp(flt[i].start,temp)==0)
					{
						PRINFO(flt[i]);
						j++;
					}	
				}
				if(j==0)printf("\n\t没有相关资料!");
				printf("\n\t共查询到%d条资料\n\t点击任意键返回......",j);
				getch();
			}
			break;
		case '3':
			{
				printf("请输入要查询的终点站:");
				scanf("%s",temp);
				PRHEAD;
				for(i=0,j=0;i<N;i++)
				{
					if(strcmp(flt[i].finish,temp)==0)
					{
						PRINFO(flt[i]);
						j++;
					}	
				}
				if(j==0)printf("\n\t没有相关资料!");
				printf("\n\t共查询到%d条资料\n\t点击任意键返回......",j);
				getch();
			}
			break;
		case '4':
			{
				printf("请输入要查询的飞行时间:");
				while(scanf("%d",&tmp)!=1)
				{
					flushall();
					printf("\t输入出错,重新输入:");
				}
				PRHEAD;
				for(i=0,j=0;i<N;i++)
				{
					if(flt[i].time==tmp)
					{
						PRINFO(flt[i]);
						j++;
					}	
				}
				if(j==0)printf("\n\t没有相关资料!");
				printf("\n\t共查询到%d条资料\n\t点击任意键返回......",j);
				getch();
			}
			break;
		case '0':return;break;
		default:break;
		}
	}
}
/*********************************************
大名鼎鼎的msgbox之c语言简化版
本程序中有一部分确定取消
故引用这个函数。
 ********************************************/
int msgbox(char *msg)
{
	char ch;
	printf("\n\t\t%s",msg);
	printf("\n\t\t确定(enter)  取消(esc)");
	while(1)
	{
		ch=getch();
		if(ch==13)return 1;
		if(ch==27)return 0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -