数据结构课程设计-航空订票系统_第1页
数据结构课程设计-航空订票系统_第2页
数据结构课程设计-航空订票系统_第3页
数据结构课程设计-航空订票系统_第4页
数据结构课程设计-航空订票系统_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构课程设计报告设计题目:航空客运订票系统院系年级学生学号指导教师2015年11月26日目录一、课程设计目的3二、需求分析3三、概要设计1.设计步骤42.系统整体结构图53.功能模块及调用关系说明5四、详细设计和源代码1.实现概要设计中定义数据的存储结构62.查询航线信息功能的算法设计73.订票功能的算法设计94.退票功能的算法设计125.录入功能的算法设计146.总航线预览功能的程序源代码15五、调试分析1.各功能的具体实例分析162.实验过程中出现的问题及解决方法20六、课程设计总结20七、参考资料21一、课程设计目的(1)熟练使用C语言编写程序,解决实际问题;(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等根本方法和技能;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;航空订票系统:〔1〕熟练掌握链表存储结构及其建立过程和常用操作;〔2〕熟练掌握队列的建立过程和常用操作;学会自己调试程序的方法并掌握一定的技巧。二、需求分析问题描述:航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。设计任务:通过此系统可以实现如下功能:录入:可以录入航班情况〔数据可以存储在一个数据文件中,数据结构、具体数据自定〕查询:可以查询某个航线的情况〔如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓〕;可以输入起飞抵达城市,查询飞机航班情况;根据旅客提出的终点站名输出以下信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;订票:〔订票情况可以存在一个数据文件中,结构自己设定〕根据客户提出的要求〔日期、航班号、订票数额〕查询该航班票额情况,假设尚有余额,那么为客户办理订票手续,输出座位号;假设已满员或余票额少于订票额,那么需要重新询问客户要求。假设需要,可预约登记排队等候。如果该航班已经无票,可以提供相关可选择航班;退票:根据客户提供的情况〔日期、航班、退票数额〕,为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,假设所退票额能满足他的要求,那么为他办理订票手续,否那么依次询问其他排队预约的客户……退票成功后修改相关数据文件。客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。修改航班信息:当航班信息改变可以修改航班数据文件要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。测试数据:由学生任意指定,但报告上要求写出多批数据测试结果。实现提示:每条航线应包含的信息有:终点站名、航班号、飞机号、飞行日期〔星期几〕、乘员定额、余票额、已订票的客户名单〔包括姓名、订票额、座位号〕和预约登记的客户名单〔包括日期、姓名、所需票额〕。这最后两项显然是一个线性表和一个队列。为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预料,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一张线性表上,由于航线根本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。选做内容:当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其它航线情况。三、概要设计1.设计步骤1〕分析问题,给出数学模型,设计相应的数据结构。提示:(1)己订票的客户名单可以用线性表来实现。为查找方便,线性表应按照客户姓名有序,并且为了插入和删除的方便,应以链表作为存储结构。(2)等候替补的客户名单可以用队列来实现。由于预约人数无法预计,所以队列也应以链表作为存储结构。(3)需将输入的航班情况登录到一张线性表上(用顺序存储结构或链表存储结构)。为了查询的方便,可以将航班情况按照航班有序或按照终点站名有序建立线性表。每条航线是这张线性表的一个记录,包含上述8个域,其中已订票的客户名单域是指向己订票的客户名单链表的头指针,等候替补的客户名单域是指向队头和队尾的指针。2〕算法设计在已经选择好数据结构的前提下,为解决问题设计算法。〔1〕确定所需模块对于稍复杂的程序设计,要充分利用模块化程序设计方法,自顶向下,逐步细化,在整体思路确定的情况下,考虑所需模块数,各模块完成功能以及模块之间的数据联系和调用关系。〔2〕各子模块功能描述给出主要模块的算法描述,用流程图或伪代码表示。〔3〕模块之间的调用关系3〕源程序清单为了提高工作效率,充分利用上机调试程序的时间,要求学生在上机之前给出源程序清单。4〕用测试数据去验证算法及程序的正确性5〕算法分析经过上机调试,源程序运行正确,并且实现算法要求的功能,解决课程设计题目中给出的问题后,分析算法的时间复杂度和空间复杂度。2.系统整体结构图〔功能模块图〕主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统主菜单menu主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统主菜单menu〔〕1.总航线信息预览display()2.查询单条航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统图1.系统整体结构图3.功能模块及调用关系说明〔1〕总航线信息预览:通过调用display()预览已经建立的全部航线的相关信息〔航班号、飞机号、终点站、飞行日期、定额、余票数、排队等候人数〕,预览完返回主菜单。〔2〕查询单条航线信息:根据乘客提出的终点站名或航班号调用Search()函数来查询并输出此条航线的相关信息〔航班号、飞机号、终点站、飞行日期、定额、余票数、已订票乘客名单、排队等候乘客名单〕。并且查询完后询问乘客是否订票,是就调用订票Book()函数来为乘客进行订票,否就返回主菜单。〔3〕办理订票业务:客户先输入的终点站名、订票数、姓名信息再来调用订票Book()函数,Book()函数根据客户提供的终点站名查询到该航线信息,假设客户订票额末超过余票量,订票成功并登记信息,在订票乘员名单链表中添加乘客的信息;如果暂时余票数缺乏是,询问客户是否要排队等侯,如果是,那么在排队等候的队列中增加该乘客的订票信息。〔4〕办理退票业务:调用tuipiao()查询函数,根据客户提供的航线进行搜索根据客户提供的姓名到订票客户名单域进行查询。退票成功后,重新将航线名单域指向订票单链表的头指针。根据队列中从出的客户信息判断是否满足要求,如果满足,那么将该客户的信息插入到乘客信息链表中。〔5〕录入航班信息:调用CreatPlane〔〕函数,根据输入的航班的相关的信息〔航班号、飞机号、终点站、飞行日期、定额、余票数〕,将此航班参加到原来的航班组中。〔6〕退出系统四、详细设计和源代码1.实现概要设计中定义数据的存储结构〔1〕已订票乘客信息〔单链表〕typedefstructCust //已订票乘客信息{ charName[15]; //乘客姓名charnumber[10]; //乘客所乘飞机航班号charend[15]; //乘客终点站〔2〕排队等候的乘客信息typedefstructwaitNode //排队等候客户信息{charname[15]; //乘客姓名 intticket; //乘客的订票数 structwaitNode*next;}waitNode,*waitlink;typedefstruct{ waitlinkfront; waitlinkrear;}waitQueue;〔3〕航班信息typedefstructPlane //航班信息{ charnumber[10]; //航班号 intplanenum; //飞机号 charend[15]; //终点站 chardate[10]; //飞行日期 intdinge; //成员定额inttick; //剩余票数 intk; //排队等候的人数 Customer*first; //链接已订票客户 waitQueueQ; //链接候补客户}PlaneLink;2.查询单条航线信息功能的算法设计〔Search()函数功能实现的源代码〕intSearch(PlaneLink*p,intN){inti=0,Q; cout<<"===========================================\n";cout<<"1.按终点站名查询\n"; cout<<"2.按航班号查询\n"; cout<<"___________________________________________\n"; cout<<">>>>>>\n"; cout<<"请选择查询方式(1/2):";cin>>Q; if(Q==1) { charend[10]; cout<<"请您输入要查询的航班的终点站名:";//按站点名查询航班信息 cin>>end;while(i<N) { if(strcmp(p[i].end,end)==0)//先查看是否存在到该站点的航班 { cout<<"\n*****************您所查询的航班信息如下******************\n"; cout<<"_________________________________________________________\n"; cout<<"航班号飞机号终点站飞行日期余票数\n"; cout<<""<<p[i].number<<setw(7)<<p[i].planenum<<setw(12)<<p[i].end<<setw(10)<<p[i].date<<setw(10)<<p[i].tick<<endl; cout<<"\n=========================================================\n"; break; } i++; } } elseif(Q==2) { charnum[10];cout<<"请您输入要查询的航班的航班号:";//按站点名查询航班信息 cin>>num;while(i<N) { if(strcmp(p[i].number,num)==0)//查看是否存在该航班号的航班 { cout<<"\n*****************您所查询的航班信息如下:****************\n"; cout<<"_________________________________________________________\n"; cout<<"航班号终点飞行日期余票数\n"; cout<<""<<p[i].number<<setw(12)<<p[i].end<<setw(12)<<p[i].date<<setw(12)<<p[i].tick<<endl; cout<<"\n=========================================================\n"; break; } i++; } } display_s(p,i,N);//调用display_s()函数输出该航班的已订票乘客和排队等候乘客的名单信息 if(i<N)//如果存在该航班,询问客户是否要预定该航班的机票 { intj; cout<<"是否需要预定该航班的票(1/0):";cin>>j; if(j==1) { charname[10];intticket; cout<<"请输入订票数目、姓名:"; cin>>ticket>>name; Book(p,p[i].end,ticket,name,N); } } else{cout<<"很抱歉,没有您查询的航班信息!\n";}return0;}3.订票功能的算法设计〔Book()函数功能实现源代码〕intBook(PlaneLink*p,charend[],intticket,charname[],intN){ inti; for(i=0;i<N;i++) { if(strcmp(p[i].end,end)==0)//先找出是否存在要订票的航班 {if(p[i].tick>=ticket)//查看余票数是否>=订票客户订票数 { p[i].tick-=ticket; Customer*t=(Customer*)malloc(sizeof(Customer)); t->ticket=ticket; strcpy(t->Name,name); strcpy(t->number,p[i].number); strcpy(t->end,p[i].end); t->next=p[i].first;p[i].first=t;//此使用的是头插法将订票乘客的信息放入到链表中/ cout<<"您订票成功!\n"; cout<<"您的航班信息如下:\n"; cout<<"__________________________________________________\n"; cout<<"航班号飞机号终点站飞行日期定额\n"; cout<<"__________________________________________________\n"; cout<<""<<setw(9)<<p[i].number<<setw(6)<<p[i].planenum<<setw(12)<<p[i].end<<setw(12)<<p[i].date<<setw(10)<<p[i].dinge<<endl; cout<<"==================================================\n\n"; break; } elseif(p[i].dinge<ticket)//订票数超出航班的定额时,不能订票,也不能无法排队等候了 {cout<<"您预订的票数超过了航班定额,无法为您订票!\n";break;} else//余票数缺乏时,询问乘客是否排队等候 { charz; cout<<"该航班剩余票数为:"<<p[i].tick<<endl; cout<<"很抱歉,剩余的票数不够!\n";cout<<"您是否需要排队等候(Y(y)/N(n)):";cin>>z; if(z=='Y'||z=='y'){ Queue(p,end,ticket,name,N,i);}//调用入队列函数,将乘客信息插入排队等候的人后面 break; } } } if(i>=N){cout<<"很抱歉,没有您所需要的航班!\n";} return0;}intdisplay_s(PlaneLink*p,inti,intN)//输出已定票及排队乘客的名单信息{ if(p[i].first!=NULL)//p[i].first!=NULL说明已订票链表不为空,输出已订票乘客的名单信息 { cout<<"****该航班的已订票乘客名单如下:****\n"; cout<<"____________________________________\n"; cout<<"姓名订票量\n"; Customer*t=p[i].first; while(t) { cout<<setw(10)<<t->Name<<""<<setw(7)<<t->ticket<<endl; t=t->next; } } if(i<N&&p[i].Q.front!=NULL)//p[i].Q.front!=NULL,输出正在排队等候乘客的名单信息 { cout<<"****该航班等候订票的乘客名单如下:****\n"; cout<<"姓名订票量\n"; waitlinkS=p[i].Q.front; while(S!=NULL) { cout<<setw(10)<<S->name<<""<<setw(7)<<S->ticket<<endl; S=S->next;} cout<<"=====================================\n"; } return0;}附:入队函数Queue()的源代码intQueue(PlaneLink*p,charend[],intticket,charname[],intN,inti)//入队函数,将等候排队的乘客放入原来的队列中{ system("cls"); system("color2e"); waitlinkq=(waitlink)malloc(sizeof(waitNode));//将要的入队的结点,存储将要入队乘客的信息 strcpy(q->name,name); q->ticket=ticket; q->next=NULL; if(p[i].Q.front==NULL) { p[i].Q.front=p[i].Q.rear=q; p[i].k++;//p[i].k用来记录排队人数 } else { p[i].Q.rear->next=q; p[i].Q.rear=q;p[i].k++; } cout<<"已为您登记,请耐心等候!\n"; return0; }4.退票功能的算法设计〔tuipiao()函数实现的源代码〕inttuipiao(PlaneLink*p,intN){inti;Customer*R,*S; charnumber[10],Name[15]; cout<<">>>>>>\n"; cout<<"请输入您的航班号与姓名:"; cin>>number>>Name; for(i=0;i<N;i++) { if(strcmp(p[i].number,number)==0&&p[i].first!=NULL) { if(strcmp(p[i].first->Name,Name)==0) { p[i].tick=p[i].tick+p[i].first->ticket; p[i].first=p[i].first->next; cout<<"您已成功退票!\n\n"; } else {R=p[i].first;S=p[i].first->next; while(S!=NULL) { if(strcmp(S->Name,Name)==0) { p[i].tick=p[i].tick+S->ticket; R->next=S->next; cout<<"您已经成功退票!\n\n";break; } R=R->next;S=S->next; } if(S==NULL)cout<<"很抱歉,在该航班上没有找到您的姓名,请核实信息!\n\n"; } if(p[i].Q.front!=NULL) { waitlinkQ=p[i].Q.front,q; while(Q!=NULL) { if(p[i].tick>=Q->ticket) { if(Q==p[i].Q.front) { cout<<"正在为等候的乘客"<<Q->name<<"办理订票!\n"; Book(p,p[i].end,Q->ticket,Q->name,N); if(p[i].Q.front==p[i].Q.rear) { p[i].Q.front=p[i].Q.rear=NULL; Q=Q->next; } else {p[i].Q.front=p[i].Q.front->next; Q=Q->next; } } else { cout<<"正在为等候的乘客"<<Q->name<<"办理订票!\n"; Book(p,p[i].end,Q->ticket,Q->name,N); q->next=Q->next;Q=Q->next; } } else{ q=Q;Q=Q->next;} } } break; } if(strcmp(p[i].number,number)==0&&p[i].first==NULL) { cout<<"很抱歉,该航班目前没有已订票的乘客,无法为你退票,请核实信息!\n\n";break; } } if(i>=N)cout<<"很抱歉,没有该航班信息,无法为你退票,请核实信息!\n\n"; return0;}5.录入功能的算法设计〔CreatPlane()函数的源代码〕voidCreatPlane(PlaneLink*p,intn,intN){ inti,j; for(i=N;i<N+n;i++) { p[i].first=NULL;//带头结点的单链表为空时的条件 p[i].Q.front=p[i].Q.rear=NULL;//队列为空时的条件 cout<<">>>>>>\n";cout<<"请输入航班号:";cin>>p[i].number; cout<<"输入终点站名:";cin>>p[i].end; for(j=0;j<N;j++) { if(strcmp(p[i].number,p[j].number)==0)//查看该航班号是否已经存在 { cout<<"已经存在该航班号!\n";break; } if(strcmp(p[i].end,p[j].end)==0)//查看是否存在到改站点的航班 { cout<<"已经有到该站点的航班!\n";break; } } if(j==N) { cout<<"飞机号、飞行日期、成员定额:\n"; cin>>p[i].planenum>>p[i].date>>p[i].dinge; p[i].tick=p[i].dinge;p[i].k=0; cout<<"录入完成!\n"; } }}6.总航线预览功能的算法设计〔display()函数的源代码〕intdisplay(PlaneLink*p,intN)//N为当前的航班数{ cout<<"==============================================================================\n"; cout<<"航班号飞机号终点站飞行日期定额余票数排队等候人数\n"; cout<<"______________________________________________________________________________\n"; for(inti=0;i<N;i++) { cout<<setw(9)<<p[i].number<<setw(6)<<p[i].planenum<<setw(12)<<p[i].end<<setw(12)<<p[i].date<<setw(10)<<p[i].dinge<<setw(10)<<p[i].tick<<setw(10)<<p[i].k<<endl; } cout<<"==============================================================================\n"; return0;}五、调试分析1〕各功能的具体实例分析为了调试分析方便,在程序中已经初始放入了三个航班信息,如下:1.系统主菜单界面2.总航线预览功能界面3.查询单条航线功能图1.按终点站名查询图2.按航班号查询图3.错误查询输出结果4.订票功能=1\#"#,##0.xxxxxxxxxxxxxxxxxxxx"1.当订票的航班存在且航班的余票数≥乘客订票数时②当订票的航班存在但余票数≤订票数≤航班的定额时③当航班存在但订票数大于航班定额时乘客将无法排队等候了=4\#"#,##0.xxxxxxxxxxxxxxxxxxxx"4.当预定的航班不存在时5.退票功能①.当退票后余票数能够满足排队乘客的需要时②.当航班号或姓名输入错误时,系统会输出显示以下的三种界面 图1图2图36.录入功能2〕实验过程中出现的问题及解决方法:一开始错误很多,包括大

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论