航空客运订票系统.docx
《航空客运订票系统.docx》由会员分享,可在线阅读,更多相关《航空客运订票系统.docx(14页珍藏版)》请在冰豆网上搜索。
航空客运订票系统
一、需求分析
航空客运订票系统,功能如下:
1、查询航线:
根据旅客提出的终点站名(例:
输入:
济南),输出下列信息:
航班号、飞机号、星期几飞行、余票数
2、承办订票业务:
根据客户提出的要求(航班号(输入字符串)、订票数额(输入整型数))查询该航班票额情况,若有余票,为客户办理订票手续,若已满员或余票额少于订票额,则询问客户是否登记排队等候。
3、承办退票业务:
根据客户提供的情况(日期(输入1-7表示星期几)、航班(字符串表示)),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的用户,若能满足他,则为其办理订票手续,否则依次询问其他候补客户。
二、概要设计
1、链表抽象数据类型
ADTList
{数据对象:
D={ai|ai∈EleSet,i=1,2,…,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=2,…,n}
基本操作:
MyList();
操作结果:
初始化一个链表
voidInsertNode(LT&);
初始条件:
链表已经存在
操作结果:
插入一个结点
boolDeleteNode(LT&);
初始条件:
链表已经存在
操作结果:
删除一个结点
}ADTList
2、队列抽象数据类型
ADTQueue
{
数据对象:
D={ai|ai∈EleSet,i=1,2,…,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=2,…,n}
约定其中a1端为对列头,an端为队列尾
基本操作:
MyQueue();
操作结果:
初始化一个队列
voidEnQueue(QT&);
初始条件:
队列已经存在
操作结果:
进对列
voidDnQueue(QT&);
初始条件:
队列已经存在
操作结果:
出对列
boolEmpty();
初始条件:
队列已经存在
操作结果:
队列是否为空
}ADTQueue
3、主程序流程图:
三、详细设计
1、链表及链队列结点类型
template
classLQNode
{
friendclassMyList;
friendclassMyQueue;
public:
LQNode();
//初始化结点
LQNode(T);
//利用参数的值初始化结点
~LQNode();
private:
Tdata;//存放结点数据
LQNode*next;//指向下一个结点
};
2、链表类型
template
classMyList
{
public:
MyList();
//初始化链表,为头指针分配存储空间,并使头接点next域指向空。
~MyList();
voidInsertNode(LT&);
//插入一个结点,取得链表头指针,生成一个新结点p,为新结点赋值,利用头插入法,
//将结点插入链表p->next=head->next;head=p;
boolDeleteNode(LT&);
//删除一个结点,利用一个临时指针p,通过while循环,p=p->next,找到要删除的结
//点,将其前一个结点的next域指向他的下一个结点。
private:
LQNode*head;//链表头指针
};
3、链队列类型
template
classMyQueue
{
public:
MyQueue();
//初始化队列,front=rear=newLQNode
~MyQueue();
voidEnQueue(QT&);
//入队列,生成一个新结点node,为结点赋值,rear->next=node,node->next=NULL;
voidDnQueue(QT&);
//出对列,对头元素出队,若对列不空front=front->next
boolEmpty();
//判断一个队列是否为空,若front->next==NULL则队列为空
private:
LQNode*front;//指向队列头的指针
LQNode*rear;//指向队列尾的指针
};
4、其他类型设计
//classAirLine
classAirLine//将航线抽象为一种抽象数据类型类
{
friendvoidInitAirLine(AirLine*line);
friendostream&operator<<(ostream&output,constAirLine&line);
public:
AirLine(void);
//初始化类成员
~AirLine(void);
stringGetEndPoint();
//取得终点站站名
intGetSeatNum(int);
//取得票数
intGetSeatRemain(int);
//取得剩余票数
voidSetSeatRemain(intnum,intwhickWeek);
//修改剩余票数
stringGetFlightNum(void);
//取得航班号
voidInsertPassenger(Passenger&temp);
//有乘客订票时,保存该乘客的信息,pList.InsertNode()
boolIsFly(intwhichWeek)const;
//查询该天有没有航班
voidInsertAwait(Passenger&temp);
//有登记候补的乘客时,保存该乘客的信息,pQueue.EnQueue()
boolDeletePassenger(Passenger&);
//从链表中删除乘客信息,pList.DeleteNode()
intIfAwaitBook(inttiNum,intwhichWeek);
//遍历队列,查看是否有符合条件的候补乘客
//Passengernode;
//while(!
pQueue.Empty())
//{
//if(有符合的)
//返回1
//}
//返回0
private:
stringendPoint;stringflightNum;stringairNum;boolweek[8];intseatNum[8];
intseatRemain[8];MyListpList;MyQueuepQueue;
};
//classPassenger
enumTicketGrade{AA,BB,CC};
classPassenger
{
public:
~Passenger(void);
Passenger(conststring&passengerName="",inttick=0,intg=1,intw=1);
//初始化
booloperator==(Passenger&d);
//重载的==运算符
intGetTickets();
//取得订票额
intGetWeek();
//取得日期
private:
stringname;inttickets;TicketGradegrade;intflightWeek;
};
4、主程序和其他伪码算法
//main
intmain()
{
while(用户不推出程序)
{
switch(用户选择要做的操作)
{
case1:
查询航线信息
case2:
承办订票业务
case3:
承办退票业务
}
}
}
boolIsQuit()//询问用户是否退出系统
{
提示用户是否退出系统Y/y是N/n否
switch(用户输入)
{
case‘Y’:
case‘y’:
returntrue;
case‘N’:
case‘n’:
returnfalse;
}
}
voidInquireAirLine(AirLine*line)//根据用户输入信息查询相关航线
{
用户输入终点名
for(不到顺序表结束)
if(顺序表中记录的终点名==用户输入)
{
输出本航线相关信息
返回
}
cout<<"对不起,没有到达该地的航班"<}
voidBookTicket(AirLine*line)//办理订票业务
{
输入航班号
输入订票额
输入订票时间:
if(tiNum>line[i].GetSeatRemain(whichWeek))//没有足够的机票数
IfAwait(line[i],tiNum,whichWeek);//办理登记候补
else
TransactBookTicket(line[i],tiNum,whichWeek);//有足够的票数,办理订票
}
voidReturnTicket(AirLine*line)//办理退票业务
{
输入名字
输入航班号
输入订票时间
输入订票额
if(line[i].DeletePassenger(temp)==true)//调用链表的DeletePassenger(),若删除成功
{
cout<<"办理退票完毕,谢谢合作"<IfBookTicket(line,fiNum,tiNum,whichWeek);//查询是否有满足订票条件候补客户
}
else
cout<<"您没有订票或输入信息错误,请核实后办理"<}
voidIfAwait(AirLine&line,inttiNum,intwhichWeek)//办理登记候补
{
cout<<"空座不够,是否排队候补?
Y/y是N/n否"<是办理候补
否cout<<"谢谢合作,再见。
"<}
voidTransactBookTicket(AirLine&line,inttiNum,intwhichWeek)
{
输入姓名
输入舱位等级
line.InsertPassenger(temp);
GetSeatNum(whichWeek);//取得该航班总票数
GetSeatRemain(whichWeek);//取得剩余票数
输出座位号
SetSeatRemain(tiNum,whichWeek);//设置剩余票数
}
voidIfBookTicket(AirLine*line,stringfiNum,inttiNum,intwhichWeek)
{
for(inti=0;iif(line[i].GetFlightNum()==fiNum)
{
intti=line[i].IfAwaitBook(tiNum,whichWeek);
if(ti==0)
cout<<"没有符合条件的候补客户"<else
为登记候补的客户办理订票业务
}
return;
}
voidInitAirLine(AirLine*line)
{
初始化航线信息
}
5、函数调用关系图
}
四、调试分析
调试的过程中,对程序做了几点改进,增加了程序的容错能力,不论用户输入什么内容,程序都能安全检查,若输入的有误,则提示用户重新输入,或重新办理业务。
从本实习题的编制过程中容易看出,线性表的应用广泛,线性表可以直接作为一种数据结构使用,也可以作为栈或队列的存储结构,构成链栈或链队列使用。
五、用户手册
1、本程序运行环境为DOS操作系统,执行文件为planeTicket.exe。
2、进入演示程序后,即显示用户界面为:
3用户根据提示进行操作。
六、测试结果
根据提示,用户输入选项:
1查询航线,
2订票业务
3退票业务
4输入错误时的显示:
七、附录
源程序文件名清单
AirLine.h
AirLine.cpp
Passenger.h
Passenger.cpp
DataStructure.h
Main.cpp
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)