飞机订票系统 第1页 共30页
飞机订票系统
学生姓名:兰海军 指导老师:易禹
摘 要 本系统主要是为了方便用户飞机订票,能使用户方便快捷的了解各航线信
息。本系统设置了航线创建功能、浏览航班信息和查询航线信息功能、订票退票功
能及查看剩余票数功能。在该系统当中,系统开发平台是Windows XP,程序设计设
计语言采用Visual C++,数据库采用Microsoft Access,程序运行平台为Windows
XP。程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以在应
用中解决实际问题。
关键词 Access;Visual C++;飞机订票
目录
1问题描述与分析...................................... 2
2数据结构设计描述 .................................... 3
3软件结构设计(系统功能模块图) ....................... 3
4算法设计思想 ....................................... 3
5调试分析 ........................................... 6
6总结 .............................................. 12
7参考文献 .......................................... 13
8附录(源程序清单) ................................. 14
飞机订票系统 第 2 页 共 30 页
1问题描述与分析
飞机订票系统要求可以实现如下功能:可以录入航班情况,可以查询某个航
线的情况,如输入飞机到达城市,查询飞机航班情况;可以订票、退票。从问题
的描述分析,该飞机定票系统必须具备以下几个功能模块:
1) 航线创建功能模块:包括终点站名、航班号、分机号、飞行日期、乘员定额、
及余票量,准载人数等信息.。
2) 浏览航班信息功能模块:查看创建的所有航线信息。
3) 查询航线信息功能模块:可通过航班号查询,也可通过飞机到达地点查询。
4) 订票功能模块:包括航班号、定票数量、订票客户姓名、舱位等级、身份证号
码。
5) 退票功能模块:不满意所订的票时可进行退票,退票时需输入订票客户的姓名。
5) 查看剩余票数功能模块:对剩余用户可以订的票的数量进行查询并排序,便于
其他用户订票。
7) 退出系统功能模块:退出系统。
所以采用如下方案:
1) 本系统以菜单方式工作
2) 航线创建功能,我们定义了一个结构体Plane作为所有信息的录入单元且其
录入的相应信息应是以Plane作为数据单元进行存储的,然后对该创建的链表调
用insert()函数,存储到数据文件中去.采用链表作为存储结构功能的实现-
-输入;
3) 订票功能模块中我们应对乘客需要订的航班进行查,看是否可以满足乘客
所需的票,若可以则为乘客订票,并修改相应航班的剩余票数,退票功能模块则
应查询机票数据文件,先用指针在文件中到相应的要退的票,即把该订票单元
结构体删除并修改退票航班的剩余票数即可;
4) 航班信息和订票信息的查看功能--输出查询航班(按航班号或抵达城市查
询)
2
飞机订票系统 第 3 页 共 30 页
2数据结构设计描述
本程序我采用了结构体,线性表存储,文件和链表存储结构。
3软件结构设计(系统功能模块图)
图3-1整体结构框图
4算法设计思想
4.1. 数据类型定义
调用头文件,定义文件指针
#include
#include
#include
#include
typedef struct wat_ros
3
飞机订票系统 第 4 页 共 30 页
{ char name[10];/*姓名*/
char ID[18];/*身份证号*/
int req_amt;/*订票量*/
struct wat_ros *next;
}qnode,*qptr; //定义结构体指针变量
void main();
void insert(); //添加航班信息函数
航班的基本信息其数据结构为:
struct airline
{ char ter_name[10];/*终点站名 */
char air_num[10];/*航班号*/
char plane_num[10];/*飞机号*/
char date[7];/*飞行日期(星期几)*/
int tkt_amt;/*乘员定额*/
int tkt_sur;/*余票量*/
linklist *order;/*乘员名单域,指向乘员名单链表的头指针*/
linkqueue wait;/*等候替补的客户名单域,分别指向排队等候名单队头队
尾的指针*/
}lineinfo;
3) 定义定票的乘客基本信息
typedef struct ord_ros
{ char name[10];/*客户姓名*/
char ID[18];/*身份证号*/
int ord_amt;/*订票量*/
int grade;/*舱位等级*/
struct ord_ros *next;
}linklist;
4.2.
主要模块内部设计(我主要负责录入模块和修改模块)_
4.2.1、录入航班信息模块(创建链)
4
飞机订票系统 第 5 页 共 30 页
1) 本模块是对程序中的insert()函数的详细说明——链表的存储结构,存
储到数据单链表中去,
该模块的算法如下:
void insert() {
for (int i=0;i printf("请输入航班%d信息(共%d条):",i+1,MAXSIZE); scanf("%8s%3s%s%4s%3d%10d",(air+i)->ter_name,(air+i)->air_num,(air+i)->plane_ num,(air+i)->date,&(air+i)->tkt_amt,&(air+i)->tkt_sur); } 4.2.2、 查看和查询航班信息模块 由于航班的录入和保存是由链表存储结构进行的,并且是保存在单链表中, 所以此查询就可通过链表查询,在查看便是将其文件中所有的航班信息进行输出, 而查询我们可根据航班号和航班抵达的城市匹配查看,在查询中将需要查询的航 班号和文件阅读时指针所指的值进行比较,从而匹配输出; 4.2.3 订票模块 先根据数据定义进行订票时信息的输入,在定票时应先按乘客想要定的航班 号或者抵达城市查询,并按乘客欲定的票的数目与查询数目进行比较,若此比较 结果大于或等于0,则输出乘客可以定票,在修改航班信息中该航班的数量,且 在整个定票系统中,所有的定票都用链表进行存储管理; 4.2.4退票模块 在退票系统中即对航班票的数据文件进行管理,所以可先按照查询航班票的 方法,若查询到的票的信息和乘客此时要求退票的信息相匹配,则删除相应的该 票的节点,再修改其航班信息; 5 飞机订票系统 第 6 页 共 30 页 5调试分析 5. 1 测试用例 自定义一些航班信息,直接对各个模块功能进行测试。 5.2 测试结果 1) 主界面: 图5-1 2) 以管理员的身份进入,输入密码(2009): (1) 主菜单窗口运行界面如下: 图5-2 (2) : 航线创建功能模块,选择1创建航线,运行界面如下 6 飞机订票系统 第 7 页 共 30 页 图5-3 (3) 查看航班信息功能模块,选择3查看航班信息,运行界面如下: 图5-4 (4) 订票功能模块,选择2订票,其运行界面如下: 7 飞机订票系统 第 8 页 共 30 页 图5-5 (5) 查看订票功能模块,选择4查看订票信息,运行界面如下: 图5-5 (5 ) 退票功能模块,选择5退票,运行界面如下: 图5-7 选择4查看订票信息,因为已经退票,所以信息为空,其运行界面如下: 8 飞机订票系统 第 9 页 共 30 页 (7) 修改航班信息功能模块,选择7修改航班信息,其运行界面如下: 图5-8 9 飞机订票系统 第 10 页 共 30 页 再选择3查看航班信息,以确认航班信息是修改成功,其运行界面如下: 图5-9 (8) 查询航班信息功能模块,选择5查询航班信息, 选择1按航班号查询,其运行界面如下: 10 飞机订票系统 第 11 页 共 30 页 图5-10 选择2,按到飞机到达地点查询,其运行界面如下: 11 飞机订票系统 第 12 页 共 30 页 图5-11 6总结 一份耕耘一份收获,经过一周的刻苦学习,认真实践,终于完成了这份“飞 机订票系统”的数据结构课程设计。看着辛苦成果,看着这30多页的报告,心中 有种很复杂的感情。 在这次课程设计中我收获了很多东西,不仅包括知识上的,更重要的是学会 用一种平和坚定的心态去面对困难。虽然我C还学得不错,但对数据结构的知识 点还掌握的不是很扎实,很多算法知道大概思想,但到具体实施的时候就会出现 不完善的地方或错误。同样我了解到自己原来知识还是比较欠缺。自己要学习的 东西还太多。通过这次课程设计,我才明白学习是一个长期积累的过程,在以后 的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。 我的心得也就这么多了,总之,不管学会的还是学不会的的确觉得困难比较 多,真是万事开头难,不知道如何入手。最后终于做完了有种如释重负的感觉。 此外,还得出一个结论:知识必须通过应用才能实现其价值!有些东西以为学会 了,但真正到用的时候才发现是两回事,所以我认为只有到真正会用的时候才是 真的学会了。 本次程序设计主要用到了结构体、调用函数、文件的保存、输入以及输出等 功能。使我对数据结构有了更深一层的认识,特别是对链表和文件的运用得到了 很大的提高。这次设计是我们对明年毕业设计的一次演练,很好的培养了我的论 文写作的规范性。 最后要感谢老师们给我们的帮助,在设计过程中,我通过查阅大量有关资料, 与同学交流经验和自学,并向老师请教等方式,使自己学到了不少知识,也经历 了不少艰辛,但收获同样巨大。在整个设计中我懂得了许多东西,也培养了我独 立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有 非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中 探索的艰难和成功时的喜悦。虽然这个设计做的也不太好,但是在设计过程中所 学到的东西是这次课程设计的最大收获和财富,使我终身受益。 12 飞机订票系统 第 13 页 共 30 页 7参考文献 [1] 严蔚敏,吴伟民. 《数据结构(C语言版)》. 清华大学出版社 [2] 吴文虎 《程序设计基础》 北京:清华大学出版社,2003 [3] 李志球 《实用C语言程序设计教程》北京:电子工业出版社,1999 [4] 徐孝凯 《数据结构实用教程(第二版)》 清华大学出版社 [5] 谭浩强.C程序设计(第二版).北京:清华大学出版社,2000 13 飞机订票系统 第 14 页 共 30 页 8附录(源程序清单) #include #include #include struct Plane //定义航班结构体 { int num; //航班号 char Stime[50]; char Etime[50]; char Start[50]; char Ends[50]; float Price; float Discount;//折扣 int Msum; //该航班最多载人数 Plane *next; }; Plane *Phead=ULL; FILE *fp; //定义文件型指针变量 void main(); void fn(); //航班信息函数 Plane * PCreate()//创建航线上的航班链表 { int k=1; Plane * ps; Plane * pEnd; ps=new Plane;//新链表->ps cout<<"请输入航班号:"; cin>>ps->num; cout<<"起飞的时间:"; cin >>ps->Stime; cout<<"抵达的时间:"; cin>>ps->Etime; cout<<"起点:"; cin>>ps->Start; cout<<"终点:"; 14 飞机订票系统 第 15 页 共 30 页 cin>>ps->Ends; cout<<"该航班现票价:"; cin>>ps->Price; cout<<"该票价的折扣:"; cin>>ps->Discount; cout<<"准载人数:"; cin>>ps->Msum; cout< pEnd=ps;//起始地址->终点地址 while(ps->num!=0) { if(Phead==ULL) Phead=ps; else pEnd->next=ps; pEnd=ps; ps=new Plane; cout<<"航班号(输入0结束):"; cin>>ps->num; } pEnd->next=ULL; return Phead; } void save(Plane * head1) //保存信息 {if((fp=fopen("","ab"))==ULL) //向二进制文件尾增加数据 {return; } for(;head1;head1=head1->next) fwrite(head1,sizeof(Plane),1,fp); //写入数据 fclose(fp); } void hangxian() //航线 { Plane * head1=PCreate(); save(head1);} 15 飞机订票系统 第 16 页 共 30 页 void watchP()//功能3:查看信息 { Plane *tail, *temp=new Plane; Phead=tail=ULL; int flag=1; if((fp=fopen("","rb"))==ULL) //为输入打开一个二进制文件 { printf("出错,请检查文件是否存在,按任意键返回住菜单n");//出错提示 main(); } while((fread(temp,sizeof(struct Plane),1,fp))==1) { if(Phead==ULL){Phead=tail=temp;Phead->next=ULL;} else { temp->next=ULL; tail->next=temp; tail=temp; } cout< cout<<"你要查看的信息如下:"< cout<<""< cout<<"航班号:"< cout<<"起飞时间:"< cout<<"抵达时间:"< cout<<"起点站:"< cout<<"终点站:"< cout<<"票 价:"< cout<<"票的折扣"< cout<<"准载人数:"< cout<<""< cout<<"谢谢使用!退出!"< temp=new Plane; } delete tail,temp; 16 飞机订票系统 第 17 页 共 30 页 fclose(fp); } void search_num() //按照航班号查 { int num; int k=1; Plane*tail, *temp=new Plane; Phead=ULL; if((fp=fopen("","rb"))==ULL) { printf("出错,请检查文件是否存在,按任意键返回主菜单");//出错提示 getchar(); fn(); } while((fread(temp,sizeof(Plane),1,fp))==1) { if(Phead==ULL){Phead=tail=temp;Phead->next=ULL;} else { temp->next=ULL; tail->next=temp; tail=temp; } temp=new Plane; } cout<<"请输入所要查航班号:"< cin>>num; if(Phead==ULL) { printf("没有你所查的信息!");fn(); } for(;Phead;Phead=Phead->next) { if(Phead->num==num) { cout< 17 飞机订票系统 第 18 页 共 30 页 cout<<""< cout<<"航班号是:"< cout<<"起飞时间:"< cout<<"抵达时间:"< cout<<"起点站:"< cout<<"终点站:"< cout<<"票价:"< cout<<"票的折扣:"< cout<<"准载人数:"< cout<<""< cout<<"谢谢使用!"< } } delete tail,temp; fclose(fp); cout< cin>>k; switch(k) { case 1: search_num();break; case 2: //fn();break; default:cout< } } void search_Ends()//按到达的地点查询 { char Ends[50]; int k=1; Plane *tail, *temp=new Plane; Phead=ULL; if((fp=fopen("","rb"))==ULL) { printf("出错,请检查文件是否存在,按任意键返回主菜单");//出错提示 18 飞机订票系统 第 19 页 共 30 页 getchar(); fn(); } while((fread(temp,sizeof(Plane),1,fp))==1) { if(Phead==ULL){Phead=tail=temp;Phead->next=ULL;} else { temp->next=ULL; tail->next=temp; tail=temp; } temp=new Plane; } cout<<"请输入所要查航班号地抵达地点:"< cin>>Ends;; if(Phead==ULL) { printf("没有你所查的信息!");fn(); } for(;Phead;Phead=Phead->next) { if(strcmp(Phead->Ends,Ends)==0) { cout< cout<<""< cout<<"航班号是:"< cout<<"起飞时间:"< cout<<"抵达时间:"< cout<<"起点站:"< cout<<"终点站:"< cout<<"票 价:"< cout<<"票的折扣:"< cout<<"准载人数:"< cout<<""< cout<<"谢谢使用!"< 19 飞机订票系统 第 20 页 共 30 页 } } delete tail,temp; fclose(fp); cout< cin>>k; switch(k) { case 1: search_num();break; case 2: //fn();break; default:cout< } } void browsePlane() //功能4:查询航线 { int i; cout<<"请选择按键 "< cout< cin>>i; switch(i) { case 1: search_num();break; case 2: search_Ends();break; case 0: fn();break; default:cout<<"按键错误!请重新按键!"< } fn(); } void change()//功能5:修改航班信息(当修改信息不存在时,不运行) { int num; 20 飞机订票系统 第 21 页 共 30 页 int i=0; Plane temp; if((fp=fopen("","rb+"))==ULL) { printf("出错,请检查文件是否存在,按任意键返回主菜单");//出错提示 } cout<<"请输入所要修改的航班号:"< cin>>num; while((fread(&temp,sizeof(Plane),1,fp))==1) { i++; if(==num) { cout<<"修改相应的航班信息:"< cout<<"修改后航班号是:"; cin>>; cout< cout<<"修改后的起飞时间是:"; cin >>; cout< cout<<"修改后的抵达时间是:"; cin>>; cout< cout<<"修改后的起点是:" ; cin>>; cout< cout<<"修改后的终点是:"; cin>>; cout< cout<<"修改后的票价是:"; cin>>; cout< cout<<"修改后的票的折扣是:"; cin>>nt; cout<<"修改后的准载人数:"; 21 飞机订票系统 第 22 页 共 30 页 cin>>; cout<<""< cout<<"修改完毕!"< cout< fseek(fp,(i-1)*sizeof(Plane),0); fwrite(&temp,sizeof(Plane),1,fp); fseek(fp,0,0); } } fclose(fp); } struct airticket //乘客信息 { long int IDcard; //身份证件号 int Pnum; //定票的航班号 int day; //定票日期 int count; //定票数量 char ame[50];//定票人的姓名 airticket *next; }; airticket * head=ULL; airticket * Create()//创建航班票的链表 { airticket * ps; airticket * pEnd; ps=new airticket; cout<<"航班号:"; cin>>ps->Pnum; cout<<"定票的日期:"; cin>>ps->day; cout<<"定票人的姓名: "; cin>>ps->ame; cout<<"身份证号:"; cin>>ps->IDcard; 22 飞机订票系统 第 23 页 共 30 页 cout<<"票数: "; cin>>ps->count; cout< pEnd=ps; while(ps->Pnum!=0) { if(head==ULL) head=ps; else pEnd->next=ps; pEnd=ps; ps=new airticket; cout<<"航班号(航班号位0结束输入):"; cin>>ps->Pnum; /*cout<<"定票的日期: "; cin>>ps->day; cout<<"定票人的姓名: "; cin>>ps->ame; cout<<"身份证号:"; cin>>ps->IDcard; cout<<"票数: "; cin>>ps->count;*/ cout< } pEnd->next=ULL; return head; } void save(airticket * head1)//保存信息 { if((fp=fopen("","ab"))==ULL) { return; } for(;head1;head1=head1->next) 23 飞机订票系统 第 24 页 共 30 页 fwrite(head1,sizeof(airticket),1,fp); fclose(fp); } void dingpiao()//功能1:订票 { airticket * head1=Create(); save(head1); cout<<"你已经成功完成订票!"< } void tuipiao()//功能2:退票 { airticket *tail, *temp=new airticket; head=ULL; if((fp=fopen("","rb"))==ULL) { printf("出错,请检查文件是否存在,按任意键返回主菜单");//出错提示 getchar(); fn(); cout<<"恭喜你,你已经成功完成退票"< } while((fread(temp,sizeof(airticket),1,fp))==1) { if(head==ULL){head=tail=temp;head->next=ULL;} else { temp->next=ULL; tail->next=temp; tail=temp; } temp=new airticket; } fclose(fp); int num; if(!head) { 24 飞机订票系统 第 25 页 共 30 页 cout<<"n数据为空!n";return; } temp=tail=head; cout<<"请输入想退机票的航班号:"; cin>>num; for(;tail;tail=tail->next) { if(head->Pnum==num){head=tail->next;} else if(tail->Pnum==num) { temp->next=tail->next; cout<<"你已经成功完成退票"< } temp=tail; } if((fp=fopen("","wb"))==ULL)return; for(;head;head=head->next) fwrite(head,sizeof(airticket),1,fp); fclose(fp); } void watchT()//功能3:查看信息 { airticket *tail, *temp=new airticket; head=tail=ULL; int flag=1; if((fp=fopen("","rb"))==ULL) { printf("出错,请检查文件是否存在,按任意键返回主菜单n");//出错提示 main(); } while((fread(temp,sizeof(struct airticket),1,fp))==1) { if(head==ULL){head=tail=temp;head->next=ULL;} else { 25 飞机订票系统 第 26 页 共 30 页 temp->next=ULL; tail->next=temp; tail=temp; } cout< cout<<"你所查看的信息如下:"< cout<<""< cout<<"航班号:"< cout<<"定票日期:"< cout<<"定票人的姓名:"< cout<<"身份证号:"< cout<<"票数:"< cout<<""< cout<<"谢谢使用!"< temp=new airticket; } delete tail,temp; fclose(fp); } void fn() //航班信息函数 { int i=1; while(i) { cout< cout<<"请输入航班信息:"< cout<<" 1 航线创建(输入0结束)"< cout<<" 2 订 票(输入0结束)"<