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

下载本文档

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

文档简介

1、数据结构课程设计报告设计题目: 航空客运订票系统院 系 年 级 学 生 学 号 指导教师 2015年11月26日目 录一、 课程设计目的 3二、 需求分析 3三、 概要设计1设计步骤 42系统整体结构图 53功能模块及调用关系说明 5四、 详细设计和源代码1.实现概要设计中定义数据的存储结构 62.查询航线信息功能的算法设计 73.订票功能的算法设计 94.退票功能的算法设计 125.录入功能的算法设计 146.总航线预览功能的程序源代码 15五、调试分析1.各功能的具体实例分析 162.实验过程中出现的问题及解决方法 20六、课程设计总结 20七、参考资料 21一、 课程设计目的(1) 熟练

2、使用 C 语言编写程序,解决实际问题;(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 航空订票系统:(1)熟练掌握链表存储结构及其建立过程和常用操作;(2)熟练掌握队列的建立过程和常用操作;(3) 学会自己调试程序的方法并掌握一定的技巧。二、 需求分析问题描述:航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。设计任务:通过此系统可以实现如下功能:录

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

4、选择航班;退票:根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户退票成功后修改相关数据文件。客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。修改航班信息:当航班信息改变可以修改航班数据文件要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。测试数据:由学生任意指定,但报告上要求写出多批数据测试结果。实现提示:每条航线应包含的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包

5、括姓名、订票额、座位号)和预约登记的客户名单(包括日期、姓名、所需票额)。这最后两项显然是一个线性表和一个队列。为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预料,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。选做内容:当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其它航线情况。三、概要设计1设

6、计步骤1)分析问题,给出数学模型,设计相应的数据结构。提示: (1)己订票的客户名单可以用线性表来实现。为查找方便,线性表应按照客户姓名有序,并且为了插入和删除的方便,应以链表作为存储结构。(2)等候替补的客户名单可以用队列来实现。由于预约人数无法预计,所以队列也应以链表作为存储结构。(3)需将输入的航班情况登录到一张线性表上(用顺序存储结构或链表存储结构)。为了查询的方便,可以将航班情况按照航班有序或按照终点站名有序建立线性表。每条航线是这张线性表的一个记录,包含上述8个域,其中已订票的客户名单域是指向己订票的客户名单链表的头指针,等候替补的客户名单域是指向队头和队尾的指针。2)算法设计在已

7、经选择好数据结构的前提下,为解决问题设计算法。(1)确定所需模块对于稍复杂的程序设计,要充分利用模块化程序设计方法,自顶向下,逐步细化,在整体思路确定的情况下,考虑所需模块数,各模块完成功能以及模块之间的数据联系和调用关系。(2)各子模块功能描述给出主要模块的算法描述,用流程图或伪代码表示。(3)模块之间的调用关系3)源程序清单为了提高工作效率,充分利用上机调试程序的时间,要求学生在上机之前给出源程序清单。4)用测试数据去验证算法及程序的正确性5)算法分析经过上机调试,源程序运行正确,并且实现算法要求的功能,解决课程设计题目中给出的问题后,分析算法的时间复杂度和空间复杂度。2系统整体结构图(功

8、能模块图) 主菜单menu()1.总航线信息预览display()2.查询单条 航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统 图 1. 系统整体结构图3功能模块及调用关系说明(1)总航线信息预览:通过调用display()预览已经建立的全部航线的相关信息(航班号、飞机号 、终点站 、飞行日期 、 定额 、余票数 、排队等候人数),预览完返回主菜单。(2)查询单条航线信息:根据乘客提出的终点站名或航班号调用Search()函数来查询并输出此条航线的相关信息(航班号、飞机号 、终点站 、飞行日期 、 定额 、

9、余票数 、已订票乘客名单、排队等候乘客名单)。 并且查询完后询问乘客是否订票,是就调用订票Book()函数来为乘客进行订票,否就返回主菜单。(3)办理订票业务:客户先输入的终点站名、订票数、姓名信息再来调用订票Book()函数,Book()函数根据客户提供的终点站名查询到该航线信息,若客户订票额末超过余票量,订票成功并登记信息,在订票乘员名单链表中添加乘客的信息; 如果暂时余票数不足是,询问客户是否要排队等侯,如果是,则在排队等候的队列中增加该乘客的订票信息。(4)办理退票业务:调用tuipiao()查询函数,根据客户提供的航线进行搜索根据客户提供的姓名到订票客户名单域进行查询。退票成功后,重

10、新将航线名单域指向订票单链表的头指针。根据队列中从出的客户信息判断是否满足要求,如果满足,则将该客户的信息插入到乘客信息链表中。(5)录入航班信息:调用CreatPlane()函数,根据输入的航班的相关的信息(航班号、飞机号 、终点站 、飞行日期 、 定额 、余票数),将此航班加入到原来的航班组中。(6)退出系统四、详细设计和源代码1.实现概要设计中定义数据的存储结构(1)已订票乘客信息(单链表)typedef struct Cust/已订票乘客信息char Name15;/乘客姓名 char number10;/乘客所乘飞机航班号 char end15;/乘客终点站(2)排队等候的乘客信息t

