航班信息的查询和检索.docx

上传人:b****6 文档编号:9002896 上传时间:2023-02-02 格式:DOCX 页数:15 大小:89.75KB
下载 相关 举报
航班信息的查询和检索.docx_第1页
第1页 / 共15页
航班信息的查询和检索.docx_第2页
第2页 / 共15页
航班信息的查询和检索.docx_第3页
第3页 / 共15页
航班信息的查询和检索.docx_第4页
第4页 / 共15页
航班信息的查询和检索.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

航班信息的查询和检索.docx

《航班信息的查询和检索.docx》由会员分享,可在线阅读,更多相关《航班信息的查询和检索.docx(15页珍藏版)》请在冰豆网上搜索。

航班信息的查询和检索.docx

航班信息的查询和检索

 

题目:

航班信息的查询与检索

设计一个实用的航班信息查询和检索系统,要求能对飞机航班信息进行排序和查询。

可按航班的航班号、起点站、到达站、起飞时间以及到达时间等信息进行查询。

一、模型分析

当今乘飞机旅行的人越来越多,人们需要关心了解各类航班的班次、时间、价格及机型等信息。

因此设计此航班信息查询系统。

本算法可对飞机航班信息进行录入、排序和查找,可按航班的航班号、起点站、终点站、起飞时间和到达时间信息进行查询。

(1)输入的形式:

选择功能时,应输入与所选功能对应的一个整型数据;输入航班信息包括航班号(由2位大写字母和4位数字组成)、起点站(1~6位字符)、终点站(1~6位字符)、班期(1~7位字符)、起飞时间(1~4位字符)、到达时间(1~4位字符)、机型(1~3位字符)和票价(整型数字)。

(2)输出的形式:

提示用户输入功能代号;提示用户输入要查询的航班信息;显示给航班记录的相关信息,包括航班号、起点站、终点站、班期、起飞时间、到达时间、机型和票价信息。

(3)算法所采用的数据结构:

用链式基数排序算法对航班号进行排序,按链表对各条记录进行有序化运算;用二分查找算法检索航班号信息,用顺序查找算法检索其他信息,显示查询结果。

(4)测试数据:

/*

CA1544合肥北京1.2.4.510551240733960

n

1

CA1544

*/

操作顺序如下:

步骤一.航班信息输入。

CA1544合肥北京1.2.4.510551240733960

步骤二.航班信息查询。

选择按航班号查询:

1

输入待查询的航班号:

CA1544

输入效验成功时,若查找到,即会显示该航班记录的相关信息:

CA1544合肥北京1.2.4.510551240733960

若未查找到,即会显示:

“很抱歉,无此航班信息。

验证失败时,即会显示:

“错误信息:

航班号须由2位大写字母和4位数字组成。

然后结束此次操作。

二、算法设计

(1)为了实现上述程序功能,采用链式基数排序算法对航班号进行排序,然后便能用二分查找算法高效地检索航班号信息,其他信息的检索功能采用顺序查找算法实现。

(2)算法用到的抽象数据类型定义:

ADTSInfor{

数据对象:

D={ei|ei∈StructSet,i=1,2,…,n,n>=0}

数据关系:

R1={|ei-1,ei∈D,i=1,…,n}

基本操作:

CreateSInfor(&L)

操作结果:

构造一个存储航班信息的链表。

DestroySInfor(&L)

初始条件:

L已存在。

操作结果:

销毁L。

AddSInfor(&L)

初始条件:

L已存在。

操作结果:

添加航班信息。

SearchSInfor(L)

初始条件:

L已存在。

操作结果:

查询航班信息。

DisplaySInfor(&L)

初始条件:

L已存在。

操作结果:

显示航班信息。

}ADTSinfor

(3)主程序的流程:

intmain(void)

{

初始化;

显示用户界面;

信息录入,并作输入效验;

执行查询;

退出系统;

}

(4)各程序模块之间的调用关系:

main()调用Prompt(),InputData(),searchcon()

InputData()调用Check_HangBanHao(),RadixSort(),Arrange()

searchcon()调用BinSearch(),SeqSearch(),Display(),Prompt()

RadixSort()调用Distribute(),Collect(),Distribute_c(),Collect_c()

(5)函数调用关系图:

 

Display()

 

三、完整源程序:

#include

#include

#include

#include

#defineMaxSpace100

#definekeylen6

#defineRADIX_n10

#defineRADIX_c26

#defineSHOW_MSG_ERROR"\n错误信息:

航班号须由2位大写字母和4位数字组成。

\n输入数据错误,程序终止执行!

\n"

usingnamespacestd;

typedefcharKeyType;

typedefstruct{

charstart[6];//起点

charend[6];//终点

charsche[6];//班期

chartime1[4];//起飞时间

chartime2[4];//到达时间

charmodel[3];//机型

intprice;//票价

}InfoType;//航班记录类型

typedefstruct{

KeyTypekeys[keylen];//关键字(航班号)

InfoTypeothers;

intnext;

}SLNode;//静态链表结点类型

