1、基于 C 语言的飞机订票系统一、需求分析1、本程序中,输入为字符串小写大写字符和整形; 2、以字符串输出;3、本订票系统要能够实现航班情况的录入功能、航班的查询功能、订票功能、退票功能以及管理本系统的功能,具体为:(1)录入功能可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)(2)查询功能可以查询某个航线的情况(如,航班号,查询起降时间,起飞抵达城市,航班票价,确定航班是否满仓) ;(3)订票功能可以订票,如果该航班不存在,则订票失败;(4)退票功能可以退票并且记录乘客的相关信息以及退票信息;如客户资料:有姓名,证件号,订票航班情况,订单要有编号。4、测试数据:订票正确
2、输入航班号f2009订票人姓名yangyatingID0841919204管理员正确密码“5566”错误密码“1234”二、概要设计1、程序包含以下模块:每个模块的算法设计说明如下: (1)录入模块: 查找单链表的链尾,在链尾插入一个“航班信息”的新结点。(2)查询模块:提供两种查方式:按航号和按航线查询,1 代表按航号查询,2 代表按航线查询。0 则表示退出查询。顺着单链表查找,如果与航班号(航线)一致,输出相关信息,否则,查询不成功。(3)订票模块:查找乘客要订的航班号,判断此航班是否有空位,有则输入乘客有关信息,订票成功,否则失败。(4)退票模块:输入要退票的乘客姓名以及证件号码,查找乘
3、客资料的链表中是否有这位乘客,有则删去此结点,并在空位加上 1,无则退票失败。(5)修改模块:输入密码,确认是否有权限对航班信息进行修改,有则在航班信息链表中查找要修改的结点,进行修改,否则不能修改。流程图飞机订票系统录入航班信息查看航班信息退票 修改订票主函数流程图显示功能选项根据 N 调用模块函数YES 输入 N:判断 N 是否在 04 之间NO三、详细设计1、航班的信息类型:为了便于查找和修改,航班的情况存储结构采用单链表,每个元素表示一个航班的情况,包括航班号、起飞达到的时间、空座和目的的、票价以及限座七个数据项:航班号 起飞时间 达到时间 目的地 限座 空座 票价单链表如下:每个结点
4、包括数据域和指针域:数据域 指针域C 语言描述如下:typedef struct flightnode char air_num10; /*航班号*/char start_time15; /*起飞时间*/char end_time15; /*到达时间 */char end_place30; /*目的地*/int total; /*限座*/int left; /*空座*/int price; /*票价*/struct flightnode *next; /*指向个结点*/flightnode;h D1 D2 D3基本操作:int CreatFlight(flightnode *l); /生成航班
5、信息链表int InsertFlight(flightnode *p,char *air_num,char *start_time,char *end_place,int total,int left,int price); /插入航班信息的结点flightnode *modefy_airline(flightnode *l,char *air_num); /修改航班信息的函数int BookTicket(flightnode*a,char *air_num,passengernode *c,char *name,char *ID_num); /订票函数int CancelTicket(pas
6、sengernode *c,flightnode*l,char *name,char *ID_num); /退票函数int SearchFlight(flightnode*head); /查询航班信息函数2、乘客信息类型:为了便于插入、删除和修改,其采用单链表存储结构,每个数据元素包括姓名、证件号码、航班号和座位号四个数据项:旅客姓名 证件号码 航班号 座位号每个结点包括数据域和指针域:数据域 指针域C 语言描述如下:typedef struct passengernode /*定义乘客资料结点*/char name20;char ID_num20;char air_num20;int sea
7、t_num;struct passengernode *next;passengernode;基本操作:int CreatPassenger(passengernode *l); /生成乘客资料链表int InsertPassenger(passengernode *p,char *name,char *ID_num,char *air_num,int seat_num); /插入乘客资料的结点3、主函数和其他函数的伪码算法void main() /主函数 while () printf(/*主菜单界面*/)switch(ch=getchar()case1:BookTicket;break;c
8、ase2:CanclelTicket;break;case3:if()SearchFlight;else if()SearchPassenger;break;case4:exit;break;flightnode *head_flight() /生成航班头结点passengernode *head_passengernode() /生成乘客资料头结点int CreatFlight(flightnode *l) /生成航班信息链表 /初始化航班信息InsertFlight() /插入航班信息/ CreatFlightint CreatPassenger(passengernode *l) /生成
9、乘客资料链表 /初始化乘客资料InsertPassenger() /插入乘客资料/ CreatPassengerint InsertFlight() /插入航班信息新结点 /定义指针,动态分配,复制信息流,赋值,next 返回指针,循环/航班信息链的尾插 /InsertFlightint InsertPassenger()/插入乘客资料新结点 /定义指针,动态分配,复制信息流,赋值,next 返回指针,循环/乘客信息链的尾插 /InsertPassengerflightnode *modefy_airline(flightnode *l,char *air_num) /修改航班信息int Bo
10、okTicket() /订票 InsertPassenger() / BookTicketint CancelTicket() /退票 l=modefy_airline(l,air_num);/CancelTicketint SearchFlight(flightnode *head) /查询航班 /输出航班信息/ SearchFlightint SearchPassenger(passengernode *head) /查询乘客 /输出乘客信息/ SearchPassenger四、调试分析1、调试结果:(1) 系统主菜单界面:(2)进入订票的界面:(3)查询信息的界面:选择 1,查询航班信息
11、的界面:选择 2,输入密码,查询乘客的信息的界面:新增乘客,查询乘客信息:密码错误时:(4)进入退票的界面:名字或者证件错误时:2、时间复杂度分析:本程序运行所耗费的时间主要在于循环语句,for 和 while 语句,其时间复杂度应该为 O(n) 。3、模块设计和调试时存在问题的思考:原先在信息查询中没有乘客与管理人员的区别,乘客与管理人员都可以看到相同的信息,航班信息和乘客资料,后来,在浏览乘客资料时要求输入管理人员的密码,以确保乘客资料的安全性。4、算法的改进设想:本程序还存在很多缺点,不能完全的实现老师要求的各种功能,特别是在查询功能方面,此程序应该增加一些查询的方式的设计,如可以按照起飞抵达地点查询航班情况。还有票价折扣和航班已无票,提供相关可选航班,订单须有编号的功能没有设计到。五、用户手册1、本程序运行环境是 windows 操作系统,执行文件是 5.exe。2、进行演示程序后,即显示用户界面: