数据结构航空客运订票系统.doc
《数据结构航空客运订票系统.doc》由会员分享,可在线阅读,更多相关《数据结构航空客运订票系统.doc(26页珍藏版)》请在冰点文库上搜索。
《数据结构》
课程设计报告书
题目:
航空客运订票系统
专业:
班级:
学号:
姓名:
完成时间:
一、需求分析
1.1问题描述
设计一个航空客运订票系统,为乘客提供各种航空客运信息服务。
1.2基本要求
每条航线所涉及的信息有:
终点站名、航班号、飞机号、星期几飞行、乘员定额、余票量、订票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需数量)。
已订票客户和预订票客户名单可分别由线性表linklist和队列linkqueue来实现。
为了插入和删除方便,两者皆采用链表作为存储结构。
系统需实现的操作和功能如下。
(1)查询航线:
根据客户提出的终点站名输出如下信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票量。
(2)承办订票业务:
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票少于订票额,则需重新询问客户要求。
若需要,可登记排队候补。
(3)承办退票业务:
根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若退票能满足他人要求,则为他办理订票手续,否则依次询问其他排队候补的客户。
二、概要设计
1.1链表的抽象数据类型定义
ADTList
Data:
D={ai|ai∈ElemtSet,i=1,2,…,n,n≥0}
Relation:
R={|ai-1,ai∈D,i=2,…,n}
Operation:
airline*find_fin()//根据客户提出的终点站名输出航线信息
airline*find_air()//根据客户提出的航班号查询航班信息
airline*find_plane()//根据客户提出的飞机号查询航班信息
airline*find_date()//根据客户提出的飞行日期查询航班信息
voidsearch()//根据客户提出的要求输出航线信息
voidlist()//全部航线的信息
voidbooklist()//订票客户名单
linklist*addlink(linklist*,int,char,int)//增加订票的客户信息
voidsort_ticket()//按剩余票数排序
endADT
1.2队列的抽象数据类型定义
ADTQueue
Data:
D={ai|ai∈ElemtSet,i=1,2,…,n,n≥0}
Relation:
R={|ai-1,ai∈D,i=2,…,n}
Operation:
linkqueueplusqueue(linkqueue,char,int)//增加排队等候的客户名单
endADT
2、本程序包含三个模块
(1)主程序模块:
voidmain()
{初始化;
Do{
输入指令;
处理指令;
}while(指令!
=”退出”);
}
(2)已买票的乘客的链表模块——实行对买票乘客信息的管理
(3)排队买票乘客的队列模快——实行对排队买票乘客信息的管理
3、各模块之间的调用关系
Insertline()
more()
main()
guide()
list()
search()
booklist()
return_ticket()
order()
wait()
addlinkr()+plusqueue()
find_air()
find_fin()
find_date()
find_plane()
三、详细设计
1、为简化问题,本系统假设只有五条航线
#defineMAX5//定义航线量的最大值
2、客户的存储信息:
结点中保存的信息包括姓名,订票量,舱位等级
typedefstructbook
{charname[10];//客户姓名
intamount;//订票量
intlevel;//舱位等级
book*next;
}linklist;
3、航班的存储信息:
结点中保存的信息包括终点站名,航班号,飞机号,飞行日期,乘员定额,余票量。
structairline
{charfin_name[10];//终点站名
charair_name[10];//航班号
charplane_name[10];//飞机号
chardate[10];//飞行日期
intticket_amount;//乘员定额
intticket_left;//余票量
linklist*book;
linkqueuewait;
}linkinfo;
为了方便调用乘员的信息和排队等候的客户信息,设置指针分别指向乘员名单和等候替补的客户名单。
4、根据客户提出的要求查询航班信息
structairline*find_fin()//根据客户提出的终点站名输出航线信息
{structairline*info;
charname[10];
inti=0;
info=start;
cout<<"请输入终点站名:
";
cin>>name;
while(i<=MAX)
{if(strcmp(name,info->fin_name)){info++;i++;}
elsebreak;
}
if(i>MAX)
cout<<"对不起,该航线未找到!
\n";
else
{cout<<"终点站名"<<"\t"<<"航班号"<<"\t"<<"飞机号"<<"\t"<<"飞行日期"<<"\t"<<"乘员定额"<<"\t"<<"余票量\n";
show(info);}
return0;
}
按照输入的终点站名从第一条航线开始依次比较对应的链表结点存储的信息(info->fin_name),若有相同的则输出该条航线的信息,若没有则返回。
structairline*find_air()//根据客户提出的航班号查询航班信息
{structairline*info;
charnumber[10];
inti=0;
info=start;
cout<<"请输入航班号:
";
cin>>number;
while(i<=MAX)
{if(strcmp(number,info->air_name)){info++;i++;}
else{returninfo;}
}
cout<<"对不起,该航线未找到\n";
return0;
}
structairline*find_plane()//根据客户提出的飞机号查询航班信息
{structairline*info;
chara[10];
inti=0;
info=start;
cout<<"请输入飞机号:
";
cin.getline(a,10);
while(i<=MAX)
{if(strcmp(a,info->plane_name)){info++;i++;}
elsereturninfo;
}
cout<<"对不起,该航线未找到\n";
return0;
}
structairline*find_date()//根据客户提出的飞行日期查询航班信息
{structairline*info;
chara[10];
inti;
info=start;
cout<<"请输入飞行日期:
";
cin.getline(a,10);
{if(strcmp(a,info->date)){info++;i++;}
elsereturninfo;
}
cout<<"对不起,该航线未找到\n";
return0;
}
5、办理订票业务
voidorder()//办理订票业务
{structairline*info;
charname[10];
intamount,level;
info=start;
intflag=0;
inti;
cout<<"请输入查询航班的方式:
\n";
选择航线查找方式查找航线;
cout<<"请输入你订票所需要的数量:
";
cin>>amount;
if(票数满足)将客户信息添加到已定票客户名单;
else若满员或余票额少于订票额,询问客户是否需要进行排队等候
}
根据客户提出的要求先找到航班(search()),再根据客户的订票量与结点中所存储的信息(info->ticket_amount)比较,符合要求,则进行订票,询问客户的姓名,舱位等级,在订票乘员名单域(addlink())中添加客户信息,得到该客户的座位号后,该航线余票量(info->ticket_left)应为之前的余票量减去该客户的订票量。
6、办理退票业务
voidreturn_ticket()//退票
{structairline*info;
node*t,*back,*m,*n;
intlevel;
linklist*p1,*p2,*head;
charname[10];
intflag=0;
inti;
cout<<"请输入查询航班的方式:
\n";
选择航线查找方式查找航线;
head=info->book;
p1=head;
cout<<"请输入你的姓名(退票客户):
";
cin>>name;
while(p1)
{if(!
strcmp(name,p1->name))break;
p2=p1;p1=p1->next;
}
if(没找到该客户的信息L)
{cout<<"对不起,你没有订过票!
\n";return;}//未找到该订票客户,退出
else//若信息查询成功
{删除订票客户名单该订票客户的信息}
info->book=head;//将航线名单域指向订票单链表的头指针
m=(info->wait).front;//*m指向排队等候名单队列的头结点
n=(info->wait).rear;//*n指向排队等候名单队列的尾结点
t=m;//*t为当前满点条件的排队候补名单域
while(t)
{if(满足条件者为头结点)
{为在头结点存储的信息对应的客户订票}
back=t;t=t->next;
if(满足条件者不为头结点)
{为满足条件的客户订票}
if(排队等候的客户名单里没有信息)break;
}
}
根据客户提出的要求先找到航班(search()),再根据客户的姓名与结点中所存储的信息(info->name)比较,符合要求,则进行退票,在订票乘员名单域(addlink())中删除客户信息,该航线余票量(info->ticket_left)应为之前的余票量加上该客户的订票量。
再在排队等候的客户名单队列(queue())里寻找符合要求的客户(info->ticket_left=info->wait.front->amount),进行订票。
四、运行与测试
1、运行程序,显示菜单,见图1
2、选择“1”浏览航线信息,见图2
3、选择“2”浏览已订票客户信息,见图3
4、选择“3”查询航线,见图4
5、选择“4”办理订票业务,见图5
6、选择“5”办理退票业务,见图6
7、选择“6”查看剩余票数并排序。
见图7
8、选择“0”退出程序。
五、总结与体会
课程设计是教学中的一个重要环节,对于我们学生来说是一次不可多得的锻炼机会。
通过这次的课程设计,我们不仅可以系统地复习、巩固课程的知识,而且还可以学到如何把书本上的知识运用于解决实际问题中来。
通过这学期的学习,我认为要学好数据结构这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践才能增强和巩固自我的知识。
通过上机实验,我们能对数据结构更加深入了解,并且能够发现平时在书面作业中比较容易令人忽略的细节问题。
要做出一个具体问题的解法,需要的不仅仅是老师灌输给我们的知识,在探索的过程中,我们会自觉地去寻找、关注相关方面的消息和知识。
所以说,这也是我们自身不断积累知识的过程。
在这次的数据结构课程设计过程中,我发现之前学过的C++知识是学习数据结构的基础,之前的C++学习有些薄弱,对这门课程有了一定的影响,还是要在假期的时候再巩固一下。
未来的两年多,还有很多的专业课要学习,知识本来就是相通的,特别是计算机编程中的各种语言,我应该要好好这些学过的知识真正变成自己的知识,才能为以后的学习打好基础。
六、附源程序
#include
#include
#include
#include
#include
#defineMAX5//定义航线量的最大值
usingnamespacestd;
typedefstructbook
{charname[10];//客户姓名
intamount;//订票量
intlevel;//舱位等级
book*next;
}linklist;
typedefstructwait
{charname[10];//姓名
intamount;//所需票数
wait*next;
}node,*ptr;
typedefstructqueue
{ptrfront;//等候替补的客户名单的队头指针
ptrrear;//等候替补的客户名单的队尾指针
}linkqueue;
structairline
{charfin_name[10];//终点站名
charair_name[10];//航班号
charplane_name[10];//飞机号
chardate[10];//飞行日期
intticket_amount;//乘员定额
intticket_left;//余票量
linklist*book;//乘员名单,指向乘员名单链表的头指针
linkqueuewait;//等候替补的客户名单,分别指向排队等候名单队头队尾的指针
}linkinfo;
structairline*start;
structairlineair[MAX]=
{{"Paris","1","P001","SAT",2,3},{"Toronto","2","T002","SUN",1,2},{"NewYork","3","N003","MON",3,5},
{"HongKong","4","H004","WED",1,2},{"Cairo","5","C005","TUE",3,4}
};;
voidshow(structairline*info)//每条航线的基本信息
{cout<fin_name<<"\t"<air_name<<"\t"<plane_name<<"\t"<date<<"\t"<ticket_amount<<"\t"<ticket_left<<"\n";}
structairline*find_fin()//根据客户提出的终点站名输出航线信息
{structairline*info;
charname[10];
inti=0;
info=start;
cout<<"请输入终点站名:
";
cin>>name;
while(i<=MAX)
{if(strcmp(name,info->fin_name)){info++;i++;}
elsebreak;
}
if(i>MAX)
cout<<"对不起,该航线未找到!
\n";
else
{cout<<"终点站名"<<"\t"<<"航班号"<<"\t"<<"飞机号"<<"\t"<<"飞行日期"<<"\t"<<"乘员定额"<<"\t"<<"余票量\n";
show(info);}
return0;
}
structairline*find_air()//根据客户提出的航班号查询航班信息
{structairline*info;
charnumber[10];
inti=0;
info=start;
cout<<"请输入航班号:
";
cin>>number;
while(i<=MAX)
{if(strcmp(number,info->air_name)){info++;i++;}
else{returninfo;}
}
cout<<"对不起,该航线未找到\n";
return0;
}
structairline*find_plane()//根据客户提出的飞机号查询航班信息
{structairline*info;
chara[10];
inti=0;
info=start;
cout<<"请输入飞机号:
";
cin.getline(a,10);
while(i<=MAX)
{if(strcmp(a,info->plane_name)){info++;i++;}
elsereturninfo;
}
cout<<"对不起,该航线未找到\n";
return0;
}
structairline*find_date()//根据客户提出的飞行日期查询航班信息
{structairline*info;
chara[10];
inti;
info=start;
cout<<"请输入飞行日期:
";
cin.getline(a,10);
{if(strcmp(a,info->date)){info++;i++;}
elsereturninfo;
}
cout<<"对不起,该航线未找到\n";
return0;
}
voidsearch()//根据客户提出的要求输出航线信息
{structairline*info;
charname[10];
inti=0;
info=start;
intflag=0;
cout<<"请输入查询航班的方式:
\n";
cout<<"航班号--->1\n";
cout<<"终点站--->2\n";
cout<<"飞行日期->3\n";
for(;!
flag;)
{
cin>>i;
switch(i)
{
case1:
info=find_air();flag=1;break;
case2:
info=find_fin();flag=1;break;
case3:
info=find_date();flag=1;break;
default:
printf("操作错误,请重新输入\n");break;
}
}
cout<<"终点站名"<<"\t"<<"航班号"<<"\t"<<"飞机号"<<"\t"<<"飞行日期"<<"\t"<<"乘员定额"<<"\t"<<"余票量\n";
show(info);
cout<<"\n";
}
voidlist()//全部航线的信息
{structairline*info;
inti=0;
info=start;
cout<<"终点站名"<<"\t"<<"航班号"<<"\t"<<"飞机号"<<"\t"<<"飞行日期"<<"\t"<<"乘员定额"<<"\t"<<"余票量\n";
while(i{show(info);
info++;
i++;
}
cout<<"\n";
}
voidbooklist()//订票客户名单
{structairline*info;
linklist*p;
intflag=0;
inti;
cout<<"请输入查询航班的方式:
\n";
cout<<"航班号--->1\n";
cout<<"终点站--->2\n";
cout<<"飞行日期->3\n";
for(;!
flag;)
{
cin>>i;
switch(i)
{
case1:
info=find_air();flag=1;break;
case2:
info=find_fin();flag=1;break;
case3:
info=find_date();flag=1;break;
default:
cout<<"操作错误,请重新输入\n";break;
}
}
p=info->book;
if(p!
=NULL)
{cout<<"客户姓名"<<"\t"<<"订票数量"<<"\t"<<"舱位等级\n";
while(p)
{cout<<"\n",p->name,p->amount,p->level;
p=p->next;
}
}
else
cout<<"该航线没有客户信息!
\n";
}
linklist*addlink(linklist*head,intamount,charname[],intlevel)//增加订票的客户信息
{linklist*p1,*new1;
p1=head;
new1=(link