typedefstruct{

SLNodesl[MaxSpace];//静态链表

intkeynum;//关键字字符数

intlength;//表长

}SLList;//静态链表类型

typedefintArrType_n[RADIX_n];

typedefintArrType_c[RADIX_c];

KeyTypekey[keylen],kl[4];

 

/*====================函数声明*/

voidDistribute(SLNode*sl,inti,ArrType_n&f,ArrType_n&e);

voidCollect(SLNode*sl,inti,ArrType_nf,ArrType_ne);

voidDistribute_c(SLNode*sl,inti,ArrType_c&f,ArrType_c&e);

voidCollect_c(SLNode*sl,inti,ArrType_cf,ArrType_ce);

voidRadixSort(SLList&L);

voidArrange(SLList&L);

intBinSearch(SLListL,KeyTypekey[]);

voidSeqSearch(SLListL,KeyTypekey[],inti);

voidDisplayStyle(inti,char*s);

voidDisplay(SLListL,inti);

voidQuit(void);

voidsearchcon(SLListL);

voidPrompt(void);

boolInputData(SLList&L);

boolCheck_HangBanHao(char*HangBanHao);

 

/*-----------------------------数字字符分配函数*/

voidDistribute(SLNode*sl,inti,ArrType_n&f,ArrType_n&e)

