数据结构课程设计 飞机航班订票系统.docx
《数据结构课程设计 飞机航班订票系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 飞机航班订票系统.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计飞机航班订票系统
课程设计报告书
课程设计名称:
《数据结构课程设计》
专业:
题目:
飞机航班订票系统
班级:
学号:
姓名:
指导老师:
完成时间:
2012-7-9
问题描述
一机场每天有n个航班,每个班次都有一班次号(1、2、3„n),固定的起飞时间,固定的路线(起始站、终点站),大致的飞行车时间,固定的额定载客量。
如
班次起飞时间起点站终点站飞行时间额定载量已定票人数
18:
00天津广汉2145130
26:
30天津成都0.5140140
37:
00天津成都0.5140120
410:
00天津成都0.5140120
„
试设计一个机票管理系统,对机场的售票情况进行管理。
基本要求
功能要求:
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据;
(2)浏览班次信息,可显示出所有班次当前状况(如果当前系统时间超过了某班次的起飞时间,则显示“此班已发出”的提示信息)。
(3)查询路线:
可按班次号查询,可按终点站查询;
(4)售票和退票功能
A:
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需重新询问客户要求。
若需要,可预约登记排队等候;
B:
根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户。
(5)修改航班信息:
当航班信息改变可以修改航班数据文件
实现提示
每条航线应包括的信息有:
终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包括姓名、订票额、座位号)和预约登记的客户名单(包括姓名、所需票额)。
这最后两项显然是一个线性表和一个队列。
为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。
由于预约人数无法预计,队列也应以链表作存储结构。
整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。
每条航线是这张表上的一个记录、包含上述八个域、其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。
选做内容
当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其他航线情况。
根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。
1、需求分析:
对于本设计,可采用基数排序法对于一组具有结构特点的飞机航班号进行排序,利用二分查找法对排好序的航班记录按航班号实现快递查找,按其他次关键字的查找可采用最简单的顺序查找方法进行,因为它们用的较少。
2、源程序:
#inc#include
#include
#include
#defineN9999//定义最多的航班数
#definePRINT"%d\t\t%s\t\t%s\t\t星期%s\t\t%d\n",s[i].num,s[i].start,s[i].over,s[i].time,s[i].count//宏定义输出格式
structair//定义结构体数组
{
intnum;
charstart[20];
charover[20];
chartime[10];
intcount;
}s[N];
inti,m=0;//定义全局变量
charii[10];
voidadd();//函数声明增加航班信息函数
voidprint();//显示航班信息
voidsearch();//查找航班信息
voiddingpiao();//订票业务
voidtuipiao();//退票
voidread();//读取文件
voidsave();//保存文件
voidoutput();//输出格式
voidpaixu();//航班排序
voidchushihua();//系统初始化
voidbuild();//建立数据文件
voidpaixu1();//按航班号从小到大排序
voidpaixu2();//从大到小
voidmain()//主函数
{
intj;
printf("欢迎使用中南大学飞机订票系统\n");
do
{
printf("================================================================================");
printf("\t1.增加航班信息\n"
"\t2.浏览航班信息\n"
"\t3.查找航班信息(按航班号)\n"
"\t4.航班排序(按航班号)\n"
"\t5.订票业务\n"
"\t6.退票业务\n"
"\t0.退出\n"
"\t\t\t\t\t\t\t\t\t\t\t中南大学欢迎您!
\n");
printf("================================================================================");
printf("请在0-6中选择以回车键结束:
");
scanf("%d",&j);
fflush(stdin);
switch(j)
{
case1:
add();
break;
case2:
print();
break;
case3:
search();
break;
case4:
paixu();
break;
case5:
dingpiao();
break;
case6:
tuipiao();
break;
case0:
save();
printf("谢谢使用,再见!
");
break;
default:
printf("您输入不合法,请按回车键继续");
getchar();
}
}while(j!
=0);//判断是否调用其他函数
}
voidbuild()//定义建立数据文件函数
{
FILE*fp;//定义文件指针
if((fp=fopen("hangban.dat","wb"))==NULL)//打开文件并判定是否出错
{
printf("创建文件失败!
");
getchar();
return;
}
printf("请依次输入航班信息(以回车键结束):
\n");
printf("--------------------------------------------------------------------------\n");
for(i=0;i{
printf("请输入航班号:
");
scanf("%d",&s[i].num);
printf("请输入起始站:
");
scanf("%s",s[i].start);
printf("请输入终点站:
");
scanf("%s",s[i].over);
printf("请输入时间(星期几):
");
scanf("%s",s[i].time);
printf("请输入机票数:
");
scanf("%d",&s[i].count);
fwrite(&s[i],sizeof(structair),1,fp);
m++;
printf("添加完毕,是否继续添加?
请键入y或n以回车键结束:
");
scanf("%s",ii);
if(strcmp(ii,"y")!
=0)//判断是否继续添加航班信息
{
fclose(fp);//关闭文件
return;
}
}
}
voidread()//定义读取文件函数
{
FILE*fp;
if((fp=fopen("hangban.dat","r"))==NULL)
{
printf("创建文件失败!
");
getchar();
return;
}
i=0;
while(!
feof(fp))
{
fread(&s[i],sizeof(structair),1,fp);//逐块读取数据
i++;
m++;//计算存在航班数
}
m--;
fclose(fp);
}
voidsave()//定义保存函数
{
FILE*fp;
if((fp=fopen("hangban.dat","wb"))==NULL)
{
printf("创建文件失败!
");
getchar();
return;
}
for(i=0;ifwrite(&s[i],sizeof(structair),1,fp);
fclose(fp);
}
voidadd()//定义增加航班信息函数
{
do{
printf("请依次输入您要增加的航班信息(以回车键结束):
\n");//打印提示信息
printf("--------------------------------------------------------------------------\n");
printf("请输入航班号:
");
scanf("%d",&s[m].num);
printf("请输入起始站:
");
scanf("%s",s[m].start);
printf("请输入终点站:
");
scanf("%s",s[m].over);
printf("请输入时间:
");
scanf("%s",s[m].time);
printf("请输入机票数:
");
scanf("%d",&s[m].count);
m++;
printf("添加完毕,是否继续添加?
请键入y或n以回车键结束:
");
scanf("%s",ii);
}while(!
strcmp(ii,"y"));//判断是否继续添加
}
voidoutput()//定义输出格式函数
{
printf("航班号\t\t起始站\t\t终点站\t\t时间\t\t机票数\n");
for(i=0;iprintf(PRINT);//打印出信息
}
voidprint()//定义显示航班信息函数
{
printf("\n目前我们有如下航班:
\n");
output();//调用输出格式函数
printf("\n请按回车键返回上层菜单");
getchar();
getchar();
}
voidsearch()//定义查询函数
{
intn;
do
{
printf("\n请输入航班号:
");
scanf("%d",&n);//输入查询的航班号
for(i=0;i{
if(s[i].num==n)//按航班号判定输出条件
{
printf("\n您所查找的航班信息为:
\n");
printf("航班号\t\t起始站\t\t终点站\t\t时间\t\t机票数\n\n");
printf(PRINT);//显示信息
printf("\n查询完毕,按回车键继续");
getchar();
getchar();
return;
}
}
printf("\n对不起,没有您需要的信息!
\n");
printf("是否重新查找?
请键入y或n以回车键结束");
scanf("%s",ii);
}while(!
strcmp(ii,"y"));//判定是否重新查找
}
voiddingpiao()//定义订票业务函数
{
intn;
chara[10]="y";
do
{
search();//调用查询模块
if(!
strcmp(ii,"n"))
{
printf("对不起!
没有找到您所需要的航班,所以不能订票。
\n");
printf("\n请按回车键返回上层菜单");
getchar();
getchar();
strcpy(ii,"n");
break;
}
do
{
printf("请输入您要订的机票数(以回车键结束):
");
scanf("%d",&n);
if(n<=0)//判定机票数是否出错
{
printf("输入错误!
至少需订1张机票。
\n");
}
elseif(s[i].count==0)//判定机票是否售完
{
printf("对不起,你所选择的航班的机票已售完!
\n");
break;
}
elseif(s[i].count!
=0&&s[i].count>=n)//判定机票数是否大于等于订票数
{
s[i].count=s[i].count-n;
printf("订票成功!
");
break;
}
elseif(s[i].count{
printf("对不起,你所选择的航班只剩%d张机票\n",s[i].count);
printf("是否需要重新输入机票数?
请输入y或n以回车键结束:
");//判定是否重新输入订票数
scanf("%s",a);
}
}while(!
strcmp(a,"y"));
printf("是否需要订其他航班的机票?
请输入y或n以回车键结束:
");
scanf("%s",a);
}while(!
strcmp(a,"y"));//判定是否继续订票
}
voidtuipiao()//定义退票函数
{
intn;
chara[10];
do
{
search();//调用查询函数
if(!
strcmp(ii,"n"))
{
printf("对不起!
没有找到您所需要的航班,所以不能退票。
\n");
printf("\n请按回车键返回上层菜单");
getchar();
getchar();
strcpy(ii,"n");
break;
}
printf("请输入您要退的机票数目:
");
scanf("%d",&n);
if(n<=0)//判定票数是否有效
printf("输入错误!
至少需退1张机票。
");
else
{
s[i].count=s[i].count+n;
printf("退票成功!
");
}
printf("是否继续?
请键入y或n以回车键结束:
");//判定是否继续退票
scanf("%s",a);
}while(!
strcmp(a,"y"));//判定并跳出循环
}
voidpaixu()//定义排序函数
{
intn;
printf("\n********************************************************************************");
printf("1.按航班号从小到大排序\n"
"\t2.按航班号从大到小排序\n");
printf("********************************************************************************");
printf("请在1-2中选择以回车键结束:
");
scanf("%d",&n);
switch(n)
{
case1:
paixu1();//调用从小到大排序函数
break;
case2:
paixu2();//调用从大到小排序函数
break;
}
printf("排序后的航班信息为:
\n");
output();//显示排序后航班信息
printf("\n请按回车键返回上层菜单");
getchar();
getchar();
}
voidpaixu1()//定义从小到大排序函数
{
intk,j;
structairt;
for(i=0;i{
k=i;
for(j=i+1;jif(s[k].num>s[j].num)
k=j;
if(i!
=k)
{
t=s[k];
s[k]=s[i];
s[i]=t;
}
}
}
voidpaixu2()//定义从大到小排序函数
{
intk,j;
structairt;
for(i=0;i{
k=i;
for(j=i+1;jif(s[k].num
k=j;
if(i!
=k)
{
}
t=s[k];
s[k]=s[i];
s[i]=t;
}
}
测试与分析
测试数据选择
测试结果分析
在输入测试数据后选择订票业务并再次输入相应的数据会完成订票业务。
在订票业务中调用dingpiao函数,所有函数的时间复杂度为O(n),系统本身采用线性结构模型。
调试分析
经验与体会
通过这次为期两周的实践学习,让我更深入的了解了数据结构这门课程,而且能灵活运用所学知识,作为一名医学生,拥有这样的有意义的一次经历让我铭记终身。