航空客运订票系统.docx

上传人:b****6 文档编号:6178037 上传时间:2023-01-04 格式:DOCX 页数:26 大小:180.41KB
下载 相关 举报
航空客运订票系统.docx_第1页
第1页 / 共26页
航空客运订票系统.docx_第2页
第2页 / 共26页
航空客运订票系统.docx_第3页
第3页 / 共26页
航空客运订票系统.docx_第4页
第4页 / 共26页
航空客运订票系统.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

航空客运订票系统.docx

《航空客运订票系统.docx》由会员分享,可在线阅读,更多相关《航空客运订票系统.docx(26页珍藏版)》请在冰豆网上搜索。

航空客运订票系统.docx

航空客运订票系统

单位代码6180

学  号 

密级

 

《C语言程序设计》

课程设计

 

院(系)名称

信息科学与工程

专业名称

计算机科学与技术

学生姓名

指导教师

王玉萍(计1)曾毅(计2)董鹏永(嵌)

 

2011年6月12日

一、设计目的

1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。

2、提高程序设计和调试能力。

学生通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。

4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。

二、设计内容

1、系统名称:

航空客运订票系统

航空客运订票的业务活动包括:

查询航线、客票预定和办理退票等。

要求在TC或VC环境下设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。

2、要求:

(1)每条航线所涉及的信息有:

终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票量、已经订票的客户名单(包括姓名、订票量)以及等候替补的客户名单(包括姓名、所需票量)。

(2)作为模拟系统,全部数据可以只存放在内存中。

(3)通过此系统可以实现如下功能:

①录入功能:

可以录入航班情况

②查询功能:

根据客户提供的终点站名进行查询,可以输出以下信息:

航班号、飞机号、星期几飞行和余票量等。

也可以根据航班号,查询飞机某个航线的情况。

订票功能:

根据客户提出的要求(姓名、终点站名、订票数量)查询该航班的余票量情况。

如尚有足够的余票,则为客户办理订票手续;若已满员或余票量少于订票数量,则需要重新询问客户要求,如需要,可登记排队候补。

④退票功能:

根据客户提供的情况(姓名、日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,若有人排队,则为排在第一位的客户办理订票手续。

三、程序设计步骤

1)功能分析说明图:

 

 

 

2)采用主要的数据结构类型。

1、定义航班信息

classFlight

{

public:

charDes_Name[10];//终点站名

charFlight_No[6];//航班号

charPlane_No[6];//飞机号

intWeek_Day;//飞行周日

intCustomer_Amount;//乘员定额

intFree_Amount;//剩余票数

floatPrice;//舱位等级的价格

Replace*ReplName;//该航班的候补乘客名单

Customer*CustName;//该航班的订票乘客名单

intCustNo;//该航班的已定票乘客数量

intReplNo;//该航班的候补乘客数量

Flight*Next;

};//指示下一航线结点

2、定义订票乘客信息

classCustomer

{

public:

charName[7];//姓名

intAmount;//定票数

intRank;//舱位等级

intSeat_No;//座位号

Customer*Next;

};

3、定义候补乘客信息

classReplace

{

public:

charName[7];//姓名

intAmount;//定票数

intRank;//舱位等级

intSeat_No;//座位号

Replace*Next;

};

4、航线添加函数

voidLine_Add()

{

Flight*p1;//建立临时航线结点

while

(1)

{

if(Head==NULL)

{

p1=p2=newFlight;

Head=p2;

}

else

{

p1=newFlight;

p2->Next=p1;//前一航线结点指向当前航班结点

p2=p1;

}//保留当前航班结点地址

cout<<"**************************************航线增设*********************************";

cout<<"请输入终点站名:

";

p2->CustNo=0;

p2->ReplNo=0;

cin>>p2->Des_Name;

while

(1)//数据合法性检验

{

cout<<"请输入航班号(唯一):

";

cin>>p2->Flight_No;

if(Find_Line(Head,p2->Flight_No))//存在航班号

cout<<"输入的航班号重复!

"<

else

break;

}

cout<<"请输入飞机号:

";

cin>>p2->Plane_No;

while

(1)

{

cout<<"请输入飞行周日(1-7):

";

cin>>p2->Week_Day;

if(p2->Week_Day<1||p2->Week_Day>7)

{

cout<<"数据输入错误,按任意键继续输入."<

system("pause");

}

else

break;

}

cout<<"请输入乘员定额:

";

cin>>p2->Customer_Amount;

cout<<"请输入票价:

";

cin>>p2->Price;

p2->Free_Amount=p2->Customer_Amount;//剩余票数与乘员定额相同

p2->CustName=NULL;//该航线定票乘客头指针为空

p2->ReplName=NULL;//初始候补名单为空

if(Continue()=='n')

{

p2->Next=NULL;//航线的下一结点为空

return;

}

}

}5、航线查找函数