{

intj,p;

for(j=0;j

f[j]=0;

for(p=sl[0].next;p;p=sl[p].next)

{

j=sl[p].keys[i]%48;//将数字字符映射为十进制数字

if(!

f[j])//--------------------------------//

f[j]=p;//|

else//|将p指向的结点插入到第j个子表中

sl[e[j]].next=p;//|

e[j]=p;//--------------------------------//

}

}

/*-----------------------------数字字符收集函数*/

voidCollect(SLNode*sl,ArrType_nf,ArrType_ne)

{

intj,t;

for(j=0;!

f[j];j++);//找第一个非空子表

sl[0].next=f[j];//将sl[0].next指向第一个非空子表的第一个结点

t=e[j];

while(j

{

for(j=j+1;j

f[j];j++);//找下一个非空子表

if(f[j])

{

sl[t].next=f[j];t=e[j];//链接到主链表

}

}

sl[t].next=0;

}

 

/*-----------------------------字母字符分配函数*/

voidDistribute_c(SLNode*sl,inti,ArrType_c&f,ArrType_c&e)

{

intj,p;

for(j=0;j

f[j]=0;

for(p=sl[0].next;p!

=0;p=sl[p].next)

{

j=sl[p].keys[i]%65;//将字母字符映射为字母集中的相应序号

if(!

f[j])//--------------------------------//

f[j]=p;//|

else//|将p指向的结点插入到第j个子表中

sl[e[j]].next=p;//|

e[j]=p;//--------------------------------//

}

}

/*-----------------------------字母字符收集函数*/

voidCollect_c(SLNode*sl,ArrType_cf,ArrType_ce)

{

intj,t;

for(j=0;!

f[j];j++);//找第一个非空子表

sl[0].next=f[j];t=e[j];//将sl[0].next指向第一个非空子表的第一个结点

while(j

{

for(j=j+1;j

f[j];j++);//找下一个非空子表

if(f[j])

{

sl[t].next=f[j];t=e[j];//链接到主链表

}

}

sl[t].next=0;

}

/*-----------------------------链式基数排序函数*/

voidRadixSort(SLList&L)

{

inti;

ArrType_nfn,en;

ArrType_cfc,ec;

for(i=0;i

L.sl[i].next=i+1;

L.sl[L.length].next=0;//"0"表示空指针

//--------------------------按最低位优先依次对各关键字进行分配和收集

for(i=L.keynum-1;i>=2;i--)//对低四位数字部分进行分配和收集

{

Distribute(L.sl,i,fn,en);

Collect(L.sl,fn,en);

}

for(i=1;i>=0;i--)//对高位的2位字母进行分配和收集

{

Distribute_c(L.sl,i,fc,ec);

Collect_c(L.sl,fc,ec);

}

}/*RAdixSort*/

/*-----------------------------按指针链整理线性表*/

voidArrange(SLList&L)

{

intp,q,i;

SLNodetemp;

p=L.sl[0].next;//p指向第一个结点

for(i=1;i

{

while(p

p=L.sl[p].next;

q=L.sl[p].next;

if(p!

=i)//若第i个结点不在当前位置,交换结点数据

{

temp=L.sl[p];L.sl[p]=L.sl[i];L.sl[i]=temp;

L.sl[i].next=p;

}

p=q;//p指向下一个未调整结点

}

}/*Arrange*/

/*-------------------二分查找函数*/

intBinSearch(SLListL,KeyTypekey[])

{intlow,high,mid;

low=1;high=L.length;

while(low<=high){

mid=(low+high)/2;

if(strcmp(key,L.sl[mid].keys)==0)

returnmid;

elseif(strcmp(key,L.sl[mid].keys)<0)

high=mid-1;

elselow=mid+1;

}

return0;

}/*BinSearch*/

/*-------------------顺序查找函数*/

voidSeqSearch(SLListL,KeyTypekey[],inti)

{intj,k,m=0;

for(j=1;j<=L.length;j++)

{

switch(i){

case2:

k=strcmp(key,L.sl[j].others.start);break;

case3:

k=strcmp(key,L.sl[j].others.end);break;

case4:

k=strcmp(key,L.sl[j].others.time1);break;

case5:

k=strcmp(key,L.sl[j].others.time2);break;

}

if(k==0)

{

m=1;

Display(L,j);

}

}

if(m==0)

printf("很抱歉,无此航班信息。

\n");

}

/*打印班次信息函数*/

voidDisplay(SLListL,inti)

{

printf("航班号起点站终点站航班期起飞时间到达时间机型票价\n");

DisplayStyle(6,L.sl[i].keys);DisplayStyle(7,L.sl[i].others.start);

DisplayStyle(7,L.sl[i].others.end);DisplayStyle(7,L.sl[i].others.sche);

DisplayStyle(9,L.sl[i].others.time1);DisplayStyle(9,L.sl[i].others.time2);

DisplayStyle(5,L.sl[i].others.model);printf("%6d\n",L.sl[i].others.price);

printf("\n");

}

 

/*调整对齐格式函数*/

voidDisplayStyle(inti,char*s)

{

intj;

i-=strlen(s);

for(j=0;j

printf("");

printf("%s,",s);

}

/*退出系统并返回*/

voidQuit(void)

{

keybd_event(VK_RETURN,0,0,0);

exit(0);

}

/*交互界面函数*/

voidsearchcon(SLListL)

{

inti=1,k;

while(i>=1&&i<=6){

printf("\n请选择命令代号(0----6):

");

scanf("%d",&i);

switch(i){

case1:

printf("输入要查询的航班号(字母要大写):

");

scanf("%s",key);k=BinSearch(L,key);

if(k)

Display(L,k);

else

printf("很抱歉,无此航班信息。

\n");

break;

case2:

printf("输入要查询的航班起点站名:

");

scanf("%s",key);SeqSearch(L,key,i);

break;

case3:

printf("输入要查询的航班终点站名:

");

scanf("%s",key);SeqSearch(L,key,i);

break;

case4:

printf("输入要查询的航班起飞时间:

");

scanf("%s",kl);SeqSearch(L,kl,i);

break;

case5:

printf("输入要查询的航班到达时间:

");

scanf("%s",kl);SeqSearch(L,kl,i);

break;

case6:

printf("请依次录入班次数据:

\n");

InputData(L);

break;

case0:

Quit();

}

Prompt();

}

}

/*显示提示信息函数*/

voidPrompt(void)

{

printf("***************************************************\n");

printf("*航班信息查询系统*\n");

printf("*1.航班号*\n");

printf("*2.起点站*\n");

printf("*3.终点站*\n");

printf("*4.起飞时间*\n");

printf("*5.到达时间*\n");

printf("*6.添加班次*\n");

printf("*0.退出系统*\n");

printf("***************************************************\n");

}

/*输入航班记录函数*/

boolInputData(SLList&L)

{

inti=++L.length;

charyn='y';

printf("\n请依次录入班次数据(航班号由2位大写字母和4位数字组成):

");

do

{

printf("\n航班号起点站终点站航班期起飞时间到达时间机型票价\n");

scanf("%s%s%s%s%s%s%s%d",L.sl[i].keys,L.sl[i].others.start,

L.sl[i].others.end,L.sl[i].others.sche,L.sl[i].others.time1,

L.sl[i].others.time2,L.sl[i].others.model,&L.sl[i].others.price);

fflush(stdin);

if(!

Check_HangBanHao(L.sl[i].keys))

returnfalse;

++i;

printf("继续输入吗?

y/n:

");

}

while((yn=getche())=='y'||yn=='Y');

printf("\n");

L.length=i-1;

RadixSort(L);

Arrange(L);

returntrue;

}

/*航班号输入效验*/

boolCheck_HangBanHao(char*HangBanHao)

{

//-----------------必须为6位

if(strlen(HangBanHao)!

=6)

returnfalse;

//-----------------1-2位须为大写字母

elseif(HangBanHao[0]<'A'||HangBanHao[0]>'Z'

||HangBanHao[1]<'A'||HangBanHao[1]>'Z')

returnfalse;

//-----------------3-6位须为数字

for(inti=2;i<=5;i++)

{

if(HangBanHao[i]<'0'||HangBanHao[i]>'9')

returnfalse;

}

returntrue;

}

intmain(void)

{

SLListL;

L.keynum=6;L.length=0;//初始化

Prompt();//显示界面

if(!

InputData(L))//信息录入,并作输入效验

{

printf(SHOW_MSG_ERROR);

return1;

}

searchcon(L);//执行相关查询

return0;

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1