航班信息的查询和检索.docx
- 文档编号:9002896
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:15
- 大小:89.75KB
航班信息的查询和检索.docx
《航班信息的查询和检索.docx》由会员分享,可在线阅读,更多相关《航班信息的查询和检索.docx(15页珍藏版)》请在冰豆网上搜索。
航班信息的查询和检索
题目:
航班信息的查询与检索
设计一个实用的航班信息查询和检索系统,要求能对飞机航班信息进行排序和查询。
可按航班的航班号、起点站、到达站、起飞时间以及到达时间等信息进行查询。
一、模型分析
当今乘飞机旅行的人越来越多,人们需要关心了解各类航班的班次、时间、价格及机型等信息。
因此设计此航班信息查询系统。
本算法可对飞机航班信息进行录入、排序和查找,可按航班的航班号、起点站、终点站、起飞时间和到达时间信息进行查询。
(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={
基本操作:
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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 航班信息 查询 检索