voidLine_Find()//根据终点站来查询所有的相关航线

{

system("cls");

charLine_Name[10];

intfind=1;

cout<<"************************************航班查找**********************************"<

cout<<"请输入要查找的航线终点站名:

";

cin>>Line_Name;

Flight*p1;

p1=Head;

char*Week_Day[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};

if(Empty_Flight())//航班线为空

return;

cout<<"终点站航班号飞机号飞行周日乘员定额剩余候补票价"<

while(p1!

=NULL)

{

if(strcmp(Line_Name,p1->Des_Name)==0)

{

find=0;

cout<<""<

:

left)<Des_Name

<<""<Flight_No

<<""<Plane_No

<<""<Week_Day-1]

<<""<Customer_Amount

<<""<Free_Amount

<<""<ReplNo

<<""<Price<

}

p1=p1->Next;

}

if(find)

cout<<"********************************没有找到相关航线*****************************"<

cout<<"按任意键返回上一级菜单..."<

system("pause");

}

6、订票办理函数

voidReseMenu()

{

Line_See();

intTicket_Count,Seat_No,flag=0;

intFlight_No=0;//记录满足条件的航线的定票结点

Flight*p1;//记下满足条件的航线结点地址

Customer*p2;//临时性定票乘员结点

Replace*p3;//临时性候补乘员结点

charanswer[7];//用户输入的航班数据

chartemp;

inttag=0;//候补乘客标志位

intAmount;

intIsRepl=0;//是否执行候补操作标志位

if(Empty_Flight())//航班线为空

return;

while

(1)

{

cout<<"**********************************订票办理*************************************"<

cout<<"";

flag=0;//标志位清零以重新作出判断

Flight_No=0;

tag=0;

cout<<"请输入航班号:

";

cin>>answer;

if(Find_Line(Head,answer,p1,Flight_No))//调用航线查找,若存在则进行以下操作

{

while

(1)//数据合法性检验

{

cout<<"请输入定票数:

";

cin>>Ticket_Count;

if(Ticket_Count==0)

{

cout<<"请输入大于零的数,按任意键继续输入."<

system("pause");

}

else

break;

}

if(p1->Free_Amount>=Ticket_Count)

{

Customer_Count++;//定票乘客总数增

flag=1;//表明进入了订票实际操作

IsRepl=1;//定票量满足,无需进入候补操作

Amount=p1->Free_Amount;//记录剩余票数

if(p1->CustName==NULL)//首个定票乘客,并记录相关属性

{

Custp1[Flight_No]=p2=newCustomer;//建立该航线的首位乘客结点

p1->CustName=Custp1[Flight_No];

}

else//建立该航线的后续乘客结点

{

p2=newCustomer;

Custp1[Flight_No]->Next=p2;

Custp1[Flight_No]=p2;

}

IsEmpty=0;//定票乘员不为空

Custp1[Flight_No]->Amount=Ticket_Count;//订票数

Seat_No=p1->Customer_Amount-p1->Free_Amount+1;//算出座位号

Custp1[Flight_No]->Seat_No=Seat_No;//赋座位号

p1->Free_Amount-=Ticket_Count;//减去定票数

p1->CustNo=p1->CustNo+Ticket_Count;//单航线总乘客数

cout<<"该航线总订票数:

"<CustNo<

cout<<"请输入你的姓名:

";

cin>>Custp1[Flight_No]->Name;

cout<<"您的座位号为:

";

if(Ticket_Count>1)//为显示规整,作相应处理打印座位号

{

cout<

Seat_No=Seat_No+Ticket_Count-1;

cout<

}

elsecout<

}//满足定票数

elseif(p1->Free_Amount==0)

{

cout<<"对不起,该航线的票已经全部售完!

"<

IsRepl=0;

}

else

{

cout<<"对不起,该航线的剩余票额数少于你的订票数。

"<

IsRepl=0;

}

if(!

IsRepl)

{

cout<<"是否列入"<Des_Name<Flight_No<<"航线候补乘客名单(Y/N)?

";

cin>>temp;

if(temp=='y'||temp=='Y')//以下为候补操作

{

if(p1->ReplName==NULL)

{

Replp1[Flight_No]=p3=newReplace;//建立该航线的首位候补乘客结点

p1->ReplName=Replp1[Flight_No];

Replp1[Flight_No]->Seat_No=Seat_No+1;//第一个候补的第一个座位号

}

else

{

p3=newReplace;

Replp1[Flight_No]->Next=p3;

Replp1[Flight_No]=p3;

Replp1[Flight_No]->Seat_No=p1->Customer_Amount+p1->ReplNo+1;

}//候补乘客的第一个座位号

IsReplace=0;//候补乘客不为空

tag=1;//已选择列入候补乘客名单

cout<<"请输入你的姓名:

";

cin>>Replp1[Flight_No]->Name;

Replp1[Flight_No]->Amount=Ticket_Count;//候补乘客的订票数

Seat_No=Replp1[Flight_No]->Seat_No-1;

p1->ReplNo=p1->ReplNo+Ticket_Count;

cout<<"当前候补数:

"<ReplNo<

cout<<"虚拟座位:

"<Seat_No<<"-"<Seat_No+Ticket_Count-1<

}//进入候补名单

}//票数满足

}//航线存在

else

cout<<"对不起,没有该次航班,按任意继续操作."<

if(flag)//此处不作处理,则会地址溢出

Custp1[Flight_No]->Next=NULL;//末位定票乘客的指针置空

if(tag)

{

Replp1[Flight_No]->Next=NULL;//末位候补乘客的指针置空

cout<<"该乘客已成功列入该航线的候补名单."<

}

if(Continue()=='n')

return;

}

}

