航空客运售票服务系统.doc_第1页
航空客运售票服务系统.doc_第2页
航空客运售票服务系统.doc_第3页
航空客运售票服务系统.doc_第4页
航空客运售票服务系统.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

学生实习报告 课程名称_ 数据结构与数据处理应用训练 题目名称 航空客运售票服务系统 学生学院 专业班级 学 号 学生姓名 指导教师 2012 年 2 月 16日航空客运售票服务系统【摘要】 21世纪是一个高速、快捷的年代。在这个高速发展的年代里,速度成了我们追求的目标;二是提高工作效率;三是降低成本。而且这样的系统势必让用户易学、易用,满足客户需求。因此,办公自动化的高速度、高效率、高便捷、低成本便成了我们的目的,为此开发了这个“机场售票管理系统”。本系统是采用C+开发的一个管理系统。本系统要解决的是机场售票中所要解决的问题,包括售票退票功能、预约等待功能、查询航线功能、浏览航线客户功能等。在整个系统中采用队列、线性链表、数组等存储方法。在整个系统设计过程中,严格按照软件工程设计标准来设计系统。【关键词】 飞机信息,队列,线性链表,数据结构 1 内容与要求【问题描述】航空客运订票的业务活动包括:查询航线、机票预订和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。【具体要求】设民航售票处的计算机系统可以为客户提供下列各项服务:1 查询航线:根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额。2. 承办订票业务:根据客户提出的要求(日期、航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需要重新询问客户要求。若需要,可预约登记排队等候。3承办退票业务:根据客户提供的情况(日期、航班、退票数额),为客户办理退票手续,然后查询该航班是否有人预约登记,首先询问排在第一的客户,若所退票数能满足他的要求,则为他办理订票手续,否则依次询问其他排队预约的客户。【实现提示】每条航线应包含的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票额、已订票的客户名单(包括姓名、订票额、座位号)和预约登记的客户名单(包括日期、姓名、所需票额)。这最后两项显然是一个线性表和一个队列。为查找方便、已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预料,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登录在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序。每条航线是这张表上的一个记录,包含上述八个域,其中乘员名单域为指向乘员名单链表的头指针,预约登记客户名单域为分别指向队头和队尾的指针。【测试数据】自己设计,但报告上要求写出多批数据测试结果。【选做内容】当客户订票要求不能满足时,系统可向客户提供到达同一目的地的其它航线情况。大家还可以充分发挥自己的想象力,增加你的系统的功能和其它服务项目。2 总体设计本系统的总体设计分为售票退票功能、预约等待功能、查询航线功能、浏览航线客户功能等。具体请看该流程图: 功能选择菜单插入航线查询航线订票业务退票业务浏览订票情况查询航线:void chaxun(char zdzhan10,int n,mainlist A)订票业务:void dingpiao(int day,int hangbanhao,int dingpiaoe,int n,mainlist A)退票业务:void tuipiao(int day,int hangbanhao,int tuipiaoe,char name,int n,mainlist A)浏览订票情况:void liulan(int n)线性链表:初始化链表:void InitList (LNode *&H)清除链表:void ClearList(LNode *&H)计算链表长度:int LengthList (LNode *H)判断链表是否为空:bool EmptyList (LNode *H)根据POS值取出值:kehu GetList (LNode *H, int pos)查找链表中的数据:bool FindList (LNode *H, kehu item)遍历链表:void TraverseList(LNode *H)链表中插入数据:bool InsertList ( LNode *&H,kehu item, int pos)链表中删除数据:bool DeleteList (LNode *&H,kehu &item,int pos)队列:void InitQueue (Queue &Q)/初始化循环队列Qint EmptyQueue (Queue Q) /判断队列是否为空,空返回1,否则返回0void EnQueue (Queue &Q , dengdai item )/进队列dengdai OutQueue(Queue &Q)/出队列dengdai PeekQueue(Queue Q)/取出队列中第一个数据void ClearQueue(Queue &Q)/清除该队列3 详细设计结构定义:typedef struct char name10;/客户姓名 int dingpiaoe;/订票额dengdai;/预约等待的客户typedef struct char name10; /客户姓名 int dingpiaoe; /订票额 int zuoweihao;/座位号kehu;/订到票的客户typedef structchar zdzhan10;/终点站名 int hangbanhao;/航班号int week;/星期int day;/日期int yupiao;/余票int dinge;/成员定额LNode *pass;/订到票的客户Queue wait;/等待预约的客户ElemType; 插入航线:先提示要输入的航线数量,再用一个FOR循环将所有输入的数据存入数组;查询航线:用一个FOR循环,将输入的要查询的信息与数组中的所有航线信息作比较,若找到相同的终点站,则全部将他们输出。订票业务:用一个FOR循环,将输入的要订票的信息与数组中的所有航线信息作比较,若找到与输入信息相同的航线,则输出“找到您所要订的航班!”,之后再输入客户姓名,再将以上输入信息放入2个结构:预约等待的客户和订票客户。再判断该航班是否有那么多票够该客户买,若够则输出座位号,若不够,则输出:“该航班余票不足,是否预约登记排队等候,请选择YES/NO”,若客户选择YES,则将该客户信息放入队列。若客户选择NO,则返回选择菜单。如果在循环结束后,还未找到该航班,则输出:“找不到您所要订的航班!”退票业务:用一个FOR循环,将输入的要退票的信息与数组中的所有航线信息作比较,若找到与输入信息相同的航线,则输出“找到了您的航班!”,再判断输入的退票额是否符合他的订票额,若大于订票额,则输出:“您要退的票大于您订的票,退票不成功!请重新输入退票额”并返回选择菜单。若不大于,则输出“退票成功!”并输出他剩余的票数。若票数为0,则删除该客户信息。退票结束后,询问在预约等待的顾客,从队列头开始,查找与余票额相符的顾客信息,找到则输出“XX客户的座位号为X”,找不到则让他们继续等待。如果在循环结束后,还未找到该航班,则输出:“您没有该航班的票!”浏览订票情况:首先让使用者输入要查询的航线信息(日期、航班号)。然后利用线性链表的的遍历功能,输出要查询航班客户信息。4 程序测试测试数据:航线信息:终点站 航班号 星期 日期hangzhou 1 1 20120101hangzhou 22 20120102hangzhou 3 3 20120103beijing 4 1 20120101beijing 5 3 20120103tianjing 6 4 20120104tianjing 7 6 20120106hangzhou 8 1 20120101hangzhou9 3 20120103sichuan 10 2 20120102sichuan 117 20120107jiangsu 12 1 20120108jiangsu 132 20120109chongqin 14 5 20120105chongqin 15 6 20120106运行正确: 菜单输入错误:订票时找不到航班:退票时找不到航班:输入的退票额大于订票额:5 总结基本上能安全的运行,具备的功能符合题目的要求。程序写的还算简练,结构清晰,各个模块的分工和功能明确。21世纪是一个高速、快捷的年代。在这个高速发展的年代里,速度成了我们追求的目标;二是提高工作效率;三是降低成本。而且这样的系统势必让用户易学、易用,满足客户需求。因此,办公自动化的高速度、高效率、高便捷、低成本便成了我们的目的,为此开发了这个“机场售票管理系统”。 本系统可以大大简化售票,订票,查询,统计等十分繁琐的工作,各个部门相互协调,简化办公环节,提高工作效率,便于管理,各种数据可以一目了然。这次系统的设计从最开始的需求分析,可行性研究,到系统的整体设计,包括概要设计和详细设计的一个整体过程,本人真正明白了要做一个软件的难度,特别是要做一个真正可用的软件,就更难了。经过这一个星期的实践编程,我收获很多,不仅巩固了以前的知识:特别是像队列、链表、线性表、数组等等,还从同学、网上学到了很多其他知识,并且对调试更加熟悉。不过这次的编程还是比较顺利的,没有出现特别大的错误,特别是那种出一点错就要改很久的错误。这次实践过程中主要遇到的错误有以下一些:1. 一开始编的线性链表的头文件是带表头附加结点的,但是在调用存入客户的座位号的时候,是不需要表头附加结点的,不然出现的错误就是每个人的座位号错误,尤其是第一个客户,是个非常大的负数。所以为了修改该错误,就要重新编写一个不带表头附加结点的线性链表。2. 一开始将数组mainlist A,定义成局部变量。但是由于在子函数中要多次使用A,有时候又会忘记定义,所以就把A当作全局变量。3. 有时候也会出现一些不常用的小错误,就是做比较的时候还是很习惯的用“=”,“”“”等,但是在这个结构很多的程序里,很多都是字符型的,所以要记得使用STRING的功能去做比较和赋值等。4. 还有这次编程的一个难点,就是处理预约等待的客户。后来从找资料和询问同学的想法之后知道了可以用一个新的队列,在询问预约等待的客户时不符合的就放入新的队列,符合就进入订票的链表,有了思路之后完成的就能很快了。参考文献1徐孝凯,数据结构实用教程M,清华大学出版社,2006年9月2牛义德.带刺的红玫瑰.航空电子售票系统.中国电子商务,2000 3伍俊良.Visual Foxpro.闵红梅.课程设计与系统开发案例.北京:清华大学出版社,2003 4张龙.school著.晏海华译.软件工程导论 第四版.北京清华大学出版, 2003.11-13,25Judy 5c+编程-从问题分析到程序设计实验指导书.电子工业出版社附录test0.cpp:#include#include#include#includetypedef struct char name10;/客户姓名 int dingpiaoe;/订票额dengdai;/预约等待的客户typedef struct char name10;/客户姓名 int dingpiaoe;/订票额 int zuoweihao;/座位号kehu;/订到票的客户#includeQueue.h#includeLinkList.htypedef structchar zdzhan10;/终点站名 int hangbanhao;/航班号int week;/星期int day;/日期int yupiao;/余票int dinge;/成员定额LNode *pass;/订到票的客户Queue wait;/预约等待的客户ElemType; const int MaxSize=200;typedef ElemType mainlistMaxSize;mainlist A;#includea.hvoid main()int n=0,i,j,day,hangbanhao,dingpiaoe,tuipiaoe,k;char zdzhan10,name10;/终点站名while(1)printf(*欢迎使用航空客运售票服务系统*n);printf(* 请选择相关服务项目 *n);printf(* 1.插入航线 *n);printf(* 2.查询航线 *n);printf(* 3.订票业务 *n);printf(* 4.退票业务 *n);printf(* 5.浏览订票情况 *n);printf(* 0.退出 *n);printf(*n);cinj;if(j=1)coutk;cout请依次输入航线信息:终点站名、航班号、星期几、日期endl;for(i=0;iAi.zdzhan;cinAi.hangbanhao;cinAi.week;cinAi.day;Ai.yupiao=50;Ai.dinge=50;InitQueue(Ai.wait);InitList(Ai.pass);n=n+k;else if(j=2)coutzdzhan;chaxun(zdzhan,n,A);else if(j=3)cout请输入您想订票的日期、航班号、订票额dayhangbanhaodingpiaoe;dingpiao(day,hangbanhao,dingpiaoe,n,A);else if(j=4)cout请输入您想退票的日期、航班号、退票额、姓名dayhangbanhaotuipiaoename;tuipiao(day,hangbanhao,tuipiaoe,name,n,A);else if(j=5)liulan(n);else if(j=0)break;else printf(输入错误!n); a.h:void chaxun(char zdzhan10,int n,mainlist A)int i,j=0;printf(终点站名t航班号t星期几t日期 t余票n);for(i=0;in;i+)if(strcmp(Ai.zdzhan,zdzhan)=0)coutAi.zdzhantAi.hangbanhaotAi.weektAi.daytAi.yupiaoendl;void dingpiao(int day,int hangbanhao,int dingpiaoe,int n,mainlist A)int i,count;kehu temp;dengdai item;char k10;for(i=0;in;i+)if(day=Ai.day&hangbanhao=Ai.hangbanhao)cout找到您所要订的航班!endl;temp.dingpiaoe=dingpiaoe;item.dingpiaoe=dingpiaoe;;strcpy(,);if(dingpiaoe=Ai.yupiao)count=Ai.dinge-Ai.yupiao+1;printf(您的座位号为%dn,count);temp.zuoweihao=count;Ai.yupiao=Ai.yupiao-dingpiaoe;InsertList(Ai.pass,temp,0);elsecout该航班余票不足,是否预约登记排队等候,请选择YES/NOk;if(strcmp(k,YES)=0)EnQueue(Ai.wait,item);elsereturn;break;if(i=n)cout找不到您所要订的航班!endl;void tuipiao(int day,int hangbanhao,int tuipiaoe,char name,int n,mainlist A)int i,count;Queue temp;dengdai item;kehu item1;LNode *p;InitQueue(temp);for(i=0;)cout找到了您的航班!p-data.dingpiaoe)cout您要退的票大于您订的票,退票不成功!请重新输入退票额data.dingpiaoe-tuipiaoe;printf(退票成功,您还有%d张票n,count);if(p-data.dingpiaoe)p-data.dingpiaoe=count;elseDeleteList (p,item1,-1);while(!EmptyQueue(Ai.wait)item=PeekQueue(Ai.wait);if(item.dingpiaoeAi.yupiao)EnQueue(temp,OutQueue(Ai.wait);elseitem1.dingpiaoe=item.dingpiaoe;strcpy(,);item1.zuoweihao=Ai.dinge-Ai.yupiao+1;InsertList(Ai.pass,item1,0);OutQueue(Ai.wait);Ai.yupiao-=item.dingpiaoe;客户系统已成功订了item1.dingpiaoe张票,座位号为:item1.zuoweihaonext;if(i=n)cout您没有该航班的票!endl;void liulan(int n)int day,hangbanhao;coutdayhangbanhao;for(int t=0;tnext; / 保存下一个结点free(cp); cp=np; /使下一个结点成为当前结点H=NULL; /置单链表为空int LengthList (LNode *H)LNode *p=H; /用来遍历链表结点int i=0; /用来统计结点个数while(p!=NULL)i+;p=p-next;return i;bool EmptyList (LNode *H) return H=NULL;kehu GetList (LNode *H, int pos)LNode *p=H; /用来遍历链表结点int i=0; /用来统计已查找的结点个数if (pos1) cerrpos is out range!next;if (p!=NULL) return p-data; else /pos值大于表长 cerrpos is out range!,)=0)return true;elsep=p-next;return false;void TraverseList(LNode *H)LNode *p=H;while ( p!=NULL )tdata.dingpiaoenext;coutendl;bool InsertList ( LNode *&H,kehu item, int pos) LNode *newptr, *cp, *ap;if (pos-1)cout参数不合法)break; else ap=cp; cp=cp-next; else if( pos = -1 ) /在表尾插入情况while ( cp != NULL) ap=cp; cp=cp-next; else /按指定位置插入情况int i=0;while(cp!= NULL) i+; if (i=pos) break;else ap=cp;cp=cp-next; if (cp=NULL&i+1pos)cout参数不合法data=item;if (ap=NULL) /插入到表头newptr-next=H;H=newptr;else /插入到ap和cp结点之间newptr-next=cp;ap-next=newptr;return true;bool DeleteList (LNode *&H,kehu &item,int pos)LNode *cp,*ap;if (H=NULL)cerr 空表,不能删除! endl;return false; if (pos-1) cout参数不合法!)break; else ap=cp; cp=cp-next; if(cp=NULL) cout 没有相应结点可删除!next != NULL) ap=cp; cp=cp-next; else /删除指定位置结点情况int i=0;while ( cp != NULL) i+; if (i=pos) break;else ap=cp; cp=cp-next; if ( cp=NULL)cout参数不合法!data;if (ap=NULL) H=H-next; /删除表头结点else ap-next=cp-next; /删除非表头结点,即cp所指的结点free(cp); return true;Queue.h:struct Queuedengdai *queue;int MaxSize;/队列最大存储数int front;/头

温馨提示

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

评论

0/150

提交评论