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

📄 flight.cpp

📁 航班查询系统,可查询航线,航班号, 起始时间,结束时间等
💻 CPP
字号:
/*航班信息的查询与检索*/
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#define N 100  //航班数
//航班信息
typedef struct flight
{
	char flight_number[10];  //航班号
	char start_address[10];   //起飞站
	char arrived_address[10];   //终点站
	char work_date[10];   //班期
	char start_time[6];     //起飞时间
	char arrived_time[6];   //到达时间
    char FlightType[4]; //机型
    int fare;           //票价 
}DataType;
struct flight Flight[N];

//-----------按航班号进行基数排序-----------
typedef char KeyType;
#define D 7              // D为排序码的最大位数 
#define R 'a'             // R为基数,这里为小于字母'a'代表的整型值 
struct Node;             //单链表结点类型 
typedef struct Node RadixNode;
struct Node
{
	KeyType key[D];   //关键字
    DataType info;    //数据信息
    RadixNode *next;
};
typedef RadixNode * RadixList;
typedef struct QueueNode
{ 
	RadixNode *f;           //对列的头指针 
    RadixNode *e;           //对列的尾指针 
}Queue;
Queue queue[R];

//初始化航班信息
struct Node element[N+1]={0};
int count;

void radixSort(RadixList * plist, int d, int r)
{
	int i,j,k; 
    RadixNode *p, *head; 
    head=(*plist)->next;
    for(j=d-1; j>=0; j--)     //进行d次分配和收集
	{
		p=head;
		for(i=0; i<r; i++)
		{
			queue[i].f=NULL;  queue[i].e=NULL;    //清队列
		}
		while(p!=NULL)
		{ 
			k=p->key[j];       //按排序码的第j个分量进行分配
			if(queue[k].f==NULL)  
				queue[k].f=p; // 若第k个堆为空,则当前记录为队头
			else  (queue[k].e)->next=p;         // 否则当前记录链接到第k队的队尾
			queue[k].e=p;
			p=p->next;
		}
		i=0;
		while(queue[i].f==NULL)  i++;        // 从r个队列中找出第一个非空的队列
		p=queue[i].e;  head=queue[i].f;      //head为收集链表的头指针
		for(i++; i<r; i++)
			if(queue[i].f!=NULL)
			{ 
				p->next=queue[i].f; 
				p=queue[i].e;  
			}  // 收集非空队列 
			p->next=NULL;
	}
	(*plist)->next=head;
}

 
//------------信 息 显 示------------
//按表的格式输出某个航班信息
//显示头部信息
void Cout_info1()
{
    cout<<"                 ****************************************\n"<<endl;
    cout<<"                 *             航 班 信 息 表           *\n"<<endl;
    cout<<"                 ****************************************\n"<<endl;
    cout<<"   航班号   起飞时间   到达时间   起飞站   终点站   班期     机型    票价\n"<<endl; 
}

void input()
{
	char cho;
	count = 0;
	while(1)
	{
		count++;
		if(count >= N) 
		{
			return;
		}
		fflush(stdin);
        cout<<"航班号 起点站 终点站    班期    起飞时间 到达时间 飞机型号 票价"<<endl;
		cin>>element[count].info.flight_number>>element[count].info.start_address>>element[count].info.arrived_address>>element[count].info.work_date>>element[count].info.start_time>>element[count].info.arrived_time>>element[count].info.FlightType>>element[count].info.fare;
		printf("继续输入吗?(y/n):");
		fflush(stdin);
		cho = getchar();	
		if(cho == 'n' || cho == 'N')
			break;
	}
}
//显示主体信息
void Cout_info2_1(Node p[])//方式一
{
	cout<<"   "<<p->info.flight_number;
	cout<<"     "<<p->info.start_time;
    cout<<"       "<<p->info.arrived_time;
    cout<<"      "<<p->info.start_address;
    cout<<"      "<<p->info.arrived_address;
    cout<<"   "<<p->info.work_date;
    cout<<"     "<<p->info.FlightType;
    cout<<"    "<<p->info.fare<<"元"<<endl;
}

void Cout_info2_2(flight F[],int i)//方式二
{
	cout<<"   "<<F[i].flight_number;
    cout<<"     "<<F[i].start_time;
    cout<<"       "<<F[i].arrived_time;
    cout<<"      "<<F[i].start_address;
    cout<<"      "<<F[i].arrived_address;
    cout<<"   "<<F[i].work_date;
    cout<<"     "<<F[i].FlightType;
    cout<<"    "<<F[i].fare<<"元"<<endl;
}

//显示所有航班信息
void output_ALL_info1(Node element[]) //方式一
{
	RadixList p=element;
    Cout_info1();
	p=p->next;
	while(p!=NULL)
	{
		Cout_info2_1(p);
		p=p->next;
	}
	cout<<endl;
}

