当前位置:文档之家› 数据结构课程设计_航空订票系统方案

数据结构课程设计_航空订票系统方案

数据结构课程设计报告设计题目:航空客运订票系统院系计算机学院年级 xxxxx学生 xxx学号 xxxxxxxxxxx指导教师 xxxxxxxxxxx起止时间 9-6/9-132013年9月10日星期二目录一、课程设计目的 3二、需求分析 3三、概要设计1.设计步骤 4 2.系统整体结构图 5 3.功能模块及调用关系说明 5四、详细设计和源代码1.实现概要设计中定义数据的存储结构 62.查询航线信息功能的算法设计 73.订票功能的算法设计 94.退票功能的算法设计 125.录入功能的算法设计 146.总航线预览功能的程序源代码 15五、调试分析1.各功能的具体实例分析162.实验过程中出现的问题及解决方法 20六、课程设计总结20七、参考资料21一、课程设计目的(1) 熟练使用 C 语言编写程序,解决实际问题;(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;航空订票系统:(1)熟练掌握链表存储结构及其建立过程和常用操作;(2)熟练掌握队列的建立过程和常用操作;(3)学会自己调试程序的方法并掌握一定的技巧。

二、需求分析问题描述:航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。

试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。

设计任务:通过此系统可以实现如下功能:录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;订票:(订票情况可以存在一个数据文件中,结构自己设定)根据客户提出的要求(日期、航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需要重新询问客户要求。

若需要,可预约登记排队等候。

如果该航班已经无票,可以提供相关可选择航班;退票:根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户……退票成功后修改相关数据文件。

客户资料有,证件号,订票数量及航班情况,订单要有编号。

修改航班信息:当航班信息改变可以修改航班数据文件要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。

测试数据:由学生任意指定,但报告上要求写出多批数据测试结果。

实现提示:每条航线应包含的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户(包括、订票额、座位号)和预约登记的客户(包括日期、、所需票额)。

这最后两项显然是一个线性表和一个队列。

为查找方便、已订票客户的线性表应按客户有序,并且,为插入和删除方便,应以链表作存储结构。

由于预约人数无法预料,队列也应以链表作存储结构。

整个系统需汇总各条航线的情况登录在一线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。

每条航线是这表上的一个记录,包含上述八个域,其中乘员域为指向乘员链表的头指针,预约登记客户域为分别指向队头和队尾的指针。

选做容:当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其它航线情况。

三、概要设计1.设计步骤1)分析问题,给出数学模型,设计相应的数据结构。

提示:(1)己订票的客户可以用线性表来实现。

为查找方便,线性表应按照客户有序,并且为了插入和删除的方便,应以链表作为存储结构。

(2)等候替补的客户可以用队列来实现。

由于预约人数无法预计,所以队列也应以链表作为存储结构。

(3)需将输入的航班情况登录到一线性表上(用顺序存储结构或链表存储结构)。

为了查询的方便,可以将航班情况按照航班有序或按照终点站名有序建立线性表。

每条航线是这线性表的一个记录,包含上述8个域,其中已订票的客户域是指向己订票的客户链表的头指针,等候替补的客户域是指向队头和队尾的指针。

2)算法设计在已经选择好数据结构的前提下,为解决问题设计算法。

(1)确定所需模块对于稍复杂的程序设计,要充分利用模块化程序设计方法,自顶向下,逐步细化,在整体思路确定的情况下,考虑所需模块数,各模块完成功能以及模块之间的数据联系和调用关系。

(2)各子模块功能描述给出主要模块的算法描述,用流程图或伪代码表示。

(3)模块之间的调用关系3)源程序清单为了提高工作效率,充分利用上机调试程序的时间,要求学生在上机之前给出源程序清单。

4)用测试数据去验证算法及程序的正确性5)算法分析经过上机调试,源程序运行正确,并且实现算法要求的功能,解决课程设计题目中给出的问题后,分析算法的时间复杂度和空间复杂度。

2.系统整体结构图(功能模块图)图 1.系统整体结构图3.功能模块及调用关系说明(1)总航线信息预览:通过调用display()预览已经建立的全部航线的相关信息(航班号、飞机号、终点站、飞行日期、定额、余票数、排队等候人数),预览完返回主菜单。

(2)查询单条航线信息:根据乘客提出的终点站名或航班号调用Search()函数来查询并输出此条航线的相关信息(航班号、飞机号、终点站、飞行日期、定额、余票数、已订票乘客、排队等候乘客)。

并且查询完后询问乘客是否订票,是就调用订票Book()函数来为乘客进行订票,否就返回主菜单。

(3)办理订票业务:客户先输入的终点站名、订票数、信息再来调用订票Book()函数,Book()函数根据客户提供的终点站名查询到该航线信息,若客户订票额末超过余票量,订票成功并登记信息,在订票乘员链表中添加乘客的信息;如果暂时余票数不足是,询问客户是否要排队等侯,如果是,则在排队等候的队列中增加该乘客的订票信息。

