📄 航班.cpp
字号:
#include <iostream.h>
#include <string.h>
#include <iomanip.h>
#include <fstream.h>
#define MAXSIZE 50
typedef struct{
int hour;
int minute;
}time;
typedef struct{
int year;
int month;
int day;
}date;
typedef struct information
{
char number[7]; //航班号
time start; //起点站
time end; //终点站
char start_station[16]; //起飞时间
char end_station[16]; //到达时间
char pay[7]; //票价
char sche[7]; //班期
char style[7]; //机型
date date_1; //有效期
date date_2;
information *next;
}info;
void screen()
{
cout<<" ★ 【航班信息的查询与检索】 ★"<<endl;
cout<<" ★*******************************★"<<endl;
cout<<" **1.插入航班信息 "<<endl;
cout<<" **2.修改航班信息 "<<endl;
cout<<" **3.按起终点查询 "<<endl;
cout<<" **4.按出行日期查询 "<<endl;
cout<<" **5.按航班号进行查询"<<endl;
cout<<" **6.退出系统 " <<endl;
cout<<" ★*******************************★"<<endl;
}
void Init_info(info *info_1[],int &count) //建立文本存储
{
fstream iofile("hangban.txt",ios::in|ios::out|ios::binary);
while(1)
{
info_1[count]=new info;
iofile.read((char*)info_1[count],sizeof(info));
if(iofile.eof())break;
if(count) info_1[count-1]->next=info_1[count];
info_1[count]->next=NULL;
count++;
}
}
void insert_info(info *info_1[],int &count) //插入航班信息
{
info_1[count]=new info;
cout<<"航班号:";
cin>>info_1[count]->number;
cout<<"起点站:";
cin>>info_1[count]->start_station;
cout<<"终点站:";
cin>>info_1[count]->end_station;
cout<<"起飞时间(时 分):";
cin>>info_1[count]->start.hour>>info_1[count]->start.minute;
cout<<"到达时间(时 分):";
cin>>info_1[count]->end.hour>>info_1[count]->end.minute;
cout<<"票价:";
cin>>info_1[count]->pay;
cout<<"班期:";
cin>>info_1[count]->sche;
cout<<"机型:";
cin>>info_1[count]->style;
cout<<"有效期(年 月 日 年 月 日):";
cin>>info_1[count]->date_1.year>>info_1[count]->date_1.month>>info_1[count]->date_1.day
>>info_1[count]->date_2.year>>info_1[count]->date_2.month>>info_1[count]->date_2.day;
if(count) info_1[count-1]->next=info_1[count];
info_1[count]->next=NULL;
count++;
}
void distribute(info *info_1[],info *info_2[],info *info_3[],int count,int state)
{
for(int i=0;i<26;i++)
{
info_2[i]=NULL;
info_3[i]=NULL;
}
for(int j=0;j<count;j++)
{
int value;
if('a'<=info_1[j]->number[state])
value=info_1[j]->number[state]-'a';
else
value=info_1[j]->number[state]-'0';
if(!info_2[value])
{
info_2[value]=info_1[j];
info_3[value]=info_1[j];
}
else
{
info_3[value]->next=info_1[j];
info_3[value]=info_1[j];
}
}
}
void collect(info *info_1[],info *info_2[],info *info_3[])
{
for(int i=0,j=0;i<26;i++)
{
while(info_2[i])
{
info_1[j++]=info_2[i];
if(info_2[i]==info_3[i]) break;
info_2[i]=info_2[i]->next;
}
}
}
void radix(info *info_1[],info *info_2[],info *info_3[],int count)
{
for(int i=strlen(info_1[0]->number)-1;0<=i;i--)
{
distribute(info_1,info_2,info_3,count,i);
collect(info_1,info_2,info_3);
}
}
int bin_search(info *info_1[],char *str,int low,int high) //按航班名二分查找
{
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(!strcmp(info_1[mid]->number,str))
return mid;
if(strcmp(info_1[mid]->number,str)<0)
low=mid+1;
else
high=mid-1;
}
return (-1);
}
void print(info *info_1[],int state)
{
cout<<"航班号:"<<info_1[state]->number<<endl;
cout<<"起点站-->终点站:"<<info_1[state]->start_station<<"-->"<<info_1[state]->end_station<<endl;
cout<<"起飞时间-->到达时间:"<<info_1[state]->start.hour<<":"<<info_1[state]->start.minute
<<"-->"<<info_1[state]->end.hour<<":"<<info_1[state]->end.minute<<endl;
cout<<"票价:"<<info_1[state]->pay<<endl;
cout<<"班期;"<<info_1[state]->sche<<endl;
cout<<"机型:"<<info_1[state]->style<<endl;
cout<<"有效期:"<<info_1[state]->date_1.year<<"."
<<info_1[state]->date_1.month<<"."<<info_1[state]->date_1.day
<<"-->"<<info_1[state]->date_1.year<<"."
<<info_1[state]->date_2.month<<"."<<info_1[state]->date_2.day<<endl;
}
int *serach_adress(info *info_1[],char str_1[],char str_2[],int count)
{
int *data;
data=new int[count+1];
for(int i=0,j=0;i<count;i++)
{
if(!strcmp(info_1[i]->start_station,str_1)&&!strcmp(info_1[i]->end_station,str_2))
{
print(info_1,i);
data[++j]=i;
}
}
data[0]=j;
cout<<"共有"<<data[0]<<"个记录!!!"<<endl;
return data;
}
void search_date(info *info_1[],int data[],int data_1,int data_2,int data_3,int count) //按日期二分查找
{
int i,j,k,m=0;
int value_1,value_2,value_3;
if(data) k=data[0];
else k=count;
for(i=0;i<k;i++)
{
if(data) j=data[i+1];
else j=i;
value_1=(info_1[j]->date_1.year-2000)*12*30+info_1[j]->date_1.month*30+info_1[j]->date_1.day;
value_2=(info_1[j]->date_2.year-2000)*12*30+info_1[j]->date_2.month*30+info_1[j]->date_2.day;
value_3=(data_1-2000)*12*30+data_2*30+data_3;
if(value_1<=value_3&&value_3<=value_2)
{
print(info_1,j);
m++;
}
}
cout<<"共有"<<m<<"个记录!!!"<<endl;
}
void main()
{
int count=0;
int i;
int data_1,data_2,data_3,data_4=1,data_5,*data;
char str_1[16],str_2[16];
info *info_1[MAXSIZE],*info_2[26],*info_3[26];
Init_info(info_1,count);
radix(info_1,info_2,info_3,count);
screen();
while(1)
{
char flag;
cout<<"欢迎进入本系统请选者所要进行的操作:";
cin>>flag;
switch(flag)
{
case '1':
insert_info(info_1,count);
radix(info_1,info_2,info_3,count);
break;
case '3':
cout<<"请输入起点站,终点站:";
cin>>str_1>>str_2;
data=serach_adress(info_1,str_1,str_2,count);
if(!data[0]) break;
cout<<"是否继续按出行日期查询(Y/N):";
cin>>flag;
if(flag=='N'||flag=='n') break;
cout<<setfill('*')<<setw(81)<<endl;
data_4=0;
case '4':
cout<<"请输入出行日期(年 月 日):";
cin>>data_1>>data_2>>data_3;
if(data_4) data=NULL;
search_date(info_1,data,data_1,data_2,data_3,count);
break;
case '5':
cout<<"请输入航班号:";
cin>>str_1;
data_5=bin_search(info_1,str_1,0,count-1);
if(data_5==-1)
{
cout<<"无记录!!!"<<endl;
break;
}
print(info_1,data_5);
break;
case'6':
{
cout<<"Bye bye!"<<endl;
}
case '0':
{
fstream iofile("hangban.txt",ios::in|ios::out|ios::binary);
for(i=0;i<count;i++)
{
iofile.write((char*)info_1[i],sizeof(info));
}
return;
}
default:
cout<<"输入错误!!!"<<endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -