飞机订票系统_第1页
飞机订票系统_第2页
飞机订票系统_第3页
飞机订票系统_第4页
飞机订票系统_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、1问题分析1.1问题描述基于目前人们外出远行频繁,为方便乘客提前买票及优化飞机航空订票服务,需要开发一个飞机订票系统,此程序就是要实现航班情况的录入,订票,退票以及航班的查询和修改等基本功能。本程序设计的题目为:飞机订票系统的设计(用链表实现)。1.2基本要求1)功能要求(1)可以录入航班情况;(2)可以查询某个航线的情况;(3)可以订票(如果该航班已经无票,可提供相关可选航班);(4)可退票并且退票后修改相关数据文件;(5)修改航班信息,当航班信息改变可修改航班数据文件;(6)规定:设计航班信息,订票信息的存储结构,设计程序完成功能。 2)输出形式有种文提示,对照相关信息以恰当的形式输出数据

2、。3)界面要求有合理的提示,对每个功能设立菜单;根据提示,可以完成相关的功能要求。4)存储结构根据系统功能要求自己设计存储结构,飞机订票系统中的相关数据要存储在数据文件中。2逻辑设计2.1全局数据类型定义飞机订票系统需要增加航班和删除航班,还有顾客订票和顾客退票,用链表相对较容易实现。在增加航班或顾客订票时只要申请一个航班结构体类型或顾客结构体类型的结点,然后赋值并将新结点插入航线链表或顾客链表中即可;在删除航班或顾客退票时只要用free()函数释放相应结点即可。所以下面定义了两种结构体类型的数据,即航班和顾客。(1)航班结构体的定义 typedef struct airline char l

3、ine_num10;/航班号 char plane_num10;/飞机号 char start_place20;/出发地 char end_place20;/目的地 int total;/座位总数 int left;/剩余座位 char start_time20;/出发时间 char arrive_time20;/抵达时间 int price;/航班票价 int discount;/票价折扣 struct airline *next;/下一个结点airline;(2)顾客结构体的定义typedef struct customer char name10;/顾客名 char id_num20;/

4、证件号码 int ticket_num;/订票数量 char line_num10;/航班号 int seat_num;/座位号 struct customer *next;/下一个结点customer;2.2抽象数据类型定义adt airline 数据对象:d=ai|1in,n0,ai属elemtype类型数据关系:r=|ai,ai+1属于d,i=1,n-1基本运算: init_airline():初始化航线链表,构造一个头结点为l的空表。 init_customer():初始化顾客链表,构造一个头结点为h的空表。insert_airline():增加航线,将新增加的航线结点插入到航线链表中

5、。insert_customer():顾客订票后,将新增加的顾客结点插入到顾客链表中。creat_airline():创建一个存有若干航线结点的非空航线链表。creat_customer():创建一个存有若干顾客结点的非空顾客链表。book():检索顾客链表找到要订的航班的相关信息,并将该顾客信息以结点方式插入到顾客链表中,订票成功返回1,否则返回0。save_airline():用fopen函数打开一个新的航线文件(如airline.txt),将航班信息存入其中,然后用fclose函数关闭此数据文件。save_customer():用fopen函数打开一个新的顾客文件(customer.tx

6、t),将顾客信息存入其中,然后用fclose函数关闭此数据文件。modefy_airline():输入航线line_num后,在航线链表中用一个指针p找出该航线结点,返回指针p,否则返回0。delete_airline():用strcmp函数按航班号在航线链表中找到该航班结点,进行删除,成功返回1,否则返回0。delete_customer():用strcmp函数按顾客名在顾客链表中查找待删除的顾客结点,进行删除,成功返回1,否则返回0。increase_air():调用insert_airline函数在航线链表中插入新增加的航班结点。delete_cus():用strcmp函数按顾客名在顾客

