数据结构课程设计:飞机订票系统设计与实现 (里面附有源代码!)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计题目飞机订票系统
院系*******
专业***************
姓名******
学号*********
指导教师***
2012年7月
1. 需求分析
问题描述
基于目前人们外出远行频繁,为方便乘客提前买票及优化飞机航空订票服务,需要开发一个飞机订票系统,此程序就是要实现航班情况的录入,查询,订票,退票以及航班的查询和修改等基本功能。
本课程设计的题目为:飞机订票系统。
基本要求
输入的形式和输入值的范围
录入航班信息时,需要输入航班号,起降时间,起飞抵达城市,值为字符串;还需要输入航班票价,票价折扣,值为浮点型(float);还需要输入航班是否满仓,值为整型(int)(“1”表示已满仓,“0”表示没有满仓);如需要继续录入航班信息,要输入判别信息,值为整型(“1”表示继续录入航班信息,“0”表示停止录入航班信息)。
客户订票时,需要输入起飞抵达城市,然后选择航班进行查询,选择航班时需要输入航班号,值为字符串。
客户退票时,需要输入姓名,证件号进行退票操作,值为字符串。
查询某个航班的情况时,需要输入航班号,值为字符串;在查询某个航线的情况时,还可以通过输入起飞抵达城市来查询,值为字符串。
查询某个订单时,需要输入订单号,值为整型(int);或者需要输入客户姓名和证件号,值为字符串。
修改航班时,需要输入字符型数据选择进行何种修改操作;增加航班时,需要输入航班号,起降时间,起飞抵达城市,值为字符串;还需要输入航班票价,票价折扣,值为浮点型(float);还需要输入航班是否满仓,值为整型(int)(“1”表示已满仓,“0”表示没有满仓);如需要继续录入航班信息,要输入判别信息,值为整型(“1”表示继续录入航班信息,“0”表示停止录入航班信息);删除航班时,需要输入要删除的航班的航班号;修改航班时间时,需要输入要修改的航班的航班号,修改后的航班起飞时间和抵达时间。
输出形式
在所有操作后的输出中都显示操作是否正确以及操作后单链表的内容。
其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。
录入航班情况时,输出显示添加航班信息是否成功。
客户订票时,当客户输入起飞抵达城市后,输出可供客户选择的航班信息;客户选择了航班后,输入提示信息告知用户订票是否成功。
客户退票时,输出客户退票成功或者无此客户,无法退票。
查询航班时,输出显示对应的航班信息,或者输出提示信息告知没有相应的航班信息。
查询订单时,输出显示对应的订单信息,或者输出提示信息告知没有相应的订单信息。
修改航班时,输出对应的提示的信息,提示操作是否成功。
功能要求
(1)可以录入航班情况,数据存储在一个数据文件中;
(2)可以查询某个航线的情况:输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓;输入起飞抵达城市,查询飞机航班情况;
(3)可以订票,订票情况存在一个数据文件中(如果该航班已经无票,提供相关可选航班);
(4)可退票并且退票后修改相关数据文件;
(5)客户资料:姓名,证件号,订票数量及航班情况,订单要有编号;
(6)修改航班信息,当航班信息改变可修改航班数据文件;
(7)要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。
2. 概要设计
数据结构
(1)航班的信息:航班的情况存储结构采用单链表,每个元素表示一个航班的情况,包括航班号、起飞时间、降落时间、起飞城市、抵达城市、航班票价、票价折扣、确定航班
单链表如下:
每个结点包括数据域和指针域:
C语言描述如下:
typedef struct flightnode{
录入航班信息模块
在主函数中输入“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;该操作将该结点插入航班链表中。
流程图如下:
顾客订票模块
在主函数中输入“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)函数将客户结点插入客户链表中.
接上页:
int *pr指向客户链表的头结点,用客户结点指针*p指向pr的下一个结点。
使用while循环寻
找匹配姓名、证件号、航班号的客户结点,找到后定义航班指针*f=h->next,使用for循环找到匹配航班号的航班结点,执行f->left=f->left+p->ticket_num,修改退票后相应航班结点
的空座数,之后执行pr->next=p->next;free(p);删除要退票的客户订单信息。
如果没有找到匹配的客户结点,输出提示信息。
查询航班模块
在主函数中输入“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 循环输出所有航
flight_num_check 函数的流程图:
查询订单模块
在主函数中输入“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)函数中,定义客户指针
order_num_check
修改航班模块
在主函数中输入“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),删除对该航班订票的订单信息。
如果没有找到匹配的航班结点,输出提示信息。
4.
合法数据的测试
(1)编译链接后显示菜单
(2)输入菜单号“1”,开始航班信息的录入
(3)输入菜单号“2”,进入订票模块
(4)输入菜单号“3”,进入退票模块
(5)输入菜单号“4”,查询航班信息
a. 输入菜单号“1”,按航班号查询航班信息
b. 输入菜单号“2”,按起飞抵达城市查询航班信息
c. 输入菜单号“3”,浏览全部航班信息
(6)输入菜单号“5”,查询订单信息
a. 输入菜单号“1”,按客户姓名和证件号查询订单信息
b. 输入菜单号“2”,按订单号查询订单信息
c. 输入菜单号“3”,浏览全部订单信息
(7)输入菜单号“6”,进入航班修改模块
a. 输入菜单号“1”,增加航班
b. 输入菜单号“2”,删除航班
c. 输入菜单号“3”,修改航班时间
(8)输入菜单号“0”,退出本系统。
非法数据的测试
(1)在主菜单中输入错误号码后,系统自动跳转到主菜单,继续让用户输入。
(2)选择订票服务后,输入了没有开通航班的城市
(3)选择订票服务后,输入了系统中没有的航班号
(4)选择退票服务后,输入了没有订票的客户姓名和证件号
(5)选择航班查询服务后,输入了没有开通航班的城市
(6)选择航班查询服务后,输入了系统中不存在的航班号
(7)选择订单查询服务后,输入了没有订票的客户姓名和证件号
(8)选择订单查询服务后,输入了系统中不存在的订单号
(9)选择删除航班服务后,输入了系统中不存在的航班号
(10)选择修改航班时间服务后,输入了系统中不存在的航班号
5. 用户使用说明
运行环境
Windows xp;Microsoft Visual C++
主要功能
飞机订票系统系统功能模块如下:
主要功能包括录入航班信息、客户订票、客户退票、查询航班信息、查询订单信息、修改航班信息六个模块;其中查询航班信息模块包括按航班号查询、按起飞抵达城市查询和浏览全部航班信息;其中查询订单信息模块包括按订单号查询、按客户姓名和证件号查询以及浏览全部订单信息;其中修改航班信息模块包括添加航班信息、删除航班信息和修改航班起飞抵达时间。
操作注意事项
用户在使用飞机订票系统之前,应注意以下事项:
用户在输入数据时,飞机航班号、起飞抵达城市、起飞抵达时间、客户姓名、证件号等为字符串形式;空座数、订票数量、航班是否满仓等为整型(int);票价、票价折扣等为浮点型(float);其他形式的输入,请按输入提示进行操作,以免引起不必要的故障。
业务流程
输入相应的选择信息,便可进入相应的模块中。
(1)输入“1”,进入【录入航班信息】模块,输入航班的相关信息,完成航班信息的录入。
(2)输入“2”,进入【客户订票】模块,输入客户的信息、要订的票数和要订的航班号,完成客户的订票操作。
(3)输入“3”,进入【客户退票】模块,输入客户的信息、要退的航班号,完成客户的退票操作。
(4)输入“4”,进入【查询航班信息】模块,可以浏览或查询航班的相关信息。
(5)输入“5”,进入【查询订单信息】模块,可以浏览或查询订单的相关信息。
(6)输入“6”,进入【修改航班信息】模块,可以添加航班信息、删除航班信息和修改航班的起飞抵达时间。
6. 总结
经过这两周的数据结构课程设计,我收获很大,在实现系统功能的过程中,也遇到很多问题,分工协作,设计修改,编写调试,每一步都渗透着沟通和分析,每一次沟通之后,都会对系统功能有更深层次的理解和阐述,这也促使我们一步步完成了整个系统,并使之可以运行。
两周的时间太短暂了,我们无法把全部学到的知识运用到具体的系统实现中,深深感受到数据结构这门课程的重要性,以及它在实际应用中的广泛性。
本系统由于种种原因仍然存在需要改进,需要完善的地方,我对于这个系统的认识和对数据结构这门课程的理解已经更加深入了。
在今后的学习和工作中,会更加深入地把知识和思想体会更广泛地应用到其他相关领域。
本系统在人性化的方面做得还不够,对于另类的输入错误,还不能很好地应对,这也体现出本系统不够健壮,会在今后的学习中加以改进和完善;在功能模块方面还可以增加更多相关模块,是系统更加完善。
在实现系统的过程中,我感受到自己的知识的薄弱零散,经过这次做系统,我觉得自己的知识得到巩固和整合,知识体系更加系统化。
我也深深体会到实践检验真理,只有实践中,才能出真知。
我懂得了学习不只是纸上谈兵,更重要的是实践,就比如平常我们在学习中经常会遇到一些问题,看似无关紧要跳过去,不求甚解,在得知答案的时候,总是感觉心领神会,久而久之,对于的知识点就模棱两可,形成知识漏洞。
但这次课程设计所要编写的程序很长,涉及的知识点也很多,选择此题目的时候我心里面还底气十足,自认为没什么问题,对于程序的步骤仿佛了然于胸,但在实际操作中才发现并非如此,在编写程序的过程中,我不断地查阅相关资料进行学习,积极地思考该怎样实现系统的每一个功能。
通过这次数据结构的课程设计,我巩固和加深对数据结构基本知识的理解,锻炼了综合运用课本知识的能力,自己也真正地完整而系统地设计并编写了一个程序,使得自己的编程能力大为提高。
通过对我所选择飞机订票系统的设计和编写,我初步掌握简单软件的分析方法和设计方法,更深的领悟了“纸上得来终觉浅,觉知此事要躬行”的重要意义,第一次体会到了数据结构编程知识在实际生活中的重要性和应用的广泛性。
参考文献
[1]谭浩强C程序设计(第四版)北京:清华大学出版社,2006
[2]李春葆数据结构教程(第二版)北京:清华大学出版社,2007
附录:程序源代码
#include <>
#include <>
#include <>
#include <>
typedef struct flightnode{
char flight_num[10]; n");
printf("\t\t请输入:");
scanf("%d",&mark);
}
}
int flight_num_check(flightnode *h,char *flight_num)n\t\t请选择输入:");
a=getch();
printf("%c\n",a);
if(a=='1')
{
printf("\t\t请输入航班号:");
scanf("%s",flight_num);
flight_num_check(p,flight_num);
}
else if(a=='2')
{
printf("\t\t请输入起飞城市:");
scanf("%s",start_place);
printf("\t\t请输入抵达城市:");
scanf("%s",end_place);
place_check(p,start_place,end_place);
}
else if(a=='3')
check_all_flight(p);
else
return;
}
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("\t\t抱歉,没有%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("\t\t抱歉,没有订单号为%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("\t\t订单信息为空!\n");
}
void passenger_check(passengerList *PList)
{
char name[20],ID_num[15];
int order_num;
char a;
printf("\t\t请选择订单查询方式:\n");
printf("\t\t1表示按客户姓名和证件号进行查询;\n");
printf("\t\t2表示按订单号进行查询;\n");
printf("\t\t3表示查看全部订单信息.\n\t\t请选择输入:");
a=getch();
printf("%c\n",a);
if(a=='1')
{
printf("\t\t请输入客户姓名:");
scanf("%s",name);
printf("\t\t请输入证件号:");
scanf("%s",ID_num);
ID_name_check(PList,name,ID_num);
}
else if(a=='2')
{
printf("\t\t请输入订单号:");
scanf("%d",&order_num);
order_num_check(PList,order_num);
}
else if(a=='3')
check_all_passenger(PList);
else
return;
}
void modify_flight(flightnode *&h,passengerList *&PList)
{
flightnode *p=h->next;
char flight_num[10],start_time[10],end_time[10];
char a;
printf("\t\t************航线信息修改*************\n");
printf("\t\t*************************************\n");
printf("\t\t* 增加航班-------1 *\n");
printf("\t\t* 删除航班-------2 *\n");
printf("\t\t* 修改航班时间---3 *\n");
printf("\t\t*************************************\n");
printf("\t\t请选择:");
a=getch();
printf("%c\n",a);
if(a=='1')
add_flight(h);
else if(a=='2')
delete_flight(h,PList);
else if(a=='3')
{
printf("\t\t请输入要修改的航班的航班号:");
scanf("%s",flight_num);
if(flight_num_check(p,flight_num)==1)
{
printf("\t\t请输入修改后的起飞时间:");
scanf("%s",start_time);
printf("\t\t请输入修改后的抵达时间:");
scanf("%s",end_time);
for(;p!=NULL;p=p->next)
if(strcmp(flight_num,p->flight_num)==0)
{
strcpy(p->start_time,start_time);
strcpy(p->end_time,end_time);
printf("\t\t航班%s时间修改成功!\n",flight_num);
}
}
}
else
return;
}
int book(flightnode *&h,passengerList *&PList)
{
char name[20]; n",p->price*p->price_discount* ticket_num);
getch();
printf("\t\t恭喜您,订票成功!\n");
return 1;
}
else
{
printf("\t\t***很遗憾,该航班已满!***\n");
printf("\t\t***如选择其他航班请输入-----1\n\t\t***不选则输入-----0***\n");
printf("\t\t输入数字进行选择:");
scanf("%d",&k);
if(k==1)
{
printf("\t\t此航线上的其他航班有:\n");
if(find_same_flight(h,flight_num)==1)
{
printf("\t\t请输入您选的航班:");
scanf("%s",flight_num);
insert_passengerList(h,PList,name,ID_num,flight_num, ticket_num);
printf("\t\t恭喜您,订票成功!\n");
return 1;
}
}
}
}
else
p=p->next;
}
if(p==NULL)
printf("\t\t对不起,您输入的航班不存在!\n");
}
return 0;
}
void cancel(passengerList *&PList,flightnode *&h)
{
char name[20],ID_num[20];
printf("\t\t请输入你的姓名:");
scanf("%s",name);
printf("\t\t请输入你的证件号:");
scanf("%s",ID_num);
delete_passenger(PList,h,name,ID_num);
}
void main()
{
char choice;
int t=1;
flightnode *flight;
passengerList *PList;
init_flight(flight);//初始化航班链表
init_passengerList(PList);
load_flight(flight);
load_passenger(PList);
while(t==1)
{
printf("\t\t************飞机订票系统菜单*************\n");
printf("\t\t*****************************************\n");
printf("\t\t* 录入信息----------1 *\n");
printf("\t\t* 订票----------2 *\n");
printf("\t\t* 退票----------3 *\n");
printf("\t\t* 查询航班----------4 *\n");
printf("\t\t* 查询订单----------5 *\n");
printf("\t\t* 修改航线----------6 *\n");
printf("\t\t* 保存退出----------0 *\n");
printf("\t\t*****************************************\n");
printf("\t\t请选择服务:");
choice=getch();
printf("%c\n",choice);
system("cls");
if(choice=='1'){
add_flight(flight);
getch();
system("cls");
}else if(choice=='2'){
book(flight,PList);
getch();
system("cls");
}else if(choice=='3'){
cancel(PList,flight);
getch();
system("cls");
}else if(choice=='4'){
flight_check(flight);
getch();
system("cls");
}else if(choice=='5'){
passenger_check(PList);
getch();
system("cls");
}else if(choice=='6'){
modify_flight(flight,PList);
getch();
system("cls");
}else if(choice=='0'){
printf("\t\t再见!\n");
t=0;
}
}
save_flight(flight);
save_passenger(PList);
}。