1、1课程设计报告课程名称: 数据结构 设计题目: 航空客运订票系统 院 系: 班 级: 设 计 者: 学 号: 指导教师: 2课程设计报告一、题目分析主要功能包括:1、录入:可以录入航班情况(如:输入航班号,飞机编号,查询起降时间,起飞抵达城市,剩余的票数) 。2、查询:可以查询某个航线的情况(如:输入航班号,飞机编号,查询起降时间,起飞抵达城市,剩余的票数) ;可以输入降落城市及航班号,查询飞机航班情况。3、订票:根据客户要求(航班号、订票数量)查询该航班的余票数情况,若有余票,则可以订票;若余票数不足,则需要重新询问客户要求,否则不能完成订票。4、退票:可退票,根据客户的姓名,订票数量查询是
2、否为真实信息,为客户办理退票。5、退出系统。二、总体设计拿到课程设计题目后,经过仔细的研究,还是决定做航空客运订票系统,它可以使自己很好的巩固在数据结构当中所学到的知识以及各算法,做到学以致用,并在运用的基础上,进一步去创新。1、 主程序流程图及其说明主程序的流程图如下图所示:航空客运订票系统1、录入航班信息2、查询航班信息3、预 定机 票4、退 定机 票5、退 出系 统利用 switch 语句,用户只需根据自己的需要,输入相应的命令即可达到效果。例如,若需要查询航班信息时,则输入 2;需要为客户预定机票时,则输入 4;若需要退出系统,则输入 5 即可。2、子程序流程图及其说明3、录入航班信息
3、的流程图及其说明:主要功能是将新的航班信息写入新建链表中,然后把新链表与储存航班的链表合并,得到新的航班信息,实现对新航班的增加。录入航班信息的流程图如下图所示:1、录入航班信息建立新的链表新增航班信息对新链表置空,订票表头初始化1.返回菜单 2.继续操作、查询航班信息流程图及其说明:先输入所要查找的航班,可通过降落城市查询或根据航班号查询。然后判断该航班是否存在,若存在,则输出相关的航班信息;若不存在,则提示该航班不存在。查询航班信息的流程图如下图所示:2、查询航班信息1、通过降落城市查询 2、通过航班号查询判断航班是否存在显示该航班信息返回主菜单、订票、退票流程图及其说明:4订票说明:先输
4、入降落城市,找到该航班并显示该航班信息,若找不到则提示不存在该航班。再通过需要订票的数量来判断余票量是否足够。若足够则录入客户姓名,完成订票;若余票不足,则提示是否要取消并重新订票。订票的流程图如下图所示:3、订票功能是否有该航班输入所需的订票信息(客户姓名及要订的票数)余票是否充足订票成功返回主菜单退票说明:先通过输入客户的姓名及订票数目,确定是否存在该客户信息,若符合条件,则完成退票;若无该客户信息,则提示该航班没有人订票或者是该客户没有订该航班的票。退票的流程图如下图所示:54、退票功能是否有该航班输入客户姓名及订票数客户信息是否正确退票成功返回主菜单三、详细设计1、数据结构设计type
5、def struct booked /单链表char name115; /已订票客户姓名int number1; /已订票数量struct booked *next1;booked,*Link;typedef struct book /单链表char name215; /预定票客户姓名int number2; /要订票数量struct book *next2; /下一个链队结点指针book,*Qptr;6typedef structQptr front; /单链队头结点Qptr rear; /单链队尾结点linkQueue;2、函数说明(1) 主函数main()允许用户通过菜单进行功能选择,使
6、用相应的功能代码来调用对应的函数功能。(2) 其他各功能函数包括函数名 功能void enter() 录入航班信息 void refer() 查询航线信息int InsertLinklist(Linklist 声明录入航班信息 void cityrefer(); 通过降落城市查询void flynumrefer(); 通过航班号查询 void reserve(); 订票 void refund(); 退票 3、分工函数设计(截图分析及相关说明)、主函数void main()H=(struct booked*)malloc(sizeof(booked);Q.front=Q.rear=(Qptr)
7、malloc(sizeof(book); /申请空间并初始化队列InitLinklist();int n;do /打印主界面printf(“t+nn“);7printf(“t*-1. 录入航班信息 *nn“);printf(“t*-2. 查询航班信息 *nn“);printf(“t*-3. 订票功能 *nn“);printf(“t*-4. 退票功能 *nn“);printf(“t*-5. 退出 *nn“);printf(“t+n“);printf(“t 请选择:“);scanf(“%d“,printf(“n“);switch(n)case 1:enter(); /录入功能break;case
8、2:refer(); /查询功能break;case 3:reserve(); /订票功能break;case 4:refund(); /退票功能break;case 5:printf(“【感谢使用航空客运订票系统】n“);break; /退出while(n=1 |n=2|n=3|n=4);运行结果 :82 、录入航班信息void enter() /录入航班信息int j=1,m;doif(!InsertLinklist(L) /向其中加入航班信息printf(“内存已满n“);/向链表中加一结点printf(“t 是否要输入下一个航线记录?n“);printf(“t 是请输入 1n“);pr
9、intf(“t 否请输入 2n“);scanf(“%d“, /选择是否输入下一条航线while(m=1);Linklist InitLinklist()L=(Linklist)malloc(sizeof(fly);if(!L)L-next=NULL; /建立一个带有头结点的单链表return(L);int InsertLinklist(Linklist p=(Linklist)malloc(sizeof(fly); /为一个新的结点分配空间printf(“t 请依次输入下面几项内容:nn“);printf(“航班号:“);scanf(“%s“,p-flynum);printf(“飞机编号:“)
10、;scanf(“%s“,p-plane);printf(“起飞城市:“);scanf(“%s“,p-city1);printf(“降落城市:“);scanf(“%s“,p-city);printf(“飞行日期:“);scanf(“%s“,p-date);printf(“剩余的票数:“);scanf(“%d“,p-booked=(booked*)malloc(sizeof(booked); /申请存储空间p-book=Q.front=Q.rear=(Qptr)malloc(sizeof(book); /申请存储空间9p-next=L-next; L-next=p;return 1;运行结果 :3
11、 、查询航班信息通过降落城市查询void cityrefer() /通过降落城市查询char c15;Linklist p=L;int m;printf(“t 请输入你要查询的降落城市:“);scanf(“%s“,c);dop=p-next;if(p)if(stricmp(*p).city,c)=0)printf(“t 航班信息:n“);printf(“t 航班号:%sn“,p-flynum);printf(“t 飞机编号:%sn“,p-plane);printf(“t 起飞城市:%sn“,p-city1);printf(“t 降落城市:%sn“,p-city);printf(“t 飞行日期:
12、%sn“,p-date);10printf(“t 剩余的票数:%dn“,p-rest);break;elseprintf(“t【对不起,没有您要查找的降落城市.】 nn“);m=0;while(m!=0);运行结果 :11通过航班号查询void flynumrefer() /通过航班号查询char c15;Linklist p=L;int m;printf(“t 请输入你要查询的航班号:“);scanf(“%s“,c);dop=p-next;if(p)if(strcmpi(*p).flynum,c)=0)printf(“t 航班信息:n“);printf(“t 航班号:%sn“,p-flynu
13、m);printf(“t 飞机编号:%sn“,p-plane);printf(“t 起飞城市:%sn“,p-city1);printf(“t 降落城市:%sn“,p-city);printf(“t 飞行日期:%sn“,p-date);printf(“t 剩余的票数:%dn“,p-rest);break;elseprintf(“t【对不起,没有您要查找的航班.】n“);m=0;while(m!=0);12运行结果 :四、源程序代码#include#include#include13#includetypedef struct booked /单链表char name115; /已订票客户姓名in
14、t number1; /已订票数量struct booked *next1;booked,*Link;typedef struct book /单链表char name215; /预定票客户姓名int number2; /要订票数量struct book *next2; /下一个链队结点指针book,*Qptr;typedef structQptr front; /单链队头结点Qptr rear; /单链队尾结点linkQueue;typedef struct fly /创建一个航线的结构体char flynum15; /航班号char plane15; /飞机编号char date12; /
15、飞行日期char city115; /起飞城市char city15; /降落城市int rest; /剩余的票数struct fly *next; /指向下一个链结点的指针struct booked *booked; /定义一个指向已订票客户的头结点指针14struct book *book;fly,*Linklist;struct fly *L=NULL; /定义全局变量struct booked *H; /为已订票客户链队来申请空间linkQueue Q; /linkQueue 类型的来申请空间Linklist InitLinklist(); /声明int InsertLinklist(
16、Linklist /声明录入航班信息void cityrefer(); /通过降落城市查询void flynumrefer(); /通过航班号查询void enter(); /录入信息void refer(); /查询信息void reserve(); /订票void refund(); /退票void main()H=(struct booked*)malloc(sizeof(booked);Q.front=Q.rear=(Qptr)malloc(sizeof(book); /申请空间并初始化队列InitLinklist();int n;do /打印主界面printf(“t+nn“);pri
17、ntf(“t*-1. 录入航班信息 *nn“);printf(“t*-2. 查询航班信息 *nn“);printf(“t*-3. 订票功能 *nn“);printf(“t*-4. 退票功能 *nn“);printf(“t*-5. 退出 *nn“);printf(“t+n“);15printf(“t 请选择:“);scanf(“%d“,printf(“n“);switch(n)case 1:enter(); /录入功能break;case 2:refer(); /查询功能break;case 3:reserve(); /订票功能break;case 4:refund(); /退票功能break;
18、case 5:printf(“【感谢使用航空客运订票系统】n“);break; /退出while(n=1 |n=2|n=3|n=4);void enter() /录入航班信息int j=1,m;doif(!InsertLinklist(L) /向其中加入航班信息printf(“内存已满n“);/向链表中加一结点printf(“t 是否要输入下一个航线记录?n“);printf(“t 是请输入 1n“);16printf(“t 否请输入 2n“);scanf(“%d“, /选择是否输入下一条航线while(m=1);Linklist InitLinklist()L=(Linklist)mallo
19、c(sizeof(fly);if(!L)L-next=NULL; /建立一个带有头结点的单链表return(L);int InsertLinklist(Linklist p=(Linklist)malloc(sizeof(fly); /为一个新的结点分配空间printf(“t 请依次输入下面几项内容:nn“);printf(“航班号:“);scanf(“%s“,p-flynum);printf(“飞机编号:“);scanf(“%s“,p-plane);printf(“起飞城市:“);scanf(“%s“,p-city1);printf(“降落城市:“);scanf(“%s“,p-city);p
20、rintf(“飞行日期:“);scanf(“%s“,p-date);printf(“剩余的票数:“);scanf(“%d“,17p-booked=(booked*)malloc(sizeof(booked); /申请存储空间p-book=Q.front=Q.rear=(Qptr)malloc(sizeof(book); /申请存储空间p-next=L-next; L-next=p;return 1;void refer() /查询航线信息int n;printf(“t 查 找 航 线 信 息 n“);printf(“t+nn“);printf(“t*-1. 通过降落城市查询 *nn“);pri
21、ntf(“t*-2. 通过航班号查询 *nn“);printf(“t+n“);printf(“t 请选择:“);scanf(“%d“,switch(n)case 1:cityrefer();break;case 2:flynumrefer();break;default:break;void cityrefer() /通过降落城市查询char c15;18Linklist p=L;int m;printf(“t 请输入你要查询的降落城市:“);scanf(“%s“,c);dop=p-next;if(p)if(stricmp(*p).city,c)=0)printf(“t 航班信息:n“);pr
22、intf(“t 航班号:%sn“,p-flynum);printf(“t 飞机编号:%sn“,p-plane);printf(“t 起飞城市:%sn“,p-city1);printf(“t 降落城市:%sn“,p-city);printf(“t 飞行日期:%sn“,p-date);printf(“t 剩余的票数:%dn“,p-rest);break;elseprintf(“t【对不起,没有您要查找的降落城市.】 nn“);m=0;while(m!=0);void flynumrefer() /通过航班号查询19char c15;Linklist p=L;int m;printf(“t 请输入你
23、要查询的航班号:“);scanf(“%s“,c);dop=p-next;if(p)if(strcmpi(*p).flynum,c)=0)printf(“t 航班信息:n“);printf(“t 航班号:%sn“,p-flynum);printf(“t 飞机编号:%sn“,p-plane);printf(“t 起飞城市:%sn“,p-city1);printf(“t 降落城市:%sn“,p-city);printf(“t 飞行日期:%sn“,p-date);printf(“t 剩余的票数:%dn“,p-rest);break;elseprintf(“t【对不起,没有您要查找的航班.】n“);m=
24、0;while(m!=0);20void reserve() /订票Linklist p=L; /Linklist 类型的 L 来指向链表头booked *h=H,*h1; /booked 定义客户的结点,以便插入与删除char c15;int m=1,ticket;int bookedt=0,bookt=0;printf(“请输入降落城市:“);scanf(“%s“,c);p=L-next;if(p)do /查找是否有该航班if(!p)printf(“【对不起,没有您要查找的航班.】nn“);return;m=stricmp(p-city,c);/通过比较来判定if(m=0)printf(“
25、t 航班信息:n“);printf(“t 航班号:%sn“,p-flynum);printf(“t 飞机编号:%sn“,p-plane);printf(“t 起飞城市:%sn“,p-city1);printf(“t 降落城市:%sn“,p-city);printf(“t 飞行日期:%sn“,p-date);printf(“t 剩余的票数:%dn“,p-rest);21elsep=p-next; /促使循环while(m!=0);if(m=0) /当有该航班时,进行订票doprintf(“n 请输入您要订的票数:n“);scanf(“%d“,if(ticketrest)h=p-booked;if
26、(h)h1=h;h=h-next1;h=(struct booked*)malloc(sizeof(booked);printf(“请输入客户姓名:n“);scanf(“%s“,h-name1);h-number1=ticket;h-next1=h1-next1;h1-next1=h;p-rest=p-rest-ticket;printf(“【订票成功!】n“);m=2;else /当余票量不足时printf(“剩余的票数:%dn“,p-rest);22printf(“对不起,剩余票%d 张不足,不能完成订票.n“,p-rest);printf(“是否需要重新订票?n“);printf(“需要
27、请输入 1 不需要请输入 2:n“);scanf(“%d“,while(m=1);void refund() /退票Linklist p=L;booked *h=H,*h1,*h2;char c15,name315;int m=1,ticket; printf(“请输入航班号:“);scanf(“%s“,c);p=L-next;if(p)doif(!p)printf(“n 对不起,没有你要查找的航班.n“);if(stricmp(*p).flynum,c)=0) /比较航班号printf(“t 航班信息:n“);23printf(“t 航班号:%sn“,p-flynum);printf(“t
28、飞机编号:%sn“,p-plane);printf(“t 起飞城市:%sn“,p-city1);printf(“t 降落城市:%sn“,p-city);printf(“t 飞行日期:%sn“,p-date);printf(“t 剩余的票数:%dn“,p-rest);m=0;else p=p-next;while(m!=0);if(m=0)h=p-booked;if(h)printf(“请输入客户姓名:“);scanf(“%s“,name3);printf(“请输入该客户订的票数:“);scanf(“%d“,h1=h;h=h-next1;if(stricmp(h-name1,name3)=0 h
29、2=h;h1-next1=h-next1;free(h2);printf(“【退票成功!】n“);24elseprintf(“对不起,该航班没有人订票或者是该客户没有订该航班的票.n“);printf(“是否要重新查找并取消订票?n“);printf(“需要请输入 1 否则请输入 2n“);scanf(“%d“,while(m=1);五、程序结果1、调试分析编成后出现了许多错误,在经过调试后发现有很多事语句上的失误,还有 switch 语句中漏写了 break 语句,switch 语句作为选择语句,在此程序中,要实现其选择执行的功能,在每个选择条件后必须有 break 语句跟随,否则程序将运行
30、错误,经检查漏洞后加以改正。在调试无误后,运行程序的过程中也出现了许多问题,有些功能无法实现。在经过反复检查以及在同学的指导帮助下,也都一一改正了,从中也发现了自己对许多语法运用的不熟练,也都弄懂了。我们的程序最大的缺陷是没有读入和读出文件,刚开始写了读入文件成功了,可是写读出文件却除了问题,由于时间有限,就没有完成该功能。2、算法的改进设想在实际的操作当中,我们不是这样按部就班的操作,因此可以根据实际的需要没在窗体中进行操作,这样就可以与现实更接近一步了。25在查询航线的时候,可以改进更多的查找航班的功能,而不是单一的靠目的地、航班号查询。这样就可以使查找信息更加方便、更加全面。我们还可以增加修改航班信息等其他功能,让该系统功能更加全面,使用更加方便。六、总结经过这几天的课程设计,我认识到把课堂上老师讲的知识运用到实际中的重要性。我这次课程设计的题目是航空客运订票系统,在开始阶段,根本无从下手,后来通过查阅了一些相关资料和同学的帮助指导,最终完成了整个程序的设计。通过这次课程设计,我对数据结构的各种算法、C 语言中的结构体定义、链表等知识有了进一步的理解,对流程图的画法更加熟练,对程序的开发思路有了一定的理解,我想这对以后的学习和工作都会有很大的帮助,更使我意识到了学习数据结构与 C 语言的重要性,今后也会根据自己不足的地方进行巩固和学习。非常感谢老师的帮助!