7、链表中找到存有该顾客信息的结点,进行删除,成功时返回1,否则返回0.print_airline():用printf函数输出航线信息,成功返回1。print_customer():用printf函数输出顾客信息,成功返回1。2.3模块划分 (1)录入航班情况模块increase_air( )调用insert_airline()函数,将新航班信息结点链入航线链表中,用save_airline()将录入的航班信息存储到数据文件中。(2)顾客订票模块int delete_cus()在主函数中,输入顾客的相关信息,用book函数调用此函数,再用此函数调用插入函数,实现顾客结点与顾客链表的连接,将顾客的信

8、息存储到数据文件中。(3)顾客退票模块int delete_cus(customer *h,airline *l,char *name) 在主函数中输入退票顾客的名字,按名字调用此函数,在此函数中进行顾客结点的删除。(4)查询航班模块int print_airline(airline *l) 在主函数中的查询航班信息时调用此函数,输出航班信息和顾客信息。(5)删除航班号模块int delete_airline(airline *h,char *line_num)在主函数的修改航线模块中,输入要删除的航班号,对航班进行删除时调用此函数,再在航线链表中移动指针进行航班结点的删除2.4模块调用关系图

9、saveinsert_ airlineincrease_airincrease_airsave_airlinedelete_customerdelete_airline录入订票退票查询退出修改主函数save_airlinebookprint_airlineprint_customersave_airline图1程序功能结构图save_airlinedelete_cus3详细设计3.1录入航班情况模块在主函数中输入航班的相关信息,调用increase_air()函数,此函数将航班指针*p指向已存在航班链表*l的头结点,利用for(;p-next!=null;p=p-next)使*p指向航线链表的

10、最后一个结点,然后调用insert_airline()函数,用strcpy函数申请一个结点用指针*q指向,将航班信息赋到新申请的结点中,(*p)-next=q;p-next!=null是airline *p=l-nextp=p-next(*p)=(*p)-next;该操作将该结点链入航线链表l中,最后用save_airline()将录入的航班信息存储到数据文件中,如图2。否插入航班信息return ok图2录入航班流程图3.2顾客订票模块在主函数中,输入顾客要订的航班号,顾客姓名,证件号码等相关信息,用book函数调用此函数;在此函数中,用指针*q顾客链表中依次向后移动直到指向最后一个结点,用

11、指针*p在航线链表中按顾客输入的航班号向后移动查找相应的航班结点,如果满足p!=null就执行strcmp(line_num,p-line_num ),若结果为0,说明在既定的航线链表中存在要订的航班,那么判断left是否大于0,若大于0,订票成功,输出座位号p-total-p-left+1调用插入函数,实现顾客结点与顾客链表的连接,若left小于0,说明座位已满,无法订票,如果strcmp得结果不为0,则航线链表中不存在此航班号,输入错误,如图3。p=l-next是q-next !=null是q=q-next否p!=null是q=q-next否line_num=p-line_num是否p-l

12、eft0插入顾客信息return errorp-left-return 0图3订票流程图3.3顾客退票模块在主函数中输入退票顾客的名字,按名字调用此模块,在此模块中进行顾客结点的删除,如图4。pr=hpr=hp!=null是否line_num=p-line_num是pr-next =p-nextreturn okpr=pr-nextreturn errorp=pr-next图4退票流程图3.4查询航班模块主函数中的查询航班信息时调用此模块,在此模块中,用指针*p指向航线链表的第一个结点,用printf函数输出航班号,飞机号,出发地,目的地等相关信息。用用指针*p指向顾客链表的第一个结点,用pr

13、intf函数输出顾客姓名,航班号,座位号,证件号码和票数,如图5。p=l-next否p!=null是输出航线信息return okp=p-next图5查询航班流程图3.5删除航班模块在主函数的修改航线模块中,选择删除航班菜单,输入要删除的航班号,然后调用int delete_airline(airline *h,char *line_num)。将航线链表的头结点赋给指针变量*pr,再将航线链表的第一个结点用*p指向,用while判断p是否为空,如果不为空,将要删除的航班号与*p指向的结点中的航班号用strcmp函数进行比较,如果比较结果为0,说明此时*p指向的结点就是要删除的航班结点,移动指针