11、ypedef struct waitNode/排队等候客户信息 char name15;/乘客姓名int ticket;/乘客的订票数struct waitNode *next;waitNode,*waitlink;typedef structwaitlink front;waitlink rear;waitQueue;(3)航班信息typedef struct Plane/航班信息char number10;/航班号int planenum;/飞机号char end15;/终点站char date10;/飞行日期int dinge;/成员定额 int tick;/剩余票数 int k;/排队

12、等候的人数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<<">>>>>&

13、gt;n"cout<<" 请选择查询方式 (1/2):" cin>>Q;if(Q=1)char end10;cout<<" 请您输入要查询的航班的终点站名: " /按站点名查询航班信息 cin>>end; while(i<N) if(strcmp(pi.end,end)=0) /先查看是否存在到该站点的航班 cout<<"n*您所查询的航班信息如下*n" cout<<"_n" cout<<" 航班号 飞机号

14、 终点站 飞行日期 余票数n" cout<<" "<<pi.number<<setw(7)<<pi.planenum<<setw(12)<<pi.end<<setw(10)<<pi.date<<setw(10)<<pi.tick<<endl; cout<<"n=n" break; i+;else if(Q=2) char num10; cout<<" 请您输入要查询的航班的航班号:

15、 " /按站点名查询航班信息 cin>>num; while(i<N) if(strcmp(pi.number,num)=0) /查看是否存在该航班号的航班 cout<<"n*您所查询的航班信息如下:*n" cout<<"_n" cout<<" 航班号 终点 飞行日期 余票数n" cout<<" "<<pi.number<<setw(12)<<pi.end<<setw(12)<<p

16、i.date<<setw(12)<<pi.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 name10; int ticket; cout<<&quo

17、t; 请输入订票数目、姓名:" cin>>ticket>>name; Book(p,pi.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(pi.end,end)=0) /先找出是否存在要订票的航班 if(pi.t

