航班查询与检索
题目:航班查询与检索
指导老师:
组长:
成员:
一:航班信息的查询与检索
按时间查询:
按站点查询:
二分法查询:
二:
算法分析:程序主要采用结构体 链表 顺序表 队列
主要算法:/*航班信息的查询与检索*/
三:/*航班信息的查询与检索*/
#include #include #include #define N 6 //航班数 //航班信息 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];//用队列表示桶 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 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 { p->next=queue[i].f; p=queue[i].e; } // 收集非空队列 p->next=NULL; } (*plist)->next=head; } //初始化航班信息 struct Node element[N+1]={ " 表头 "CA1544合肥北京 "MU5341上海广州每日 "CZ3869重庆深圳 "MU3682桂林南京 "HU1836上海北京每日 "CZ3528成都厦门 }; //------------信 息 显 示------------ //按表的格式输出某个航班信息 //显示头部信息 void Cout_info1() { cout<<" ****************************************\\n"< //显示主体信息 void Cout_info2_1(Node p[])//方式一 { cout<<" "< cout<<" "< cout<<" "< cout<<" "< cout<<" "< cout<<" "< cout<<" "< cout<<" "< void Cout_info2_2(flight F[],int i)//方式二 { cout<<" "< //显示所有航班信息 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< void output_ALL_info2(flight F[]) //方式二 { Cout_info1(); for(int i=0;i Cout_info2_2(F,i); } cout< //--------------信 息 复 制---------------- //将排好的序列(链表)转化成顺序表存储形式 void copy(flight F[],Node element[]) { RadixList p=element; p=p->next; int i; for(i=0;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_fare(flight F[]); void F_By_FN(flight F[]); //主菜单 void mainmenu() { char ch; int y; cout<<" 主菜单\\n"< { cout<<"请输入服务命令:"; cin>>y; switch(y) { case 0: mainmenu();break; 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 6:F_By_fare(Flight);break; default :cout<<" 谢谢惠顾! "< cout<<"是否退出?(Y/N):"; cin>>ch; if(ch=='Y'||ch=='y') break; } } //--------------查 询 系 统-------------- //通过航班号实现二分查找法查找 void F_By_FN(flight F[]) { int low=0,high=N,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; } cout<<" *************对不起,没有您要查找的航班号********** "< //通过起飞/到达时间查询 void F_By_Time(flight F[],int Time) { int i; char T[6]; cout<<"请输入您要查询的航班的起飞/抵达时间:"; cin>>T; Cout_info1();//显示头部信息 for(i=0;i if(Time==1) //按起飞时间查询 { if(strcmp(T,F[i].start_time)==0) Cout_info2_2(F,i); } if(Time==2) //按抵达时间查询 { if(strcmp(T,F[i].arrived_time)==0) Cout_info2_2(F,i); } } cout<<" *******对不起,该时间没有航班******* "< //通过站点查询 void F_By_Address(flight F[],int AD) { char str[10]; cout<<"请输入您要查询的航班的起飞/抵达地址:"; cin>>str; Cout_info1(); for(int i=0;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); } } cout<<" ********对不起,该站点不存在******** "< //通过票价范围查询 void F_By_fare(flight F[]) { int T1,T2,i; cout<<"请输入您要查询的航班的最低票价(单位:元):"; cin>>T1; cout<<"请输入您要查询的航班的最高票价(单位:元):"; cin>>T2; Cout_info1(); for(i=0;i if(T1<=F[i].fare && T2>=F[i].fare) Cout_info2_2(F,i); } cout<<" *******对不起,没有适合您的航班,请修改您的票价范围********" < //--------------主 函 数---------------- int main() { RadixList p=element; for(int i=0;i element[10].next=NULL; radixSort(&p, D, R); //基数排序 output_ALL_info1(element); //输出排序后的有序序列(航班信息) copy(Flight,element); //另存储排序后的航班信息 mainmenu(); //给出主菜单 return 0; } 测试数据及测试结果: 、 边界值处理: 四: 遇到的问题及解决策略:首先是要实现所要的功能需用什么数据结构的问题,比如排序问题究竟用那一种,在组员的商量下和上网搜寻资料,采用对排序最符合,其次是在时间的查询过程中,比如输入时间16:40开始只能实现输入10,最后通过改时间的数据类型实现了时间的输入,最后是在各个模块的组合过程中由于各个成员编程所起的名字或者其他原因,程序无法运行 ,最后在大家的努力下一起修改错误使得程序可以正常运行。 还未解决的问题:插入的订票的函数无法正常运行。 五:实验收获和心得: 通过这次次实验我们收获了很多,对数据结构这门课有了更深的了解.让我们对链表、队列、结构体的应用更娴熟,为我们更好的了解课本内容,改进不足提供了件。在这次课程设计的过程中充分说明了团队合作的重要性,组内成员共同讨论,即充分而认真的完成自己负责的模块又对组内其他成员的工作提供建议,使得这次课程设计能够按时完成。我们一定会更加努力,争取在以后的学习中能够学以致用,最后要感谢胡老师在设计过程中给我们的指导,有了胡老师的帮助,我们的流程图更加的规范、正确。再一次谢谢胡老师。 六: 人员分工:组内成员一起构思了流程图。并完成最后的整理工作