数据结构课程设计飞机订票系统(30页).doc
-摘 要随着时代的进步社会分工的不断细化,各个行业联系的不断密切,人们出行越来越多,出行的方式也是百花齐放,作为空中重要的交通工具,飞机航空系统也在不断地得到优化,其中重要的一项就是航空飞机订票系统,因此好的订票系统关系着人们的日常出行方便与否,设计并编制出符合人们需要的航空订票系统是一项繁重而艰巨的任务。本文 Microsoft Visual C 6.0 作为程序代码的实现软件,进行飞机订票系统的数据结构课程设计。首先,根据课程设计内容进行需求分析,确定主要的功能模块,。然后进行数据结构、各功能模块算法以及它们之间的调用关系的概要设计,做出各信息模块的数据结构表,并给出所用的结构体和结点类型。在此基础上,进行各功能模块的详细算法设计,做出各算法的流程图。最后,对系统进行测试,分为合法数据测试和非法数据测试,并对测试结果截图保存。本系统包含录入航班信息、订票、退票、查询航班信息、查询订票信息、修改航班信息和退出系统 7 个基本功能,经测试后健壮性良好。关键词飞机订票系统;数据结构;C 语言;单链表i-第 30 页-目录ii1问题背景订票系统是一种新兴的现代商务方式,近几年来得到了迅速发展,显现了巨大的现代商业价值。有理由相信,订票系统将逐渐方便盛会生活,也将成为数字化社会的一种重要体现。它改变了传统的买卖双方面堆满的交流方式,也打破了旧有工作经营模式,它通过网络使航空公司面对整个世界,为用户提供每周 7 天,每天 24 小时的全天候服务。网上订票的规模正在逐年迅速增长,它带来的商机是巨大而深远的。订票系统研究的主攻方向是通过公共计算机通信网络进行网上订票活动,突破传统商务在时间、地域上的限制,成为方便、快捷、安全可靠的新兴电子化商务活动模式。是网上订票活动更安全、可靠、快速、明确和方便。对航空公司来说,航空订票管理系统既能扩大服务范围,扩大公司影响,减少营业费用,又对稳固航空公司的客源有着重要的辅助作用;站在旅客的角度,航空公司提供的这种服务提供了更多的方便,节省了很多时间。建设航空订票管理系统是体现和提高航空公司领导业绩的一条捷径。2问题分析通过此系统可以实现如下功能:录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;退票: 可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。修改航班信息:当航班信息改变可以修改航班数据文件13需求分析3.1 用户需求分析用户使用此程序所要完成的工作主要为:录入和查询所有航线信息、查看已订票客户信息、查询航线、办理订票业务、办理退票业务。通过此系统可以方便的进行上述工作。每条航线所涉及的信息有:终点站名、航班号、飞行时间、票价、乘员定额、余票量。已订票的客户名单信息包括姓名、订票量、舱位等级(1,2 或 3)。等候替补的客户名单信息包括姓名、所需票量。查询航线功能可以根据旅客提出的终点站名输出航班号、飞行时间、票价、乘员定额、余票量。订票业务功能根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于定票额,则需重新询问客户要求。若需要,可登记排队候补购票。退票业务功能根据客户提供的情况(航班号、姓名)为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。3.2功能需求分析1.功能模块说明:(1) 将航班的基本信息录入到系统中。(2) 根据航班号或者根据起飞地点、降落地点查询所需航班信息。(3) 输入姓名和所要订航班的航班号订票。(4) 输入姓名和所订航班的航班号办理退票。(5) 输入航班号,修改该航班的起飞和降落时间以修改航班的起降时间。(6) 退出的同时将信息写入文件。2. 订票系统功能图2订票系统录办办查查航退入理理询询班出航订退航订信系班票票班单息统信业业信信修息务务息息改图 3.1 订票系统结构图3.3 系统需求分析开发环境:PC 机,Windows 7 系统运行软件:Microsoft Visual C 6.04逻辑设计4.1 数据结构1 航班的信息:航班的情况存储结构采用单链表,每个元素表示一个航班的情况,包括航班号、起飞时间、降落时间、起飞城市、抵达城市、航班票价、票价折扣、确定航班是否满仓和空座数九个数据项:表 3.1 航班信息的数据结构表数据项数据类型航班号字符串(char)起飞时间字符串 (char)降落时间字符串 (char)起飞城市字符串 (char)抵达城市字符串 (char)航班是否满仓整型 (int)空座数整型 (int)票价浮点数 (float)票价折扣浮点数 (float)typedef struct passengernode /定义客户资料结点 char name20; /姓名 char ID_num20; /证件号 char flight_num10; /航班号 int order_num; /订单号 int ticket_num; /订票数量 struct passengernode *next; /指向下一个结点 passengernode; 3 客户链表:每个数据元素包括头指针和尾指针两个数据项: 每个结点包括两个指针域: C 语言描述如下: typedef struct passengerList passengernode *head; passengernode *rear; passengerList;4.2各功能模板函数之间的调用关系。4.3 函数说明 void init_flight(flightnode *&h):要建立一个以 h 为头结点的空链表,录入航班信息和增加航班后将航班结点插入该链表。 void init_passengerList(passengerList *&pList):建立一个带有头指针和尾指针的空链表,存储带有顾客信息的结点。 头指针域 尾指针域 void save_flight(flightnode *h):保存航班信息到指定数据文件中。 void load_flight(flightnode *&h):从存储航班信息的文件导入航班信息到航班链表中。 void save_passenger(passengerList *PList):保存客户信息到指定数据文件中。 void load_passenger(passengerList *&PList):从存储客户信息的文件导入客户信息到客户链表中。 void add_flight(flightnode *&h):录入航班信息后调用 insert_flight 函数增加班。 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):在录入航班情况或增加新的航班后,将新的航班结点插入到航线链表中。 int book(flightnode *&l,passengerList *&PList):要完成客户订票,将客户结点插入客户链表中,并修改相应的航班信息。 void insert_passengerList(flightnode *&h,passengerList *&PList,char *name,char *ID_num,char *flight_num,int ticket_num):在顾客订票后,将该顾客结点插入到顾客链表中,并修改相应的航班信息。 void find_same_flight(flightnode *l,char *flight_num):在客户订票时,当客户输入的航班号对应的航班已满仓时,提供其他可选航班并输出显示。 void cancel(passengerList *&PList,flightnode *&h):完成客户退票,将客户的订单从客户链表中删除,并修改相应的航班信息。 int delete_passenger(passengerList *&PList,flightnode *&h,char *name,char *ID_num):按照要退票的顾客的姓名和证件号查找该顾客结点,进行删除操作。 void flight_check(flightnode *h):选择使用何种方式对航班信息进行查询。 void check_all_flight(flightnode *l):浏览所有航班信息。 int place_check(flightnode *l,char *start_place,char *end_place):按照起飞抵达城市查询航班信息。 int flight_num_check(flightnode *l,char *flight_num):按照航班号查询航班信息。 void passenger_check(passengerList *PList):选择使用何种方式对订单信息进行查询。 void check_all_passenger(passengerList *PList):浏览所有订单信息。 int order_num_check(passengerList *PList,int order_num):按订单号查询订单信息。 int ID_name_check(passengerList *PList,char *name,char *ID_num):按客户姓名和证件号查询订单信息。 void modify_flight(flightnode *&h,passengerList *&PList):修改航班信息,包括添加航班信息,删除航班信息,修改航班起飞抵达时间。 void delete_flight(flightnode *&h,passengerList *&PList):按照某个航班号删除航班结点。 5 详细设计5.1 录入航班信息 在主函数中输入“1”,调用 void add_flight(flightnode *&h)函数,此函数将航班指针*p指向已存在航班链表*h 的头结点,利用 for(;p->next!=NULL;p=p->next)使*p 指向航线链表的最后一个结点,然后让用户输入航班信息,然后调用 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)函数,用 malloc 函数申请一个航班结点,并用指针*q 指向,将航班信息赋到新申请的结点中,p->next=q;p=p->next;该操作将该结点插入航班链表中。流程图如下 5.2 顾客订票模块在主函数中输入“2”,调用 int book(flightnode *&h,passengerList *&PList)函数完成客户的订票。用航班指针*p 指向已存在航班链表*h 的头结点的下一个结点,请客户输入起飞抵达城市,分别存于 start_place 和 end_place 中。调用 int place_check(flightnode *l,char *start_place,char *end_place)函数,如果函数返回“1”则请客户输入要订的航班号,如果输入的航班号不存在,输出提示信息, 如果航班存在则提示客户输入订的票数、客户的姓名和证件号,调用 void insert_passengerList(flightnode *&h,passengerList *&PList,char *name,char *ID_num,char *flight_num,int ticket_num)函数,定义航班指针*p=h->next,使用 for 循环匹配 flight_num和 p->flight_num,找到后,执行 p->left=p->left-ticket_num,修改相应航班的空座数。用malloc 函数申请一个客户结点,并用指针*q 指向,将客户信息和航班号赋到新申请的结点中,PList->rear->next=q;PList->rear=q;该操作将该结点插入客户链表中。 如果该航班已满仓或该航班的空座数不够,输出可供选择的航班,让客户选择,之后调用 void insert_passengerList(flightnode *&h,passengerList *&PList,char *name,char *ID_num,char *flight_num,int ticket_num)函数将客户结点插入客户链表中. 5.3 顾客退票模块 在主函数中输入“3”,调用 void cancel(passengerList *&PList,flightnode *&h)函数完成客户的退票。提示客户输入客户的姓名和证件号以及要退的航班号,此函数再调用 int delete_passenger(passengerList *&PList,flightnode *&h,char *name,char *ID_num,char *flight_num)函数,用客户结点指针*pr 等于已存在客户链表结点 Plist 的头指针,相当于将*pr 指向客户链表的头结点,用客户结点指针*p 指向 pr 的下一个结点。使用 while 循环寻找匹配姓名、证件号、航班号的客户结点,找到后定义航班指针*f=h->next,使用 for 循环找到匹配航班号的航班结点,执行 f->left=f->left+p->ticket_num,修改退票后相应航班结点的空座数,之后执行 pr->next=p->next;free(p);删除要退票的客户订单信息。如果没有找到匹配的客户结点,输出提示信息.5.4 查询航班模块 在主函数中输入“4”,调用 void flight_check(flightnode *h)函数选择使用哪一种查询方式进行查询。提示客户输入查询方式,如客户输入“1”,则调用 int flight_num_check(flightnode *l,char *flight_num)函数按航班号对航班进行查询,提示客户输入航班号,存于 flight_num 中;如客户输入“2”,则调用 int place_check(flightnode *l,char *start_place,char *end_place)函数按起飞抵达城市对航班进行查询,提示客户输入起飞抵达城市,分别存于 start_place 和 end_place 中;如客户输入“3”,则调用 void check_all_flight(flightnode *l)函数浏览全部航班信息。 在 int flight_num_check(flightnode *l,char *flight_num)函数中,定义航班指针*p=h,使用 for 循环匹配 flight_num 和 p->flight_num,找到匹配的航班节点后,输出该航班的所有信息。 在 int place_check(flightnode *l,char *start_place,char *end_place)函数中,定义航班指针*p=h,使用 for 循环寻找匹配 start_place 和 start_place 的结点,找到匹配的航班结点后,输出该航班的所有信息。 在 void check_all_flight(flightnode *l)函数中,定义航班指针*p=h,使用 for 循环输出所有航班信息。 5.5 查询订单模块在主函数中输入“5”,调用 void passenger_check(passengerList *PList)函数选择使用哪一种查询方式进行查询。提示客户输入查询方式,如客户输入“1”,则调用 int ID_name_check(passengerList *PList,char *name,char *ID_num)函数按客户的姓名和证件号对订单进行查询,提示客户输入姓名和证件号,分别存于 name 和 ID_num 中;如客户输入“2”,则调用 int order_num_check(passengerList *PList,int order_num)函数按订单号对订单进行查询,提示客户输入订单号,存于 order_num 中;如客户输入“3”,则调用 void check_all_passenger(passengerList *PList)函数浏览全部订单信 在 int ID_name_check(passengerList *PList,char *name,char *ID_num)函数中,定义客户指针*p= PList->head->next,使用 for 循环寻找匹配 name 和 ID_num 的结点,找到匹配的订单节点后,输出该订单的所有信息。 在 int order_num_check(passengerList *PList,int order_num)函数中,定义客户指针*p=PList->head->next,使用 for 循环寻找匹配 order_num 的结点,找到匹配的订单结点后,输出该订单的所有信息。 在 void check_all_passenger(passengerList *PList)函数中,定义客户指针*p=PList->head->next,使用 for 循环输出所有订单信息。 5.6 修改航班模块在主函数中输入“6”,调用 void modify_flight(flightnode *&h,passengerList *&PList)函数对航班信息进行修改。提示客户输入修改模式,如客户输入“1”,则调用 void add_flight(flightnode *&h)函数添加航班信息;如客户输入“2”,则调用 void delete_flight(flightnode *&h,passengerList *&PList)函数删除指定的航班信息,提示客户输入航班号,存于 flight_num 中;如客户输入“3”,则示客户输入航班号,如果该航班号存在,则提示用户输入修改后的起飞抵达时间。 在 void delete_flight(flightnode *&h,passengerList *&PList)函数中,定义航班指针*pr=h,定义航班指针 p=pr->next,定义客户指针*qr=PList->head,定义客户指针*q=qr->next。使用 while 循环寻找匹配航班号的航班结点,找到后执行 pr->next=p->next;free(p),删除指定的航班信息;使用 while 循环找到匹配航班号的订单结点,执行 qr->next=q->next;free(q),删除对该航班订票的订单信息。如果没有找到匹配的航班结点,输出提示信息。6.1 合法数据测试结果 (1)编译链接后显示菜单 (2)输入菜单号“1”,开始信息的录入(3) 输入菜单号“2”,进入订票模块 (4) 输入菜单号“3”,进入退票模块 (5) 输入菜单号“4”,查询航班信息 输入菜单号“1”,a. 按航班号查询航班信息 b. 输入菜单号“2”,按起飞抵达城市查询航班信息 c. 输入菜单号“3”,浏览全部航班信息 (6) 输入菜单号“5”,查询订单信息 a. 输入菜单号“1”,按客户姓名和证件号查询订单信息 b. 输入菜单号“2”,按订单号查询订单信息 c. 输入菜单号“3”,浏览全部订单信息 (7)输入菜单号“6”,进入修改模块 a. 输入菜单号“1”,增加航班 b. 输入菜单号“2”,删除航班 c. 输入菜单号“3”,修改航班时间 6.2 非法数据测试结果 (1) 选择订票服务后,输入了没有开通航班的城市 (2) 选择订票服务后,输入了系统中没有的航班号 (4) 选择退票服务后,输入了没有订票的客户姓名和证件号 (5) 选择删除航班服务后,输入了系统中不存在的航班号 (5) 选择航班查询服务后,输入了没有开通航班的城市 (6) 选择航班查询服务后,输入了系统中不存在的航班号 (7) 选择订单查询服务后,输入了没有订票的客户姓名和证件号 (8) 选择订单查询服务后,输入了系统中不存在的订单号 (9) 选择修改航班时间服务后,输入了系统中不存在的航班号#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> typedef struct flightnode char flight_num10; char start_time10; char end_time10; char start_place20; char end_place20; int left; float price; float price_discount; int isFull; struct flightnode *next; flightnode; typedef struct passengernode char name20; char ID_num20; char flight_num10; int order_num; int ticket_num; struct passengernode *next; passengernode; typedef struct passengerList passengernode *head; passengernode *rear; passengerList; void init_flight(flightnode *&h) h=(flightnode *)malloc(sizeof(flightnode); if(h=NULL) exit(0); h->next=NULL; 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; 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%-10s%-8s%-6s%-10s%-8sn","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","是否满仓","空座数"); 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; flightnode *p=h; q=(flightnode *)malloc(sizeof(flightnode); 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; q->next=p->next; 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_f