航空客运订票系统.docx
《航空客运订票系统.docx》由会员分享,可在线阅读,更多相关《航空客运订票系统.docx(26页珍藏版)》请在冰豆网上搜索。
航空客运订票系统
单位代码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