飞机订票系统设计与实现 里面附有源代码.docx
《飞机订票系统设计与实现 里面附有源代码.docx》由会员分享,可在线阅读,更多相关《飞机订票系统设计与实现 里面附有源代码.docx(52页珍藏版)》请在冰豆网上搜索。
飞机订票系统设计与实现里面附有源代码
课程设计
题目飞机订票系统
院系*******
专业***************
姓名******
学号*********
指导教师***
2012年7月
1.需求分析
1.1问题描述
基于目前人们外出远行频繁,为方便乘客提前买票及优化飞机航空订票服务,需要开发一个飞机订票系统,此程序就是要实现航班情况的录入,查询,订票,退票以及航班的查询和修改等基本功能。
本课程设计的题目为:
飞机订票系统。
1.2基本要求
1.2.1输入的形式和输入值的范围
录入航班信息时,需要输入航班号,起降时间,起飞抵达城市,值为字符串;还需要输入航班票价,票价折扣,值为浮点型(float);还需要输入航班是否满仓,值为整型(int)(“1”表示已满仓,“0”表示没有满仓);如需要继续录入航班信息,要输入判别信息,值为整型(“1”表示继续录入航班信息,“0”表示停止录入航班信息)。
客户订票时,需要输入起飞抵达城市,然后选择航班进行查询,选择航班时需要输入航班号,值为字符串。
客户退票时,需要输入姓名,证件号进行退票操作,值为字符串。
查询某个航班的情况时,需要输入航班号,值为字符串;在查询某个航线的情况时,还可以通过输入起飞抵达城市来查询,值为字符串。
查询某个订单时,需要输入订单号,值为整型(int);或者需要输入客户姓名和证件号,值为字符串。
修改航班时,需要输入字符型数据选择进行何种修改操作;增加航班时,需要输入航班号,起降时间,起飞抵达城市,值为字符串;还需要输入航班票价,票价折扣,值为浮点型(float);还需要输入航班是否满仓,值为整型(int)(“1”表示已满仓,“0”表示没有满仓);如需要继续录入航班信息,要输入判别信息,值为整型(“1”表示继续录入航班信息,“0”表示停止录入航班信息);删除航班时,需要输入要删除的航班的航班号;修改航班时间时,需要输入要修改的航班的航班号,修改后的航班起飞时间和抵达时间。
1.2.2输出形式
在所有操作后的输出中都显示操作是否正确以及操作后单链表的内容。
其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。
录入航班情况时,输出显示添加航班信息是否成功。
客户订票时,当客户输入起飞抵达城市后,输出可供客户选择的航班信息;客户选择了航班后,输入提示信息告知用户订票是否成功。
客户退票时,输出客户退票成功或者无此客户,无法退票。
查询航班时,输出显示对应的航班信息,或者输出提示信息告知没有相应的航班信息。
查询订单时,输出显示对应的订单信息,或者输出提示信息告知没有相应的订单信息。
修改航班时,输出对应的提示的信息,提示操作是否成功。
1.2.3功能要求
(1)可以录入航班情况,数据存储在一个数据文件中;
(2)可以查询某个航线的情况:
输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓;输入起飞抵达城市,查询飞机航班情况;
(3)可以订票,订票情况存在一个数据文件中(如果该航班已经无票,提供相关可选航班);
(4)可退票并且退票后修改相关数据文件;
(5)客户资料:
姓名,证件号,订票数量及航班情况,订单要有编号;
(6)修改航班信息,当航班信息改变可修改航班数据文件;
(7)要求:
根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。
2.概要设计
2.1数据结构
(1)航班的信息:
航班的情况存储结构采用单链表,每个元素表示一个航班的情况,包括航班号、起飞时间、降落时间、起飞城市、抵达城市、航班票价、票价折扣、确定航班是否满仓和空座数九个数据项:
航班号
起飞
时间
降落
时间
起飞
城市
抵达
城市
航班
是否满仓
空座数
票价
票价
折扣
字符串
字符串
字符串
字符串
字符串
整数
(int)
整数
(int)
浮点数
(float)
浮点数
(float)
单链表如下:
每个结点包括数据域和指针域:
数据域
指针域
C语言描述如下:
typedefstructflightnode{
charair_num[10];//航班号
charstart_time[15];//起飞时间
charend_time[15];//抵达时间
charstart_place[20];//起飞城市
charend_place[20];//降落城市
intleft;//空座数
floatprice;//票价
floatprice_discount;//票价折扣
intisFull;//航班是否满仓
structflightnode*next;//指向下一个结点
}flightnode;//航班结点
(2)客户的资料:
为了便于插入、删除和修改,其采用单链表存储结构,每个数据元素包括姓名、证件号、航班号、订票数量和订单号五个数据项:
姓名
证件号
航班号
订票数量
订单号
字符串
字符串
字符串
整数(int)
整数(int)
每个结点包括数据域和指针域:
数据域
指针域
C语言描述如下:
typedefstructpassengernode{//定义客户资料结点
charname[20];//姓名
charID_num[20];//证件号
charflight_num[10];//航班号
intorder_num;//订单号
intticket_num;//订票数量
structpassengernode*next;//指向下一个结点
}passengernode;
(3)客户链表:
每个数据元素包括头指针和尾指针两个数据项:
每个结点包括两个指针域:
头指针域
尾指针域
C语言描述如下:
typedefstructpassengerList{
passengernode*head;
passengernode*rear;
}passengerList;
2.2程序模块
2.2.1录入航班信息模块
voidadd_flight(flightnode*&h)调用voidinsert_flight(flightnode*&h,char*flight_num,char*start_place,char*end_place,char*start_time,char*end_time,intleft,floatprice,floatprice_discount,intisFull)函数,将新航班结点插入航班链表中。
2.2.2客户订票模块
intbook(flightnode*&h,passengerList*&PList)函数调用intinsert_passenger(passengernode*&h,char*name,char*ID_num,char*flight_num,intticket_num,intorder_num)函数,将新客户结点插入客户链表中。
2.2.3客户退票模块
voidcancel(passengerList*&PList,flightnode*&h)函数调用intdelete_passenger(passengerList*&PList,flightnode*&h,char*name,char*ID_num)函数,将相应的顾客结点删除,并修改相应的航班信息。
2.2.4查询航班模块
voidflight_check(flightnode*h)调用voidcheck_all_flight(flightnode*h)函数进行所有航班信息浏览,调用intplace_check(flightnode*h,char*start_place,char*end_place)函数按起飞抵达城市对航班进行查询,调用intflight_num_check(flightnode*h,char*flight_num)按航班号对航班进行查询。
2.2.5查询订单模块
voidpassenger_check(passengerList*PList)调用voidcheck_all_passenger(passengerList*PList)函数进行所有订单信息浏览,调用intorder_num_check(passengerList*PList,intorder_num)函数按订单号对订单进行查询,调用intID_name_check(passengerList*PList,char*name,char*ID_num)按客户姓名和证件号对订单进行查询。
2.2.6修改航班模块
增加航班时,voidmodify_flight(flightnode*&h,passengerList*&PList)函数调用voidadd_flight(flightnode*&h)函数,将新航班信息结点插入航班链表中。
删除航班时,voidmodify_flight(flightnode*&h,passengerList*&PList)函数调用voiddelete_flight(flightnode*&h,passengerList*&PList)函数将相应的航班信息删除,并删除相应的订单信息。
修改航班时间时,voidmodify_flight(flightnode*&h,passengerList*&PList)函数修改指定航班的起飞抵达时间。
2.3各模块之间的调用关系以及算法设计
2.3.1各模块之间的调用关系
2.3.2算法设计
voidinit_flight(flightnode*&h):
要建立一个以h为头结点的空链表,录入航班信息和增加航班后将航班结点插入该链表。
voidinit_passengerList(passengerList*&pList):
建立一个带有头指针和尾指针的空链表,存储带有顾客信息的结点。
voidsave_flight(flightnode*h):
保存航班信息到指定数据文件中。
voidload_flight(flightnode*&h):
从存储航班信息的文件导入航班信息到航班链表中。
voidsave_passenger(passengerList*PList):
保存客户信息到指定数据文件中。
voidload_passenger(passengerList*&PList):
从存储客户信息的文件导入客户信息到客户链表中。
voidadd_flight(flightnode*&h):
录入航班信息后调用insert_flight函数增加航班。
voidinsert_flight(flightnode*&h,char*flight_num,char*start_place,char*end_place,char*start_time,char*end_time,intleft,floatprice,floatprice_discount,intisFull):
在录入航班情况或增加新的航班后,将新的航班结点插入到航线链表中。
intbook(flightnode*&l,passengerList*&PList):
要完成客户订票,将客户结点插入客户链表中,并修改相应的航班信息。
voidinsert_passengerList(flightnode*&h,passengerList*&PList,char*name,char*ID_num,char*flight_num,intticket_num):
在顾客订票后,将该顾客结点插入到顾客链表中,并修改相应的航班信息。
voidfind_same_flight(flightnode*l,char*flight_num):
在客户订票时,当客户输入的航班号对应的航班已满仓时,提供其他可选航班并输出显示。
voidcancel(passengerList*&PList,flightnode*&h):
完成客户退票,将客户的订单从客户链表中删除,并修改相应的航班信息。
intdelete_passenger(passengerList*&PList,flightnode*&h,char*name,char*ID_num):
按照要退票的顾客的姓名和证件号查找该顾客结点,进行删除操作。
voidflight_check(flightnode*h):
选择使用何种方式对航班信息进行查询。
voidcheck_all_flight(flightnode*l):
浏览所有航班信息。
intplace_check(flightnode*l,char*start_place,char*end_place):
按照起飞抵达城市查询航班信息。
intflight_num_check(flightnode*l,char*flight_num):
按照航班号查询航班信息。
voidpassenger_check(passengerList*PList):
选择使用何种方式对订单信息进行查询。
voidcheck_all_passenger(passengerList*PList):
浏览所有订单信息。
intorder_num_check(passengerList*PList,intorder_num):
按订单号查询订单信息。
intID_name_check(passengerList*PList,char*name,char*ID_num):
按客户姓名和证件号查询订单信息。
voidmodify_flight(flightnode*&h,passengerList*&PList):
修改航班信息,包括添加航班信息,删除航班信息,修改航班起飞抵达时间。
voiddelete_flight(flightnode*&h,passengerList*&PList):
按照某个航班号删除航班结点。
3.详细设计
3.1录入航班信息模块
在主函数中输入“1”,调用voidadd_flight(flightnode*&h)函数,此函数将航班指针*p指向已存在航班链表*h的头结点,利用for(;p->next!
=NULL;p=p->next){}使*p指向航线链表的最后一个结点,然后让用户输入航班信息,然后调用voidinsert_flight(flightnode*&h,char*flight_num,char*start_place,char*end_place,char*start_time,char*end_time,intleft,floatprice,floatprice_discount,intisFull)函数,用malloc函数申请一个航班结点,并用指针*q指向,将航班信息赋到新申请的结点中,p->next=q;p=p->next;该操作将该结点插入航班链表中。
流程图如下:
3.2顾客订票模块
在主函数中输入“2”,调用intbook(flightnode*&h,passengerList*&PList)函数完成客户的订票。
用航班指针*p指向已存在航班链表*h的头结点的下一个结点,请客户输入起飞抵达城市,分别存于start_place和end_place中。
调用intplace_check(flightnode*l,char*start_place,char*end_place)函数,如果函数返回“1”则请客户输入要订的航班号,如果输入的航班号不存在,输出提示信息,
如果航班存在则提示客户输入订的票数、客户的姓名和证件号,调用voidinsert_passengerList(flightnode*&h,passengerList*&PList,char*name,char*ID_num,char*flight_num,intticket_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;该操作将该结点插入客户链表中。
如果该航班已满仓或该航班的空座数不够,输出可供选择的航班,让客户选择,之后调用voidinsert_passengerList(flightnode*&h,passengerList*&PList,char*name,char*ID_num,char*flight_num,intticket_num)函数将客户结点插入客户链表中.
接上页:
3.3顾客退票模块
在主函数中输入“3”,调用voidcancel(passengerList*&PList,flightnode*&h)函数完成客户的退票。
提示客户输入客户的姓名和证件号以及要退的航班号,此函数再调用intdelete_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);删除要退票的客户订单信息。
如果没有找到匹配的客户结点,输出提示信息。
delete_passenger函数的流程图:
3.4查询航班模块
在主函数中输入“4”,调用voidflight_check(flightnode*h)函数选择使用哪一种查询方式进行查询。
提示客户输入查询方式,如客户输入“1”,则调用intflight_num_check(flightnode*l,char*flight_num)函数按航班号对航班进行查询,提示客户输入航班号,存于flight_num中;如客户输入“2”,则调用intplace_check(flightnode*l,char*start_place,char*end_place)函数按起飞抵达城市对航班进行查询,提示客户输入起飞抵达城市,分别存于start_place和end_place中;如客户输入“3”,则调用voidcheck_all_flight(flightnode*l)函数浏览全部航班信息。
在intflight_num_check(flightnode*l,char*flight_num)函数中,定义航班指针*p=h,使用for循环匹配flight_num和p->flight_num,找到匹配的航班节点后,输出该航班的所有信息。
在intplace_check(flightnode*l,char*start_place,char*end_place)函数中,定义航班指针*p=h,使用for循环寻找匹配start_place和start_place的结点,找到匹配的航班结点后,输出该航班的所有信息。
在voidcheck_all_flight(flightnode*l)函数中,定义航班指针*p=h,使用for循环输出所有航班信息。
flight_num_check函数的流程图:
3.5查询订单模块
在主函数中输入“5”,调用voidpassenger_check(passengerList*PList)函数选择使用哪一种查询方式进行查询。
提示客户输入查询方式,如客户输入“1”,则调用intID_name_check(passengerList*PList,char*name,char*ID_num)函数按客户的姓名和证件号对订单进行查询,提示客户输入姓名和证件号,分别存于name和ID_num中;如客户输入“2”,则调用intorder_num_check(passengerList*PList,intorder_num)函数按订单号对订单进行查询,提示客户输入订单号,存于order_num中;如客户输入“3”,则调用voidcheck_all_passenger(passengerList*PList)函数浏览全部订单信息。
在intID_name_check(passengerList*PList,char*name,char*ID_num)函数中,定义客户指针*p=PList->head->next,使用for循环寻找匹配name和ID_num的结点,找到匹配的订单节点后,输出该订单的所有信息。
在intorder_num_check(passengerList*PList,intorder_num)函数中,定义客户指针*p=PList->head->next,使用for循环寻找匹配order_num的结点,找到匹配的订单结点后,输出该订单的所有信息。
在voidcheck_all_passenger(passengerList*PList)函数中,定义客户指针*p=PList->head->next,使用for循环输出所有订单信息。
order_num_check函数的流程图:
3.6修改航班模块
在主函数中输入“6”,调用voidmodify_flight(flightnode*&h,passengerList*&PList)函数对航班信息进行修改。
提示客户输入修改模式,如客户输入“1”,则调用voidadd_flight(flightnode*&h)函数添加航班信息;如客户输入“2”,则调用voiddelete_flight(flightnode*&h,passengerList*&PList)函数删除指定的航班信息,提示客户输入航班号,存于flight_num中;如客户输入“3”,则示客户输入航班号,如果该航班号存在,则提示用户输入修改后的起飞抵达时间。
在voiddelete_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),删除对该航班订票的订单信息。
如果没有找到匹配的