学号姓名分工2009301500189裴仁静航班管理、美工设计2009301500185曹沁售票管理、菜单选择2009301500196王颖航班查询、售票查询航空售票系统【问题定义及实现主要功能】1.该民航的航班数目不固定,根据要求提供增加航班和取消某个航班的功能;2.可查询航班信息,程序可根据用户交互式输入的终点站名称,查询航班号、售票情况等航班信息;3.乘客信息浏览,根据航班号,列出该航班已订票的乘客名单;4.订票功能:可根据航班号为客户订票,如该航班有余票,则为客户订票;如该航班已满员,则显示响应信息;5.退票功能:可按乘客要求退出已预定的机票。提示:可以考虑采用链表创建航线表,对每个航班应包括以下信息:航班号、到达港、总座位数、余票额、乘客名单等;其中乘客名单是另外一个单链表,每个乘客的信息有:乘客姓名、证件号码、座位号等,为方便查找,可考虑按乘客姓名排序。【开发工具及运行环境】Dev-C++4.9.9.2【数据结构】注:全局变量部分。局部变量将在之后各函数中详细说明。#includestdio.h#includestdlib.h#includestring.h#includeconio.h#includewindows.h/*航班结构体*/structhb{charnum[20];//航班号;charstart[20];//出发站;charend[20];//到达站;chartime_s[20];//起飞时间;chartime_a[20];//到达时间;intfee;//票价;intsum;//总票数;intn;//剩余票数;intmark[300];//标记作用,表示该座位号是否已售出,其取值为1表示售出,为0表示未售出;};/*乘客结构体*/structck{charname[20];//乘客姓名charnum[20];//航班号charcard[20];//证件号码intn;//所购票数intseat[300];//储存所选择的座位号};/*航班结构链表结构体*/typedefstructa//航班结构链表结构体的别名{structhbh;structa*next;}hbnode;/*将航班结构体同航班结构链表结构体分两次定义是为了在下面读取文件时开辟存储空间(注:不需对结构体中的指针,即structa*next开辟内存)*//*乘客链表结构体*/typedefstructb{structckc;structb*next;}cknode;//乘客结构链表结构体的别名hbnode*hbhead=NULL,*hbi=NULL,*cq1=NULL,*prj=NULL;//hbhead全局链表头指针//hbi全局活动链表指针cknode*ckhead=NULL,*cki=NULL,*cq2=NULL;//ckhead全局链表头指针//cki全局活动链表指针/*主要的子函数:*/voidReadck();voidBuy();voidBack();intSelectMenu(inta,void(*f[])(),voidlook());voidSaveck();voidinitial_hb();voidnewhb();voidshowhb();voidn0();voidn1();voidn2();voidn3();voidn4();voidn5();voidimproveshow();voiddelhb();voidsavehb();voidmodifyhb();voidshow1();voidshow2();voidteddy();voidmainshow();voidendshow();voidshowwy();voidy0();voidy1();voidlookhb();voidshowwy1();voidt0();voidt1();voidlookck();voidcleanck();voidcleanall();voidshow3();voidclean();/*end子函数*/【算法描述】主函数/*王颖*/Main()函数系统管理购买机票退回机票航线查询乘客查询清空数据退出增加航线修改航线取消航线地址查询航班查询航班查询身份查询系统信息乘客信息航班管理/*裴仁静*/1.读取航班文件voidinitial_hb():(注明:读取航班文件和保存航班文件参考文献较多)基本思路:利用打开文件fopen函数打开航班文件、读取文件fread函数读取航班文件,利用链表进行内存空间的开辟;数据结构:FILE*fp;//航班文件位置指针hbnode*p;//起到开辟多长度为structhb字节的内存空间作用intn;//n为需开辟多少个长度为structhb字节的内存空间的个数流程图:开始in还未建立任何航班信息FalseTrue将fp指到文件末尾并计算需开辟多少个长度为structhb字节长的内存使fp重置于文件开头(fp=fopen(hb.text,r))==NULLTrue用指针p开辟长度为hbnode字节长的内存空间从文件中读取数据项p-next=NULL2132.新建航班voidnewhb():基本思路:利用链表尾接法插入新建航班数据数据结构:hbnode*p,*p1;//p1作用是在链表中找使strcmp(p1-h.num,p-h.num)==0的p流程图:Truehbhead=hbi=p;hbhead==NULLFalsehbi-next=p;hbi=hbi-next;i++关闭文件结束123开始是否创建Y用指针开辟长度为hbnode的内存空间p-next=NULL读取航班号p-h.num判断该航班是否存在N读取起始地p-h.start读取目的地p-h.end读取起飞日期p-h.time_s读取到达日期p-h.time_a读取机票金额p-h.feep-h.time_a12重新输入Y定义一个hbnode*p1,作用是在链表中找使strcmp(p1-h.num,p-h.num)==0的p1读取机票总数p-h.sump-h.sum=p-h.np-h.time_a判断总数是否大于300N给p-h.mark[k]逐一初始化p-h.time_afor(k=0;kp-h.sum;k++)p-h.mark[k]=0;hbhead==NULLhbhead=hbi=p;FalseTruehbi-next=p;hbi=hbi-next;是否继续创建N结束2Y重新输入3修改航班(第二版)voidmodifyhb():基本思路:利用指针p寻找需修改的航班号,如已售票不能修改。修改航班第一版利用带形参的菜单选择函数,后改为利用全局变量hbnode*prj。与第一版相比本版的好处在于:1.函数之间传递时不需要形参;2.不需要另写一带形参的菜单选择函数intSelectMenuprj(inta,void(*f[])(),voidlook()),只需利菜单选择函数intSelectMenu(inta,void(*f[])(),voidlook()),这样使总代码结构显得更加紧凑。(在流程图后另附第一版)数据结构:hbnode*prj//全局变量hbnode*p=hbhead;//定义指针p指向链表头charm[20];//定义char类型的字符串变量,存放输入的航班号流程图:开始判断p==hbhead还未建立任何航班信息TrueFalse输入要修改的航班mp!=NULLTrue判断p-h.num是否等于mFalse该航班已售票不能修改将找到的p指针赋值给全局指针变量prj调用菜单函数SelectMenu(6,n,improveshow);修改成功结束True另附修改航班(第一版):未成功目前仍处在调试期调用函数:voidn0(hbnode*p0)//以调用修改起始地函数为例说明intSelectMenuprj(inta,void(*f[])(),voidlook(),hbnode*p1)//带形参的菜单选择函数voidmodifyhb()//和修改航班(第一版)类似只在调用选择函数时稍作修改函数部分源代码:voidn0(hbnode*p0){printf(\n请修改起始地\n\n);scanf(%s,p0-h.start);fflush(stdin);}voidmodifyhb(){intchoice=0;look();printf(Pleasemakeachoice:\n);scanf(%d,&choice);fflush(stdin);while(choice=0&&choicea){(*f[choice])(p1);look();printf(Pleasemakeachoice:\n);scanf(%d,&choice);fflush(stdin);}if(choice==a)return0;}说明:voidmodifyhb()函数中的SelectMenuprj(6,n,improveshow,p)即调用带形参的菜单选择函数,指针变量p即指向要修改的航班,则形参p1也指向要修改的航班。接着(*f[choice])(p1),以调用voidn0(hbnode*p0)为例p0指向要修改的航班,在voidn0(hbnode*p0)中给航班的起始地重赋值,即完成修改。错误提示:错误提示:toomanyargumentstofunction。由于时间关系,该错误未完全想明白。4.取消航班voiddelhb():基本思路:删除链表单元开始输入要取消的航班mP是否为NULL还未建立任何航班信息y=0判断航班是否开始售票False该航班开始售票不能取消y=0strcmp(p-h.num,m)!=0且p-next!=NULLp1=p;p=p-nextFalseTrueTrue判断p-h.num和m是否相等P==hbheadTrueFalsep1-next=p-nexthbhead=p-next123123释放p的内存y=1y=0取消成功取消失败结束5.保存航班文件voidsavehb():基本思路:利用打开文件fopen函数打开航班文件、读写文件fwrite函数写入航班文件流程图:开始打开航班文件用只写类型p!=NULLTrue读入文件p=p-next关闭文件结束用只写类型打开时将原文件删除然后重新建立一个新文件界面设计/*裴仁静*/基本思路:利用printf部分界面截图、源代码举例:A.进入系统界面:B.结束画面源代码:乘客信息链表/*曹沁*/此部分实现功能:1、乘客买票;2、乘客退票。函数voidBuy();/*乘客购买机票*/voidBack();/*乘客退票*/voidReadck();/*从文件将乘客信息链表读入内存*/voidSaveck;/*将乘客信息链表由内存保存到文件*/订票函数:函数原型voidBuy();实现功能:1、读入并保存乘客购买机票航班号、机票数、姓名、证件号码、座位号等信息;2、机票航班号、机票数选项有提示报错功能;3、乘客自行选择座位号。界面效果:函数功能模块:模块算法描述、功能及说明:SectionA:charbuy_num[20];//购买航班号intticket;//购买票数intj;//标记作用voidBuy()A:航班号,机票数B:乘客基本信息C:选择座位输入要购买的航班号及机票数,判断航班是否存在、机票数是否足够。若满足,则进入B;若不满足,则出现提示信息,结束函数。SectionB:录入乘客信息。若乘客链表存在(从外存读入),则将新建的链表链接到原链表的尾部;若乘客链表不存在,则乘客链表的头指针指向该链表。SectionC:intseat_num=0;//选择座位号inti=-1;//控制选择次数,正确选择ticket次intk=0;//输出座位号乘客自行选择座位号。输入错误或座位号已售出则提示重新输入。Buy()SectionA:开始输入购买航班号buy_num指向航班链表的指针不为空cq1!=NUL