航空售票系统设计报告.docx
《航空售票系统设计报告.docx》由会员分享,可在线阅读,更多相关《航空售票系统设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
航空售票系统设计报告
算法与数据结构
课程设计报告
设计题目:
航空客运订票系统
专业计科院网络工程
班级11102
学生
学号
指导教师
2013年第二学期
一、设计目的……………………………………………………..………2
二、需求分析……………………………………………………..………2
三、概要分析……………………………………………………..………2
四、源程序清单……………………………………………………………………………….…....3
五、详细设计和源代码………………………………………………..…3
六、算法分析………………………………………………..…………………………….…………6
七、调试分析……………………………………………………………11
八、用测试数据去验证算法及程序的正确性……………………...….11
九、课程设计总结………………………………………...………….....14
十、指导老师意见………………………………………………….....…..15
一、设计目的
1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2、提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
二、需求分析
1、系统名称:
航空客运订票系统
航空客运订票的业务活动包括:
查询航线、客票预定和办理退票等。
要求在TC或VC环境下设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
2、要求:
(1)每条航线所涉及的信息有:
终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票量、已经订票的客户名单(包括姓名、订票量)以及等候替补的客户名单(包括姓名、所需票量)。
(2)作为模拟系统,全部数据可以只存放在内存中。
(3)通过此系统可以实现如下功能:
①录入功能:
可以录入航班情况
②查询功能:
根据客户提供的终点站名进行查询,可以输出以下信息:
航班号、飞机号、星期几飞行和余票量等。
也可以根据航班号,查询飞机某个航线的情况。
订票功能:
根据客户提出的要求(姓名、终点站名、订票数量)查询该航班的余票量情况。
如尚有足够的余票,则为客户办理订票手续;若已满员或余票量少于订票数量,则需要重新询问客户要求,如需要,可登记排队候补。
④退票功能:
根据客户提供的情况(姓名、日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,若有人排队,则为排在第一位的客户办理订票手续。
三、概要分析
1、分析问题,给出数学模型,设计相应的数据结构。
(1)己订票的客户名单可以用线性表来实现。
为查找方便,线性表应按照客户姓名有序,
并且为了插入和删除的方便,应以链表作为存储结构。
(2)等候替补的客户名单也有可能出现退票的情况,故用链表来实现。
(3)需将输入的航班情况登录到一张线性表上(用顺序存储结构或链表存储结构)。
为了查询的方便,可以将航班情况按照航班有序或按照终点站名有序建立线性表。
每条航线是这张线性表的一个记录,包含上述8个域,其中已订票的客户名单域是指向己订票的客户名单链表的头指针,等候替补的客户名单域是指向队头和队尾的指针。
2、算法设计
在已经选择好数据结构的前提下,为解决问题设计算法。
(1)确定所需模块
对于稍复杂的程序设计,要充分利用模块化程序设计方法,自顶向下,逐步细化,在整体思路确定的情况下,考虑所需模块数,各模块完成功能以及模块之间的数据联系和调用关系。
(2)各子模块功能描述
给出主要模块的算法描述,用流程图或伪代码表示。
(3)模块之间的调用关系
给出算法各模块之间的关系图示
3、源程序清单
为了提高工作效率,充分利用上机调试程序的时间,要求学生在上机之前给出源程序清单。
4、用测试数据去验证算法及程序的正确性
5、算法分析
经过上机调试,源程序运行正确,并且实现算法要求的功能,解决课程设计题目中给出的问题后,分析算法的时间复杂度和空间复杂度。
四、源程序清单:
intmain();//主菜单
intEntering();//录入航线
intSearch();//查询信息
intReserve();//订票
intRefund();//退票
五、详细设计和源代码
定义:
typedefstructYidingkehu{//单链表
charname[15];//已订票的客户姓名
intdingpiaoshu;//已订票数量
structYidingkehu*next1;//
}Yidingkehu,*Link;
typedefstructWeidingkehu{//单链队
charname[15];//预订票的客户姓名
intyudingpiao;//要订票数量
structWeidingkehu*next2;//下一个链队结点指针
}Weidingkehu,*Qptr;
typedefstructyuding{
Qptrfront;//单链队头结点
Qptrrear;//单链队尾结点
}linkQueue;
typedefstructHangxian{//创建一个含有六个信息的结构体
charhangbanhao[15];//航班号-
charfeijihao[15];//飞机号
intfeixingriqi;//起飞时间
intchenkerenshu;//座位数
intyupiao;//余票
charzhongdianzhai[15];//降落城市
structHangxian*next;//指向下一个链结点的指针
structYidingkehu*yiding;//定义一个指向已订票客户的头结点指针
structWeidingkehu*yudingqueue;//或structyudingyudingqueue;
}Hangxian,*Linklist;
1.main
六、算法设计
模块图:
2.Entering
3.Search
4.Reserve
5.Refund
模块说明:
(1)显示主菜单并根据输入调用相应函数。
(2)将航班信息存入程序。
(3)根据航班号或终点站查询信息,浏览所有航班信息。
(4)输入姓名、订票数订票,若余票不足提示是否预订。
(5)显示退票主菜单并根据输入调用相应函数。
选择退订票或预订票,输入姓名、退票数退票。
若退订票,退票成功后然后查询该航班是否有人排队候补,若有人排队,则为排在第一位的客户办理订票手续。
模块算法描述(伪代码):
主要函数
intEntering(Hangxian&first)//录入航线
{
Hangxian*last;
last=first.next;
Hangxian*p=(Hangxian*)malloc(sizeof(Hangxian));
cout<<"输入航班号:
";
cin>>p->hangbanhao;
cout<<"输入飞机号:
";
cin>>p->feijihao;
cout<<"输入起飞时间:
";
cin>>p->feixingriqi;
cout<<"输入座位数:
";
cin>>p->chenkerenshu;
cout<<"输入降落城市:
";
cin>>p->zhongdianzhai;
p->yupiao=p->chenkerenshu;
p->next=NULL;
p->yiding=NULL;
p->yudingqueue=NULL;
if(last==NULL)
first.next=p;
else
{
while(last->next!
=NULL)
{
last=last->next;
}
last->next=p;
}
return0;
}
intSearch(Hangxian&first)//查询航线
{
Hangxian*s;
s=first.next;
chara[10];
intn;
inti=1;
do{
cout<<"*****************************************************************************\n";
cout<<"******1:
终点站查询2:
航班号查询3:
退出******\n";cout<<"*****************************************************************************\n";
cin>>n;
switch(n)
{
case1:
cout<<"输入终点站名:
";
cin>>a;
while(s!
=NULL)
{
if(strcmp(s->zhongdianzhai,a)==0)
{
cout<<"到达该终点站航班信息:
\n";
cout<<"航班号:
"<hangbanhao<<"";
cout<<"飞机号:
"<feijihao<<"";
cout<<"起飞时间:
"<feixingriqi<<"";
cout<<"终点站:
"<zhongdianzhai<<"";
cout<<"余票量:
"<yupiao<i++;
}
s=s->next;
}
if(i==1)
{
cout<<"到达该终点站的航班不存在,请重新输入\n";
return0;
}
break;
case2:
cout<<"输入航班号:
";
cin>>a;
while(s!
=NULL)
{
if(strcmp(s->hangbanhao,a)==0)
{
cout<<"该航班号信息:
\n";
cout<<"航班号:
"<hangbanhao<<"";
cout<<"飞机号:
"<feijihao<<"";
cout<<"起飞时间:
"<feixingriqi<<"";
cout<<"终点站:
"<zhongdianzhai<<"";
cout<<"余票量:
"<yupiao<i++;
}
s=s->next;
}
if(i==1)
{
cout<<"该航班不存在,请重新输入\n";
return0;
}
case3:
break;
default:
cout<<"错误,请重新输入\n";
}
}
while(n!
=3);
return0;
}
intReserve(Hangxian&first)//订票
{
Hangxian*s;
s=first.next;
chara[10];
inti=1;
intnum;
cout<<"输入终点站名:
\n";
cin>>a;
while(s!
=NULL)
{
if((strcmp(s->zhongdianzhai,a)==0))
{
cout<<"航班号:
";
cout<hangbanhao<<"";
cout<<"飞机号:
";
cout<feijihao<<"";
cout<<"起飞时间:
";
cout<feixingriqi<<"";
cout<<"余票量:
";
cout<yupiao<i++;
}
s=s->next;
}
if(i==1)
{
cout<<"您选择的航班不存在,请重新操作\n";
return0;
}
cout<<"输入需订票航班号:
";
cin>>a;
cout<<"输入需订票数:
";
cin>>num;
s=first.next;
while(s!
=NULL)
if(strcmp(s->hangbanhao,a)==0)
break;
if(s->yupiao>=num)
{
Yidingkehu*p=(Yidingkehu*)malloc(sizeof(Yidingkehu));
Yidingkehu*q;
q=s->yiding;
cout<<"输入乘客姓名:
";
cin>>p->name;
p->next1=NULL;
p->dingpiaoshu=num;
if(q==NULL)
s->yiding=p;
while(q!
=NULL)
{
if(strcmp(q->name,p->name)==0)
{
cout<<"该姓名乘客已存在,请重新操作\n";
return0;
}
q=q->next1;
}
q=p;
s->yupiao-=num;
q->dingpiaoshu=num;
cout<<"订票成功!
\n";
return0;
}
else
{
charn;
cout<<"抱歉,余票不够!
若想排队候补请输入'e',否则按任意键退出";
cin>>n;
if(n=='e')
{
Weidingkehu*p=(Weidingkehu*)malloc(sizeof(Weidingkehu));
Weidingkehu*q;
q=s->yudingqueue;
cout<<"输入预订乘客姓名:
";
cin>>p->name;
p->next2=NULL;
p->yudingpiao=num;
if(q==NULL)
s->yudingqueue=p;
while(q!
=NULL)
{if(strcmp(q->name,p->name)==0)
{
cout<<"该乘客预定已存在,请重新操作\n";
return0;
}
q=q->next2;
}
q=p;
q->yudingpiao=num;
cout<<"预定票成功!
\n";
return0;
}
}
}
intYDRefund(Hangxian&first)//退已订的票
{
Hangxian*s;
Yidingkehu*p=(Yidingkehu*)malloc(sizeof(Yidingkehu));
charname[10],hangbanhao[10];
cout<<"输入航班号:
\n";
cin>>hangbanhao;
cout<<"输入姓名:
\n";
cin>>name;
s=first.next;
while(s!
=NULL)
{
if(strcmp(s->hangbanhao,hangbanhao)==0)
break;
s=s->next;
}
if(s==NULL)
{
cout<<"该航班不存在,请重新操作\n";
return0;
}
else
{
p=s->yiding;
if(p==NULL)
{
cout<<"该航班没有已定客户,请重新操作\n";
return0;
}
if(p->next1==NULL)
{
if(strcmp(p->name,name)==0)
{
s->yupiao+=s->yiding->dingpiaoshu;
free(s->yiding);
s->yiding=NULL;
cout<<"退票成功\n";
}
else
{
cout<<"该航班乘客中没有该姓名乘客,请重新操作\n";
return0;
}
}
else
{
while(p->next1!
=NULL)
{
if(strcmp(p->next1->name,name)==0)
break;
p=p->next1;
}
p=p->next1;
if(p!
=NULL)
{
s->yupiao+=p->dingpiaoshu;
free(p);
p=p->next1;
cout<<"退票成功\n";
}
else
{
cout<<"该航班乘客中没有该姓名乘客,请重新操作\n";
return0;
}
}
}
if(s->yudingqueue!
=NULL)//查询该航班是否有人排队候补,若有人排队,则为排在第一位的客户办理订票手续
{
yudingq;
q.front=q.rear=(Weidingkehu*)malloc(sizeof(Weidingkehu));
q.front=s->yudingqueue;
Yidingkehu*m;
while(s->yupiao>=q.front->yudingpiao)//查询余票量是否满足客户订票数量
{
if(s->yiding==NULL)
{
Yidingkehu*n=(Yidingkehu*)malloc(sizeof(Yidingkehu));
n->dingpiaoshu=q.front->yudingpiao;
strcpy(n->name,q.front->name);
n->next1=NULL;
s->yiding=n;
s->yupiao-=n->dingpiaoshu;
cout<<"该乘客"<name<<"预定的机票已到,"<dingpiaoshu<<"张,请注意验收\n";
}
else
{
m=s->yiding;
while(m->next1!
=NULL)
m=m->next1;
Yidingkehu*n=(Yidingkehu*)malloc(sizeof(Yidingkehu));
n->dingpiaoshu=q.front->yudingpiao;
strcpy(n->name,q.front->name);
n->next1=NULL;
m->next1=n;
s->yupiao-=n->dingpiaoshu;
cout<<"该乘客"<name<<"预定的机票已到,"<dingpiaoshu<<"张,请注意验收\n";
}
q.front=q.front->next2;
s->yudingqueue=q.front;
if(q.front==NULL)
break;
}
}
return0;
}
intWDRefund(Hangxian&first)//退预订票
{
Hangxian*s;
Weidingkehu*p=(Weidingkehu*)malloc(sizeof(Weidingkehu));
charname[10],hangbanhao[10];
cout<<"输入航班号:
";
cin>>hangbanhao;
cout<<"输入姓名:
";
cin>>name;
s=first.next;
while(s!
=NULL)
{
if(strcmp(s->hangbanhao,hangbanhao)==0)
break;
s=s->next;
}
if(s==NULL)
{
cout<<"该航班不存在,请重新操作\n";
return0;
}
else
{
p=s->yudingqueue;
if(p==NULL)
{
cout<<"该航班没有预定客户,请重新操作\n";
return0;
}
if(p->next2==NULL)
{
if(strcmp(p->name,name)==0)
{
free(s->yudingqueue);
s->yudingqueue=NULL;
cout<<"退预订票成功!
\n";
return0;
}
else
{
cout<<"预定乘客中没有该姓名乘客,请重新操作\n";
return0;
}
}
else
{
while(p->next2!
=NULL)
{
if(strcmp(p->next2->name,name)==0)
break;
p=p->next2;
}
if(p->next2==NULL)
{
cout<<"该航班不存在,请重新操作\n";
return0;
}
else
{
free(p->next2);
p->next2=p->next2->next2;
}
}
}
return0;
}
intRefund(Hangxian&first)//退票界面
{
intn;
do
{
cout<<"*****************************************************************************\n";
cout<<"**********1:
退订票2:
退预定票3.退出**********\n";
cout<<"*****************************************************************************\n";
cin>>n;
switch(n)
{
case1:
YDRefund(first);
break;
case2:
WDRefund(first);
break;
case3:
break;