淮阴工学院算法设计技能训练报告姓名: 学号:班级: NIIT1151学院: 计算机与软件工程学院专业: 计算机科学与技术题目:航空订票系统指导教师:2016 年12 月目录1 课题任务描述 (1)1.1查询航线: (1)1.2承办订票业务: (1)1.3承办退票业务: (1)1.4实现提示: (1)2 系统设计 (1)2.1主界面模块 (1)2.2算法设计 (2)3.详细设计 (3)3.1.录入航班 (3)3.2.主界面选择 (3)3.3查询 (3)3.4.订票 (4)3.5.退票 (4)3.6关键代码 (4)4 测试 (15)结论 (17)致谢 (18)参考文献 (19)1 课题任务描述每条航线所涉及的信息有:终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需数量)。
1.1查询航线:根据客户提出的终点站名输出如下信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;1.2承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票少余订票额,则需重新询问客户要求。
若需要,可登记排队候补;1.3承办退票业务:根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。
1.4实现提示:两个客户名单可分别由线性表和队列实现。
为查找方便,已订票客户的线性表应按客户姓名有序,并且,为了插入和删除方便,应以链表作为存储结构。
由于预约人数无法预计,队列也应以链表作为存储结构。
2 系统设计2.1主界面模块表12.2算法设计本程序定义了三个类,分别为乘客类,候补乘客类,航班类,并定义了若干函数(如:输出所有航班函数,输出所有乘客函数,增加航班函数等),用主函数将他们联系起来,实现了预订航班查询航班的快捷操作。
使用前需要首先由工作人员进行录入航班,然后再使用。
使用中通过用户的选择不同,程序执行不同的操作。
对于此程序的时间空间复杂度,主要是对于调用各种输入输出函数的复杂度分析:时间复杂度:O(n);空间复杂度:O(n)。
刚开始编写时,只定义了两个类,乘客类和航班类,在做候补名单时不方便操作,而且不能单图处理候补乘客,因为其意义和普通乘客不一样,所以也不能将各种信息录入到乘客类中。
解决方法:重新定义一个类,单独用来保存候补乘客信息由于本程序的时间要求只是用星期表示,所以只有1到7的选择,刚开始没有考虑到这个问题,所以输入时可以输入比7大的数,这样就不符合要求,使录入信息无意义。
解决方法:使用判定语句,如果大于7,则叫用户重新输入当每个单独的功能实现后,应该返回哪一步,刚开始编写程序时,是使全部返回主界面,这使得很多操作过于繁琐,比如当用户查找了所有航班,想单独查看某一航班时间,必须首先退回主界面重新选择。
解决方法:通过把功能的图画出来,搞清哪些程序功能相互关联,在该程序和做一个选择语句,让用于自己决定是否返回。
在飞机票订票功能是如何进入候补选择;在退票功能结束如何调用候补名单。
由于刚开始编写时在订票失败后直接要求用户返回或者重新选择航班,没有提供候补的选项。
同样在退票完成时只是返回主界面。
解决方法:订票失败后,让用户选择是否成为候补,也可以选择放弃返回,否则进行录入候补名单操作;退票成功,先查找是否有在候补该航班的乘客,如果用输出他的信息,没有则返回3.详细设计3.1.录入航班3.2.主界面选择3.3查询3.4.订票3.5.退票3.6关键代码1定义乘客类.class CkNode{public:int Add;char Name[50];int Fly;CkNode(const int Add=0,char N[50]="",const int F=0); };2,定义航班类class FlightNode{public:char Over[50];int Fnum;int Pnum;int Day;int Max;int Left;FlightNode(char O[50]="",const int F=0,const int P=0,const int D=0,const int M=0,const int L=0);};3,定义候补乘客类class WaitNode{public:char Name[50];int Fly;WaitNode(const int Fly=0,char Name[50]="");};4,增加,录入航班函数void addFlight(FlightNode *F){cout<<"现在开始增加航班\n"<<endl;cout<<"++++++++++++++++++++++++++++++++++++++++++++++"<<endl;int i=0,n=0;top9: cout<<"请输入航班的信息:\n"<<endl;cout<<"+_+++++++++++++++++++++++++++++++++++++++++++++++"<<endl;top8: do{cout<<"请输入航班的终点站名:";cin>>F[n].Over;cout<<"请输入新航班的航班号:";cin>>F[n].Fnum;for(int j=0;j<n;j++)if(F[n].Fnum==F[j].Fnum){cout<<"航班号已存在,请重新输入。
/n----------------------------------------";goto top8;}}while(i);cout<<"请输入新航班的飞机号(飞机编码):";cin>>F[n].Pnum;cout<<"请输入新航班的飞行日(星期几):";top15: cin>>F[n].Day;if(F[n].Day>7){cout<<"该系统只针对一周内航班\n"<<endl;cout<<"请重新输入\n"<<endl;goto top15;}top11: cout<<"请输入新航班的成员定额:";cin>>F[n].Max;cout<<"请输入如新航班的余票量:";cin>>F[n].Left;if(F[n].Max<F[n].Left){cout<<"输入错误\n"<<endl;cout<<"输入的定额比余票数大,你他妈逗我?\n"<<endl;goto top11;}cout<<"录入成功";n++;cout<<"是否继续录入(y/n)";char ch;top10: cin>>ch;if(ch=='y'){goto top9;}else if(ch=='n')return;else{cout<<"输入错误!请重新选择:";goto top10;}}5,输出全部乘客函数void ShowAllCkNode(CkNode *C){cout<<"---------------------------------------------"<<endl;cout<<"姓名"<<"\t"<<"飞机号"<<"\t"<<"座位号"<<endl;int n=50;for(int i=0;i<n;i++){if(!C[i].Fly)break;else{cout<<C[i].Name<<"\t"<<C[i].Fly<<"\t"<<C[i].Add<<endl;}}cout<<"---------------------------------------------"<<endl;cout<<"你可以进行以下操作:1.查看单位乘客;"<<"2.返回上一级.\n"<<"请选择:";int chioce;top7: cin>>chioce;if(chioce==1){ShowOneCkNode(C);}else if(chioce==3){return;}else{cout<<"输入错误!请重新选择:";goto top7;}}6,输出全部航班函数void ShowAllFlight(FlightNode *F){cout<<"---------------------------------------------"<<endl;cout<<"航班号"<<"\t"<<"终点站"<<"\t"<<"飞行日"<<endl;int n=50;for(int i=0;i<n;i++){if(!F[i].Fnum)break;else{cout<<F[i].Fnum <<"\t"<<F[i].Over <<"\t"<<F[i].Day <<endl;}}cout<<"---------------------------------------------"<<endl;cout<<"你可以进行以下操作:1.查看单条航线;"<<"2.录入新的航班信息"<<"3.返回上一级.\n"<<"请选择:";int chioce;top2: cin>>chioce;if(chioce==1){ShowOneFlight(F);}else if(chioce==2)addFlight(F);else if(chioce==3){return;}else{cout<<"输入错误!请重新选择:";goto top2;}}7,输出单个乘客函数void ShowOneCkNode(CkNode *C){char Q[20];int n=50;int choice;cout<<"请输入查询乘客名字:\n";cin>>Q;CkNode temp[50];int m=0;for(int i=0;i<=n;i++){if(strcmp(Q,C[i].Name)==0)temp[m]=C[i];m++;}if(m==0)cout<<"没有您的订票信息"<<endl;else{ CkNode temp1=temp[0];cout<<"姓名"<<temp[0].Name<<"飞机号"<<temp[0].Fly<<"座位号"<<temp[0].Add<<endl;}cout<<"请选择所要的操作:1.继续查询2.返回上一级\n";top12: cin>>choice;if(choice==1){ShowOneCkNode(C);}else if(choice==2){return;}else{cout<<"输入错误!请重新选择:";goto top12;}}8,输出单个航班函数void ShowOneFlight(FlightNode *F){char T[20];int n=50;int choice;cout<<"请输入终点站名称:\n";cin>>T;FlightNode temp[50];int m=0;for(int i=0;i<=n;i++){if(strcmp(T,F[i].Over)==0){temp[m]=F[i];m++;}}if(m==0)cout<<"无此终点站"<<endl;else{FlightNode temp1=temp[0];cout<<"航班号:"<<temp[0].Fnum<<ends<<"飞机号:"<<temp[0].Pnum<<ends<<"飞行日:"<<temp[0].Day<<ends<<"余票额:"<<temp[0].Left<<endl;for(int j=1;j<m;j++){if(temp[j].Day!=0){cout<<"航班号:"<<temp[j].Fnum<<ends<<"飞机号:"<<temp[j].Pnum<<ends<<"飞行日:"<<temp[j].Day<<ends<<"余票额:"<<temp[j].Left<<endl;if(temp[j-1].Day>temp[j].Day)temp1=temp[j];}}cout<<"最近一天的航班:\n"<<"航班号:"<<temp1.Fnum<<ends<<"飞机号:"<<temp1.Pnum<<ends<<"飞行日:"<<temp1.Day<<ends<<"余票额:"<<temp1.Left<<endl;}cout<<"请选择所要的操作:1.继续查询2.返回上一级\n";top3: cin>>choice;if(choice==1){ShowOneFlight(F);}else if(choice==2){return;}else{cout<<"输入错误!请重新选择:";goto top3;}}9,订票函数void BookTicket(FlightNode *F,CkNode *C){char O[20];char Na[20];int choice;int temp;cout<<"请输入您想到达的目的地:\n";top6: cin>>O;for(int i=0;i<=50;i++){if(strcmp(O,F[i].Over)==0){cout<<"最近一周有到达该地的航班\n"<<endl;cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;temp=i;cout<<"航班号:"<<F[i].Fnum<<ends<<"飞机号:"<<F[i].Pnum<<ends<<"飞行日:"<<F[i].Day<<ends<<"余票额:"<<F[i].Left<<endl;goto top14;}if(i>=50){cout<<"对不起,最近一星期没有到该地航班"<<endl;cout<<"+++++++++++++++++++++++++++++++++++++++++++++"<<endl;goto top6;}}top14:cout<<"实名制购票,请输入您的名字,一人限购一张:\n";cin>>Na;if(F[temp].Left>=1){char choice1;cout<<"尚有余票,您现在预订的是"<<"飞行日(星期几):"<<F[temp].Day<<ends<<"飞机号:"<<F[temp].Pnum<<ends<<"的机票,确定订票?(N/Y)"<<endl;cin>>choice1;switch(choice1){case 'Y':case 'y':F[temp].Left=F[temp].Left-1;for(int i=0;i<=50;i++){if(C[i].Fly==0){C[i].Fly=F[temp].Pnum;C[i].Add=F[temp].Left;cout<<"请再次输入你的名字确认"<<endl;cin>>C[i].Name;cout<<"订票成功!\n";break;}if(i>=50){cout<<"订票人数达到上限,请稍后再试!"<<endl;}}cout<<"您预订的"<<"飞机号:"<<F[temp].Pnum<<ends<<"飞往:"<<F[temp].Over<<ends<<"将于"<<"飞行日(星期几):"<<F[temp].Day<<ends<<"起飞,希望您旅途愉快!"<<endl;break;default:return ;}}if(F[temp].Left<=1){cout<<"抱歉您想要定的航班已满,对此我们深表歉意,订票失败"<<endl;}cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"<<e ndl;cout<<"您可以:1.继续订票 3.返回上一级\n"<<endl;top4: cin>>choice;if(choice==1){BookTicket(F,C);}else if(choice==3){return;}else{cout<<"输入错误!请重新选择:";goto top4;}}10,退票函数void ReturnTicket(FlightNode *F,CkNode *C){char Na[20];int temp;int choice;int n=50;int y;cout<<"请输入你的名字:";top13: cin>>Na;for(int i=0;i<n;i++){if(strcmp(Na,C[i].Name)==0){ temp=i;cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;cout<<"尊敬的"<<C[i].Name<<ends<<"已查到您的订票信息,您的飞机号是"<<C[i].Fly<<ends<<"座位号是"<<C[i].Add<<endl;break;}else{cout<<"没有查询到您的订票信息,请核对后继续!"<<endl;cout<<"++++++++++++++++++++++++++++++++++++++++++++++"<<endl;goto top13;}}cout<<"尊敬的"<<C[temp].Name<<"是否确认退票?"<<endl;cout<<"1,确认 2,取消";cin>>y;if(y==1){*C[temp].Name=NULL;C[temp].Add=0;C[temp].Fly=0;F[temp].Left=F[temp].Left+1;cout<<"退票成功"<<endl;}else{cout<<"取消退票"<<endl;goto top13;}cout<<"请选择下一步操作:1.继续退票 2.订票 3.返回上级菜单\n"; top5: cin>>choice;if(choice==1){ReturnTicket(F,C);}else if(choice==2){BookTicket(F,C);}else if(choice==3){return;}else{cout<<"输入错误!请重新选择:";goto top5;}}11,输出所有候补乘客函数void ShowAllWaitNode(WaitNode *W){cout<<"---------------------------------------------"<<endl;cout<<"姓名"<<"\t"<<"候补飞机号"<<"\t"<<endl;int n=50;for(int i=0;i<n;i++){if(!W[i].Fly)break;else{cout<<W[i].Name<<"\t"<<W[i].Fly<<"\t"<<endl;}}cout<<"---------------------------------------------"<<endl;cout<<"你可以进行以下操作:"<<"1.返回上一级.\n"<<"请选择:";int chioce;top17: cin>>chioce;if(chioce==1){return;}else{cout<<"输入错误!请重新选择:";goto top17;}}12,主函数,调用各种函数void main(){FlightNode F[50];CkNode C[50];int n=0;int choice;cout<<"欢迎使用订票系统\n"<<endl;cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<end l;cout<<"请工作人员录入本周航班\n"<<endl;addFlight(F);while(1){cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;cout<<" *** 欢迎使用航空客运订票系统!!*** "<<endl;cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;cout<<"你可以进行以下的操作:\n"<<"1==>查询已有航线\n"<<"2==>录入新的航线信息\n"<<"3==>查询单条航线\n"<<"4==>查询乘客信息\n"<<"5==>查询我的订票信息\n"<<"6==>订票\n"<<"7==>退票\n"<<"8==>退出.\n"<<"----------------------------------------"<<endl;cout<<"请选择:";top: cin>>choice;switch(choice){case 1 : ShowAllFlight(F);break;case 2 : addFlight(F);break;case 3 : ShowOneFlight(F);break;case 4 : ShowAllCkNode(C);break;case 5: ShowOneCkNode(C);break;case 6: BookTicket(F,C) ;break;case 7: ReturnTicket(F,C) ;break;case 8 : cout<<"退出系统!多谢使用!\n";return;default : cout<<"输入错误,请重新输入:\n";goto top;}}}4 测试首先进入程序界面,由工作人员进行录入航班:可以录入航班情况;航班录入完毕后进入使用界面,根据界面提示可以有不同的选择,分别为:1,查询航线:分为全部查询和单此查询,全部查询可以输出所有航班的信息;单个查询由用户输入终点,查询符合情况的航班2,承办订票业务:根据客户提出的要求查询该航班票额情况,若尚有余票,则为客户办理订票手续;若已满员或者余票数少于订票额,则需重新寻味客户要求,若需要,可登记排队候补;3,承办退票业务:根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队等候补,首先询问排在第一的客户,若所有退票额能满足他的要求,则为他办理订票手续否则依次询问其他排队候补的客户。