18、ick>=ticket) /查看 余票数是否 >= 订票客户 订票数pi.tick-=ticket;Customer *t=(Customer *)malloc(sizeof(Customer);t->ticket=ticket;strcpy(t->Name,name);strcpy(t->number,pi.number); strcpy(t->end,pi.end);t->next=pi.first; pi.first=t; / 此使用的是头插法将订票乘客的信息放入到 链表中 /cout<<" 您订票成功!n"cou

19、t<<" 您的航班信息如下:n"cout<<"_n"cout<<" 航班号 飞机号 终点站 飞行日期 定额n"cout<<"_n"cout<<" "<<setw(9)<<pi.number<<setw(6)<<pi.planenum<<setw(12)<<pi.end<<setw(12)<<pi.date<<setw(10)<

20、;<pi.dinge<<endl;cout<<"=nn"break;else if(pi.dinge<ticket) /订票数超出航班的定额时,不能订票,也不能无法排队等候了 cout<<" 您预订的票数超过了航班定额,无法为您订票!n" break; else / 余票数不足时,询问乘客是否排队等候char z;cout<<" 该航班剩余票数为:"<<pi.tick<<endl;cout<<" 很抱歉,剩余的票数不够!n&quo

21、t; 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(pi.first!=NULL) /pi

22、.first!=NULL说明已订票链表不为空, 输出 已订票乘客的名单信息cout<<"*该航班的已订票乘客名单如下:*n" cout<<"_n"cout<<" 姓名 订票量n"Customer *t=pi.first;while(t) cout<<setw(10)<<t->Name<<" "<<setw(7)<<t->ticket<<endl; t=t->next;if(i<N&am

23、p;&pi.Q.front!=NULL) /pi.Q.front!=NULL,输出正在排队等候乘客的名单信息 cout<<"*该航班等候订票的乘客名单如下: *n"cout<<" 姓名 订票量n"waitlink S=pi.Q.front; while(S!=NULL)cout<<setw(10)<<S->name<<" "<<setw(7)<<S->ticket<<endl;S=S->next; cout<

24、<"=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

25、->next=NULL; if(pi.Q.front=NULL) pi.Q.front=pi.Q.rear=q; pi.k+; /pi.k用来记录排队人数elsepi.Q.rear->next=q;pi.Q.rear=q; pi.k+; cout<<"已为您登记,请耐心等候!n"return 0;4.退票功能的算法设计(tuipiao( )函数实现的源代码)int tuipiao(PlaneLink *p,int N) int i; Customer *R,*S;char number10,Name15;cout<<">&

26、gt;>>>>n"cout<<" 请输入您的航班号与姓名:"cin>>number>>Name;for(i=0;i<N;i+) if(strcmp(pi.number,number)=0&&pi.first!=NULL)if(strcmp(pi.first->Name,Name)=0)pi.tick=pi.tick+pi.first->ticket;pi.first=pi.first->next;cout<<" 您已成功退票!nn"e

27、lse R=pi.first; S=pi.first->next;while(S!=NULL)if(strcmp(S->Name,Name)=0)pi.tick=pi.tick+S->ticket;R->next=S->next;cout<<" 您已经成功退票!nn" break;R=R->next; S=S->next;if(S=NULL) cout<<" 很抱歉,在该航班上没有找到您的姓名,请核实信息!nn"if(pi.Q.front!=NULL)waitlink Q=pi.Q.fro

28、nt , q; while(Q!=NULL)if(pi.tick>=Q->ticket)if(Q=pi.Q.front)cout<<" 正在为等候的乘客 "<<Q->name<<"办理订票!n"Book(p,pi.end,Q->ticket,Q->name,N);if(pi.Q.front=pi.Q.rear)pi.Q.front=pi.Q.rear=NULL;Q=Q->next;else pi.Q.front=pi.Q.front->next; Q=Q->next;el

29、secout<<" 正在为等候的乘客 "<<Q->name<<"办理订票!n"Book(p,pi.end,Q->ticket,Q->name,N);q->next=Q->next; Q=Q->next;else q=Q; Q=Q->next; break; if(strcmp(pi.number,number)=0&&pi.first=NULL)cout<<" 很抱歉,该航班目前没有已订票的乘客,无法为你退票,请核实信息!nn"

30、break;if(i>=N) cout<<" 很抱歉,没有该航班信息,无法为你退票,请核实信息!nn"return 0;5.录入功能的算法设计(CreatPlane( )函数的源代码)void CreatPlane(PlaneLink *p,int n,int N) int i,j;for(i=N;i<N+n;i+)pi.first=NULL; / 带头结点的单链表为空时的条件pi.Q.front=pi.Q.rear=NULL; /队列为空时的条件cout<<">>>>>>n" co

31、ut<<" 请输入航班号: " cin>>pi.number;cout<<" 输入终点站名: " cin>>pi.end;for( j=0;j<N;j+)if(strcmp(pi.number,pj.number)=0) /查看该航班号是否已经存在cout<<" 已经存在该航班号!n " break; if(strcmp(pi.end,pj.end)=0) / 查看是否存在到改站点的航班cout<<" 已经有到该站点的航班!n " bre

32、ak;if(j=N)cout<<" 飞机号、飞行日期、成员定额:n" cin>>pi.planenum>>pi.date>>pi.dinge; pi.tick=pi.dinge; pi.k=0;cout<<" 录入完成!n"6.总航线预览功能的算法设计(display( )函数的源代码)int display(PlaneLink *p,int N) /N为当前的航班数 cout<<"=n"cout<<" 航班号 飞机号 终点站 飞行日期 定额

33、 余票数 排队等候人数n"cout<<"_n"for(int i=0;i<N;i+)cout<<setw(9)<<pi.number<<setw(6)<<pi.planenum<<setw(12)<<pi.end<<setw(12)<<pi.date<<setw(10)<<pi.dinge<<setw(10)<<pi.tick<<setw(10)<<pi.k<<endl

34、;cout<<"=n"return 0;五、调试分析1)各功能的具体实例分析为了调试分析方便,在程序中已经初始放入了三个航班信息,如下:1.系统主菜单界面2.总航线预览功能界面3.查询单条航线功能 图1.按终点站名查询图2.按航班号查询图3.错误查询输出结果4.订票功能1.当订票的航班存在且航班的余票数乘客订票数时当订票的航班存在但余票数订票数航班的定额时当航班存在但订票数大于航班定额时乘客将无法排队等候了4.当预定的航班不存在时5.退票功能.当退票后余票数能够满足排队乘客的需要时.当航班号或姓名输入错误时,系统会输出显示以下的三种界面 图1 图2 图36.录入

35、功能 19 / 232)实验过程中出现的问题及解决方法:1、 一开始错误很多,包括大量的语法错误和逻辑错误。通过反复的编译、调试、学习和修改,更正了程序中的语法,使程序可以正常编译,运行。2、 程序健壮性方面屡屡遇到问题,在程序的测试过程中逐步发现并改进,如主菜单选择如果输入字符型数据就会引起程序的混乱出现自动跳出;解决方法,引入新的部分从键盘获取字符型数据,通过字符型常量与数据间的关系,将字符数据转化成整形数据。3、 程序优化,程序虽然可以运行使用,但是有很多不合理处, 例如程序的运行过程对于正确的输入情况考虑的还比较完全,但对于有误信息的输入情况考虑的不是很好,经常输入有误或是不符合的信息时,会出现死循环或者其他一些异常。对于种情况,我都是通过

温馨提示

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

评论

0/150

提交评论