实验六 航班检索与查询.docx
《实验六 航班检索与查询.docx》由会员分享,可在线阅读,更多相关《实验六 航班检索与查询.docx(17页珍藏版)》请在冰豆网上搜索。
实验六航班检索与查询
目录
1概述1
1.1问题描述1
1.2实验目的1
2系统分析1
2.1系统设计分析1
3概要设计2
3.1主程序模块图2
3.2系统功能2
3.2.1程序的设计采用的结构体2
3.2.2实现排序的函数3
4详细设计4
4.1程序描述4
4.1.1顺序查找的调用模块4
4.1.2二分查找的调用模块5
4.1.3基数排序5
4.2算法设计6
5运行与测试6
5.1测试数据及结果6
6总结和心得8
参考文献8
7附:
源代码8
1概述
1.1问题描述
现在乘飞机旅行的人越来越多,飞机也成为人们交通工具最便捷的一种,人们需要关心了解各类航班的班次、时间、价格及机型等信息。
利用计算机建立一个航班信息的查询和检索系统,对飞机航班信息进行排序和查找。
可按航班的航班号、起点站、到达站、起飞时间以及到达时间等信息进行查询。
可采用基数排序法对一组具有结构特点的飞机航班号排序,利用二分查找法对排好序的航班记录按航班号实现快速查找。
每个航班记录包括航班号、起点站、终点站、班期、起飞时间、到达时间、飞机型号以及票价。
1.2实验目的
通过进行课程设计,了解并初步掌握设计航班信息的查询与检索功能,包括:
系统分析、详细设计、系统功能、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法。
在系统中,每个模块都是一个自定义的函数,各自实现一个功能,首先是输入城市信息,主要实现程序最初运行时城市之间数据的录入并保存;第二个就是查询模块,这个模块可以通过航班号,起飞时间以及到达时间等信息对系统的相关信息进行查询。
2系统分析
2.1系统设计分析
根据题目所要求,程序必须实现航班信息的录入和查询。
程序首先定义了一个用于储存航班信息的数据类型,再由用户录入航班数据,在录入的同时并对数据进行排序,最后执行数据查询和检索。
在查询设计中,使用二分查找法对排好序的航班数据按航班号实现快速查找,按航班号、起点站、终点站、班期、起飞时间、到达时间、飞机型号及票价等查询。
实验要求对飞机航班信息进行检索和查找。
可按航班的航班号、起点站、到达站、起飞时间以及到达时间等信息进行查询。
以链式基数排序为主线,用到二分查找和顺序查找等知识,还有建立静态链表等相关概念。
1、每个航班记录包括:
航班号、起始站、终点站、班期、起飞时间、到达时间、机型、票价。
2、对航班信息进行排序与查找。
3、退出系统。
3概要设计
3.1主程序模块图
图3.1主程序模块图
3.2系统功能
3.2.1程序的设计采用的结构体
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];//静态链表,s1[0]为头结点
intkeynum;//记录当前关键字字符个数
intlength;//当前表长
}sllis//静态链表类型
3.2.2实现排序的函数
(1)一趟分配函数
voiddistribute(slnode*sl,inti,arrtype_nf,arrtype_ne);//本算法是按关键字keys[i]建立//radix个、子表,使同一个子表中记录的keys[i]相同,f[0…radix]和e[0..radix]分别指向//各子表中的第一个和最后一个记录
(2)一趟搜集函数
voidcollect(slnode*sl,inti,arrtype_nf,arrtype_ne);//本算法是按关键字keys[i]从小到大//将f[0…radix]所指向的各子表依次链接成一个链表
(3)链式基数排序函数
voidradixsort(sllist&l)//本算法是按关键字从低位向高位依次对各关键字进行分配和收//集,分两段实现
(4)二分查找函数
intbinsearch(sllistl,keytypekey[])//l为待查找的关键字,按二分法查找的思想实现查找
(5)主控函数
voidmain()
{
初始化;
数据输入;
排序处理;
接受查找要求及查找关键字;
查找处理;
输出查找结果;
}
4详细设计
4.1程序描述
4.1.1顺序查找的调用模块
对于根据起点站、终点站、班期、起飞时间、到达时间、飞机型号、票价来进行航班查找的函数,只需将这个查找关键字与结构体数组中相应的键值进行比较,因为每个关键字查找不一定是唯一的,所以如果想要查找到所有的相关信息,则必须将结构体查找到底。
当找到相应航班信息时,只要将其输出即可。
图4.1.1顺序查找的调用模块
4.1.2二分查找的调用模块
设置标志位low,hight,mid。
其中low表示查找序列的左端第一个元素下标,hight表示查找序列的右端第一个元素下标。
mid等于(low+high)/2,函数使用while循环,循环条件是low<=high。
在循环体内,首先判断待查找信息的航班号是否与以mid为下标的数组内指针所指向的结构体变量一致,若一致,则输出该航班信息,若比该结构体变量小,则令high=mid-1,继续进入下一轮循环,若比较大,则令low=mid+1,继续循环。
这样查找到最后,若找到,则会输出相应航班信息,若没有找到,需要输出提示信息。
图4.1.2二分法查找的调用模块
4.1.3基数排序
①定义队列类:
因为在基数排序中,要将待排序序列中的元素根据关键字位放入相应的队列,因此首先要定义一个队列类。
在此队列类中,数据成员有:
一个指向结构体类型的指针数组,一个标志队列头的整型变量,一个标志尾的整型变量。
类的成员函数包括:
构造函数,清空队列函数,判断队列是否为空的函数,进队列函数和出队列函数。
②基数排序过程:
先从航班号的最低位开始,作为此回合排序的关键字位。
根据这个关键字位,将航班信息的指针放入相应的队列中,全部放完后,再将队列中的元素按顺序放回指针数组。
注意:
将队列元素全部导出后,要将队列清空,否则会导致队列的假溢出现象。
接着再以航班号倒数第二位作为关键位,将指针数组元素分配到相应队列,如此反复,直到航班号的第一位字符也被作为关键位进行排序后,该基数排序就完成了。
4.2算法设计
1、利用起点站、终点站、班期、起飞时间、到达时间、飞机型号、票价为关键字来查询航班信息。
该查找算法使用最简单的顺序查找方法进行。
即按照航班信息的结构体数组依次与被查找信息作比较,若找到,则输出结果即可。
若没找到,则输出相关提示信息。
2、利用航班号作为关键字进行查询
由于设计内容要求使用基数排序对这组航班信息进行排序,并利用二分查找法对排好序的航班记录按航班号实现快速查找,因此次算法设计需包括基数排序和二分查找。
5运行与测试
5.1测试数据及结果
运行结果图如下:
1.存储航班号,起点站,终点站等信息。
2.通过航班号查询航班的信息。
3.通过起点站名查找航班相应信息。
4.通过终点站名查找航班相应信息。
5.通过航班起飞时间查找航班相应信息。
6.通过航班到达时间查找航班相应信息。
6总结和心得
在试验中知道,航班信息查询与检索要求对航班信息进行查找和排序需要利用二分法对排好序的航班号快速进行查找,使用基数排序法。
在学习中,目的掌握数据结构存储的方法。
一定要把重点放在解题的思路上和运用何种存储的方法,还要通过思考和大量的阅读,来构造一个完整的程序。
。
参考文献
[1]《数据结构课程设计》-----苏仕华等编著
[2]《数据结构(C语言版)》-----严蔚敏吴伟民编著
[3]《C程序设计(第三版)》------谭浩强著
7附:
源代码
#include
#include
#definemaxspace100
#definekeylen6
#defineradix_n10
#defineradix_c26
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];
voiddistribute(slnode*sl,inti,arrtype_nf,arrtype_ne)
{
intj,p;
for(j=0;j{
f[j]=e[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
sl[e[j]].next=p;
e[j]=p;
}
}
voidcollect(slnode*sl,inti,arrtype_nf,arrtype_ne)
{
intj,t;
for(j=0;!
f[j];j++);
sl[0].next=f[j];
t=e[j];
while(j{
for(j=j+1;jf[j];j++);
if(f[j])
{
sl[t].next=f[j];
t=e[j];
}
}
sl[t].next=0;
}
voiddistribute_c(slnode*sl,inti,arrtype_cf,arrtype_ce)
{
intj,p;
for(j=0;j{
f[j]=e[j]=0;
}
for(p=sl[0].next;p;p=sl[p].next)
{
j=sl[p].keys[i]%65;
if(!
f[j])
f[j]=p;
else
sl[e[j]].next=p;
e[j]=p;
}
}
voidcollect_c(slnode*sl,inti,arrtype_cf,arrtype_ce)
{
intj,t;
for(j=0;!
f[j];j++);
sl[0].next=f[j];
t=e[j];
while(j{
for(j=j+1;jf[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;il.sl[i].next=i+1;
l.sl[l.length].next=0;
for(i=l.keynum-1;i>=2;i--)
{
distribute(l.sl,i,fn,en);
collect(l.sl,i,fn,en);
}
for(i=1;i>=0;i--)
{
distribute_c(l.sl,i,fc,ec);
collect_c(l.sl,i,fc,ec);
}
}
voidarrange(sllist&l)
{
intp,q,i;
slnodetemp;
p=l.sl[0].next;
for(i=1;i{
while(p
p=l.sl[p].next;
q=l.sl[p].next;
if(p!
=i)
{
temp=l.sl[p];
l.sl[p]=l.sl[i];
l.sl[i]=temp;
l.sl[i].next=p;
}
p=q;
}
}
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;
else
low=mid+1;
}
return0;
}
voidseqsearch(sllistl,keytypekey[],inti)
{
intj,k,m=0;
printf("*************************************************************\n");
printf("*航班号起点站终点站航班期起飞时间到达时间机型票价*\n");
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;
printf("*%-8s%-7s%-6s%-11s%-9s%-7s%-5s%4d*\n",l.sl[j].keys,l.sl[j].others.start,l.sl
[j].others.end,l.sl[j].others.sche,l.sl[j].others.time1,l.sl[j].others.time2,l.sl
[j].others.model,l.sl[j].others.price);
}
}
if(m==0)
printf("*无此航班信息,可能是输入错误!
*\n");
printf("*************************************************************\n");
}
voidsearchcon(sllistl)
{
keytypekey[keylen];
inti=1,k;
while(i>=1&&i<=5)
{printf("\********************\n");
printf("*航班信息查询系统*\n");
printf("********************\n");
printf("*1.航班号*\n");
printf("*2.起点站*\n");
printf("*3.终点站*\n");
printf("*4.起飞时间*\n");
printf("*5.到达时间*\n");
printf("*0.退出系统*\n");
printf("********************\n");
printf("请选择(0-5):
");
scanf("%d",&i);
printf("\n");
switch(i)
{case1:
printf("输入要查询的航班号(字母要大写):
");
scanf("%s",key);
k=binsearch(l,key);
printf("*************************************************************\n");
if(k==0)
printf("*无此航班信息,可能是输入错误!
*\n");
else
{printf("*航班号起点站终点站航班期起飞时间到达时间机型票价*\n");
printf("*%-8s%-7s%-6s%-11s%-9s%-7s%-5s%4d*\n",l.sl[k].keys,l.sl[k].others.start,l.sl
[k].others.end,l.sl[k].others.sche,l.sl[k].others.time1,l.sl[k].others.time2,l.sl
[k].others.model,l.sl[k].others.price);
}
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",key);
seqsearch(l,key,i);
break;
case5:
printf("输入要查询的航班到达时间:
");
scanf("%s",key);
seqsearch(l,key,i);
break;
case0:
printf("\n\n\n再见\n\n\n");
}
}
}
voidinputdata(sllist&l)
{
inti=++l.length;
charyn='y';
while(yn=='y'||yn=='Y')
{
printf("航班号起点站终点站航班期起飞时间到达时间机型票价\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);
++i;getchar();
radixsort(l);
arrange(l);
printf("继续输入吗?
y/n:
");
scanf("%c",&yn);
}
l.length=i-1;
}
voidmain()
{
sllistl;
l.keynum=6;
l.length=0;
inputdata(l);
searchcon(l);}