C语言航空订票系统.doc_第1页
C语言航空订票系统.doc_第2页
C语言航空订票系统.doc_第3页
C语言航空订票系统.doc_第4页
C语言航空订票系统.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

这是一篇用C语言编写的航空订票系统的论文。该系统使用的是十字链表结构,包含有订票,退票,录入航班信息,查询航班余票,查询个人订票信息这些功能。内含详细论文格式及程序源代码(源代码附有详细注释)XXXXXXXXXX项目名称:航空信息管理系统 学生姓名:XXXXXX 学 号:XXXXXXXXX 班 级:XXXXXX 指导教师:XXX 2012年12月25日目录1.系统需求分析12.数据结构设计及用法说明23.详细设计和编码43.1订票模块43.2退票模块63.3录入模块83.4查询模块94.实验结果104.1主菜单界面104.2查询功能模块104.3订票功能模块114.4退票功能模块124.5录入航班信息模块125.体会13参考文献14附录:源程序清单15251.系统需求分析本次课程设计要求使用C语言编写一个航空客运订票系统程序,根据所有内容都可以只在内存中运行可得知该模拟的航空客运订票系统不需要用文件保存相关输入,运行过程中的数据。同时该航空客运订票系统要求模拟实际航空订票系统,具有查询航线,客票预订,办理退票,录入航班信息等基本功能。查询航线功能根据实际分析应该具有通过用户输入的要查询终点站名输出该终点站的终点站,航班号,飞机号,飞行日期,剩余票量的功能。订票功能应当设计能够根据用户输入的姓名和终点站,查询该终点站的余票并提示剩余票数,之后让用户输入需要订购的票数并执行相关操作。退票功能可设计成要求用户输入姓名和航班号来查找该用户的的订票信息并打印,再询问是否退票。录入功能是必要的,用来录入航班节点信息。2.数据结构设计及用法说明根据该航空信息管理系统的功能要求,应当设计菜单模块,查询模块,订票模块,退票模块,录入信息模块等几个基本模块,main函数里调用菜单模块打印选项菜单,然后用switch case 接收用户选择,并依此跳转到相应模块执行。同时,为达到能够执行一个模块后继续返回主菜单执行而不是直接退出的目的设计将菜单模块及相应子功能模块放入for死循环里,当输入5则直接退出程序。按该系统的功能分析得出存放在系统中各项数据不需要使用排序功能,因而使用链表保存数据比用顺序表和数组要便捷并且占用内存少,所以定义linklist类型,内部有data,next指针2个数据。其中定义一个flight类型的结构体用来存放实际数据:typedef struct char flightnameMAX;/终点站名 int flightid;/航班号 int date;/飞行日期 int max;/乘员定额 int left;/余票量 int wait;/排队中的票数flight;/存储 航班信息 中 实际数据 的结构体。flight结构体中left存放航班剩余票数,wait存放当前航班候处于候补状态的人缺票的总数。同时建另一条linklist_2类型保存订票人员的相关信息,包括用户姓名,用户已定票数,用户缺少票数,指向下一个节点的next指针等数据:typedef struct lnode_2 char nameMAX;/用户姓名 int num;/当前用户定的的票数int need;/当前用户缺少的票数lnode_2 *next;/指向下一个节点的指针linklist_2;/存储 用户信息 的链表。 其中need代表当前用户缺少的票数,这些票数之和存放在航班候补票数中。上述2个结构体类型构成linklist类型:typedef struct lnode_1 flight *data;/航班信息实际数据 lnode_1 *next;/指向下一个节点的指针 linklist;/存储航班信息的链表。其中data用来存放实际数据,里面包含终点站名,航班号,飞行日期,乘员定额,余票量,处于排队中的票数等等信息,next是指向下一个结点的指针。而根据系统功能实际分析发现实际算法中经常需要查询航班下对应的有哪些人员定了该航班票,因而将人员信息链表链接到航班信息链表中更为方便,在航班连表的data实际数据里放一个人员信息链表的头指针:linklist_2 *top2;,当有新人员订票则新建一个人员节点,将节点连接到这个头指针下面,这样的链表结构更方便保存和查询系统中各项数据。最后在程序开头创建链表头结点并分配内存:linklist *top=(linklist *)malloc(sizeof(linklist);程序运行过程中产生的数据依次保存在这个头结点后面的结点。 图2-1 航班链表存储结构图3.详细设计和编码 3.1订票模块进入订票模块先要求用户输入姓名,再输入需要定票的终点站名,然后遍历所有航班节点的名称信息看是否存在该终点站,如果不存在则提示没有该站点信息,请重新输入:要求重新输入终点站名,知道输入的终点站名存在,然后创建新人员节点并分配空间:linklist_2 *s=(linklist_2 *)malloc(sizeof(linklist_2);再用尾插法插入新节点:while(p-next!=NULL)/定位当前人员连表的到最后一个节点p=p-next;p-next=s;/将新节点s连接上s-next=NULL;/初始化新节点下一个节点为空并保存当前订票人的名子,输入的订票数量。当输入订票数量时进行对票数进行判断if(num0&numdata-max)要求输入的票数大于0并小于航班乘员定额,否则提示非法票数,要求重新输入。在然后对票数大小进行判断if(numdata-left),当输入票数小于航班剩余票数时,直接订票成功,当票数大于航班剩余票数时设定只能定航班剩余票数,其余票处于排队状态,当前航班排队中票数增加m-data-wait+=s-need;图3-1 订票模块结构图3.2退票模块进入退票模块先要求用户输入自己姓名,在输入要退票的航班的终点站名,然后查询整个航班链表中是否有该终点站。通过查看m是否为空判断是否有该终点站if(m=NULL),则没有找到,要求用户重新输入,如果找到则打印该用户订票信息,并提示是否确认退票:coutendlnext;while(m!=NULL)if(strcmp(flightname1,m-data-flightname)=0)break;/退出循环m=m-next;程序流程图如3-2所示:图3-2 退票模块结构图3.3录入模块录入航班信息模块先创建新航班节点并为新节点分配内存空间:linklist *n=(linklist *)malloc(sizeof(linklist);再用尾插法将新节点插入:while(m-next!=NULL)m=m-next;/使m指针指向最后一个节点m-next=n;n-next=NULL;/使新节点下一个节点为空然后初始化当前航班节点的实际数据里的保存人员信息的头指针为空:flight *a=(flight *)malloc(sizeof(flight);linklist_2 *b=(linklist_2 *)malloc(sizeof(linklist_2);n-data=a;/初始化新节点里的data数据n-data-top2=b;/初始化新节点里的data里的top2数据n-data-top2-next=NULL;/初始化top2指针next节点为空再要求用户输入航班中部分信息,包括航班名,航班号,飞行日期,乘员定额,余票量,输入之后并保存到新节点中,录入完成后提示下一步操作:coutendlendldata-flightname,flightname1)=0)break;/遍历所有航班名,找到相同的则退出循环m=m-next; if(m=NULL)当m为空时代表完全自身退出整个循环,中间没有找到同名结点,即没找到该输入的航班名,提示用户没有该航班,继续输入。当找到后,则打印该航班所有信息。图3-4 航班查询余票模块图4.实验结果4.1主菜单界面进入程序主菜单界面,打印选项菜单,让用户输入选项,根据选项进入相应模块图4-1主菜单界面图4.2查询功能模块当选择1时进入查询模块,打印选项菜单,让用户选择查询航班余票或是个人订票信息:图4-2 查询模块图当在查询模块选择1是进入余票查询模块:根据输入的终点站打印站点信息:图4-3 航班余票查询模块图当在查询模块选择2时进入个人订票信息查询模块,用户输入姓名然后根据姓名打印出订票信息:图4-4 个人信息查询成功图4.3订票功能模块当在主菜单选择2时进入订票模块,用户输入姓名和终点站名,之后提示该终点站剩余票数,让用户输入需要订的票数:图4-5 订票模块图确认订票后打印订票成功的菜单并显示详细订票信息:图4-6 订票成功窗口图4.4退票功能模块当主菜单选择3时进入退票模块,提示用户输入姓名和终点站名。2项信息核对无误则打印订票信息,询问是否确认退票:图4-7 退票模块图4.5录入航班信息模块当主菜单选择4时进入航班信息录入模块,逐个提示需要录入的信息,录入完成返回主菜单:图4-8 航班信息录入模块图5.体会XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX参考文献1 黄扬铭.数据结构.北京:科学出版社,20012 赵文静.数据结构C+语言描述.西安:西安交通大学出版社,19993 严蔚敏,吴伟明.数据结构.北京:清华大学出版社,20034 黄刘生.数据结构.北京:经济科学出版社,20005 王晓东.算法设计与分析.北京:清华大学出版社,2003附录:源程序清单 #include#include#include#include#define MAX 20using namespace std;typedef struct lnode_2 char nameMAX;/用户姓名 int num;/当前用户定的的票数int need;/当前用户缺少的票数lnode_2 *next;/指向下一个节点的指针linklist_2;/存储 用户信息 的链表 typedef struct char flightnameMAX;/终点站名 int flightid;/航班号 int date;/飞行日期 int max;/乘员定额 int left;/余票量 int wait;/排队中的票数 linklist_2 *top2;/指向已经订票的客户和候替补的客户的名单(包括姓名、订票量) 的指针 flight;/存储 航班信息 中 实际数据 的结构体 typedef struct lnode_1 flight *data;/航班信息实际数据 lnode_1 *next;/指向下一个节点的指针 linklist;/存储航班信息的链表 linklist *top=(linklist *)malloc(sizeof(linklist);/创建链表头指针并分配空间void error();/用户输入非提供选项时清除多输入的字符的函数void find();/查询函数void find1();/查询函数子模块,个人余票信息查询void find2();/查询函数子模块,航班余票查询void buy();/订票函数void menu();/菜单函数void input();/录入航班信息函数int cancel();/取消订票函数int main()top-next=NULL;/初始化头指针下一个节点为空for(int q;)/建一个for死循环,达到 执行一个模块后不退出程序可以继续选择运行下一个模块 的目的 int flag;/将while循环标志设为0 menu();/打印菜单 do cinq;flag=0; switch(q) case 1:find(); break; case 2:buy(); break; case 3:cancel(); break; case 4:input(); break; case 5:exit(0);/退出程序 default: error(); cout 无效选择,请重新输入:; flag=1;/输入的无效选择时,将while循环标志设为1,让用户继续输入 while(flag); /根据用户是否输入的是给定的选项判断是否循环 return 0; void menu()/-菜单函数- cout #欢 迎 使 用 航 空 订 票 系 统#endl;cout - endl;cout - endl; cout 1.查 询 信 息endl;cout 2.订 购 客 票endl;cout 3.退 订 客 票endl;cout 4.录 入 信 息endl;cout 5.退 出 程 序endl;cout - endl;cout - endl;cout ;void error()/-输入非给定选项处理函数- char ch;/定义一个临时字符 while(ch=getchar()!=n)/当字符为enter键时不用getchar()接收 continue; void find()/-查询函数- int q; int flag2; system(cls); /清屏 cout请选择需要的功能:; coutendl1.查询航班余票; coutendl2.查询个人订票信息; coutendlq; switch(q) case 1:find1(); break; case 2:find2(); break; default: error(); cout无效选择,请重新输入:; flag2=1; while(flag2);void find1()/-查询函数子模块,航班余票查询- char flightname1MAX;/存储输入的终点站名 int flag1; linklist *m;/m为辅助linklist型指针 system(cls); /清屏 cout #余票查询#; coutendlendlflightname1; flag1=0; m=top-next;/m指针指向头指针后的第一个节点 while(m!=NULL) if(strcmp(m-data-flightname,flightname1)=0) break;/遍历所有航班名,找到相同的则退出循环 m=m-next;/移向下一个节点 if(m=NULL)/m为空则表示没找到相同名字的节点,即没有要查询的这个终点站 error(); cout没有该站点相关信息,请重新输入:; flag1=1; else/找到该站点 coutendl该终点站信息如下:; coutendl-endl; cout站点名:data-flightnameendl; cout航班号:data-flightidendl; cout飞行日期:星期data-datedata-left0) cout剩余票数:data-leftendl; else cout票已售完,data-wait人处于侯票状态endl; cout-endl; coutendlnul); system(cls); while(flag1);void find2()/-查询函数子模块,个人余票信息查询-char name1MAX;linklist *m;linklist_2 *p;int flag=1; system(cls); /清屏cout #个人订票信息查询#;coutendlname1;m=top-next; while(m!=NULL&flag=1) p=m-data-top2-next;while(p!=NULL)if(strcmp(name1,p-name)=0)coutendl您的订票信息如下:endl; cout-endl; cout姓名:nameendl; cout*订票信息*endl; cout航班名:data-flightnameendl; cout航班号:data-flightidendl; cout已订票数量:num张need)0) coutneed张票处于候补状态endl; cout-endl; coutendlnul); system(cls);flag=0;break;p=p-next;m=m-next;if(p=NULL)coutendl没有您的订票信息;coutendlnul);system(cls);void buy()/-订票函数-char name1MAX,flightname1MAX; int flag1,flag2,num;/num存储需要定的票数linklist_2 *s=(linklist_2 *)malloc(sizeof(linklist_2);/为创建的新(人员)节点s分配空间linklist_2 *p;/人员信息链表辅助指针plinklist *m;/航班链表辅助指针m system(cls); cout #订 票#;coutendlname1;coutendlflightname1;flag1=0;m=top-next;while(m!=NULL)if(strcmp(m-data-flightname,flightname1)=0)break;/遍历所有终点站,找到同名就退出m=m-next;if(m=NULL)/未找到该终点站coutdata-top2;/辅助指针p指向该终点站下的top2指针(存放定了该终点站票的人员信息)while(p-next!=NULL)p=p-next;p-next=s;/将新节点s连接上s-next=NULL;/初始化新节点下一个节点为空strcpy(s-name,name1);/将输入的姓名存到新建的s节点里cout*站点flightname1的余票量为:data-left张*endl;/打印该站剩余票数coutnum;flag2=0;if(num0&numdata-max)/输入的票数要求大于0,小于航班乘员定额if(numdata-left)/输入票数小于航班剩余票数时m-data-left-=num;/该站点剩余票更新s-num=num;/存放定的票数s-need=0;/设定排队中票数为0system(cls); cout订票成功:endl;cout-endl;cout姓名:name1endl;cout*订票信息*endl;cout航班名:data-flightnameendl;cout航班号:data-flightidendl;cout已订票数量:num张endl;cout-endl;coutendlnul);system(cls);else/输入票数大于航班剩余票量时cout该站点当前剩余票数不足num张;coutendl按Enter键确认定下data-leftnul);system(cls);cout订票成功:endl;cout-endl;cout姓名:name1endl;cout*订票信息*endl;cout航班名:data-flightnameendl;cout航班号:data-flightidendl;cout已订票数量:data-left张endl;coutdata-left张票进入候补状态,有剩余票将会通知.endl;cout-num=m-data-left;s-need=num-m-data-left;/更新当前用户的 需要票数m-data-left=0;/航班剩余票数变为0m-data-wait+=s-need;/该航班等待中票数更新coutendlnul);system(cls);elseerror();cout无效数量,请重新输入:;flag2=1;/输入的订票数不合要求时继续循环,要求重新输入while(flag2);/根据输入的订票数是否和要求判断是否循环while(flag1);/根据输入的终点站名是否存在判断是否循环int cancel()/-退票函数-char name1MAX,flightname1MAX; int flag1,flag2=0,flag3;char a,ch;linklist_2 *p,*s;/人员信息链表辅助指针p,slinklist *m;/航班链表辅助指针msystem(cls);cout #退票#; coutendlname1;coutendlflightname1;flag1=0;m=top-next;while(m!=NULL)if(strcmp(flightname1,m-data-flightname)=0)break;/退出循环m=m-next;if(m=NULL)/没找到输入的终点站coutdata-top2-next; while(p!=NULL)if(strcmp(p-name,name1)=0)break;p=p-next;if(p=NULL)coutendl未查询到相关定票信息;coutendla;if(a=y|a=Y)return cancel();else if(a=n|a=N)system(cls);return 0;elsecout无效选择;else coutendl您的订票信息如下:endl;cout-endl;cout姓名:nameendl;cout*订票信息*endl;cout航班名:data-flightnameendl;cout航班号:data-flightidendl;cout已订票数量:num张need)0)coutneed张票处于候补状态endl;cout-endl;coutendlch;flag3=0; if(ch=y|ch=Y)m-data-left+=p-num;/航班剩余票数增加p-need=0;/当前退订用户候补中票数变为0 s=m-data-

温馨提示

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

最新文档

评论

0/150

提交评论