admin 管理员组

文章数量: 1086019


2024年4月27日发(作者:腾讯企业邮箱登录入口)

算法与数据结构实验报告

航班查询与检索

题目:航班查询与检索

指导老师:

组长:

成员:

一:航班信息的查询与检索

开始

初始化信息

进行排序

主菜单显示

输入查询序号

判断序号是否合法

按航班

号查询

按时间

查询

按地点

查询

按票价

查询

输出航班信息

结束

按时间查询:

开始

输入查询时间

按起飞时间查询

Time=1

按抵达时间查询

返回查询信息

按票价范围查询

开始

输入票价范

判断有无符

合条件票价

输出相应

信息

返回查询信息

按站点查询:

二分法查询:

开始

输入起点

终点及AD

按目的站查询

AD=1?

按起点站查询

返回查询信息

开始

输入航班号

输入航班号对应序列号

Low<=hi

gh

Low=mid+1

Mid=(high+low)/2

Num=F[mid].

flight_number

Num

_number

返回

High=mid+1

二:

算法分析

:程序主要采用结构体 链表 顺序表 队列

主要算法:/*航班信息的查询与检索*/

三:

/*航班信息的查询与检索*/

#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

if(queue[i].f!=NULL)

{ p->next=queue[i].f; p=queue[i].e; } // 收集非空队列

p->next=NULL;

}

(*plist)->next=head;

}

//初始化航班信息

struct Node element[N+1]={

" "," "," "," "," "," "," "," ",0,NULL,//表头

"CA1544","CA1544","合肥","北京","1245 ","10:55","12:40","733",960,NULL,

"MU5341","MU5341","上海","广州","每日 ","14:20","16:15","M90",1280,NULL,

"CZ3869","CZ3869","重庆","深圳","246 ","08:55","10:35","733",1010,NULL,

"MU3682","MU3682","桂林","南京","23467","20:50","22:15","M90",1380,NULL,

"HU1836","HU1836","上海","北京","每日 ","09:40","11:20","738",1250,NULL,

"CZ3528","CZ3528","成都","厦门","13457","15:10","16:50","CRJ",1060,NULL,

};

//------------信 息 显 示------------

//按表的格式输出某个航班信息

//显示头部信息

void Cout_info1()

{

cout<<" ****************************************n"<

cout<<" * 欢 迎 您 使 用 *n"<

cout<<" * 航 班 信 息 表 *n"<

cout<<" ****************************************n"<

cout<<" 航班号 起飞时间 到达时间 起飞站 终点站 班期 机型

n"<

}

票价

//显示主体信息

void Cout_info2_1(Node p[])//方式一

{

cout<<" "<_number;

cout<<" "<_time;

cout<<" "<d_time;

cout<<" "<_address;

cout<<" "<d_address;

cout<<" "<_date;

cout<<" "<Type;

cout<<" "<<<"元"<

}

void Cout_info2_2(flight F[],int i)//方式二

{

cout<<" "<

cout<<" "<

cout<<" "<

cout<<" "<

cout<<" "<

cout<<" "<

cout<<" "<

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->_number);

strcpy(F[i].start_time,p->_time);

strcpy(F[i].arrived_time,p->d_time);

strcpy(F[i].start_address,p->_address);

strcpy(F[i].arrived_address,p->d_address);

strcpy(F[i].work_date,p->_date);

strcpy(F[i].FlightType,p->Type);

F[i].fare=p->;

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<<"

===========================================================n"<

cout<<" Please choose: (input the number)(输入查询/排序命令)n"<

cout<<" 0. show the mainmenu (显示主菜单)n"<

cout<<" 1. Find by flight number(按航班号查询)n"<

cout<<" 2. Find by start time(按起飞时间查询)n"<

cout<<" 3. Find by arrived time(按到达时间查询)n"<

cout<<" 4. Find by start address(按起飞地点查询)n"<

cout<<" 5. Find by arrived address(按目的地点查询)n"<

cout<<" 6. Find by the fare(按票价范围查询)n"<

cout<<" ----其他键退出"<

cout<<"

===========================================================n"<

while(1)

{

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[i].next=&element[i+1];

element[10].next=NULL;

radixSort(&p, D, R); //基数排序

output_ALL_info1(element); //输出排序后的有序序列(航班信息)

copy(Flight,element); //另存储排序后的航班信息

mainmenu(); //给出主菜单

return 0;

}

测试数据及测试结果:

边界值处理:

四:

遇到的问题及解决策略

:首先是要实现所要的功能需用

什么数据结构的问题,比如排序问题究竟用那一种,在组员的商量下

和上网搜寻资料,采用对排序最符合,其次是在时间的查询过程中,

比如输入时间16:40开始只能实现输入1640,最后通过改时间的数

据类型实现了时间的输入,最后是在各个模块的组合过程中由于各个

成员编程所起的名字或者其他原因,程序无法运行 ,最后在大家的

努力下一起修改错误使得程序可以正常运行。

还未解决的问题:插入的订票的函数无法正常运行。

五:

实验收获和心得

通过这次次实验我们收获了很多,对数据结构这门课有了更深的了解.

让我们对链表、队列、结构体的应用更娴熟,为我们更好的了解课本

内容,改进不足提供了件。在这次课程设计的过程中充分说明了团队

合作的重要性,组内成员共同讨论,即充分而认真的完成自己负责的

模块又对组内其他成员的工作提供建议,使得这次课程设计能够按时

完成。我们一定会更加努力,争取在以后的学习中能够学以致用,最

后要感谢胡老师在设计过程中给我们的指导,有了胡老师的帮助,我

们的流程图更加的规范、正确。再一次谢谢胡老师。

六:

人员分工

:组内成员一起构思了流程图。并完成最后的整理工


本文标签: 查询 时间 输入 成员 排序