数据结构课程设计航空订票系统.docx
《数据结构课程设计航空订票系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计航空订票系统.docx(44页珍藏版)》请在冰点文库上搜索。
数据结构课程设计航空订票系统
总体设计
通过此系统可以实现如下功能:
1).录入:
可以录入航班情况(数据存储在一个数据文件中)
2).查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);
可以输入起飞抵达城市,查询飞机航班情况;
3).订票:
(订票情况存在一个数据文件中)
可以订票,如果该航班已经无票,可以提供相关可选择航班;
4).退票:
可退票,退票后修改相关数据文件;
客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
5).修改航班信息:
当航班信息改变可以修改航班数据文件
概要设计
每个模块的算法设计说明如下:
(1)录入模块:
查找单链表的链尾,在链头插入一个“航班信息”的新结点。
(2)浏览模块:
顺着单链表输出航班信息。
(3)修改模块:
输入密码,确认是否有权限对航班信息进行修改,有则进行修改,否则不能修改。
提供两种修改方式:
添加航班和对已有的航班信息进行改动(修改和删除),1添加航线,0对已有的航班信息进行改动(修改和删除)。
对已有的航班信息进行改动(修改和删除):
顺着单链表查找,若找到则进行相关操作。
(4)查询模块:
提供两种查方式:
按航号和起飞抵达城市查询,0代表按航号查询,1代表按起飞抵达城市查询。
顺着单链表查找,如果与航班号(起飞抵达城市)一致,输出相关信息并询问乘客是否要订票,若订进入订票模块;否则,查询不成功。
(5)订票模块:
查找乘客要订的航班号,判断此航班是否有空位,有则输入乘客有关信息,订票成功;否则查找这个月此乘客起飞城市和降落城市的有空位航班,供乘客选择,若有则订票,若无则订票不成功并把此乘客的信息录入此航班等候订票队列中,退出订票。
(6)退票模块:
输入要退票的乘客姓名以及所退票的编号,查找乘客资料的链表中是否有这位乘客,有则删去此结点,并判断是否有等候订票的乘客(有则通知等候订票乘客订票,无则余票加乘客所退票数);无则退票失败。
(7)文件模块:
顺着单链表把链表的信息写入文件。
详细设计
由于此系统流程图太多,流程图所对应的源代码较长,所占篇幅也较大,并且流程图所对应的源程序在订票系统源程序中都有,这里就不再赘述。
需要说明的是插入、查找、修改和删除这些线性表的基本操作的流程图在订票系统源程序中没有单独函数,是因为此系统主要是运用线性表的基本操作解决实际问题,具体问题所对应的基本操作代码有所不同,但思维是相同的,所以这几个操作的源代码已经对应写入了其他具体操作的函数中,这里也不再给出。
根据订票系统功能的需要定义了如下的结构体:
typedefstructwat_ros/*等候订票乘客的信息*/
{charname[20];/*姓名*/
charphone[15];/*等候订票乘客的联系方式*/
structwat_ros*next;
}qnode,*qptr;
typedefstructpqueue
{qptrfront;/*等候替补客户名单域的头指针*/
qptrrear;/*等候替补客户名单域的属指针*/
}linkqueue;
typedefstructord_ros
{charname[20];/*客户姓名*/
charIDnum[20];/*客户有效证件的编号*/
charairnum[7];/*航班号*/
intdpl;/*订票量*/
charpiaohaio[20];//票的编号,由航班号起飞日期此航班订票前的余票量
structord_ros*next;
}Lnode,*linklist;
typedefstructairline
{charqdname[20];/*起点站名*/
charzhname[20];/*终点站名*/
charair_num[7];/*航班号*/
charplane_num[10];/*飞机型号*/
charyear[5];
charmonth[3];
charday[3];/*飞行日期*/
charqhour[3];
charqminute[3];/*起飞时间*/
charjhour[3];
charjminute[3];/*降落时间*/
floatzhekou;/*没有折扣为十折*/
floatprice;/*票价*/
inttkt_amt;/*乘员定额*/
inttkt_sur;/*余票量*/
Lnode*order;/*本航班乘客名单域,指向乘客名单链表的头指针*/
linkqueue*wait;/*本航班等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/
structairline*next;/*指向下一个结点*/
}lineinfo,*lineair;
调试分析
测试数据及截图
时间复杂度分析
录入为线性表的初始化,所以时间复杂度:
O
(1);
浏览遍历整张线性表所以时间复杂度:
O
(1);
修改航班信息为线性表的查找、线性表的插入和线性表的删除操作,其平均移动元素个数分别为(n+1)/2、n/2、(n-1)/2,所以时间复杂度:
O(n);
查询为线性表的查找,所以时间复杂度:
O(n);
订票为线性表的查找所以时间复杂度:
O(n);
退票是查找两张线性表,所以时间复杂度:
O(n*e);
其中的n为航班总数,e为对应航班已定票人数。
问题思考
(1)在事先就把航班信息写入文件,从文件中获取信息,但取数时怎样控制文件指针,也就是怎样取数的问题。
(2)输入密码时像平时在上网登录某一账号时输入密码一样显示“*********”。
(3)管理员能够在系统上浏览乘客信息。
解决第一个问题需要在读取文件信息时与灵活运用文件的指针的定位,在写入文件信息需严格按照一定的格式,不然文件指针不好定位;解决第二个问题用不回显接收函数getch(),然后调用printf()函数打印出一个*号;第三个问题只需在浏览操作时,设立一个管理员入口,输入管理员密码就对每条航线的乘客信息进行遍历,并把每条航班和对应的乘客信息输出。
算法的改进设想
(1)在算法效率,由于此课程设计所用到的是线性表的建立、查找、插入、删除和队列的建立、插入、删除,所涉及的是查找和排序问题,所以可以在建立插入时按照起飞和抵达城市进行排序,若起飞和抵达城市相同则再按日期进行排序,查找时采用分块查找,当然要实现这些操作,对航班信息的存储应采指针数组存储。
(2)在函数重组,把处理不同问题相同算法思想(如线性表的插入、删除、查找等等)写在一个函数中,其他函数要用到这种操作时只需调用这些函数,减少整个程序的代码量,方便理解、阅读和使用。
课设总结体会
此次课程设计我们组选了订票系统这个选题。
为了实现某个功能,必须使用相应的结构体,我们首先在网上搜索了几套别人所做订票系统的课程设计,看了一下他们所定义的结构体和我们课程设计选题所要实现的功能,觉得他们的结构体相对于我们的选题来说还是有一定的缺陷。
我们的选题主要运用线性结构来存储数据,进行线性表、队列的一些基本操作。
根据选题要实现的功能和链式存储结构的优点,我们最终决定队列和线性表都采用链式存储结构存储,并定义相应的结构体。
在敲源代码时,发现航班结构体中的已定票乘客信息和等待订票乘客信息的结构不太好操作,经过一番思考最终改为源代码中所定义的结构体。
从中知道了结构体的定义决定了源程序的难易。
在打程序时,没有把文件操作的代码打进源程序。
在调试没有文件操作的代码时,没有很多错误,但是犯了一个大错,就是在有一个字符串的复制中使用了赋值,调试过程指出错错误半天都不知道改,后来看了整个程序才反应过来。
在运行调试过程中浏览信息没有输出想要的输出结果,检查程序原来是格式控制字符串中的一个字符打成了大写;查询信息只能查询链表中的第一条航线,检查程序原来是多用了break造成过早跳出循环,不能查找后面的航线;乘客订多张票后浏览信息发现余票只减了一张,检查程序发现乘客订票后只对余票做了自减,在运行调试过程中就出现了这么些大的错误,在这过程中还对输出窗口界面做了一些调整。
加入文件操作代码后进行调试,没有出现什么错误。
最终运行时老在文件操作时终止程序,经过调试和自己的摸索原来是文件检测函数运用错误,改正后程序正常运行。
运行程序后打开所写的文件,发现航班信息的余票量没有随乘客的订票而减少,还是初始值,这时才发现每进行一次订票后都要重新对航班信息的文件重新写入,改后最终就确定了上交源代码。
在敲代码和在程序的调试、运行过程中我们发现我们半天才能想出几句语句,整个代码敲了二十几个小时,调试调了二三十个小时,主要原因使我们练得还不够,C语言功底还不是很扎实,要增加敲的代码量。
数据结构是为了解决实际问题,提出了一些结构,这些东西是我们以后解决一些问题时所要用到的,所以一定要熟练掌握,要多敲代码。
此次课程设计,使我们对链表和链队列的基本操作更加熟练,让我们深深地体会到要学好数据结构需要多练。
附录
程序说明
此课程设计程序无需安装,只需打开在VC++6.0上编译、连接、运行即可。
程序的源代码在本模块中。
源代码
#include
#include
#include
typedefstructwat_ros/*等候订票乘客的信息*/
{charname[20];/*姓名*/
charphone[15];/*等候订票乘客的联系方式*/
structwat_ros*next;
}qnode,*qptr;
typedefstructpqueue
{qptrfront;/*等候替补客户名单域的头指针*/
qptrrear;/*等候替补客户名单域的属指针*/
}linkqueue;
typedefstructord_ros
{charname[20];/*客户姓名*/
charIDnum[20];/*客户有效证件的编号*/
charairnum[7];/*航班号*/
intdpl;/*订票量*/
charpiaohaio[20];//票的编号,由航班号起飞日期此航班订票前的余票量
structord_ros*next;
}Lnode,*linklist;
typedefstructairline
{charqdname[20];/*起点站名*/
charzhname[20];/*终点站名*/
charair_num[7];/*航班号*/
charplane_num[10];/*飞机型号*/
charyear[5];
charmonth[3];
charday[3];/*飞行日期*/
charqhour[3];
charqminute[3];/*起飞时间*/
charjhour[3];
charjminute[3];/*降落时间*/
floatzhekou;/*没有折扣为十折*/
floatprice;/*票价*/
inttkt_amt;/*乘员定额*/
inttkt_sur;/*余票量*/
Lnode*order;/*本航班乘客名单域,指向乘客名单链表的头指针*/
linkqueue*wait;/*本航班等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/
structairline*next;/*指向下一个结点*/
}lineinfo,*lineair;
voidExplorer(lineairH)/*浏览航线信息*/
{
lineinfo*p;
p=H->next;
printf("航班号起飞站终点站机型飞行日期起、降时间票价折扣成员定额余票量\n");
while(p)
{
printf("%s%s%s%s%s/%s/%s%.2s:
%.2s%.2s:
%.2s%5.1f%3.1f%d%d\n",p->air_num,p->qdname,p->zhname,p->plane_num,p->year,p->month,p->day,p->qhour,p->qminute,p->jhour,p->jminute,p->price,p->zhekou,p->tkt_amt,p->tkt_sur);
p=p->next;
}
}
intGreatelist(lineair&H,intn)/*录入*/
{chara;
inti;
lineinfo*p;
if(!
(H=(lineair)malloc(sizeof(lineinfo))))
{
printf("分配空间出错");
a=getchar();
return(0);
}
H->next=NULL;
if(!
(H->order=(linklist)malloc(sizeof(lineinfo))))
{
printf("分配空间出错");
a=getchar();
return0;
}
H->order->next=NULL;
if(!
(H->wait=(linkqueue*)malloc(sizeof(lineinfo))))
{
printf("分配空间出错");
a=getchar();
return0;
}
H->wait->rear=H->wait->front=NULL;
printf("\n开始录入航班信息:
\n");
printf("起点终点航班号机型年月日起降时间折扣票价乘员定额\n");/*起飞时间和降落时间包含时分*/
for(i=0;i{
if(!
(p=(lineair)malloc(sizeof(lineinfo))))
{printf("分配空间出错");
a=getchar();
return0;
}
scanf("%s%s%s%s%s%s%s%s%s%s%s%f%f%d",p->qdname,p->zhname,p->air_num,p->plane_num,p->year,p->month,p->day,p->qhour,p->qminute,p->jhour,p->jminute,&p->zhekou,&p->price,&p->tkt_amt);
p->tkt_sur=p->tkt_amt;
if(!
(p->order=(linklist)malloc(sizeof(lineinfo))))
{printf("分配空间出错");
a=getchar();
return0;
}
p->order->next=NULL;
if(!
(p->wait=(linkqueue*)malloc(sizeof(lineinfo))))
{printf("分配空间出错");
a=getchar();
return0;
}
p->wait->rear=p->wait->front=NULL;
p->next=H->next;
H->next=p;
}
return1;
}
intDinpiao(lineairH)/*订票*/
{
intm,k=0,x,v=0,c=1,d;
lineinfo*p,*t;
Lnode*q;
chara,*b;
qnode*s;
charyear[5];
charmonth[3];
charday[3];/*飞行日期*/
charair_num[7];/*航班号*/
p=H->next;
t=H->next;
printf("请输入所定的航班号,票的年、月、日:
\n");
scanf("%s",air_num);
scanf("%s",year);
scanf("%s",month);
scanf("%s",day);
while(p)
{
if(!
(strcmp(air_num,p->air_num))&&!
(strcmp(year,p->year))&&!
(strcmp(month,p->month))&&!
(strcmp(day,p->day)))
{
c=0;
if(p->tkt_sur)
{
printf("此航班还有%d张票可订,请输入您要订票的张数:
",p->tkt_sur);
scanf("%d",&m);
if(m<=p->tkt_sur)
{
printf("您已成功订到%d张票!
\n请输入您的姓名:
",m);
if(!
(q=(linklist)malloc(sizeof(Lnode))))
{
printf("分配空间出错");
a=getchar();
return0;
}
scanf("%s",q->name);
printf("请输入您的身份证号码:
");
scanf("%s",q->IDnum);
q->dpl=m;
if(!
(b=(char*)malloc(sizeof(char))))
{
printf("分配空间出错");
a=getchar();
return0;
}
strcpy(q->airnum,p->air_num);
itoa(p->tkt_sur,b,10);
strcpy(q->piaohaio,p->air_num);
strcat(q->piaohaio,p->year);
strcat(q->piaohaio,p->month);
strcat(q->piaohaio,p->day);
strcat(q->piaohaio,b);
printf("您所订票的编号:
%s",q->piaohaio);
p->tkt_sur-=m;
q->next=p->order->next;
p->order->next=q;
return1;
}
else
{
printf("对不起余票量不够,请选择其他航班!
");
k=1;
}
}
if(!
p->tkt_sur||k==1)
{
printf("航班已经满仓,您可以选择以下相关航班:
\n");
while(t)
{
if(!
(strcmp(t->year,p->year))&&!
(strcmp(t->month,p->month))&&!
(strcmp(p->qdname,t->qdname))&&!
(strcmp(p->zhname,t->zhname))&&p->tkt_sur)
{
printf("航班号机型飞行日期起降时间票价折扣余票量\n%s%s%s/%s/%s%s:
%s%s:
%s%5.1f%3.1f%d\n",t->air_num,t->plane_num,t->year,t->month,t->day,t->qhour,t->qminute,t->jhour,t->jminute,t->price,t->zhekou,t->tkt_sur);
}
t=t->next;
}
printf("有没有您可以乘坐的航班\t0没有\t非0整数有\t请选择:
");
scanf("%d",&x);
if(!
x)
{
printf("请输入您的姓名、联系方式\n");
if(!
(s=(qptr)malloc(sizeof(qnode))))
{
printf("分配空间出错!
");
a=getchar();
return0;
}
scanf("%s",s->name);
scanf("%s",s->phone);
s->next=NULL;
if(p->wait->front==NULL&&p->wait->rear==NULL)/*等候订票队列为空*/
p->wait->rear=p->wait->front=s;
else
{
s->next=p->wait->rear->next;
p->wait->rear->next=s;
p->wait->rear=s;
}
printf("如果有人退票,我们会在第一时间联系您!
\n");
return0;
}
else
returnDinpiao(H);
}
}
p=p->next;
}
if(c)
{
printf("没有您所指定的航班,0菜单栏非0数字重新输入航班号,票的年、月、日\n");
scanf("%d",&d);
if(d)
returnDinpiao(H);
else
return0;
}
return1;
}
intLocateair(lineairH)/*查询*/
{
intm,k=1,t;
lineinfo*p;
charqdname[20];/*起点站名*/
charzhname[20];/*终点站名*/
charair_num[7];/*航班号*/
p=H->next;
printf("输入0按航班号查询,输入1按起飞抵达城市查询,请输入您的选择:
");
scanf("%d",&m);
while(m<0||m>1)
{
printf("请您重新选择,输入0按航班号查询,输入1按起飞抵达城市查询:
");
scanf("%d",&m);
}
if(m)
{
printf("请分别输入起飞抵达城市:
\n");
scanf("%s",qdname);
scanf("%s",zhname);
printf("机型航班号飞行日期起降时间票价折扣余票量\n");
while(p)
{
if(!
(strcmp(p->qdname,qdname))&&!
(strcmp(p->zhname,zhname)))
{
printf("%s%s%s/%s/%s%.2s:
%.2s%.2s:
%.2s%5.1f%3.1f%d\n",p->plane_num,p->air_num