《数据结构课程设计航空订票系统.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计航空订票系统.doc(21页珍藏版)》请在三一办公上搜索。
1、数据结构课程设计报告设计题目: 航空客运订票系统院 系 计算机学院 年 级 xxxxx 学 生 xxx 学 号 xxxxxxxxxxx指导教师 xxxxxxxxxxx 起止时间 9-6/9-13 2013年9月10日星期二目 录一、 课程设计目的 3二、 需求分析 3三、 概要设计1设计步骤 42系统整体结构图 53功能模块及调用关系说明 5四、 详细设计和源代码1.实现概要设计中定义数据的存储结构 62.查询航线信息功能的算法设计 73.订票功能的算法设计 94.退票功能的算法设计 125.录入功能的算法设计 146.总航线预览功能的程序源代码 15五、调试分析1.各功能的具体实例分析 16
2、2.实验过程中出现的问题及解决方法 20六、课程设计总结 20七、参考资料 21一、 课程设计目的(1) 熟练使用 C 语言编写程序,解决实际问题;(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 航空订票系统:(1)熟练掌握链表存储结构及其建立过程和常用操作;(2)熟练掌握队列的建立过程和常用操作;(3) 学会自己调试程序的方法并掌握一定的技巧。二、 需求分析问题描述:航空客运订票的业务活动包括:查询航线、客票预订和办理
3、退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。设计任务:通过此系统可以实现如下功能:录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;订票:(订票情况可以存在一个数据文件中,结构自己设定)根据客户提出的要求(日期、航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;若已
4、满员或余票额少于订票额,则需要重新询问客户要求。若需要,可预约登记排队等候。如果该航班已经无票,可以提供相关可选择航班;退票:根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户退票成功后修改相关数据文件。客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。修改航班信息:当航班信息改变可以修改航班数据文件要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。测试数据:由学生任意指定,但报告上要求写出多批数据测试结果。实现提示
5、:每条航线应包含的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包括姓名、订票额、座位号)和预约登记的客户名单(包括日期、姓名、所需票额)。这最后两项显然是一个线性表和一个队列。为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预料,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和
6、队尾的指针。选做内容:当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其它航线情况。三、概要设计1设计步骤1)分析问题,给出数学模型,设计相应的数据结构。提示: (1)己订票的客户名单可以用线性表来实现。为查找方便,线性表应按照客户姓名有序,并且为了插入和删除的方便,应以链表作为存储结构。(2)等候替补的客户名单可以用队列来实现。由于预约人数无法预计,所以队列也应以链表作为存储结构。(3)需将输入的航班情况登录到一张线性表上(用顺序存储结构或链表存储结构)。为了查询的方便,可以将航班情况按照航班有序或按照终点站名有序建立线性表。每条航线是这张线性表的一个记录,包含上述8个域,其中已订
7、票的客户名单域是指向己订票的客户名单链表的头指针,等候替补的客户名单域是指向队头和队尾的指针。2)算法设计在已经选择好数据结构的前提下,为解决问题设计算法。(1)确定所需模块对于稍复杂的程序设计,要充分利用模块化程序设计方法,自顶向下,逐步细化,在整体思路确定的情况下,考虑所需模块数,各模块完成功能以及模块之间的数据联系和调用关系。(2)各子模块功能描述给出主要模块的算法描述,用流程图或伪代码表示。(3)模块之间的调用关系3)源程序清单为了提高工作效率,充分利用上机调试程序的时间,要求学生在上机之前给出源程序清单。4)用测试数据去验证算法及程序的正确性5)算法分析经过上机调试,源程序运行正确,
8、并且实现算法要求的功能,解决课程设计题目中给出的问题后,分析算法的时间复杂度和空间复杂度。2系统整体结构图(功能模块图) 主菜单menu()1.总航线信息预览display()2.查询单条 航线信息Search()3.办理订票业务Book()4.办理退票业务tuipiao()5.录入航班信息CreatPlane0.退出系统 图 1. 系统整体结构图3功能模块及调用关系说明(1)总航线信息预览:通过调用display()预览已经建立的全部航线的相关信息(航班号、飞机号 、终点站 、飞行日期 、 定额 、余票数 、排队等候人数),预览完返回主菜单。(2)查询单条航线信息:根据乘客提出的终点站名或航
9、班号调用Search()函数来查询并输出此条航线的相关信息(航班号、飞机号 、终点站 、飞行日期 、 定额 、余票数 、已订票乘客名单、排队等候乘客名单)。 并且查询完后询问乘客是否订票,是就调用订票Book()函数来为乘客进行订票,否就返回主菜单。(3)办理订票业务:客户先输入的终点站名、订票数、姓名信息再来调用订票Book()函数,Book()函数根据客户提供的终点站名查询到该航线信息,若客户订票额末超过余票量,订票成功并登记信息,在订票乘员名单链表中添加乘客的信息; 如果暂时余票数不足是,询问客户是否要排队等侯,如果是,则在排队等候的队列中增加该乘客的订票信息。(4)办理退票业务:调用t
10、uipiao()查询函数,根据客户提供的航线进行搜索根据客户提供的姓名到订票客户名单域进行查询。退票成功后,重新将航线名单域指向订票单链表的头指针。根据队列中从出的客户信息判断是否满足要求,如果满足,则将该客户的信息插入到乘客信息链表中。(5)录入航班信息:调用CreatPlane()函数,根据输入的航班的相关的信息(航班号、飞机号 、终点站 、飞行日期 、 定额 、余票数),将此航班加入到原来的航班组中。(6)退出系统四、详细设计和源代码1.实现概要设计中定义数据的存储结构(1)已订票乘客信息(单链表)typedef struct Cust/已订票乘客信息char Name15;/乘客姓名
11、char number10;/乘客所乘飞机航班号 char end15;/乘客终点站(2)排队等候的乘客信息typedef 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;/终点站ch
12、ar date10;/飞行日期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;coutn;coutQ;if(Q=1)char end10;coutend; while(iN) if(strcmp(p
13、i.end,end)=0) /先查看是否存在到该站点的航班 coutn*您所查询的航班信息如下*n; cout_n; cout 航班号 飞机号 终点站 飞行日期 余票数n; cout pi.numbersetw(7)pi.planenumsetw(12)pi.endsetw(10)pi.datesetw(10)pi.tickendl; coutn=n; break; i+;else if(Q=2) char num10; coutnum; while(iN) if(strcmp(pi.number,num)=0) /查看是否存在该航班号的航班 coutn*您所查询的航班信息如下:*n; cou
14、t_n; cout 航班号 终点 飞行日期 余票数n; cout pi.numbersetw(12)pi.endsetw(12)pi.datesetw(12)pi.tickendl; coutn=n; break; i+; display_s(p, i, N); /调用display_s()函数输出该航班的已订票乘客和排队等候乘客的名单信息if(iN) /如果存在该航班,询问客户是否要预定 该航班的 机票int j; coutj; if(j=1) char name10; int ticket; coutticketname; Book(p,pi.end,ticket, name, N); e
15、lse cout 很抱歉,没有您查询的航班信息!n; return 0;3.订票功能的算法设计(Book( )函数功能实现源代码)int Book(PlaneLink *p,char end,int ticket,char name,int N) int i; for(i=0;i=ticket) /查看 余票数是否 = 订票客户 订票数pi.tick-=ticket;Customer *t=(Customer *)malloc(sizeof(Customer);t-ticket=ticket;strcpy(t-Name,name);strcpy(t-number,pi.number); str
16、cpy(t-end,pi.end);t-next=pi.first; pi.first=t; / 此使用的是头插法将订票乘客的信息放入到 链表中 /cout 您订票成功!n;cout 您的航班信息如下:n;cout_n;cout 航班号 飞机号 终点站 飞行日期 定额n;cout_n;cout setw(9)pi.numbersetw(6)pi.planenumsetw(12)pi.endsetw(12)pi.datesetw(10)pi.dingeendl;cout=nn;break;else if(pi.dingeticket) /订票数超出航班的定额时,不能订票,也不能无法排队等候了 c
17、out 您预订的票数超过了航班定额,无法为您订票!n; break; else / 余票数不足时,询问乘客是否排队等候char z;cout 该航班剩余票数为:pi.tickendl;cout 很抱歉,剩余的票数不够!n; coutz; 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
18、!=NULL) /pi.first!=NULL说明已订票链表不为空, 输出 已订票乘客的名单信息cout*该航班的已订票乘客名单如下:*n; cout_n;cout 姓名 订票量n;Customer *t=pi.first;while(t) coutsetw(10)Name setw(7)ticketnext;if(iN&pi.Q.front!=NULL) /pi.Q.front!=NULL,输出正在排队等候乘客的名单信息 cout*该航班等候订票的乘客名单如下: *n;cout 姓名 订票量n;waitlink S=pi.Q.front; while(S!=NULL)coutsetw(10)
19、name setw(7)ticketnext; coutname,name);q-ticket=ticket;q-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,N
20、ame15;coutn;coutnumberName;for(i=0;iName,Name)=0)pi.tick=pi.tick+pi.first-ticket;pi.first=pi.first-next;coutnext;while(S!=NULL)if(strcmp(S-Name,Name)=0)pi.tick=pi.tick+S-ticket;R-next=S-next;coutnext; S=S-next;if(S=NULL) cout=Q-ticket)if(Q=pi.Q.front)cout 正在为等候的乘客 nameticket,Q-name,N);if(pi.Q.front=
21、pi.Q.rear)pi.Q.front=pi.Q.rear=NULL;Q=Q-next;else pi.Q.front=pi.Q.front-next; Q=Q-next;elsecout 正在为等候的乘客 nameticket,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=N) cout 很抱歉,没有该航班信息,无法为你退票,请核实信息!nn;return 0;5.录入功能的算法设计(CreatPlane( )函数的源
22、代码)void CreatPlane(PlaneLink *p,int n,int N) int i,j;for(i=N;iN+n;i+)pi.first=NULL; / 带头结点的单链表为空时的条件pi.Q.front=pi.Q.rear=NULL; /队列为空时的条件coutn; coutpi.number;coutpi.end;for( j=0;jN;j+)if(strcmp(pi.number,pj.number)=0) /查看该航班号是否已经存在cout 已经存在该航班号!n ; break; if(strcmp(pi.end,pj.end)=0) / 查看是否存在到改站点的航班co
23、ut 已经有到该站点的航班!n ; break;if(j=N)coutpi.planenumpi.datepi.dinge; pi.tick=pi.dinge; pi.k=0;cout 录入完成!n;6.总航线预览功能的算法设计(display( )函数的源代码)int display(PlaneLink *p,int N) /N为当前的航班数 cout=n;cout 航班号 飞机号 终点站 飞行日期 定额 余票数 排队等候人数n;cout_n;for(int i=0;iN;i+)coutsetw(9)pi.numbersetw(6)pi.planenumsetw(12)pi.endsetw(
24、12)pi.datesetw(10)pi.dingesetw(10)pi.ticksetw(10)pi.kendl;cout=n;return 0;五、调试分析1)各功能的具体实例分析为了调试分析方便,在程序中已经初始放入了三个航班信息,如下:1.系统主菜单界面2.总航线预览功能界面3.查询单条航线功能 图1.按终点站名查询图2.按航班号查询图3.错误查询输出结果4.订票功能.当订票的航班存在且航班的余票数乘客订票数时当订票的航班存在但余票数订票数航班的定额时当航班存在但订票数大于航班定额时乘客将无法排队等候了.当预定的航班不存在时5.退票功能.当退票后余票数能够满足排队乘客的需要时.当航班号
25、或姓名输入错误时,系统会输出显示以下的三种界面 图1 图2 图36.录入功能2)实验过程中出现的问题及解决方法:1、 一开始错误很多,包括大量的语法错误和逻辑错误。通过反复的编译、调试、学习和修改,更正了程序中的语法,使程序可以正常编译,运行。2、 程序健壮性方面屡屡遇到问题,在程序的测试过程中逐步发现并改进,如主菜单选择如果输入字符型数据就会引起程序的混乱出现自动跳出;解决方法,引入新的部分从键盘获取字符型数据,通过字符型常量与数据间的关系,将字符数据转化成整形数据。3、 程序优化,程序虽然可以运行使用,但是有很多不合理处, 例如程序的运行过程对于正确的输入情况考虑的还比较完全,但对于有误信
26、息的输入情况考虑的不是很好,经常输入有误或是不符合的信息时,会出现死循环或者其他一些异常。对于种情况,我都是通过F10调试,在调试过程输入刚出错我输入的信息,然后逐句或是逐过程的进行调试,最终都能找到问题的具体所在处,然后通过分析为什么这处会出现异常,从这不断的调试及分析的过程中得出了这些错误的修改方法。从而不断的完善了整个系统程序。4、 功能添加上,我是在实现基础功能的基础上再添加一些其他的比较复杂难处理的功能,但在添加另外的功能时,常常会出现这些功能之间逻辑联系不好的问题。这些主要就是通过调试看 这些函数的连接处的代码的调试情况,比如一些for循环、while循环或是if语句等的限制条件上
27、把握的不好,经常会出现在我的逻辑理论上应该执行的语句没执行,而不该执行的却执行了的情况。在调试的时候我会首先看看这些连接处的中间变量的值的变化境况,通过这找出了比较这些语句的正确的限制的条件。六、课程设计总结1、 在一周的时间里,不断地对程序及各模块进行修改、编译、调试、运行,其间遇到很多问题,但通过自己的努力及询问同学的帮助都一一解决了。2、 因本人能力有限,在编写的时候只使用了相对较为简单的基础语言 ,代替了相对较为复杂的语言,降低了运行效率。3、 程序是写出来的,不是想出来的。开始阶总是在想,总感觉很困难做不了,但是真正投入其中之后才发觉其实只要用心,只要有克服一切的勇气和信心就可以把程
28、序做好,错误总是越改越少的。4、 要用愉悦的心情去做,从编程的过程中体会乐趣,兴趣是最好的老师就是这么回事5、 学会利用辅助程序去发现问题6、 通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用 。7、 数据结构课程设计是检验我们这个学期学习成果的重要手段,通过这学期的学习,我认为学好数据结构这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践才能增强和巩固我的知识。经过这一阶段的上机实践学习,使我对数据结构有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它。通过实践,我也发现我的很多不足之处,首先是自己平时上机练习太少,知识的积压给编程带来了一定的麻烦。另外我对数据结构的一些标准库函数还不太了解,如开始进入系统后发现操作的界面很乱,如果能够及时的清屏那样就会变的很明了。查阅了相关的资料和问同学后我知道只要在程序中调用库函数system(cls)就可以了,知道了这个函数的基本用法;还有对数据结构中经常出现的错误也不了解,通过实践,使我独自处理错误的能力也有了很大的提高。七、参考资料 1. 数据结构(C语言版) 严蔚敏 吴伟民 编著,清华大学出版社2. 数据结构(C语言版)相配套的课本源代码3. C+程序设计谭浩强 编著 清华大学出版社