《数据结构课程设计报告航空售票处服务系统.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计报告航空售票处服务系统.doc(37页珍藏版)》请在三一办公上搜索。
1、淮阴工学院数据结构课程设计报告选题名称: 航空售票处服务系统 系(院): 计算机工程学院 专 业: 计算机科学与技术 班 级: 计算机1084 姓 名: 学 号: 1081308119 指导教师: 学年学期: 2009 2010 学年 第 2 学期2010年 6 月 26 日设计任务书课题名称航空售票处服务系统设计目的 本课程设计的目的是通过实践使学生经历一个小型系统开发的全过程并受到一次综合的训练,以便能较全面地理解、掌握和综合运用所学的知识去分析、解决实际问题。实验环境1、Windows Sever 2008 2、Visual C+ 6.0任务要求任务:完成航空售票处服务系统系统的分析设计
2、工作,并选用适当的开发工具完成系统的开发。要求:1、完成需求分析;2、进行概念设计;3、进行详细设计和实现;4、进行调试与操作说明;工作进度计划序号起止日期工 作 内 容2010.06.21网上资料搜索2010.6.22需求分析与概念设计2010.6.23详细设计与调试2010.06.24完成报告及PPT讲稿,答辩指导教师: 2010 年 6 月 10 日 摘要:在当今经济和商务交往日益频繁的状况下,航空服务行业正面临客流量骤增的压力。越来越多的航空公司都认识到传统的售票方法已经不能适合当今社会的需要,必须借助先进的计算机信息技术对售票服务进行管理。“航空售票系统”可以说是整个航空售票计算机信
3、息系统的中心子系统,因为航空售票最主要的功能就是为旅客提供订票退票。通过此程序能够实现添加、查询、订票、退票、修改、删除、浏览、保存等功能。实现这一课程,首先必须对一些知识点有所了解,我们是用单链表来做的。通过此程序能够实现添加、查询、订票、退票、修改、删除、浏览、保存等功能。实现这一课程,首先必须对一些知识点有所了解,我们是用单链表来做的。概要设计部分主要介绍了逻辑设计,物理设计,界面设计和系统功能模块图;源码部分给出了此程序所有的实现源代码。关键词:航空售票系统;订票退票;单链表;实现源代码目录1需求分析12 概要设计22.1总体功能结构设计22.2主要实现的方法和原理33详细设计和实现3
4、3.1添加航班信息模块33.2查询航班信息模块53.3订票函数模块93.4退票函数模块123.5修改航班信息模块163.6删除航班信息模块203.7浏览航班信息模块214调试与操作说明22总结30致谢31参考文献321需求分析本次课程设计利用C+语言来编写,其运行平台为Visual C+。1. 问题描述:航空客运订票业务活动包括:查询航线、客票预定和办理退票等。设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。2. 基本要求:任务:通过此系统可以实现如下功能:(1)录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)(2)查询:可以查询某个航线的情况(如,输
5、入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);(3)可以输入起飞抵达城市,查询飞机航班情况;(4)订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;(5)退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。(6)修改航班信息:当航班信息改变可以修改航班数据文件。3. 查询能实现的操作和功能如下:查询航线:根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情
6、况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票少于订票额,则需重新询问客户要求。若需要,可登记排队候补;承办退票业务:根据客户的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队,首先询问排在第一的客户,若所退票数满足他的要求,则为他办理订票手续,否则一次询问其他排队候补的客户。2 概要设计2.1总体功能结构设计1 航空售票处服务系统业务活动包括:添加航班信息,查询航班信息,修改航班信息,删除航班信息,订票业务,退票业务,保存,退出等,以上述业务可以借助计算机来完成。2 每条航线所涉及的信息有:航班号,航班起点站,航班终点站,航班起飞时间日期,航班飞行时间,航
7、班票数,航班剩余票数。3 作为示意系统,全部数据可以只放在内存中,但保存数据使用文件存储。4 系统能实现的操作和功能如下: 询航线:根据旅客提出的终点站名输出下列信息:航班号、起飞起点和重点,航班,订票数,等待订票客户和剩余票额。 航线信息的处理:包括添加,查询,修改,删除航线信息。 承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续。若已满员或余票额少于订票额,则需重新询问客户要求。若需要,可登记排队候补; 承办退票业务:根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所剩票
8、额能满足他的要求则为他办理订票手续,否则依次询问其它排队候补的客户。5 两个客户名单可分别由线性表和队列实现。为查找方便已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预计,队列也应以链表作存储结构。整个系统需汇总各条航线约情况登录在一张线性表上,由于航线基本不变采用顺序存储结构,并按航班有序或按终点站名有序。6 保存当前操作:将所有数据写入文件中。使下次登录时候可以使用此次操作的信息。为以后接入数据库留接口。7 密码验证部分:为以后接入数据库使用密码验证留接口。图2.1系统功能结构图2.2主要实现的方法和原理此课程设计主要使用的是链表的相关操作
9、,如创建,插入,删除等。在设计订票等待相关函数的时候用了队列的先进先出的思想来设计等待函数。先申请等待的客户在有余票的时候优先得到订票权。3详细设计和实现3.1添加航班信息模块 队列算法输入相关数据(字符型)链表图3.1添加航班信息功能模块图此模块通过链表的创建和插入的原理,把输入的相关数据储存在链表中。函数如下:/.添加航班信息函数.void NewAirsysinfo(vector *vec_Air)/输入新的航班信息Airsysinfo* pA;char yes=n;coutyes;if(yes=n|yes=N)return ;coutendl;string num,start,end,
10、time,flytime; int count;/*开始录入航班信息*/coutnum;coutendl;coutstart;coutendl;coutend;couttime; coutendl;coutflytime;coutcount;coutSetNum(num); /新航班编号pA-SetStart(start); /新航班起点站pA-SetEnd(end); /新航班终点站pA-SetTime(time); /新航班起飞日期pA-SetFlyTime(flytime); /新航班总飞行时间(小时)pA-SetCount(count); /新航班总票数pA-SetLeftCount(
11、count); /新航班剩余票数vec_Air-push_back(pA);coutendl;coutt录入新航班信息成功,请查看!endl;coutt按任意键返回主界面!;cin.get();cin.get();/*结束录入航班信息*/3.2查询航班信息模块 链表顺序遍历输入字符(选择查找方式)节点图3.2查询航班信息功能模块图通过链表的顺序遍历来查找相关节点函数如下:/.查询航班信息函数.void FindAirsysinfo(vector vec_Air)/查询航班信息system(cls);coutendl;char choice=p;while(choice!=y) system(c
12、ls); coutendl; couttt1按航班编号查询tt2.按起点站查询endl; couttt3.按终点站查询tt4.按起飞时间(日期)endl; couttt5.按飞行总时间查询t0.返回主界面endlendl; coutchoice; switch(choice) case 1:/按航班编号查询 string num; coutnum; for(int i=0;iGetNum()=num)/是否有相应的航班编号 vec_Airi-PrintInfo();/打印输出相应航班的所有信息 break; if(i=vec_Air.size() /如果找到所有记录最后还没有找到要找的航班编号
13、,/则表示没有此航班 coutt对不起,没有找到该编号的航班信息!; cin.get(); cin.get(); break; case 2:/按起点站查询 int flag=0; string start; coutstart; for(int i=0;iGetStart()=start) vec_Airi-PrintInfo(); flag=1; /说明起码找到一条相应的记录 if(flag=0)/没有此航班记录 coutt对不起,没有找到该起飞站航班信息!; cin.get(); cin.get(); break; case 3:/按终点站查询 int flag=0; string en
14、d; coutend; for(int i=0;iGetEnd()=end) vec_Airi-PrintInfo();/打印输出航班信息 flag=1;/说明起码找到一条相应的记录 if(flag=0) coutt对不起,没有找到该终点站航班信息!; cin.get(); cin.get(); break; case 4:/按起飞时间(日期) int flag=0; string time; couttime; for(int i=0;iGetTime()=time) vec_Airi-PrintInfo(); flag=1; if(flag=0) coutt对不起,没有找到该起飞日期的航班
15、信息!; cin.get(); cin.get(); break; cin.get(); cin.get(); break; case 5:/按飞行总时间查询 int flag=0; string flytime; coutflytime; for(int i=0;iGetFlyTime()=flytime) vec_Airi-PrintInfo(); flag=1; if(flag=0) coutt对不起,没有找到该终点站航班信息!; cin.get(); cin.get(); break; case 0:/返回 coutendl; coutchoice; break; 3.3订票函数模块
16、图3.3订票功能模块图输入节点相关数据,如航班数等,首先查找是否已经余票为零。若为零,则询问时候进入等候队列。若不为零则继续添加订票信息,进入订票队列。函数部分如下:/.订票函数部分.void BookAirsysinfo(vector *vec_Air)/订票vector:iterator v_Iter;/当作指针用system(cls);/清屏coutendl;string num;/航班号coutnum;for(v_Iter=vec_Air-begin();v_Iter!=vec_Air-end();v_Iter+)if(*v_Iter)-GetNum()=num)/找到相应的航班号(*
17、v_Iter)-PrintInfo();/输出航班信息break;if(v_Iter=vec_Air-end()/如果找到记录最后还没有找到此航班的记录coutm_wPerson.size()!=0)/是否有客户在等候订票for(int i=0;im_wPerson.size();i+)/如果第一个客户所订票数小于此航班所剩余的票数,则询问此客户是否要订票 if(*v_Iter)-m_wPerson0.m_nWantGetLeftCount() coutt请先核对并满足排队等候本航班的客户!GetLeftCount()-(*v_Iter)-m_wPerson0.m_nWant;char mee
18、t;/满足要求coutmeet;if(meet=y)/满足此客户的订票需求vector:iterator Iter_person; /声明一个客户类型的指针Iter_person=(*v_Iter)-m_wPerson.begin(); /指向等候队列首地址(*v_Iter)-SetLeftCount(left);coutt已经为等候本航班的客户订票!请通知该客户!m_wPerson0.m_strID; Person.m_strName=(*v_Iter)-m_wPerson0.m_strName; Person.m_nWant=(*v_Iter)-m_wPerson0.m_nWant; /把
19、已满足的客户放入已订得票的客户记录(*v_Iter)-m_haveBook.push_back(Person); /删除第一个已经满足订票的客户(*v_Iter)-m_wPerson.erase(Iter_person); /输出修改后的本航班所有信息 (*v_Iter)-PrintInfo();i-;if(*v_Iter)-m_wPerson.size()!=0)/还有客户等候本航班char wait=n;coutwait;if(wait=y)Buyer p;/声明一个要等候的客户对象coutp.m_strID;coutp.m_strName; coutp.m_nWant; (*v_Iter
20、)-m_wPerson.push_back(p);/进行排队等候coutt此客户已经进入本航班的订票排队!;else /新客户,本航班没有客户在等候排票int count;coutcount;if(*v_Iter)-GetLeftCount()count)/若余票没有了coutendl;coutt对不起,本航班已没有足够的票数endl;coutch;if(ch=y)Buyer p;coutendl;coutp.m_strID;coutendl;coutp.m_strName;p.m_nWant=count;(*v_Iter)-m_wPerson.push_back(p);coutt此客户已进入
21、等候排队订票中!endl;else coutendl;coutt您已取消了排队等候订票!endl;else/可以满足订票要求,把新客户放入已订得票的客户记录里Buyer person;coutendl;coutperson.m_strID;coutendl;coutperson.m_strName;person.m_nWant=count;int left=(*v_Iter)-GetLeftCount()-count;/ (*v_Iter)-SetLeftCount(left); /设计本航班剩余票数 (*v_Iter)-m_haveBook.push_back(person); /记录可订得
22、票的客户coutendl;coutt成功为新客户订票!endl;/coutt按任意键返回主界面;cin.get();cin.get();3.4退票函数模块图3.4退票功能模块图先遍历到当前客户的信息节点,若在订票队列里面,则删除订票队列离得节点,然后在等候队列里面的第一个节点插入订票队列节点,等候队列节点里面的后面几个节点前移。若是删除等候队列里的节点,则直接删除若其后有节点,则前移。函数如下:/.退票函数.void CancelAirsysinfo(vector *vec_Air)/取消订票(航班)vector:iterator v_Iter;/指针system(cls);coutendl;
23、string num;/航班号coutnum;for(v_Iter=vec_Air-begin();v_Iter!=vec_Air-end();v_Iter+)/begin()传回迭代器中的第一个数据地址 /end()指向迭代器中末端元素的下一个,指向一个不存在元素if(*v_Iter)-GetNum()=num)/找到相应的航班号(*v_Iter)-PrintInfo();/输出航班信息break;if(v_Iter=vec_Air-end()/如果找到最后还没找到相应的航班记录coutt对不起,暂时没有此航班号!;cin.get();cin.get();return ;char choic
24、e=n;coutt要取消订票的客户是否在等候订票队列?(是则输入y):endl;coutt要取消订票的客户已经得了票(是则输入n):;coutchoice;if(choice=y&(*v_Iter)-m_wPerson.size()/在等候订票的客户取消等候订票业务string strID;/客户IDcoutstrID;for(int i=0;im_wPerson.size();i+)/查找队列是否有此ID的客户if(*v_Iter)-m_wPersoni.m_strID=strID)/找到有此ID的客户coutt所找的客户信息如下:endl;coutt客户ID:m_wPersoni.m_st
25、rIDt姓名:m_wPersoni.m_strNamet所订票数:m_wPersoni.m_nWantendl;coutchoice;if(choice=y)/取消订票vector:iterator v;v=(*v_Iter)-m_wPerson.begin()+i;(*v_Iter)-m_wPerson.erase(v);/删除此客户所有信息coutt成功取消此客户的订票业务!PrintInfo();/输出取消订票业务后的此航班记录信息break;if(i=(*v_Iter)-m_wPerson.size()coutt对不起,没有此客户在等候订票队列!m_haveBook.size()/订票
26、的客户,不在等候队列里(即已经得到票)string strID;/客户IDcoutstrID;for(int i=0;im_haveBook.size();i+)/查找队列是否有此ID的客户if(*v_Iter)-m_haveBooki.m_strID=strID)/找到有此ID的客户coutt所找的客户信息如下:endl;coutt客户ID:m_haveBooki.m_strIDt姓名:m_haveBooki.m_strNamet所订票数:m_haveBooki.m_strNameendl;coutchoice;if(choice=y)/取消订票int left=(*v_Iter)-GetL
27、eftCount()+(*v_Iter)-m_haveBooki.m_nWant; (*v_Iter)-SetLeftCount(left);/设计剩余票数vector:iterator v;v=(*v_Iter)-m_haveBook.begin()+i;(*v_Iter)-m_haveBook.erase(v);/erase(beg,end)删除pos位置的数据,传回下一个数据的位置。即删除此客户所有信息coutt成功完成此客户的退票业务!endl;coutt修改订票业务后的本航班信息如下:PrintInfo();/输出取消订票业务后的此航班记录信息break;if(i=(*v_Iter)
28、-m_haveBook.size()coutt对不起,没有此客户在已订票客户记录里!endl;else coutt本航班没有任何客户!endl;coutendl;coutt按任意键返回主界面;cin.get();cin.get();3.5修改航班信息模块图3.5修改航班信息功能模块图使用了链表的顺序遍历。输入查找的信息字符,顺序遍历后找到节点,然后修改。函数部分如下:/.修改航班信息函数.void ModifyAirsysinfo(vector *vec_Air)/修改航班信息vector:iterator v_Iter;/相当于遍历指针system(cls);/清屏string num;co
29、utnum;for(v_Iter=vec_Air-begin();v_Iter!=vec_Air-end();v_Iter+)if(*v_Iter)-GetNum()=num)/查到相应的航班(编号)(*v_Iter)-PrintInfo();break;if(v_Iter=vec_Air-end()/找到最后没找到相应的航班coutt对不起,没有此航班!endl;coutt按任意键返回主界面!;cin.get();cin.get();return ;char ch=n;coutch;if(ch=n)return ;/取消修改航班信息char choice=p;while(choice!=y)coutendl;coutt1.修改航班编号ttt2.修改航班起飞站endl;coutt3.修改航班终点站tt4.修改航班起飞时间(日期)endl;coutt5.修改航班总飞行时间(小时)t6.修改航班总票数endl;coutt7.修改航班剩余票数tt8.修改等候订本航班票的客户endl;coutt0.返回主界面endlendl;coutchoice;switch(choice)case 1:/修改航班编号string tem;