(4)办理退票业务:调用tuipiao()查询函数,根据客户提供的航线进行搜索根据客户提供的到订票客户域进行查询。

退票成功后,重新将航线域指向订票单链表的头指针。

根据队列中从出的客户信息判断是否满足要求,如果满足,则将该客户的信息插入到乘客信息链表中。

(5)录入航班信息:调用CreatPlane()函数,根据输入的航班的相关的信息(航班号、飞机号、终点站、飞行日期、定额、余票数),将此航班加入到原来的航班组中。

(6)退出系统四、详细设计和源代码1.实现概要设计中定义数据的存储结构(1)已订票乘客信息(单链表)typedef struct Cust //已订票乘客信息{char Name[15]; //乘客char number[10]; //乘客所乘飞机航班号char end[15]; //乘客终点站(2)排队等候的乘客信息typedef struct waitNode //排队等候客户信息{char name[15]; //乘客int ticket; //乘客的订票数struct waitNode *next;}waitNode,*waitlink;typedef struct{waitlink front;waitlink rear;}waitQueue;(3)航班信息typedef struct Plane //航班信息{char number[10]; //航班号int planenum; //飞机号char end[15]; //终点站char date[10]; //飞行日期int dinge; //成员定额int tick; //剩余票数int k; //排队等候的人数Customer *first; //已订票客户waitQueue Q; //候补客户}PlaneLink;2.查询单条航线信息功能的算法设计(Search( )函数功能实现的源代码)int Search(PlaneLink *p,int N){int i=0,Q;cout<<"===========================================\n";cout<<" 1.按终点站名查询\n";cout<<" 2.按航班号查询 \n";cout<<"___________________________________________\n";cout<<">>>>>>\n";cout<<" 请选择查询方式 (1/2):"; cin>>Q;if(Q==1){char end[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<<se tw(10)<<p[i].tick<<endl;cout<<"\n=========================================================\n";break;}i++;}}else if(Q==2){char num[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) //如果存在该航班,询问客户是否要预定该航班的机票{int j;cout<<" 是否需要预定该航班的票(1/0):"; cin>>j;if(j==1){char name[10]; int ticket;cout<<" 请输入订票数目、:";cin>>ticket>>name;Book(p,p[i].end,ticket, name, N);}}else { cout<<" 很抱歉,没有您查询的航班信息!\n"; }return 0;}3.订票功能的算法设计(Book( )函数功能实现源代码)int Book(PlaneLink *p,char end[],int ticket,char name[],int N){int i;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;}else if(p[i].dinge<ticket) //订票数超出航班的定额时,不能订票,也不能无法排队等候了{ cout<<" 您预订的票数超过了航班定额,无法为您订票!\n"; break; }else // 余票数不足时,询问乘客是否排队等候{char z;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"; }return 0;}int display_s(PlaneLink *p,int i,int N) //输出已定票及排队乘客的信息{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";waitlink S=p[i].Q.front;while(S!=NULL){cout<<setw(10)<<S->name<<" "<<setw(7)<<S->ticket<<endl;S=S->next;}cout<<"=====================================\n";}return 0;}附:入队函数Queue( )的源代码int Queue(PlaneLink *p,char end[],int ticket,char name[],int N ,int i) //入队函数,将等候排队的乘客放入原来的队列中{system("cls");system("color 2e");waitlink q=(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";return 0;}4.退票功能的算法设计(tuipiao( )函数实现的源代码)int tuipiao(PlaneLink *p,int N){int i;Customer *R,*S;char number[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){waitlink Q=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";return 0;}5.录入功能的算法设计(CreatPlane( )函数的源代码)void CreatPlane(PlaneLink *p,int n,int N){int i,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( )函数的源代码)int display(PlaneLink *p,int N) //N为当前的航班数{cout<<"========================================================================= =====\n";cout<<" 航班号飞机号终点站飞行日期定额余票数排队等候人数\n";cout<<"_________________________________________________________________________ _____\n";for(int i=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";return 0;}五、调试分析1)各功能的具体实例分析为了调试分析方便,在程序中已经初始放入了三个航班信息,如下:1.系统主菜单界面2.总航线预览功能界面3.查询单条航线功能图1.按终点站名查询图2.按航班号查询图3.错误查询输出结果4.订票功能①.当订票的航班存在且航班的余票数≥乘客订票数时②当订票的航班存在但余票数≤订票数≤航班的定额时③当航班存在但订票数大于航班定额时乘客将无法排队等候了④.当预定的航班不存在时5.退票功能①.当退票后余票数能够满足排队乘客的需要时②.当航班号或输入错误时,系统会输出显示以下的三种界面图1图2图36.录入功能2)实验过程中出现的问题及解决方法:1、一开始错误很多,包括大量的语法错误和逻辑错误。

相关主题