航空客运订票系统本科课程设计.docx
《航空客运订票系统本科课程设计.docx》由会员分享,可在线阅读,更多相关《航空客运订票系统本科课程设计.docx(21页珍藏版)》请在冰点文库上搜索。
航空客运订票系统本科课程设计
石家庄经济学院
本科生课程设计报告书
题目航空客运订票系统
航空客运订票系统
1需求分析
【问题描述】
试设计一个航空客运订票系统,方便乘客通过购票系统购买自己的所需要的飞机票,而航空客运订票的业务活动包括:
1.查询航线;2.客票预订;3.办理退票。
【系统能实现的功能】
①录入:
由设计者录入航班情况,数据存储在文件中;
②查询航线:
由用户输入终点站名,出发时间,输出下列信息:
所有可能的航班号,当天航班的余票数目;
③承办订票业务:
根据用户提出的要求(航班号、出发时间、订票数额)查询
该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;已满员或余票额少于订票额,则需重新询问客户是否需要进入预约人数中。
④承办退票业务:
根据用户提供的情况(日期、航班、票数等),为客户办理
退票手续。
然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票数目能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。
登陆系统
查询航线
选择定票
办理退票
退出系统
【测试实例】
例子某客户输入订票信息:
北京到上海,2014年5月3日,所需票数3张;系统输出:
所有可能航班号1000,1001,1002余票分别为40张,50张,55张;该客户选择航班号为1000的航班;则该航班余票变为37张;
2概要设计
航线的情况和已订票客户登录在一张线性表上,分别用顺序表和单链表实现;
ADTlist{
数据对象:
D={ai|ai∈ElemSet,i=1,2,…,n,n>=0}
数据关系:
R1={|ai-1,ai∈D,i=2,…,n}
基本操作:
InitList70219(&L)
操作结果:
构造一个空的线性表L;
ListInsert70219(&L,i,e)
初始条件:
线性表L已经存在;
操作结果:
在L中第i个位置之前插入新的元素e,L的长度加1;
ListDelete70219(&L,i,&e)
初始条件:
线性表L已经存在且非空,
操作结果:
删除L的第i个位置的元素,并用e返回其值,L的长度减1;
}
预约客户信息的存储使用队列。
ADTQueue{
数据对象:
D={ai|ai∈ElemSet,i=1,2,…,n,n>=0}
数据关系:
R1={|ai-1,ai∈D,i=2,…,n}
约定其中a1端为队头,an端为队列尾。
基本操作:
InitQueue70219(&Q);
操作结果:
构造一个空队列;
QueueEmpty70219(&Q);
初始条件:
队列Q已存在;
操作结果:
若Q为空队列,则返回1,否则返回0;
EnQueue70219(&Q,&e);
初始条件:
队列Q已存在;
操作结果:
插入元素e为Q的新队尾元素;
DeQueue70219(&Q,&e);
初始条件:
队列Q已存在,且非空;
操作结果:
删除Q的队头元素,并用e返回其值。
Gedhead70219(&Q,&e);
初始条件:
队列Q已存在,且非空;
操作结果:
取队列的队头元素,用e返回;
}
航空系统用到的其他的函数:
voidentry70219();
操作结果:
初始化录入功能
voidsearch70219();
初始条件:
初始化录入成功
操作结果:
通过始发地和终点站查询
voidbook70219();
初始条件:
初始化录入成功
操作结果:
实现订票
voidreturnticket70219();
初始条件:
已经成功预订机票;
操作结果:
实现退票;
intmain()
{
intn;
do{//主界面
printf("\n欢迎使用航空客运订票系统\n");
printf("\n==>1.录入功能==\n");
printf("\n==>2.查询功能==\n");
printf("\n==>3.订票功能==\n");
printf("\n==>4.退票功能==\n");
printf("\n==>5.退出==\n");
scanf("%d",&n);
printf("\n");
switch(n)
{
case1:
entry70219();//录入功能
break;
case2:
search70219();//查询功能
break;
case3:
book70219();//订票功能
break;
case4:
returnticket70219();//退票功能
break;
default:
exit(0);//退出
}
}while(n==1||n==2||n==3||n==4);
return0;
}
3详细设计
已订票客户的单链表存储结构
typedefstructbooked{
charname[20];//订票客户姓名
intbookednum;//该客户已订票数
structbooked*next_1;//指向下一客户的
}booked,*LinkList;
预约客户的队列存储结构
typedefstructyuyue{
charname[20];//预约客户姓名
intyuyuenum;//该客户预约票数
structyuyue*next_2;//指向下一客户的
}yuyue,*Qnode;
typedefstruct{
Qnodefront;//队头指针
Qnoderear;//队尾指针
}LinkQueue;
每条航线是这张表上的一个记录,包含8个域、其中乘员名单域为指向乘员名单链表的头指针,等候替补的客户名单域为分别指向队头和队尾的指针。
航班的相关信息使用顺序表存储结构
typedefstructhangxian{
charhangbannum[10];//航班号
charfeijinum[10];//飞机号
charzhongdian[20];//终点站名
intstarttime;//飞行时间
inttotalnum//乘员定额
intleftnum;//余票量
booked*yiding;//指向已订票客户的头结点指针
LinkQueue*yuyuequeue;//指向预约客户队列的指针
}hangxian;
1链表的操作:
1.1初始化单链表来存储订票客户的信息:
申请带有头结点的单链表;
如果申请失败则退出程序;
头结点的下一个指针为空
返回值为初始化的头结点指针;
LinkListInitList70219(LinkList&la){
la=(LinkList)malloc(sizeof(booked));
if(la==NULL)exit(0);
la->next_1=NULL;
returnla;}
1.2插入订票客户的信息:
、
该节点指针域存储la的指针域的指针;
la的指针域存储新申请的节点的指针;
voidlianbiaoInsert70219(LinkList&la,LinkList&s){
s->next_1=la->next_1;
la->next_1=s;
return;}
1.3删除退票客户信息:
传入的删除节点的前一个节点的地址;
删除传入的指针的后一个节点;
释放该节点;
voidlianbiaoDelete70219(LinkList&s){
LinkListq=s,p;
p=q->next_1;
q->next_1=p->next_1;
free(p);}
2队列的操作:
2.1初始化队列
为头尾指针申请一个头节点;
申请失败则退出;
此时头结点指针域为空;
返回Q值;
LinkQueInitQueue70219(LinkQue&Q){
Q=(LinkQueue*)malloc(sizeof(LinkQueue));
Q->front=Q->rear=(Qnode)malloc(sizeof(yuyue));
if(!
Q->front)exit(-1);
Q->rear->next_2=NULL;
returnQ;}
2.2插入预约客户的信息:
插入节点的指针域为空;
队尾指针中的指针域存储传入的节点地址;
队尾指针存储传入节点的地址;
voidEnQueue70219(LinkQue&Q,Qnodep){
p->next_2=NULL;
Q->rear->next_2=p;
Q->rear=p;}
2.3删除队列的首元素,即第一个预约的客户:
判断是否为空队列;
不为空则删除队列首元素;
队列中最后一个元素被删除时,使队尾指针指向头结点;
释放该节点;
LinkQueDeQueue70219(LinkQue&Q){
if(Q->front==Q->rear)exit(-1);
p=Q->front->next_2;
Q->front->next_2=p->next_2;
if(Q->rear==p)Q->rear=Q->front;
free(p);
returnQ;}
2.4取队头元素:
先判断队列是否为空;
不为空则取队头元素;
QnodeGedhead70219(LinkQue&Q)
{if(Q->front==Q->rear)returnNULL;
s=(Q->front->next_2);
returns;}
3.飞行航线的录入:
打开文件读取数据;
从文件读取的所有航班信息;
将读入的数据显示到屏幕上;
关闭文件;
voidentry70219(hangxianair[20];){
FILE*fp=fopen(filename,"r");
interrno=0;
if(!
fp)exit(-1);
while(!
feof(fp)&&i<20)
{fscanf(fp,"%s%s%s%s%d%d",air[i].hangbannum,air[i].feijinum,air[i].zhongdian
air[i].starttime,&(air[i].totalnum),&(air[i].leftnum));
InitQueue70219(air[i].yuyueque);
InitList70219(air[i].yiding);
i++;}
fclose(fp);
}
4.查询功能:
输入终点站以查询某航线所有信息;
在顺序表中查找该航线信息;
找到则显示该航班的信息;
voidsearch70219(hangxianair[20]){
scanf("%s",city);
for(i=0;i<20;i++){
if(!
strcmp(air[i].zhongdian,city))
break;}
if(i=20)
return;
}
5.订票功能:
在数组中查找客户输入的航线信息;
如果找到该航线
输入订票姓名和票数;
判断该客户所定的航班的余票是否足够;
足够则把客户提供的姓名和票数,输入到该航线对应的链表中;
航线的余票数目发生改变;
订票成功则退出程序;
否则提示余票不足,询问是否预约;
预约则把该客户的信息插入到预约客户的队列队尾;
输入的终点站不存在,退出程序;
voidbook70219(hangxianair[20]){
scanf("%s",city);//
for(i=0;i<20;i++){
if(!
strcmp(air[i].zhongdian,city)){
scanf("%s",name);
scanf("%d",&ticket_num);
if(air[i].leftnum>=ticket_num){
b=(LinkList)malloc(sizeof(booked));
b->bookednum=ticket_num;
strcpy(b->name,name);
lianbiaoInsert70219(air[i].yiding,b);
air[i].leftnum=air[i].leftnum-ticket_num;
return;}
else{
E=(Qnode)malloc(sizeof(yuyue));
E->yuyuenum=ticket_num;
strcpy(E->name,name);
EnQueue70219(air[i].yuyueque,E);/
return;}
elsereturn;
}
}
}
return;
}
6.退票功能:
寻找航线位置;
客户输入姓名在该航线订票客户中查找;
订票客户链表为空不进行循环;
通过姓名寻找到订票客户的节点位置;
以取消订阅;
没有找到则继续寻找;
退出循环时指针仍然存在则表示退票成功;
否则提示没有找到客户的信息;
判断退票成功时是否有预约客户;
有则判断此时该航线的余票是否满足第一个预约客户的订票需求;
满足则客户订票;
取队列的对头元素;
将队头的元素信息插入到链表中;
从队列取出的元素插入到订票客户链表中;
删除队列的队头元素;
voidreturnticket70219(hangxianair[20]){
scanf(city);
for(i=0;i<20;i++){
if(!
strcmp(air[i].zhongdian,city)){
scanf(name);
p=air[i].yiding;
if(p->next_1){
while(p->next_1){
if(!
strcmp(p->next_1->name,name)){
air[i].leftnum+=p->next_1->bookednum;
lianbiaoDelete70219(p);
break;
}
p=p->next_1;
j=1;
}
if(j==1)
return;
}
else
return;
m=air[i].yuyueque->front;
if(m->next_2)
{if(m->next_2->yuyuenum<=air[i].leftnum)
{
h=Gedhead70219(air[i].yuyueque);
s=(LinkList)malloc(sizeof(booked));
strcpy(s->name,h->name);
s->bookednum=h->yuyuenum;
air[i].leftnum=air[i].leftnum-h->yuyuenum;
lianbiaoInsert70219(air[i].yiding,s);
DeQueue70219(air[i].yuyueque);
}
}
return;
}
}
return;
}
intmain()
{
intn;
do{//主界面
printf("\n欢迎使用航空客运订票系统\n");
printf("\n==>1.录入功能==\n");
printf("\n==>2.查询功能==\n");
printf("\n==>3.订票功能==\n");
printf("\n==>4.退票功能==\n");
printf("\n==>5.退出==\n");
scanf("%d",&n);
switch(n){
case1:
entry70219(air);//录入功能
break;
case2:
search70219(air);//查询功能
break;
case3:
book70219(air);//订票功能
break;
case4:
returnticket70219(air);//退票功能
break;
default:
exit(0);//退出
}
}while(n==1||n==2||n==3||n==4);
return0;
}
4编码调试
运行程序主界面如图1
图1
从文件中导入航班的信息:
输入的数据能基本能正确导入结构体中,并在屏幕中显示出来,但在文件中再加入一行航班信息时屏幕上不会显示,但在查询时能输出该航线的信息,表明文件正确导入结构体中,但没有输出到屏幕上,将for(j=0;j
图2
查询终点站为武汉的航班信息如图3
图3
查询终点站为广州的航班信息如图4
图4
订票模块:
订票时各航线数据除第一行外都能够正确显示,并提示订票。
经过调试发现是从文件导入数据时第一行数据没有正确初始化;改进之后就可以全部显示;此中第一条航班信息北京即为边界数据。
选择订票有航线:
北京,姓名:
王,订票数:
7,显示订票成功,如图5
图5
在此基础上选择订票,姓名:
张;订票数:
4,显示余票不足,选择预约如图6
图6
退票模块:
进入退票功能时,输入航班后提示输入订票客户姓名但不管输入任何订票客户的信息都提示没有该客户的信息,则说明退票函数的功能没有正确执行。
错误的原因:
删除订票客户节点的函数lianbiaoDelete70219的参数没有传递对,刚开始传递的是该航线单链表的头指针,根据函数功能应该传递的是这项删除节点的前一个节点的指针,改正之后能够正确执行函数功能;
在以上客户订票基础上执行退票,航线:
北京,姓名:
王。
退票成功并且是首位预约客户订票成功,如图7
图7
5设计体会
1.由于是首次进行稍微复杂的程序设计,所以在需求分析阶段需花费一定
的时间以便深刻的了解该阶段到底要实现什么功能,才能为后几个阶段做好准备;比如需求分析时写入了较多的专业术语既是一种错误的做法,此阶段需要的是可供非专业人员读懂的设计要求,所以过多的专业术语将导致需求分析失去了其作用;
2.概要设计时及要求大脑中有一个大概的轮廓知道如何设计各种数据类型
并进行存储以及个数据类型之间的关系,需要知道主功能模块与个数据类型基本操作之间的调用关系;
3.详细设计时实现实现个函数功能做主要的阶段,由于以往不良的编程习
惯导致刚开始设计程序时是直接上手敲代码,致使函数功能的实现中出现了大量的错误,后来在张有华老师的要求下重头开始先用汉字将算法描述一遍,然后再有类c语言写出算法,这样不仅让函数功能的实现更加清晰,而且使得程序在编译时错误大大减少;
4.编码调试阶段由于函数中任然存在各种问题,如指针、引用的使用,函数参数的传递,实参、虚参之间的关系,在老师和同学的帮助下终于将问题一一击破;
5.测试结果及所采用的测试相关数据已经在编码调试阶段给出了一些分析,录入航班信息的功能时间复杂度为O(n)、空间复杂度为O(l),查询功能的时间复杂度为O(n),空间复杂度O(n),订票功能的时间复杂度为O(n),时间复杂度O(l),
退票功能的时间复杂度为O(n*n);
6.算法改进,此程序中预约客户使用队列的存储存在一个缺陷。
即队列是采用的尾进头出的存储结构,也就是说大部分的预约客户(队头元素除外)不能够实现取消预约的情况,显然在实际情况中不大合情理。
改进思路可以采用链表的形式存储,但需要对链表进行一定的限制,如必须在链表尾部插入新的预约客户信息。
另一个需要改进的地方是航空客运订票系统应该分成几个不同的操作界面,外部客户界面、内部系统界面这样才与现实的情况相符合;
7.本次课程设计是我对c语言的运用更加熟练,理解更加深刻,同时对数据结构最基本的操作理解更进一步,同时加深了对软件工程的认识。
是自己对今后的就业方向更加清晰,师生、同伴之间的交流加强了团队合作的呢能力;
6致谢
/*提示:
培养感恩之心,对在本次设计中所有对你有帮助的人(老师、同学、同组成员)表达真诚的谢意。
*/
由于本人目前能力有限,在本次课程设计各种功能的实现中遇到了很大很多的问题,程序的成功完成得到了各位老师和同学的大力支持。
在此特意感谢我的数据结构老师吴聪聪,她并不是我此次课程设计的直接指导老师,但是当我的程序陷入问题中时她都会非常耐心、认真地指导和帮助我。
本次课设的难度相对来说比较大程序中遇到的问题也是非常棘手,如果不是吴老师的帮助我恐怕很难保质保量地按时完成课设的任务。
基于此再次对吴老师的帮助表示感谢。
同时感谢张有华老师对我们的高标准严要求,因为他的要求使得我在编程这一块的能力有了很大的提升,良好地变成习惯逐渐形成。
最后感谢在我程序设计时为我提供过帮助的同学。
7参考文献
[1].严蔚敏.数据结构(C语言版)[M].清华大学出版社2008年11月;
[2].李文斌c语言程序设计与大学教程清华大学出版社;
[3].刘坤起数据结构题型题集题解科学出版社;
[4].谭浩强c++程序设计清华大学出版社;
8附录(源程序清单)
aviationsystem源文件夹;