void output_ALL_info2(flight F[]) //方式二
{ 
	Cout_info1();
	for(int i=0;i<count;i++)
	{
		Cout_info2_2(F,i);
	}
	cout<<endl;
}

//--------------信 息 复 制----------------
//将排好的序列(链表)转化成顺序表存储形式
void copy(flight F[],Node element[])
{
	RadixList p=element;
	p=p->next;
	int i;
	for(i=0;i<count && p!=NULL;i++) 
	{
		strcpy(F[i].flight_number,p->info.flight_number);
        strcpy(F[i].start_time,p->info.start_time);
        strcpy(F[i].arrived_time,p->info.arrived_time);
        strcpy(F[i].start_address,p->info.start_address);
        strcpy(F[i].arrived_address,p->info.arrived_address);
        strcpy(F[i].work_date,p->info.work_date);
        strcpy(F[i].FlightType,p->info.FlightType);
        F[i].fare=p->info.fare;
        p=p->next;
	}
}


//---------------服 务 菜 单--------------
void F_By_Time(flight F[],int);
void F_By_Address(flight F[],int);
void F_By_FN(flight F[]); 
//主菜单
void mainmenu()     
{
    cout<<"                                 主菜单\n"<<endl;
    cout<<"        ===========================================================\n"<<endl;
    cout<<"             Please choose: (input the number)(输入查询/排序命令)\n"<<endl;
    cout<<"                 1.   Find by flight number(按航班号查询)\n"<<endl;
    cout<<"                 2.   Find by start time(按起飞时间查询)\n"<<endl;
    cout<<"                 3.   Find by arrived time(按到达时间查询)\n"<<endl;
    cout<<"                 4.   Find by start address(按起飞地点查询)\n"<<endl;
    cout<<"                 5.   Find by arrived address(按目的地点查询)\n"<<endl;
    cout<<"                 0.   exit"<<endl;
    cout<<"        ===========================================================\n"<<endl;
}

//--------------查 询 系 统--------------
//通过航班号实现二分查找法查找
void F_By_FN(flight F[])    
{
	int low=0,high=count - 1,mid;
	char Num[10];
	cout<<"请输入您要查询的航班号:";
	cin>>Num;
	Cout_info1();
	while(low<=high)
	{
		mid=(low+high)/2;
        if(strcmp(Num,F[mid].flight_number)==0)
		{
			Cout_info2_2(F,mid);break;
		}
		else if(strcmp(Num,F[mid].flight_number)>0)
			high=mid-1;
        else
			low=mid+1;
	}
}

//通过起飞/到达时间查询
void F_By_Time(flight F[],int Time)      
{
	int i;
	char T[6];
    cout<<"请输入您要查询的航班的起飞/抵达时间(eg: 16:45 show as 1645):";
    cin>>T;
    Cout_info1();                                     
    for(i=0;i<count;i++)
	{
		if(Time==1)  //按起飞时间查询
		{
			if(strcmp(T,F[i].start_time))
				Cout_info2_2(F,i);
		}
		if(Time==2)  //按抵达时间查询
		{
			if(strcmp(T,F[i].arrived_time))
				Cout_info2_2(F,i);
		}
	} 
}

//通过站点查询
void F_By_Address(flight F[],int AD)    
{
    char str[10]; 
    cout<<"请输入您要查询的航班的起飞/抵达地址:";
    cin>>str;
	Cout_info1();
	for(int i=0;i<count;i++)
	{
		if(AD==1) //按起点站查询
		{
			if(strcmp(str,F[i].start_address)==0)  
				Cout_info2_2(F,i);
		}
		if(AD==2) //按目的站查询
		{
			if(strcmp(str,F[i].arrived_address)==0) 
				Cout_info2_2(F,i);
		}
	}
}


//--------------主 函 数----------------
void main()
{
	char ch,y;
	cout<<"请输入航班信息:"<<endl;
	input();
	RadixList p=element;
	for(int i=0;i<count;i++)
		element[i].next=&element[i+1];
	element[10].next=NULL;
	radixSort(&p, D, R);  //基数排序
	output_ALL_info1(element); //输出排序后的有序序列(航班信息)
	copy(Flight,element); //另存储排序后的航班信息
	
	while(1)
	{
		mainmenu();  //给出主菜单
		cout<<"请输入服务命令:";
		fflush(stdin);
        cin>>y;
		switch(y)
		{
        case '1':F_By_FN(Flight);break;
        case '2':F_By_Time(Flight,1);break;
        case '3':F_By_Time(Flight,2);break;
        case '4':F_By_Address(Flight,1);break;
        case '5':F_By_Address(Flight,2);break;
		case '0':cout<<"谢谢惠顾!"<<endl;return;
        default :cout<<"选项错误!"<<endl;break;
		}
	}
}

⌨️ 快捷键说明

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