14、,将该结点删除,返回1;如果比较结果不为0,则将指针*p后移,循环执行strcmp的比较,直到找到要删除的结点,将其删除。如果执行while循环发现p=0了,说明不存在此航班,输入错误,返回0,如图6。pr=hp=pr-nextp!=null是否strcmp(line_num,p-line_num是pr-next =p-nextreturn okreturn errorpr=pr-nextp=pr-next图6删除航班流程图4程序编码4.1调用函数部分(1) 初始化航线链表airline *init_airline()/目的是要建立一个以l为头结点的空链表,录入航班信息和增加航班后将航班结点插

15、入该链表 airline *l;/定义l为airline类型的指针 l=(airline*)malloc(sizeof(airline);/申请头结点的空间if(l=null) exit(0);l-next=null;/将头结点l的指针域置为空return l;(2) 初始化顾客链表customer * init_customer()/目的是要建立一个以l为头结点的空链表,存储带有顾客信息的结点 customer *l; /定义l为customer类型的指针 l=(customer*)malloc(sizeof(customer);/ 申请头结点的空间if(l=null) exit(0); l

16、-next=null;/将头结点l的指针域置为空 return l;(3) 创建航线单链表 int creat_airline(airline *l) airline *p=*l; /定义p为航线链表的中间指针,开始时指向头结点int i=0; char *line_num3=bjnc01,bjsh02,shgz03;char *plane_num3=plane1,plane2,plane3; char *start_place3=北京,北京,上海; char *end_place3=南昌,上海,广州; int total3=100,100,100;int left3=51,50,78; ch

17、ar *start_time3=6:00,8:00,15:00; char *arrive_time3=7:00,10:00,18:00; int price3=400,400,600; int discount3=80,90,80;/建立若干个最初的存有航班信息的结点for (i=0;i3;i+) insert_airline(&p,line_numi,plane_numi,start_placei,end_placei,totali,lefti,start_timei,arrive_timei, pricei,discounti);return ok; / 利用for循环调用insert_

18、airline函数将各个结点链接到航线链表中,执行成功时返回1。(4) 创建顾客单链表int creat_customer(customer *l) customer *p=*l;/定义p为顾客链表的中间指针,开始时指向头结点int i=0; char *name3=张三,李四,王五; char *id_num3163287602,2783987643; int ticket_num3=1,1,1; char *line_num3=bjnc01,bjsh02,shgz03; int seat_num3=1,5,10;/建立若干个最初的存有顾客信息的结点 for (i=

19、0;inext ;p=l-next;/分别定义p和q为航线链表和顾客链表的中间指针,用于查找要订的航班结点和顾客结点for(;q-next!=null;q=q-next) for(;p!=null;p=p-next )/指针后移查找所订航班的结点,找着后执行下面大括号中的操作if(strcmp(line_num,p-line_num )=0) if(p-left0)/判断left的值,只有在它大于0的情况下才能订票 printf(tt恭喜您!订票成功!n); printf(tt你的座位号是: %dn,(p-total-p-left+1);insert_customer(&q,name,id_n

20、um,ticket_num,line_num, p-total-p-left +1);p-left-;/订完票后让剩余座位数减去1return ok;else printf(tt对不起,座位已满!n);return 0;/ 这是left小于0的情况,不能订票printf(tt对不起,没有这个航班号!n);return error; / 输入的航班号不存在,返回0。(6)保存航班信息int save_airline(airline *l)/保存航线信息 file *fp_airline; char ch=#; airline *p=l-next ; char filename=d:airline

21、.txt; if(fp_airline=fopen(filename,wb)=null) printf(can not open file to write:%sn,filename); return error; for(;p!=null;p=p-next ) fprintf(fp_airline,%s,%s,%s,%s,%d,%d,%s,%s,%d,%d,%cn,p-line_num ,p-plane_num ,p-start_place ,p-end_place ,p-total ,p-left,p-start_time,p-arrive_time,p-price,p-discount,

22、ch); fclose(fp_airline); return ok;(7)保存顾客信息int save_customer(customer *l)/保存顾客信息 file *fp_customer; char ch=#; customer *p=l-next ; char filename=d:customer.txt; if(fp_customer=fopen(filename,wb)=null) printf(can not open file to write:%sn,filename); return error; for(;p!=null;p=p-next ) fprintf(fp

23、_customer,%s,%s,%d,%s,%d,%c,p-name ,p-id_num, p-ticket_num,p-line_num ,p-seat_num ,ch); fclose(fp_customer); return ok;(8)按航班号查找航班airline *modefy_airline(airline *l,char *line_num)/修改航线链表中的数据 airline *p;p=l-next ;for(;p!=null;p=p-next) if(strcmp(line_num,p-line_num )=0) p-left +; return l; printf(tt

24、没有这个航班,无法完成修改任务!n);return 0;(9)航线链表中结点的插入int insert_airline(airline *p,char *line_num,char *plane_num,char *start_place,char *end_place,int total,int left,char *start_time, char *arrive_time,int price,int discount)/在录入航班情况或增加新的航班后,将新的航班结点插入到航线链表中 airline *q;/定义q为新增加的航班结点的指针的形参q=(airline*)malloc(size

25、of(airline);/为q结点申请空间strcpy(q-line_num,line_num);strcpy(q-plane_num,plane_num);strcpy(q-start_place,start_place);strcpy(q-end_place,end_place);strcpy(q-start_time,start_time);strcpy(q-arrive_time,arrive_time);q-total=total;q-left=left;q-price=price;q-discount=discount; /以上是用strcpy函数将新增加航班的各种信息复制到q结点

26、中q-next=null;/将q结点的指针域置为空(*p)-next=q;(*p)=(*p)-next;/将指针后移return ok;(10)顾客链表中结点的插入int insert_customer(customer *p,char *name,char *id_num,int ticket,char *line_num,int seat) /这一函数的主要目的是在顾客订票后,将该顾客结点插入到顾客链表中 customer *q; /定义q为订票顾客结点的指针的形参q=(customer*)malloc(sizeof(customer); /为q结点申请空间strcpy(q-name,na

27、me);strcpy(q-id_num,id_num);strcpy(q-line_num,line_num);q-seat_num=seat;q-ticket_num=ticket;q-next=null; /以上是用strcpy函数将订票顾客的各种信息复制到q结点中(*p)-next=q;(*p)=(*p)-next;/ 将指针后移return ok;(11)航班结点的删除 int delete_airline(airline *h,char *line_num) /目的要按照某个航班号删除航班结点 airline *p,*pr;pr=h; /pr为航线链表的头结点p=pr-next ;/

28、用p作为指针对航线链表中要删除的航班结点进行查找while(p!=null) /要删除的航班存在,下面进行删除操作if(strcmp(line_num,p-line_num )=0) pr-next =p-next ; /移动指针找着要删除的航班结点printf(tt删除 %s 航班成功!n,p-line_num );return ok;pr=pr-next ;p=pr-next ; /删除操作printf(tt无此航班,无法删除!n);return error;/输入的航班号不存在,返回0(12)顾客结点的删除int delete_customer(customer *h,char *lin

29、e_num)/该操作按照待删除顾客的姓名删除该顾客结点 customer *p,*pr;pr=h; /pr为顾客链表的头结点p=pr-next;/用p作为中间指针对顾客链表中要删除的顾客结点进行查找while(p!=null) /要删除的顾客存在,下面进行删除操作 if(strcmp(line_num,p-line_num )=0) pr-next =p-next ;/移动指针找着要删除的顾客结点pr=pr-next ;p=pr-next ;/删除操作return ok;(13)在航线链表中增加航班int increase_air(airline *l, char *line_num, cha

30、r *plane_num,char *start_place,char *end_place,int total,int left,char start_time,char *arrive_time,int price,int discount) /该调用函数的目的是要在录入航班信息后调用insert_airline函数增加航班 airline *p=l-next ;for(;p-next!=null;p=p-next)/移动指针,找到最后一个结点insert_airline(&p,line_num,plane_num,start_place,end_place,total,left,star

31、t_time,arrive_time,price,discount); printf(tt增加航班 %s 成功!n,line_num);return ok;(14)顾客退票操作int delete_cus(customer *h,airline *l,char *name)/目的是按照要退票的顾客的姓名查找该顾客结点,进行删除操作 customer *p,*pr;char line_num8;pr=h; /pr指向顾客链表的头结点p=pr-next;while(p!=null) if(strcmp(name,p-name )=0) strcpy(line_num,p-line_num );l=

32、modefy_airline(l,line_num);pr-next =p-next;printf(tt顾客 %s 退票成功!n,p-name );return ok;pr=pr-next;p=pr-next;printf(tt无此顾客,无法退票!n);return error;(15)打印航线信息int print_airline(airline *l) airline *p=l-next ;/让p指向头结点的下一个结点for(;p!=null;p=p-next ) /让p从表头向表尾移动依次指向每个结点 printf(%-9s%-9s%-9s%-9s%-8d%-8d%-8s%-8s%-6d

33、%-5dn,p-line_num,p-plane_num,p-start_place,p-end_place,p-total,p-left,p-start_time,p-arrive_time,p-price,p-discount);/对p指向的结点的数据进行输出return ok;(16)打印顾客信息int print_customer(customer *l) customer *p=l-next ; /让p指向头结点的下一个结点for(;p!=null;p=p-next) printf(%-12s%-11s%-10d%-16s%-6dn,p-name,p-line_num,p-seat_

34、num,p-id_num,p-ticket_num);/ 对p指向的结点的数据进行输出 return ok;4.2主函数部分 void main() charchoice,choice2;charname10,line_num10,id_num20,plane_num10,arrive_time20,start_time20, start_place20,end_place20;int t=1,ticket_num,total,price,discount,left;airline *air=init_airline(); /初始化航线链表customer *cus=init_customer

35、(); /初始化顾客链表printf(*); printf(tt计算机系信息管理与信息系统专业课程设计n);printf(tt第二组:飞机订票系统n);printf(tt编写人:赵素燕(4082014237)n);printf(tt指导教师:劳淑蕾n);printf(*n);creat_airline(&air);/创建航线单链表creat_customer(&cus);/创建顾客单链表while(t=1) printf(nnttt 欢迎进入飞机订票系统! nn);printf(tt*-*n); printf(tt*-飞机订票系统菜单-*n);printf(tt*n); printf(tt*

36、录入信息-1 *n);printf(tt* 订 票-2 *n); printf(tt* 退 票-3 *n);printf(tt* 查询航班-4 *n);printf(tt* 修改航线-5 *n);printf(tt* 退 出-其他键 *n);printf(tt*n); printf(tt*-*n); printf(tt请选择您要的服务!: ); choice=getch();printf(%cn,choice); if(choice=1) printf(tt请输入你要增加的航班号: ); scanf(%s,line_num);printf(tt请输入飞机号:);scanf(%s,plane_n

37、um);printf(tt请输入目的地: );scanf(%s,end_place);printf(tt请输入出发地: );scanf(%s,start_place);printf(tt请输入票价: );scanf(%d,&price);printf(tt请输入折扣: );scanf(%d,&discount); printf(tt请输入起飞时间: );scanf(%s,start_time);printf(tt请输入抵达时间: );scanf(%s,arrive_time);printf(tt请输入座位总数: );scanf(%d,&total); printf(tt请输入剩余座位数: );

38、scanf(%d,&left);increase_air(air,line_num,plane_num,start_place,end_place,total,left,start_time,arrive_time,price,discount); save_airline(air);else if(choice=2) printf(tt请输入你要订的航班号: ); scanf( %s,line_num); printf(tt请输入你的证件号码: ); scanf( %s,id_num);printf(tt请输入你要订的票数: );scanf( %d,&ticket_num);printf(t

39、t请输入你的姓名: );scanf( %s,name);book(air,cus,line_num,name,id_num,ticket_num);save_customer(cus);else if(choice=3) printf(ntt请输入你的姓名: );scanf( %s,name);delete_cus(cus,air,name);save_airline(air);save_customer(cus);else if(choice=4) printf(n 航班号 飞机号 出发地名 目的地名 总票数 余票数 起飞时间 抵达时间 票价 折扣n);print_airline(air);

40、printf(nn 姓名 航班号 座位号 证件号码 票数n);print_customer(cus);else if(choice=5) int tt=1;while (tt=1) printf(tt*-航线信息修改:-*n);printf(tt*n);printf(tt* 增加航班号-a *n);printf(tt* 删除航班号-b *n); printf(tt* 退出航线修改-c *n);printf(tt*n); printf(tt请选择: );choice2=getch();printf(%cn,choice2);if(choice2=a) printf(tt请输入你要增加的航班号:

41、);scanf(%s,line_num);printf(tt请输入飞机号: );scanf(%s,plane_num);printf(tt请输入目的地: );scanf(%s,end_place);printf(tt请输入出发地: );scanf(%s,start_place);printf(tt请输入票价: );scanf(%d,&price);printf(tt请输入折扣: );scanf(%d,&discount);printf(tt请输入座位总数: );scanf(%d,&total);printf(tt请输入剩余座位数: );scanf(%d,&left);increase_air(

42、air,line_num,plane_num,start_place,end_place,total,left,start_time,arrive_time,price,discount); save_airline(air);else if (choice2=b) printf(tt请输入你要删除的航班号: );scanf(%s,line_num);delete_airline(air,line_num);delete_customer(cus,line_num);save_airline(air); else if(choice2=c) tt=0;else printf(tt你的输入有误n

43、);tt=0;else printf(tt再见!n);t=0;5 测试数据5.1合法数据的测试(1)编译链接后显示菜单,如图7。图7菜单图 (2)输入菜单号1,开始航班情况的录入,显示录入所有航班信息后的结果,如图8。图8录入信息图(3)输入菜单号2,正确输入个人相关信息看,享受订票服务,如图9。图9订票服务图(4)输入菜单号3,正确输入用户姓名,享受退票服务,如图10。图10退票服务图(5)输入菜单号4,进行航班的查询,并显示所有航班信息以及顾客信息,如图11。图11查询航班图6)输入菜单号5,弹出航线信息修改的菜单,进一步选择,如图12-14。图12增加航班图图13删除航班图图14退出航线

44、修改图7)输入菜单号0,退出飞机订票系统服务,如图15。图15退出系统服务图5.2非法数据的测试 在主菜单中输入号码错误,如图16。图16非法录入图5.3局部非法数据的测试1)选择订票服务后,输入了不存在的航班号,如图17。图17订票录入错误图2)选择退票服务后,输入错误,如图18。图18退票录入错误图3)在进行航线信息修改时,输入的要删除的航班号不存在,如图19。图19删除录入错误图4)选择服务的菜单号错误,如图20。图20菜单号录入错误图6总结数据结构不只是一门学科,也是一门很实用的学问,我们学习的目的就是学以致用。曾经上课听老师说道运用我们所学的知识编写小游戏,小系统时,我总是感觉那离我们很遥远,因为我们所学所知都是很零散的。 首先,在课程设计的过程中,我也遇到了很多令人头疼的问题:第一、怎样把系统要求实现的功能全部编到程序里面。为此我很是绞尽了脑汁,后来经同学提醒我想到了先把这个大的系统细分成几大模块,把课程设计要求中要实现的主要

温馨提示

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

评论

0/150

提交评论