7、退票办理函数

voidLogoutMenu()

{

intFlight_No=0,flag=0;//记录满足条件的航线的定票结点

Flight*p1;//记下满足条件的航线结点地址

Customer*p2,*p4;//临时性定票乘员结点

Replace*p3;//临时性候补乘员结点

charanswer[7],name[7];//用户输入的航班数据

inttag=0,last=1;//若第二乘客满足条件,则它的首地址会发生冲突,注意此处

intSeat_No;//记录座位号

if(Empty_Flight())//航班线为空

return;

if(IsEmpty)

{

cout<<"对不起,系统中暂时无定票乘客..."<

system("pause");

return;

}

while

(1)

{

flag=0;

tag=0;

Flight_No=0;

cout<<"***********************************退票办理*******************************"<

cout<<"请输入航班号:

";

cin>>answer;

if(Find_Line(Head,answer,p1,Flight_No))//航线存在

{

p2=p1->CustName;//指向该航线的乘客名单的首地址

p4=p1->CustName;

cout<<"请输入您的姓名:

";

cin>>name;

while(p2!

=NULL)//查找有无此乘客名

{

if(strcmp(p2->Name,name)==0)

{

if(p2==p1->CustName)//若为首位乘客满足

{

prior=p1->CustName;//记录指针

Seat_No=p2->Seat_No;

flag=1;

break;

}

}

elseif(p2->Next!

=NULL)//记录满足航线的的前结点地址

{

if(strcmp(p2->Next->Name,name)==0)

{

tag=1;//特别注意此处

prior=p2;//记录满足定乘客的前一地址,以作删除操作

Seat_No=p2->Next->Seat_No;

flag=1;

break;

}

}

p2=p2->Next;//指向下一乘客结点

}

if(!

flag)

cout<<"该航线无此乘客,请查证后再操作..."<

}

else

cout<<"没有该次航班,按任意继续操作."<

if(flag)

{

if(prior==p1->CustName&&!

tag)//首结点满足条件且一个乘客,则该航线定票乘客置空

{

if(prior->Next==NULL)//如果只有一个乘客,直接赋值为空

{

p1->Free_Amount+=prior->Amount;

p1->CustNo-=prior->Amount;

p1->CustName=NULL;

}

else

{

p1->Free_Amount+=prior->Amount;

p1->CustNo-=prior->Amount;

p1->CustName=prior->Next;

}

}//指向下一乘客结点

else

{

p1->Free_Amount+=prior->Next->Amount;

p1->CustNo-=prior->Next->Amount;

if(prior->Next->Next==NULL)//若删除的是最后一个订票乘客

{

Custp1[Flight_No]=prior;//把Custp1[Flight_No]往前移

}

else

{

prior->Next=prior->Next->Next;

}

}//删除操作

Customer_Count--;

if(Customer_Count==0)

IsEmpty=1;

}

if(flag)

{

p3=p1->ReplName;

while(p3!

=NULL)

{

if(p3->Amount<=p1->Free_Amount)//候补乘客的定票数小于或等于剩余票数

{

p4=Custp1[Flight_No]->Next=newCustomer;

Custp1[Flight_No]=p4;//记录节点位置

p4->Next=NULL;

IsEmpty=0;

if(p1->CustName==NULL)

p1->CustName=p4;

strcpy_s(p4->Name,p3->Name);

p4->Rank=p3->Rank;

p4->Amount=p3->Amount;

if(flag==0)//座位号调整

{

p4->Seat_No=Seat_No;

}

else

p4->Seat_No=Seat_No;

Seat_No=p4->Seat_No+p4->Amount;//记录新乘客的下一个座位号

p1->Free_Amount-=p3->Amount;//减去相应的票数

p1->ReplNo-=p3->Amount;

p1->CustNo+=p3->Amount;

Customer_C

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1