为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

航空订票系统_《数据结构课程设计》

2019-01-19 4页 doc 197KB 38阅读

用户头像 个人认证

不系舟红枫

从教近30年,经验丰富,教学水平较高

举报
航空订票系统_《数据结构课程设计》 《数据结构》课程设计报告 设计题目 航空客运订票系统 专 业 软件工程 班 级 07级软件工程 目 录 1. 问题描述……………………………………………… 3 2. 系统设计……………………………………………… 3 3. 数据结构与算法描述…………………………………页码 4. 测试结果与分析………………………………………页码 5. 总...
航空订票系统_《数据结构课程设计》
《数据结构》课程 设计目 航空客运订票系统 专 业 软件 班 级 07级软件工程 目 录 1. 问题描述……………………………………………… 3 2. 系统设计……………………………………………… 3 3. 数据结构与算法描述…………………………………页码 4. 测试结果与………………………………………页码 5. 总 结…………………………………………………页码 6. 参考文献………………………………………………页码 附录 程序源代码…………………………………………页码 航空客运定票系统 1. 问题描述 1.1 基本要求 每条航线所涉及的信息有:终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需数量)。 1.2 系统能实现的操作和功能 1)查询航线:根据客户提出的终点站名输出如下信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额; 2)承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票少余订票额,则需重新询问客户要求。若需要,可登记排队候补; 3)承办退票业务:根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候的客户。 1.3 实现提示 两个客户名单可分别由线性表和队列实现。为查找方便,已订票客户的线性表应按客户姓名有序,并且,为了插入和删除方便,应以链表作为存储结构。由于预约人数无法预计,队列也应以链表作为存储结构。 2. 系统设计 2.1 设计目标 设计一航空客运订票系统,该系统记录着所有航班的基本信息(航班号、起点站、终点站、机型号、乘员定额、余票量、订票的客户名单、替补客户名单等),可以按客户提出的要求(航班号、起点站、终点站)查询相应的航班基本信息、随时查询指定航班的基本信息。可以根据客户提出的要求(航班号、订票额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票少余订票额,则需重新询问客户要求。若需要,可登记排队候补。亦可以根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候的客户。 2.2 设计思想 设计一记录所有航班基本信息的线性存储结构,该数据结构作为所有航班记录的总线,包括航班基本信息,如航班号、起点站、终点站、机型号、乘员定额、余票量以及指向各航班所对应的订票客户名单详细信息、替补客户详细信息数据结构的指针。可以通过该主线线性结构的索引号直接查找到指定航班的详细基本信息。如需查找指定航班的订票客户名单详细信息、替补客户详细信息,可通过航班号查找到主线索引所对应的航班信息,然后通过指向订票客户名单详细信息、替补客户详细信息的指针进行查询。为了查找方便起见,已订票客户的线性表应按客户姓名有序,并且,为了插入和删除方便,应以链表作为存储结构。由于预约人数无法预计,队列也应以链表作为存储结构。 2.3 系统模块划分 2.3.1 显示各航班信息 该模块实现了显示所有航班基本信息、根据指定的航班号查询该航班所有订票客户的详细信息以及根据指定的航班号查询该航班所有替补客户的详细信息。还具有返回上一级菜单的功能。 图2.3.1 显示航班信息流程图 2.3.2 查询各航班信息 该模块具有根据指定起点站、终点站以及航班号查询航班基本信息的功能。也具有返回上一级菜单的功能。 图2.3.1 查询航班信息流程图 2.3.3 编辑航班信息 该模块实现了对指定航班号进行相关编辑的功能。如新增航线、删除航线、修改航线。新增航线时需要判断新增航班号是否已经存在,如果存在,新增失败,否则予以新增。删除航线时也需判断该航班是否存在已订票客户、替补客户,如果存在,删除失败。修改菜单项具有下一级子菜单-修改航班信息子菜单,可以修改指定航班的起点站、终点站、班期、起飞时间、到达时间、机型、票价、乘员定额。当然,修改航班信息之前也需判断该航班是否存在已订票客户、替补客户,如果存在,修改失败。该子菜单具有返回上一级菜单-编辑航班信息子菜单的功能。 图2.3.3 编辑航班信息流程图 2.3.4 订票业务 该模块实现订票操作的相关功能。可根据客户指定航班号进行订票操作。如果订票还有余票,则为客户办理订票手续,输出座位号;若已满员或余票少余订票额,则需重新询问客户要求。若需要,可登记排队候补。 图2.3.4 订票业务流程图 2.3.5 退票业务 该模块实现退票操作的相关功能。根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候的客户。 图2.3.5 退票业务流程图 3、数据结构与算法描述 3.1、数据结构 航班基本信息采用线性存储结构,该数据结构作为所有航班记录的总线,包括航班基本信息,如航班号、起点站、终点站、机型号、乘员定额、余票量以及指向各航班所对应的订票客户名单详细信息、替补客户详细信息数据结构的指针。具体结构如下: Airno start ...(基本字段省略) book wait Airno start ...(基本字段省略) book wait Airno start ...(基本字段省略) book wait Airno Start ...(基本字段省略) Book wait … … … … … 3.2 总体结构设计 图3-2 总体结构设计框图 4. 测试结果与分析 4.1显示各航班信息测试 选择主控菜单中菜单项1,进入显示航班信息子菜单。选择1显示所有航班基本信息;选择2,输入航班号“CA1544”,显示出该航班所有订票客户信息。随意输入一航班号“1234”,显示出“没有该航班信息”的提示;选择3,输入航班号“CA1544”,显示出该航班所有候补客户信息。随意输入一航班号“1234”,显示出“没有该航班信息”的提示;然后选择4返回主控菜单。 4.2 查询航班信息测试 选择主控菜单中菜单项2,进入查询航班信息子菜单。选择1并输入要查询的航班号,输入航班号“CA1544”,显示出该航班基本信息,随意输入一航班号“1234”,显示出“没有该航班信息”的提示;选择2并输入要查询的起点站“合肥”, 显示出该航班基本信息,随意输入一起点站“郑州”, 显示出“没有该航班信息”的提示;选择3并输入要查询的起点站“北京”, 显示出该航班基本信息,随意输入一起点站“杭州”, 显示出“没有该航班信息”的提示;选择4返回主控菜单。 4.3 编辑航班信息测试 选择主控菜单中菜单项3,进入编辑航班信息子菜单。选择1进入新增航班操作,输入一新增航班号“KB2312”,显示出“该航班可以新增”的提示信息,然后输入该航班的其他信息,最后显示出“新增”成功的提示信息,输入一新增航班号“CA1544”,显示出“该航班一存在,不可新增”的提示信息,随后返回编辑航班信息子菜单。选择2进入删除航班操作,输入一航班号“CA1544”,显示“该航班已经存在订票客户,删除失败”的提示,输入一航班号“CA4321”,显示“是否确认删除该航班”的询问提示,点击“Y”,即可将次航班删除;选择3进入编辑航班信息操作。输入一航班号“CA1544”,显示“该航班已经存在订票客户,修改失败”的提示,输入一航班号“CA4321”,显示“允许修改”的提示,然后对该航班信息进行修改,具体修改过程不再详细叙述;选择4返回主控菜单。 4.4 订票办理测试 选择主控菜单中菜单项4,进入订票办理子菜单。输入一航班号“CA1544”,已经输入订票数量为3,显示“余票额不足,是否愿意等候替补(Y/N)”的提示。选择“是”,则进入候补队列之中,选择“否”则该次订票失败。输入一航班号“CA4321”,已经输入订票数量为3,显示“订票成功”的提示。返回主菜单,查看该航班余票额已减少3,证明订票成功。 4.5 退票办理测试 选择主控菜单中菜单项5,进入退票办理子菜单。输入退票航班号“CA1544”,显示出该航班基本信息,然后输入身份证号“666666”,姓名输入为“邢风”, 显示“没有该客户的订票信息”的提示信息,将刚才输入的身份证号更正为“345243”,然后输入退票数量为4,显示“该客户实际订票量小于退票量,退票失败”的提示信息,将其修改为3,显示“成功退票”的提示信息,随后又显示“张三已成功订票”的提示信息,这是由于“邢风”此客户的退票额可以满足候补用户“张三”的订票需求,故该系统自动为“张三”办理订票手续。 5. 总 结 从开学一个月开始着手该课程设计,历经两个多星期的努力,实现了该设计的两个版本:C语言版和MFC(可视化)版。做完后感觉受益匪浅,有很大的成就感,锻炼了数据结构方面的知识,同时也使我对VC++可视化设计过程中应用程序与数据库的交互的理解以及ADO技术的使用加深很多。在C语言版的设计过程中,我首先将该程序设计所设计到的所有数据结构大致列出,大约使用到了6个结构类型。分析明了之后就这六个结构中的之一即航班基本信息结构类型作为总线,将其他结构类型贯穿其中,随后又将其划分为六个基本模块。建立好这种数据结构,在随后的编程过程中的主要问题的解决势如破竹,几乎没有遇到什么难题。大约用了一个多星期的时间C语言版就完成了。自认为该系统目前最大的缺陷为删除操作做的不够完善,尚存在改进之处。 由于寒假的时候一直在学习VC++与数据库编程技术,对ADO访问数据库技术的使用理解很深,加上之前曾做过几个与该程序很类似的模块,所以MFC(可视化)版的编写过程也十分顺利。值得一提的是:在MFC(可视化)版的编写时遇到一个很能激发创新思维的问题,C语言版可以使用指针来指示候补客户信息节点的下一节点,并可实现FIFO队列模式,因此对候补客户的排序相当简单。但MFC版使用数据库存储候补客户信息,根本没有办法使用指针来实现指示下一后续的后部客户信息,既实现FIFO的模式。这里我使用了一种自认很不错的解决方法:在数据库替补客户信息表中增加一id字段,用来标示该客户进入该候补队列的进入的先后顺序,当删除该候补客户的时候其他客户的id字段都自动减1,当有新客户进入的时候,首先获取候补客户记录数目,然后将该新客户的id字段加1,最后插入到表中。一言之,就是使用数据表的的id字段模拟FIFO(队列模式)。 总之,受益匪浅、颇有成就感。 6. 参考文献 [1] 周靖译.《C++面向对象高级程序设计》第六版-清华大学出版社 [2] 严蔚敏、吴伟民编著.《数据结构(C语言版)》-清华大学出版社 附录 程序源代码 #include #include #include #include #include #include #include #define MAX 50 typedef struct BookInfoNode { char AirInfo[8]; char ClientName[6]; char id[8]; int TicketAcount; struct BookInfoNode *next; }*BookInfoList; typedef struct WaitClientNode { char AirInfo[8]; char ClientName[6]; char id[8]; int TicketAcount; struct WaitClientNode *index; }WaitClientNode,*Queueptr; typedef struct { Queueptr front; Queueptr rear; }WaitClientList; typedef struct { char Airno[8]; char start[6]; char end[6]; char sche[6]; char time1[8]; char time2[8]; char mode[5]; int price; int fixed; int remained; BookInfoList book; WaitClientList wait; }AirInfo; typedef struct { AirInfo s[MAX]; int acount; //记录当前航班信息数 }SSList; int selmenu(); void displayInfo(SSList L); void BookInfo(SSList L); void airinfo(SSList L); void waitInfo(SSList L); void findInfo(SSList L); void searchbyairno(SSList L); void searchbystart(SSList L); void searchbyend(SSList L); void editInfo(SSList &L); void delairinfo(SSList &L); void addairinfo(SSList &L); void updateairinfo(SSList &L); void subupdatemenu(SSList &L,int k); void bookticket(SSList &L); void withdrawticket(SSList &L); void rewrite(SSList L,ofstream &fout1,ofstream &fout2,ofstream &fout3); void main() { //声明流(对象)fin1、fin2、fin3 ifstream fin1; ifstream fin2; ifstream fin3; //打开文件(建立流与磁盘文件的关联) fin1.open("1.txt"); fin2.open("2.txt"); fin3.open("3.txt"); if(fin1.fail()) { printf("读取文件失败!"); exit(1); } if(fin2.fail()) { printf("读取文件失败!"); exit(1); } if(fin3.fail()) { printf("读取文件失败!"); exit(1); } int i=0; SSList L; L.acount=0; while(!fin1.eof()) { fin1>>L.s[i].Airno>>L.s[i].start>>L.s[i].end>>L.s[i].sche>>L.s[i].time1 >>L.s[i].time2>>L.s[i].mode>>L.s[i].price>>L.s[i].fixed >>L.s[i].remained; L.acount++; i++; } printf("航班信息成功生成!\n"); char s1[8],s2[6],s3[6]; int num; //初始化客户链表 for(i=0;inext=NULL; } //初始化替补队列 for(i=0;iindex=NULL; } while(!fin2.eof()) { fin2>>s1>>s2>>s3>>num; for(i=0;iAirInfo,s1); strcpy(p->ClientName,s2); strcpy(p->id,s3); p->TicketAcount=num; p->next=L.s[i].book->next; L.s[i].book->next=p; break; } } } printf("订票客户链表已成功生成!\n"); while(!fin3.eof()) { fin3>>s1>>s2>>s3>>num; for(i=0;iAirInfo,s1); strcpy(p->ClientName,s2); strcpy(p->id,s3); p->TicketAcount=num; p->index=NULL; L.s[i].wait.rear->index=p; L.s[i].wait.rear=p; } } } printf("替补客户队列已成功生成!\n"); printf("\n"); printf(" 欢迎使用进入航班订票系统\n"); fin1.close(); fin2.close(); fin3.close(); ofstream fout1; ofstream fout2; ofstream fout3; fout1.open("4.txt"); fout2.open("5.txt"); fout3.open("6.txt"); //文件4.txt打开失败 if(fout1.fail()) { printf("读取文件失败!"); exit(1); } //文件5.txt打开失败 if(fout2.fail()) { printf("读取文件失败!"); exit(1); } //文件6.txt打开失败 if(fout3.fail()) { printf("读取文件失败!"); exit(1); } for( ; ; ) { switch(selmenu()) { case 1: displayInfo(L); break; case 2: findInfo(L); break; case 3: editInfo(L); break; case 4: bookticket(L); break; case 5: withdrawticket(L); break; case 0: rewrite(L,fout1,fout2,fout3); return; default: break; } } fout1.close(); fout2.close(); fout3.close(); } //菜单选择函数程序 int selmenu() { int sel; printf("*****************************\n"); printf("* 航空订票客运系统 *\n"); printf("*****************************\n"); printf("* 1.显示各航线信息 *\n"); printf("* 2.查询各航线信息 *\n"); printf("* 3.编辑各航线信息 *\n"); printf("* 4.订 票 *\n"); printf("* 5.退 票 *\n"); printf("* 0.退 出 系 统 *\n"); printf("*****************************\n"); printf("请 选 择(0-5):\n"); for( ; ; ) { scanf("%d",&sel); if(sel<0||sel>5) printf("\n输入错误,重选0-5:"); else break; } return sel; } //显示航班信息、订票信息、替补信息 void displayInfo(SSList L) { int sel; for( ; ; ) { printf("================================\n"); printf("= 显示各航线信息子菜单 =\n"); printf("================================\n"); printf("= 1.显示所有航线 =\n"); printf("= 2.显示订票客户 =\n"); printf("= 3.显示等待客户 =\n"); printf("= 4.返回主菜单 =\n"); printf("================================\n"); printf("请 选 择:"); for( ; ; ) { scanf("%d",&sel); if(sel<1||sel>4) printf("\n输入错误,重选1-4:"); else break; } switch(sel) { case 1: airinfo(L); break; case 2: BookInfo(L); break; case 3: waitInfo(L); break; case 4: return; } } } void BookInfo(SSList L) { char airno[8]; printf("请输入要显示的客户信息的航班号:"); scanf("%s",airno); for(int j=0;jnext; if(p==NULL) { printf("没有该航班的客户订票信息!\n"); return; } printf("此航班订票客户信息如下:\n"); while(p!=NULL) { printf("%s %s %s %2d\n",p->AirInfo,p->ClientName,p->id,p->TicketAcount); p=p->next; } return; } } printf("该航线不存在!\n"); } void airinfo(SSList L) { for(int j=0;jindex; if(q==NULL) { printf("没有该航班的替补客户信息!\n"); return; } printf("此航班替补客户信息如下:\n"); while(q!=NULL) { printf("%s %s %s %2d\n",q->AirInfo,q->ClientName,q->id,q->TicketAcount); q=q->index; } return; } } printf("该航线不存在!\n"); } void findInfo(SSList L) { int sel; for( ; ; ) { printf("================================\n"); printf("= 航线信息查询子菜单 =\n"); printf("================================\n"); printf("= 1.按航班号查询 =\n"); printf("= 2.按起点站查询 =\n"); printf("= 3.按终点站查询 =\n"); printf("= 4.返回主菜单 =\n"); printf("================================\n"); printf("请 选 择:"); for( ; ; ) { scanf("%d",&sel); if(sel<1||sel>4) printf("\n输入错误,重选1-4:"); else break; } switch(sel) { case 1: searchbyairno(L); break; case 2: searchbystart(L); break; case 3: searchbyend(L); break; case 4: return; } } } void searchbyairno(SSList L) { int j; char airno[8]; printf("请输入要查询的航班号:"); scanf("%s",airno); for(j=0;j4) printf("\n输入错误,重选1-4:"); else break; } switch(sel) { case 1: addairinfo(L); break; case 2: delairinfo(L); break; case 3: updateairinfo(L); break; case 4: return; } } } void delairinfo(SSList &L) { int j; char ans; char airno[8]; printf("请输入要删除的航班号:"); scanf("%s",airno); for(j=0;jnext!=NULL || L.s[j].wait.front->index!=NULL) { printf("此航线已有人定过票或有人等候替补订票,不能修改航线信息!\n"); return; } printf("确定要删除该航线吗?(Y/N):\n"); cin>>ans; if(ans=='Y'||ans=='y') { //将航班号置为'000000'作为已删除标志 strcpy(L.s[j].Airno,"000000"); printf("该航线已被删除!\n"); } else { printf("尚未删除此条航线!\n"); } return; } } printf("此航线不存在!\n"); } void addairinfo(SSList &L) { int j; char airno[8],start[6],end[6],sche[6],time1[8],time2[8],mode[5]; int price,fixed; printf("请输入要新增的航班号:"); scanf("%s",airno); for(j=0;jnext=NULL; //初始化指向替补客户队列的指针 L.s[L.acount].wait.front=L.s[L.acount].wait.rear=(Queueptr)malloc(sizeof(WaitClientNode)); L.s[L.acount].wait.front->index=NULL; printf("成功新增该航线!\n"); printf("添加航线信息如下:\n"); printf("%s,%s,%s,%6s,%s,%s,%s,%4d,%d,%d\n",L.s[L.acount].Airno,L.s[L.acount].start,L.s[L.acount].end,L.s[L.acount].sche,L.s[L.acount].time1,L.s[L.acount].time2,L.s[L.acount].mode,L.s[L.acount].price,L.s[L.acount].fixed,L.s[L.acount].remained); L.acount++; } void updateairinfo(SSList &L) { int j; char airno[8]; printf("请输入要修改的航班号:"); scanf("%s",airno); for(j=0;jnext==NULL && L.s[j].wait.front->index==NULL) { printf("%s,%s,%s,%6s,%s,%s,%s,%4d,%d,%d\n",L.s[j].Airno,L.s[j].start,L.s[j].end,L.s[j].sche,L.s[j].time1,L.s[j].time2,L.s[j].mode,L.s[j].price,L.s[j].fixed,L.s[j].remained); subupdatemenu(L,j); return; } else { printf("此航线已有人定过票或有人等候替补订票,不能修改航线信息!\n"); return; } } } printf("不存在该航线!\n"); } void subupdatemenu(SSList &L,int k) { int sel; for( ; ; ) { printf("================================\n"); printf("= 修改航线信息子菜单 =\n"); printf("================================\n"); printf("= 1.修改起点站 =\n"); printf("= 2.修改终点站 =\n"); printf("= 3.修改班期 =\n"); printf("= 4.修改起飞时间 =\n"); printf("= 5.修改到达时间 =\n"); printf("= 6.修改机型 =\n"); printf("= 7.修改票价 =\n"); printf("= 8.修改乘员定额 =\n"); printf("= 9.返回编辑航线子菜单 =\n"); printf("================================\n"); printf("请 选 择:"); for( ; ; ) { scanf("%d",&sel); if(sel<1||sel>9) printf("\n输入错误,重选1-9:"); else break; } char start[6],end[6],sche[6],time1[8],time2[8],mode[5]; int price,fixed; switch(sel) { case 1: printf("请输入起点站:"); scanf("%s",start); strcpy(L.s[k].start,start); printf("起点站已修改!\n"); break; case 2: printf("请输入终点站:"); scanf("%s",end); strcpy(L.s[k].end,end); printf("终点站已修改!\n"); break; case 3: printf("请输入班期:"); scanf("%s",sche); strcpy(L.s[k].sche,sche); printf("班期已修改!\n"); break; case 4: printf("请输入起飞时间:"); scanf("%s",time1); strcpy(L.s[k].time1,time1); printf("起飞时间已修改!\n"); break; case 5: printf("请输入到达时间:"); scanf("%s",time2); strcpy(L.s[k].time2,time2); printf("到达时间已修改!\n"); break; case 6: printf("请输入机型:"); scanf("%s",mode); strcpy(L.s[k].mode,mode); printf("机型已修改!\n"); break; case 7: printf("请输入票价:"); scanf("%d",&price); L.s[k].price=price; printf("票价已修改!\n"); break; case 8: printf("请输入乘员定额:"); scanf("%d",&fixed); L.s[k].fixed=fixed; printf("乘员定额已修改!\n"); break; case 9: return; } printf("修改后该航线信息如下:\n"); printf("%s,%s,%s,%6s,%s,%s,%s,%4d,%d,%d\n",L.s[k].Airno,L.s[k].start,L.s[k].end,L.s[k].sche,L.s[k].time1,L.s[k].time2,L.s[k].mode,L.s[k].price,L.s[k].fixed,L.s[k].remained); } } void bookticket(SSList &L) { char ans; char airno[8],name[6],id[6]; int j,booknum; printf("请输入要订票的航班号:"); scanf("%s",airno); for(j=0;jAirInfo,L.s[j].Airno); strcpy(p->ClientName,name); strcpy(p->id,id); p->TicketAcount=booknum; p->next=L.s[j].book->next; L.s[j].book->next=p; L.s[j].remained-=booknum; printf("订票成功!\n"); return; } else { printf("订票量大于此航班余票量,是否愿意等候替补(Y/N):"); // scanf("%c",&ans); cin>>ans; if(ans=='Y'||ans=='y') { printf("请输入客户姓名:"); scanf("%s",name); printf("请输入客户身份证号:"); scanf("%s",id); Queueptr p; p=(Queueptr)malloc(sizeof(WaitClientNode)); strcpy(p->AirInfo,L.s[j].Airno); strcpy(p->ClientName,name); strcpy(p->id,id); p->TicketAcount=booknum; p->index=NULL; L.s[j].wait.rear->index=p; L.s[j].wait.rear=p; printf("%s %s %s %d\n",p->AirInfo,p->ClientName,p->id,p->TicketAcount); printf("已进入等候替补队列!\n"); return; } if(ans=='N'||ans=='n') { printf("订票失败!\n"); return; } } } } printf("此航班不存在!\n"); } void withdrawticket(SSList &L) { int j,withdrawnum,num; char airno[8],name[6],id[6]; printf("请输入要退票的航班号:"); scanf("%s",airno); for(j=0;jnext; q=L.s[j].book; while(p!=NULL) { if(strcmp(p->ClientName,name)==0 && strcmp(p->id,id)==0) { //将票全退 if(p->TicketAcount==withdrawnum) { //删除该客户链表信息 num=p->TicketAcount+L.s[j].remained; q->next=p->next; delete(p); printf("退票成功!\n"); //查找替补队列 Queueptr k; k=L.s[j].wait.front->index; if(k!=NULL) { //如果替补客户所需票量不大于退票量与余票量之和 if(k->TicketAcount<=num) { //第一个替补客户出队 L.s[j].wait.front->index=k->index; if(L.s[j].wait.rear==k) L.s[j].wait.front=L.s[j].wait.rear; printf("第一位替补客户\n"); printf("%s %s %s %d\n",k->AirInfo,k->ClientName,k->id,k->TicketAcount); printf("已购票成功!\n"); BookInfoList p; p=(BookInfoList)malloc(sizeof(BookInfoNode)); strcpy(p->AirInfo,k->AirInfo); strcpy(p->ClientName,k->ClientName); strcpy(p->id,k->id); p->TicketAcount=k->TicketAcount; p->next=L.s[j].book->next; L.s[j].book->next=p; L.s[j].remained=num-k->TicketAcount; delete(k); return; } else { L.s[j].remained=num; return; } } } else if(p->TicketAcountTicketAcount-=withdrawnum; num=withdrawnum+L.s[j].remained; printf("退票成功!\n"); //查找替补队列 Queueptr k; k=L.s[j].wait.front->index; if(k!=NULL) { //如果替补客户所需票量不大于退票量与余票量之和 if(k->TicketAcount<=num) { //第一个替补客户出队 L.s[j].wait.front->index=k->index; if(L.s[j].wait.rear==k) L.s[j].wait.front=L.s[j].wait.rear; printf("第一位替补客户\n"); printf("%s %s %s %d\n",k->AirInfo,k->ClientName,k->id,k->TicketAcount); printf("已购票成功!\n"); BookInfoList p; p=(BookInfoList)malloc(sizeof(BookInfoNode)); strcpy(p->AirInfo,k->AirInfo); strcpy(p->ClientName,k->ClientName); strcpy(p->id,k->id); p->TicketAcount=k->TicketAcount; p->next=L.s[j].book->next; L.s[j].book->next=p; L.s[j].remained=num-k->TicketAcount; delete(k); return; } else { L.s[j].remained=num; return; } } } } q=p; p=p->next; } printf("此客户没有订过%s航班的机票,无法退票!\n",airno); return; } } printf("没有此航线!\n"); printf("\n"); } void rewrite(SSList L,ofstream &fout1,ofstream &fout2,ofstream &fout3) { int j; for(j=0;jnext!=NULL) { BookInfoList p; p=L.s[j].book->next; fout2.setf(ios::left); while(p!=NULL) { fout2<AirInfo<ClientName<id<TicketAcount<next; } } if(L.s[j].wait.front->index!=NULL) { Queueptr q; q=L.s[j].wait.front->index; fout3.setf(ios::left); while(q!=NULL) { fout3<AirInfo<ClientName<id<TicketAcount<index; } } } } } 显示所有航班基本信息 显示该航班所有的订票客户信息 显示该航班所有的替补客户信息 显示订票客户 (航班号存在) 显示替补客户(航班号存在) 主控菜单 选择显示航班信息子菜单 返回主控菜单 选择子菜单项 查询航班信息子菜单 选择查询航班信息子菜单 编辑航线 返回主控菜单 按终点站查询 显示航班情况子菜单 选择子菜单项 返回主控菜单 按起点站查询 按航班号查询 主控菜单 选择子菜单项 编辑航班情况子菜单 选择编辑航班信息子菜单 修改起点站 新增航线 删除航线 修改航线子菜单 主控菜单 修改终点站 修改班期 修改起飞时间 修改到达时间 修改机型 修改票价 修改成员定额 返回上级菜单 满足需求 返回主控菜单 输入客户要求的航班号 询问客户是否愿意等候替补 选择订票子菜单 航班号不存在 航班号存在 票额不足 输入客户要求的订票量 主控菜单 办理订票手续 否 是 登记排队候补 订票失败 订票成功 返回主控菜单 .... 成功订票 退票成功 为满足条件的客户办理订票手续 返回主控菜单 不能满足他人订票需求 查询该航班是否有人排队候补 办理退票手续 退票量大于实际订票量 输入客户要求退票数量 输入客户订票的姓名、身份证号 航班号存在 客户信息不存在 输入客户要求的航班号 返回主控菜单 选择退票子菜单 主控菜单 候补客户节点(队列链表类型) …. 订票客户信息节点(链表类型) 退票办理 修改成员定额 修改票价 修改机型 修改到达时间 修改起飞时间 显示候补客户信息 显示订票客户信息 显示所有航班信息 按起点站查询 返回主控菜单 查询航线信息 显示航线信息 按终点站查询 编辑航班信息 订票办理 按航班号查询 航班订票系统主控菜单 编辑航班信息子菜单 修改班期 修改终点站 修改起点站 PAGE 2
/
本文档为【航空订票系统_《数据结构课程设计》】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索