飞机订票系统.doc
目 录目录1摘要21 设计目的32 设计要求33 设计内容43.1 预备知识43.2设计思路43.3 总体设计43.4各模块部分53.4.1录入航班信息模块53.4.2 订票模块63.4.3 退票模块83.4.4 航班信息查询模块93.5设计结果验证9总结与致谢13参考文献14附录15摘 要 随着经济的快速发展以及生活水平的提高,飞机已经成为了人们出行常用的交通工具之一,而作为航空公司,飞机订票系统必不可少,为了适应快速发展的需求,管理大量数据,有效地稳定的管理航空公司,我运用所学知识,编程开发了一套飞机订票系统,此系统虽然简单,却可以完成基本功能。 其具体工作流程为:首先我们可以录入航班信息,包括班号、飞机号、目的地、订票数、余票数共5项。顾客到达营业网点后向航空公司营业员提供出姓名和航班号,营业员根据以上信息,操作软件,查询该航线的订票情况, 若有余票, 则为客户办理订票手续, 分配给客户一个座位号, 然后将新客户的信息添加, 并修改该航线的订票数和余票数。若无余票, 则输出客满信息。当航班信息改变时可以修改航班信息。进一步可实现如果该航班已经无票,可以提供相关可选择航班信息。可以提供退票业务。本设计采用VC+6.0完成编程。关键词:系统;飞机订票;退票;航班;1 设计目的本次课程设计的飞机订票系统,要求实现如下功能: 1) 录入航线信息:每条航线信息包括航班号、飞机号、目的地、订票数、余票数共5项。假设现在有3条航线, 目的地分别是北京, 上海, 广州, 飞机上可乘坐100人( 即初始订票数为0, 余票数为100)。 2) 订票业务:客户信息包括姓名, 航班号, 座位号(初始为0)。有新客户订票时, 先输入客户的姓名和他提出的航班号, 查询该航线的订票情况, 若有余票, 则为客户办理订票手续, 分配给客户一个座位号, 然后将新客户的信息添加, 并修改该航线的订票数和余票数。若无余票, 则输出客满信息。进一步可实现如果该航班已经无票,可以提供相关可选择航班信息。 3) 退票业务:根据客户提出的航班号, 办理退票,删除该客户的信息, 并修改文件相应航线的订票数和余票数。 4) 修改航班信息:当航班信息改变可以修改。2 设计要求1根据已知设计要求分析飞机订票系统设计功能,确定实现飞机订票系统设计的方法,画出流程图,编写实现程序,并进行调试,完成系统软件设计。2基本教学要求:每人一台计算机,计算机安装VC、visio等软件。3 设计内容3.1 预备知识线性链表的定义:航班的信息:航班的情况存储结构采用单链表,每个元素表示一个航班的情况,包括航班号、飞机号、目的地、订票数、余票数五个数据项:航班号飞机号目的地订票数余票数字符串字符串字符串整数(int)整数(int)单链表如下: 每个结点包括数据域和指针域:数据域指针域3.2设计思路本系统设计主要采用线性链表的定义、插入、删除等基本操作。这是数据结构里学到的内容。当然还需要编制初始化、建立数据文件、数据文件保存、增加航班信息、订票、退票业务等内容。包括录入信息模块,订票模块,退票模块,查询航班,修改航班模块等。3.3 总体设计 本系统为完成设计要求的功能必须包括录入,订票,退票,修改航班信息业务。其总设计流程图如下所示。图1 总设计流程图3.4各模块部分 3.4.1录入航班信息模块该步骤在实际生活中主要内容由航空公司完成,录入航班信息,然后保存,以供顾客订票,退票,查询使用。录入的信息包括每条航线信息包括航班号、飞机号、目的地、订票数、余票数共5项。假设现在有3条航线, 目的地分别是北京, 上海, 广州, 飞机上可乘坐100人( 即初始订票数为0, 余票数为100)。图2 录入航班信息具体定义程序:typedef struct flightnodechar flight_num10; /航班号char start_num10; /飞机号char aim_place10; /目的地char dingpiao20;/订票数char yupiao20; /余票数struct flightnode *next;/指向下一个结点flightnode;/航班结点录入航班信息即用到了线性链表的插入,链表的插入:void add_flight(flightnode *&h)调用void insert_flight(flightnode *&h,char* flight_num,char* start_num, char* aim_place, char* dingpiao, char* yupiao)函数,将新航班结点插入航班链表中。3.4.2 订票模块在这个函数中首先调用了search函数查找需要订票的航班。运用if语句实现订票时的多种情况:订票数输入不正确、飞机票数不足等情况。订票成功时运用si.count=si.count-n;将已被订的机票数减去,以显示新的即时航班信息图3 订票模块(1)客户的资料:为了便于插入、删除和修改,其采用单链表存储结构,每个数据元素包括姓名、航班号和座位号三个个数据项:姓名航班号座位号字符串字符串整数(int)每个结点包括数据域和指针域:数据域指针域C语言描述如下:typedef struct passengernode/定义客户资料结点 char name20; /姓名char flight_num10;/航班号 int id_place; /座位号 struct passengernode *next;/指向下一个结点passengernode; (2)客户链表:每个数据元素包括头指针和尾指针两个数据项:每个结点包括两个指针域:头指针域尾指针域C语言描述如下:typedef struct passengerList passengernode *head; passengernode *rear;passengerList; (3)链表的插入int book(flightnode *&h,passengerList *&PList)函数调用int insert_passenger(passengernode *&h,char *name,char *ID_num,char *flight_num, int id_place)函数,将新客户结点插入客户链表中。3.4.3 退票模块与订票函数相类似,只做稍稍修改就行退票成功是用si.count=si.count+n; 将航班的剩余票数加上去以显示即时航班信息。图4 退票模块线性链表的删除:void delete_flight(flightnode *&h,passengerList *&PList)/目的要按照某个航班号删除航班结点int delete_passenger(passengerList *&PList,flightnode *&h,char *name,char *ID_num)/目的是按照要退票的顾客的姓名查找该顾客结点,进行删除操作3.4.4 航班信息查询模块即查询所有航班信息3.5设计结果验证总结与致谢经过此次的课程设计,可以很明确的了解到自己哪些知识点掌握的比较好,哪些知识点运用的还不够熟练。通过此次课程设计也学会综合运用理论知识来分析和解决实际问题的能力、养成严谨的科学态度和良好的程序设计习惯,实现由知识向智能的初步转化;学会遵循软件开发过程的基本规范,运用结构化程序设计的方法,按照课程设计的题目要求,并能够完成设计、编写、调试和测试应用程序及编写文档的任务。 短暂的课程设计就要结束了,在此,感谢所有在学习和生活中给予我关心和帮助的人们。首先我要感谢杨红娟、张君捧两位位老师,本次课程设计设计的选题、课题调研与撰写工作实在和老师的指导下完成的。和老师渊博的知识、严谨的治学态度、一丝不苟的工作作风、和不厌其烦的精神对我影响至深,使我受益终生,在此我向和老师表示崇高的敬意和衷心的感谢。其次,在我的课程设计期间,同课题的同学都给予了我热情的帮助和无私的指导,在此向这些同学们表示衷心的感谢。最后,向所有曾给予我关心和帮助的老师和同学们再次致以最衷心的感谢,向参加报告评审、答辩的老师表示衷心的感谢和崇高的敬意。参考文献1 数据结构及应用算法教程,严蔚敏、陈文博,清华大学出版社,20112 数据结构与程序设计(影印版),(美)Robert L.Kruse,Alexander J.Ryba,高等教育出版社,20013数据结构与算法分析,(美)Mark Allen Weiss,机械工业出版社,20044数据结构算法实现及解析,高一凡,西安电子科技大学,20085计算机软件技术基础(第二版),徐士良、葛兵,清华大学出版社,20076计算机软件技术基础(第三版),沈被娜、刘祖照、姚晓冬,清华大学出版社,20077软件开发技术基础(第2版),赵应良,机械工业出版社,20048(美) H.M.Deitel, P.J.Deitel 著,薛万鹏等译, C 程序设计教程,北京:机械工业出版社,20009C语言程序设计,谭浩强主编,清华大学出版社,201010 Brian W. Kernighan Dennis M. Ritchie, C PROGRAMMING LANGUAGE, 清华大学影印版 ,2001 年 6 月第 10 次印刷附录#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>typedef struct flightnodechar flight_num10; /航班号char start_num10; /飞机号char aim_place10; /目的地char dingpiao20;/订票数char yupiao20; /余票数struct flightnode *next;/指向下一个结点flightnode;/航班结点typedef struct passengernodechar name20; /姓名char ID_num20; /证件号char flight_num10;/航班号int order_num; /订单号int ticket_num; /订票数量struct passengernode *next;/指向下一个结点passengernode;/客户结点typedef struct passengerListpassengernode *head;passengernode *rear;passengerList;void init_flight(flightnode *&h)/目的是要建立一个以h为头结点的空链表,录入航班信息和增加航班后将航班结点插入该链表h=(flightnode *)malloc(sizeof(flightnode);/申请头结点的空间if(h=NULL) exit(0);h->next=NULL;/将头结点h的指针域置为空void init_passengerList(passengerList *&pList)pList=(passengerList *)malloc(sizeof(passengerList);pList->head=(passengernode *)malloc(sizeof(passengernode);/创建头结点pList->rear=pList->head;pList->rear->order_num=0;/订单号从0开始计数pList->head->next=NULL;void save_passenger(passengerList *PList)FILE* fp = fopen("passenger.dat","wb");if(fp=NULL)return;passengernode *temp=PList->head->next;while(temp!=NULL)fwrite(temp,sizeof(passengernode),1,fp);temp = temp->next;fclose(fp);void load_passenger(passengerList *PList)FILE* fp = fopen("passenger.dat","rb");if(fp=NULL)return;passengernode *q;int n;while(!feof(fp)q=(passengernode *)malloc(sizeof(passengernode);n =fread(q,sizeof(passengernode),1,fp);if(n!=1)break;PList->rear->next=q;PList->rear=q;PList->rear->next=NULL;fclose(fp);void save_flight(flightnode *h)FILE* fp = fopen("flightList.dat","wb");if(fp=NULL)return;flightnode *temp=h->next;while(temp!=NULL)fwrite(temp,sizeof(flightnode),1,fp);temp = temp->next;fclose(fp);void load_flight(flightnode *&h)flightnode *pt=h;FILE* fp = fopen("flightList.dat","rb");if(fp=NULL)return;flightnode *q;int n;while(!feof(fp)q=(flightnode *)malloc(sizeof(flightnode);n=fread(q,sizeof(flightnode),1,fp);if(n!=1)break;pt->next=q;pt=q;pt->next=NULL;fclose(fp);int find_same_flight(flightnode *h,char *flight_num)flightnode *t=h->next,*p=h->next;int mark=0;printf("%-8s%-12s%-12s%-10s%-10sn","航班号","飞机号","目的地","订票数","余票数");while(t!=NULL && strcmp(t->flight_num,flight_num)!=0) t=t->next;while(p!=NULL)if(strcmp(t->start_place,p->start_place)=0)&&(strcmp(t->end_place,p->end_place)= 0)&&(strcmp(t->flight_num,p->flight_num)!=0)printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-6.2f%-10d%-8dn",p->flight_num, p->start_place,p->end_place,p->start_time,p->end_time,p->price,p->price_discount,p->isFull,p->left);mark=1;p=p->next;if(mark=0)printf("tt抱歉,没有可选的航班!n");return 0;return 1;void insert_flight(flightnode *&h,char* flight_num,char* start_place,char* end_place,char* start_time,char* end_time,int left,float price,float price_discount,int isFull)/在录入航班情况或增加新的航班后,将新的航班结点插入到航线链表中flightnode *q;/定义q为新增加的航班结点的指针的形参flightnode *p=h;q=(flightnode *)malloc(sizeof(flightnode);/为q结点申请空间strcpy(q->flight_num,flight_num);strcpy(q->start_place,start_place);strcpy(q->end_place,end_place);strcpy(q->start_time,start_time);strcpy(q->end_time,end_time);q->left=left;q->price=price;q->price_discount=price_discount;q->isFull=isFull;/以上是用strcpy函数将新增加航班的各种信息复制到q结点中q->next=p->next;/将q结点的指针域置为空p->next=q;p=p->next;/将指针后移void insert_passengerList(flightnode *&h,passengerList *&PList,char *name,char *ID_num,char *flight_num,int ticket_num)/客户订票后,将客户结点插入客户链表中,并修改相应的航班信息。flightnode *p=h->next;for(;p!=NULL;p=p->next)if(strcmp(p->flight_num,flight_num)=0)p->left=p->left-ticket_num;if(p->left=0)p->isFull=1;passengernode *q=(passengernode *)malloc(sizeof(passengernode);/新建结点,存放新的客户订单信息strcpy(q->name,name);strcpy(q->ID_num,ID_num);strcpy(q->flight_num,flight_num);q->ticket_num=ticket_num;q->next=NULL;/将新订单连接到链表中PList->rear->next=q;q->order_num=PList->rear->order_num+1;/生成订单号PList->rear=q;void delete_flight(flightnode *&h,passengerList *&PList)/目的要按照某个航班号删除航班结点flightnode *p,*pr;passengernode *q,*qr;char flight_num10;int mark=1;qr=PList->head;/pr为顾客链表的头结点q=qr->next;/用p作为中间指针对顾客链表中要删除的顾客结点进行查找pr=h;/pr为航线链表的头结点p=pr->next;/用p作为指针对航线链表中要删除的航班结点进行查找printf("tt请输入你要删除的航班号:");scanf("%s",flight_num);while(p!=NULL)/要删除的航班存在,下面进行删除操作if(strcmp(flight_num,p->flight_num)=0)pr->next=p->next;/移动指针找着要删除的航班结点free(p);/删除操作printf("tt删除%s航班成功!n",flight_num);mark=0;p=NULL;if(pr->next!=NULL)pr=pr->next;p=pr->next;if(mark=1)printf("tt无此航班,无法删除!n");elsewhile(q!=NULL)/要删除的顾客存在,下面进行删除操作if(strcmp(flight_num,q->flight_num)=0)qr->next=q->next;/移动指针找着要删除的顾客结点free(q);q=NULL;if(qr->next!=NULL)qr=qr->next;q=qr->next;int delete_passenger(passengerList *&PList,flightnode *&h,char *name,char *ID_num)/目的是按照要退票的顾客的姓名查找该顾客结点,进行删除操作passengernode *p,*pr=PList->head;/pr指向顾客链表的头结点p=pr->next;while(p!=NULL)if(strcmp(name,p->name)=0&&strcmp(ID_num,p->ID_num)=0)for(flightnode *f=h->next;f!=NULL;f=f->next)if(strcmp(p->flight_num,f->flight_num)=0)f->left=f->left+p->ticket_num;f->isFull=0;break;pr->next=p->next;free(p);printf("tt顾客%s,%s退票成功!n",name,ID_num);return 1;pr=pr->next;p=pr->next;printf("tt无此顾客,无法退票!n");return 0;void add_flight(flightnode *&h)/录入航班信息后调用insert_flight函数增加航班flightnode *p=h;char flight_num10,start_time10,end_time10,start_place20,end_place20;int left,isFull,mark=1;float price,price_discount;for(;p->next!=NULL;p=p->next)/移动指针,找到最后一个结点while(mark=1)printf("tt请输入你要增加的航班号:");scanf("%s",flight_num);printf("tt请输入飞机号:");scanf("%s",start_num);printf("tt请输入目的地:");scanf("%s",aim_place);printf("tt请输入订票数:");scanf("%s",dingpiao);printf("tt请输入余票数:");scanf("%s",yupiao);insert_flight(p,flight_num,start_num,aim_place,dingpiao,yupiao);printf("tt增加航班%s成功!n",flight_num);printf("tt是否继续录入航班信息(1表示继续录入;0表示停止录入).n");printf("tt请输入:");scanf("%d",&mark);int flight_num_check(flightnode *h,char *flight_num)/用航班号进行查询flightnode *p=h;printf("%-8s%-12s%-12s%-10s%-10sn","航班号","飞机号","目的地","订票数","余票数");for(;p!=NULL;p=p->next)if(strcmp(p->flight_num,flight_num)=0)printf("%-8s%-12s%-12s%-10s%-10sn",p->flight_num, p->start_num,p->aim_place,p->dingpiao,p->yupiao);return 1;printf("tt抱歉,没有航班号为%s的航班信息!n",flight_num);return 0;int place_check(flightnode *h,char *start_place,char *end_place)/用起飞抵达城市进行查询flightnode *p=h;int mark=0;printf("%-8s%-12s%-12s%-10s%-10sn","航班号","飞机号","目的地","订票数","余票数");for(;p!=NULL;p=p->next)if(strcmp(p->start_place,start_place)=0&&strcmp(p->end_place,end_place)=0)printf("%-8s%-12s%-12s%-10s%-10sn",p->flight_num, p->start_num,p->aim_place,p->dingpiao,p->yupiao);mark=1;if(mark=0)printf("tt抱歉,没有从%s到%s的航班信息!n",start_place,end_place);return 0;return 1;void check_all_flight(flightnode *h)flightnode *p=h;int m=0;printf("%-8s%-12s%-12s%-10s%-10sn","航班号","飞机号","目的地","订票数","余票数");for(;p!=NULL;p=p->next)printf("%-8s%-12s%-12s%-10s%-10sn",p->flight_num, p->start_num,p->aim_place,p->dingpiao,p->yupiao);m=1;if(m=0)printf("tt航班信息为空!n");void flight_check(flightnode *h)/选择使用哪一个函数进行查询flightnode *p=h->next;char flight_num10,start_place20,end_place20;char a; printf("tt请选择航班查询方式:n");printf("tt1表示按航班号进行查询;n");printf("tt3表示浏览全部航班信息.ntt请选择输入:");a=getch();printf("%cn",a);if(a='1')printf("tt请输入航班号:");scanf("%s",flight_num);flight_num_check(p,flight_num);else if(a='3')check_all_flight(p);elsereturn;int ID_name_check(passengerList *PList,char *name,char *ID_num)passengernode *p=PList->head->next;int mark=0;printf("%-8s%-20s%-20s%-10s%-8s%n","订单号","姓名","证件号","航班号","订票数量");for(;p!=NULL;p=p->next)if(strcmp(p->ID_num,ID_num)=0&&strcmp(p->name,name)=0)printf("%-8d%-20s%-20s%-10s%-8d%n",p->order_num,p->name,p->ID_num, p->flight_num,p->ticket_num);mark=1;if(mark=0)printf("tt抱歉,没有%s,%s的订单信息!n",name,ID_num);return 0;return 1;int order_num_check(passengerList *PList,int order_num)passengernode *p=PList->head->next;printf("%-8s%-20s%-20s%-10s%-8s%n","订单号","姓名","证件号","航班号","订票数量");for(;p!=NULL;p=p->next)if(p->order_num=order_num)printf("%-8d%-20s%-20s%-10s%-8d%n",p->order_num,p->name,p->ID_num, p->flight_num,p->ticket_num);return 1;printf("tt抱歉,没有订单号为%d的订单信息!n",order_num);return 0;void check_all_passenger(passengerList *PList)passengernode *p=PList->head->next;int m=0;printf("%-8s%-20s%-20s%-10s%-8s%n","订单号","姓名","证件号","航班号","订票数量");for(;p!=NULL;p=p->next)printf("%-8d%-20s%-20s%-10s%-8d%n",p->order_num,p->name,p->ID_num, p->flight_num,p->ticket_num);m=1;if(m=0)printf("tt订单信息为空!n");void passenger_check(passengerList *PList)char name20,ID_num15;int order_num;char a; printf("tt请选择订单查询方式:n");printf("tt1表示按客户姓名和证件号进行查询;n");printf("tt2表示按订单号进行查询;n");printf("tt3表示查看全部订单信息.ntt请选择输入:");a=getch();printf("%cn",a);if(a='1')printf("tt请输入客户姓名:");scanf("%s",name);printf("tt请输入证件号:");scanf("%s",ID_num);ID_name_check(PList,name,ID_num);else if(a='2')printf("tt请输入订单号:");scanf("%d",&order_num);order_num_check(PList,order_num);else if(a='3')check_all_passenger(PList);elsereturn;void modify_flight(flightnode *&h,passengerList *&PList)flightnode *p=h->next;char flight_num10,start_time10,end_time10;char a;printf("tt*航线信息修改*n");printf("tt*n");printf("tt*