《数据结构课程设计(C语言版)飞机订票系统.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计(C语言版)飞机订票系统.doc(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构课程设计(C语言版)飞机订票系统 C语言版课题题目:飞机订票系统和图的遍历的动态演示姓名:学号:班级:指导教师:订票系统1.需求分析任务:通过此系统可以实现如下功能:录入:可以录入航班情况数据可以存储在一个数据文件中,数据结构、具体数据自定查询:可以查询某个航线的情况如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓;可以输入起飞抵达城市,查询飞机航班情况;订票:订票情况可以存在一个数据文件中,结构自己设定可以订票,如果该航班已经无票,可以提供相关可选择航班;退票: 可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
2、修改航班信息:当航班信息改变可以修改航班数据文件要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能;2:主要设计思路:算法构造流程图:A:主菜单:主菜单0123456789输入航班的信息列出航班的信息按航班号查询航班信息按城市来查询航班订票程序退票系统修改飞机航班的信息保存文件读取文件 、下载文件退出B:各分块模板的构造流程图:0.输入航班的信息航班号起飞城市降落城市出发时间降落时间剩下的座位价格折扣1.列出航班的信息继续 y退出 n2.按航班号查询航班信息输入所需要查询的航班号显示这个航班的的信息3.按城市来查询航班输入起飞城市输入降落城市显示这个航班的信息4.订票程
3、序输入号码输入名字输入ID需要定的票数航班号5.退票系统输入航班号输入你ID确定退票 1否认 06.修改飞机航班的信息输入要修改的航班号重新输入新的航班信息7.保存文件显示保存成功3:功能函数设计:1:订票系统主菜单函数 menu_select 本函数主要构造系统的主菜单,系统需要实现很多功能,并且各个功能需要各自的函数支持,所以通过主菜单可以轻松的进入各个函数下实现各自的功能,故主菜单显得尤为重要。其实就是通过键盘输入选择项,然后通过scanf接受,在通过swtich判断进入各个选择项。2:工作人员管理函数 enter &change 系统需要各个航班的详细信息,所以需要工作人员把信息输入系
4、统里,以供乘客查询订票。enter函数的构造就是为了解决这个问题。而有可能航班线路更改或由于天气等原因飞机的起飞时间发生了更改,故工作人员需要及时更改信息,所以需要构造change函数。3:列出航班信息的函数 list 乘客需要查询各个航班的信息,所以通过系统要能调出上面工作人员已经录入好的航班信息,所以构造本函数来实现这个功能。4乘客具体查询函数 search 本函数分两个分函数:search1和search2,它们分别实现乘客的按航班查询和按出发及抵达城市的两种查询方案。5票务管理函数 book&quit 通过book函数可以实现乘客的订票操作,通过quit可以实现乘客的退票操作。6文件操
5、作函数 save&load3.源程序代码:WIN TC下运行#include #include #include #include #define N 20#define Q 40 /*定义数据结构*/*乘客信息*/typedef struct char number10;/*编号*/ char id20; /*证件号*/ char name10; /*姓名*/ int count; /*订票数*/ char flightname10;/*乘坐航班号*/ GUEST; /*航班信息*/typedef struct char planenumber10;/*航班号*/ char Take_off
6、_city20;/*起飞城市*/ char Arrived_in_city20;/*抵达城市*/ char takeoff_time20;/*起飞时间*/ char Landing_time20;/*降落时间*/ int shipping; /*舱位数*/ char price5; /*票价*/ char discount5; /*折扣*/ GUEST guest20; int sit; FLY;/*菜单函数,函数返回值为整数,代表所选的菜单项*/menu_select int c; printf 按任意键返回主菜单n ;/*提示压任意键继续*/ getch ; /*读入任意字符*/ prin
7、tf Welcome tonn ; printf Tickets Booking Systemnn ; printf *MENU*nn ; printf 0. 输入航班信息n ; printf 1. 列出航班的信息n ; printf 2. 按航班号查询航班信息n ; printf 3. 按城市来查询航班n ; printf 4. 订票程序n ; printf 5. 退票系统n ; printf 6. 修改飞机航班的信息n ; printf 7. 保存文件n ; printf 8. 读取和下载文件n ; printf 9. 退出n ; printf *nn ; do printf n 输入你的
8、选择项 09 : ; /*提示输入选项*/ scanf %d,&c ; /*输入选择项*/ while c 0|c 9 ; /*选择项不在9之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/ /*输入函数*/int enter FLY t int i,k,n,m,w,j; char *s; printf 输入航线总数 n 40 : ;/*输入航线总数*/ scanf %d,&n ; while n 40|n 0 printf 输入错误!再次输入 0 n 40 : ;/*输入航线总数*/ scanf %d,&n ; printf 输入航班的信息nn ;/*提示信息
9、*/ printf 航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣n ; printf for i 0;i n;i+ scanf %s,ti.planenumber ;/*输入姓名*/ scanf %s,ti.Take_off_city ;/*输入起飞城市*/ scanf %s,ti.Arrived_in_city ;/*输入降落城市*/ scanf %s,ti.takeoff_time ;/*输入起飞时间*/ scanf %s,ti.Landing_time ;/*输入降落时间*/ scanf %d,&ti.shipping ;/*输入舱位数*/ scanf %s,ti
10、.price ;/*输入票价*/ scanf %s,ti.discount ;/*输入折扣*/ printf for i 0;i n;i+ ti.sit 0; return n; /*返回记录条数*/ /*显示记录,参数为记录数组和记录条数*/void list FLY t,int n int i; printf 航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣n ; printf for i 0;i n;i+ printf %-12s%-12s%-10s%-12s%-10s%-7d%-7s%-7sn,ti.planenumber,ti.Take_off_city,ti.A
11、rrived_in_city,ti.takeoff_time,ti.Landing_time,ti.shipping,ti.price,ti.discount ; printf *end*n ; /*按航班号查找记录*/void search1 FLY t,int n char s20; /*保存待查找航班名字符串*/ int i; printf 输入你想查找的航班名: ; scanf %s,s ; /*输入待查找航班名*/ for i 0;i n;i+ /*从第一条记录开始,直到最后一条*/ if strcmp s,ti.planenumber 0 /*记录中的航班名和待比拟的是否相等*/
12、break; /*相等,那么返回该记录的下标号,程序提前结结束*/ if i n-1 /*如果整数i值大于n-1,说明没找到*/ printf 没有找到n ; else printf 航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣n ; /*显示记录*/ printf printf %-12s%-12s%-10s%-12s%-10s%-7d%-7s%-7sn,ti.planenumber,ti.Take_off_city,ti.Arrived_in_city,ti.takeoff_time,ti.Landing_time,ti.shipping,ti.price,ti.d
13、iscount ; /*按起降城市查找记录*/void search2 FLY t,int n char s120; char s220; int i; printf 输入起飞城市名称: ; scanf %s,s1 ; /*输入起飞城市名*/ printf 输入降落城市名称: ; scanf %s,s2 ; /*输入降落城市名*/ for i 0;i n;i+ /*从第一条记录开始,直到最后一条*/ if strcmp s1,ti.Take_off_city 0 & strcmp s2,ti.Arrived_in_city 0 /*记录中的城市和待比拟的是否相等*/ break; /*相等,那
14、么返回该记录的下标号,程序提前结结束*/ if i n-1 /*如果整数i值大于n-1,说明没找到*/ printf 没有找到n ; else printf 航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣n ; /*找到,显示记录*/ printf printf %-12s%-12s%-10s%-12s%-10s%-7d%-7s%-7sn,ti.planenumber,ti.Take_off_city,ti.Arrived_in_city,ti.takeoff_time,ti.Landing_time,ti.shipping,ti.price,ti.discount ;
15、/*订票*/void book FLY t,int n char s20,number110,name110,id120,flightname110; int i,j 0,m,k,count1; printf 输入你想预订的票数: ; scanf %d,&m ; printf 号码 姓名 证件号 订的票数 航班号n ; /*提示信息*/ printf for k 0;k m;k+ scanf %s,number1 ; scanf %s,name1 ;/*输入订票客户姓名*/ scanf %s,id1 ;/*输入证件号*/ scanf %d,&count1 ;/*输入订票票数*/ scanf %
16、s,flightname1 ;/*输入航班号*/ for i 0;i n;i+ /*从第一条记录开始,直到最后一条*/ if strcmp flightname1,ti.planenumber 0 /*记录中的航班名和待比拟的是否相等*/ j ti.sit; strcpy ti.guestj.number,number1 ; strcpy ti.guestj.name,name1 ; strcpy ti.guestj.id,id1 ; ti.guestj.count count1; strcpy ti.guestj.flightname,flightname1 ; ti.shipping ti
17、.shipping-count1; ti.sit+; break; /*相等,那么返回该记录的下标号,程序提前结结束*/ if i n-1 /*如果整数i值大于n-1,说明没找到*/ printf 对不起!没有此航班n ; m m+2; k+; /*退票*/void quit FLY t,int n char s120,s220; /*保存待查找航班名和证件号字符串*/ int i,k,j,h,l,ch; printf 请输入你想退订的航班号: ; scanf %s,s1 ; /*输入待查找航班名*/ printf 请输入你的证件号: ; scanf %s,s2 ; /*输入待查找证件号*/
18、printf 号码 姓名 证件号 订的票数 航班号n ; /*显示提示*/ printf for i 0;i n;i+ /*从第一条记录开始,直到最后一条*/ for j 0;j ti.sit;j+ if strcmp s1,ti.guestj.flightname 0 & strcmp s2,ti.guestj.id 0 printf %-11s%-16s%-16s%-14d%-10sn,ti.guestj.number,ti.guestj.name,ti.guestj.id,ti.guestj.count,ti.guestj.flightname ; ti.shipping ti.ship
19、ping+ti.guestj.count; l j; h i; break; i h; if i n-1 /*如果整数i值大于n-1,说明没找到*/ printf 没有找到n ; else printf 你是否确认删除 1/0 n ; /*确认是否要删除*/ scanf %d,&ch ; /*输入一个整数或*/ if ch 1 /*如果确认删除整数为*/ for k l+1;k ti.sit;k+ strcpy ti.guestk-1.number,ti.guestk.number ; /*将后一条记录的姓名拷贝到前一条*/ strcpy ti.guestk-1.name,ti.guestk.
20、name ; strcpy ti.guestk-1.id,ti.guestk.id ; ti.guestk-1.count ti.guestk.count; strcpy ti.guestk-1.flightname,ti.guestk.flightname ; ti.sit-; printf 退票成功!n ;/*提示退票成功*/ /*修改航班信息*/void channge FLY t,int n char s20; /*要删除记录的姓名*/ int i,j; printf 请输入你要修改的航班号: ; /*提示信息*/ scanf %s,s ;/*输入航班名*/ for i 0;i n;i
21、+ /*从第一条记录开始,直到最后一条*/ if strcmp s,ti.planenumber 0 /*记录中的航班名和待比拟的是否相等*/ break; /*相等,那么返回该记录的下标号,程序提前结结束*/ if i n-1 /*如果整数i值大于n-1,说明没找到*/ printf 没有找到n ; else printf 航班号起飞城市 降落城市 出发时间 降落时间 剩下的座位 价格 折扣n ; /*找到,显示原先记录*/ printf printf %-12s%-12s%-10s%-12s%-10s%-7d%-7s%-7sn,ti.planenumber,ti.Take_off_city
22、,ti.Arrived_in_city,ti.takeoff_time,ti.Landing_time,ti.shipping,ti.price,ti.discount ; printf please input the new information:n ; scanf %s,ti.planenumber ;/*输入航班名*/ scanf %s,ti.Take_off_city ;/*输入起始城市*/ scanf %s,ti.Arrived_in_city ;/*输入终点城市*/ scanf %s,ti.takeoff_time ;/*输入起飞时间*/ scanf %s,ti.Landing
23、_time ;/*输入降落时间*/ scanf %d,ti.shipping ;/*输入座位号*/ scanf %s,ti.price ;/*输入票价*/ scanf %s,ti.discount ;/*输入折扣*/ /*保存资料*/void save FLY t,int n int i,j; FILE *fp; /*指向文件的指针*/ if fp fopen record1.txt,wb NULL /*翻开文件,并判断翻开是否正常*/ printf can not open filen ;/*没翻开*/ exit 1 ; /*退出*/ printf n保存文件n ; /*输出提示信息*/ f
24、printf fp,%d,n ; /*将记录数写入文件*/ fprintf fp,rn ; /*将换行符号写入文件*/ for i 0;i n;i+ fprintf fp,%s %s %s %s %s %d %s %s,ti.planenumber,ti.Take_off_city,ti.Arrived_in_city,ti.takeoff_time,ti.Landing_time,ti.shipping,ti.price,ti.discount ; fprintf fp,rn ; /*将换行符号写入文件*/ fprintf fp,%d,ti.sit ; /*将记录数写入文件*/ fprint
25、f fp,rn ; /*将换行符号写入文件*/ for j 0;j ti.sit;j+ fprintf fp,%s %s %s %d %s,ti.guestj.number,ti.guestj.name,ti.guestj.id,ti.guestj.count,ti.guestj.flightname ;/*格式写入记录*/ fprintf fp,rn ; /*将换行符号写入文件*/ fclose fp ;/*关闭文件*/ printf *恭喜!保存成功*n ; /*显示保存成功*/ /*读入函数,参数为结构体数组*/int load FLY t int i,n,j; FILE *fp; /*
26、指向文件的指针*/ if fp fopen record1.txt,rb NULL /*翻开文件*/ printf 不能翻开n ; /*不能翻开*/ exit 1 ; /*退出*/ fscanf fp,%d,&n ; /*读入记录数*/ for i 0;i n;i+ fscanf fp,%s %s %s %s %s %d %s %s,ti.planenumber,ti.Take_off_city,ti.Arrived_in_city,ti.takeoff_time,ti.Landing_time,&ti.shipping,ti.price,ti.discount ; fscanf fp,%d,
27、&ti.sit ; /*读入记录数*/ for j 0;j ti.sit;j+ fscanf fp,%s %s %s %d %s,ti.guestj.number,ti.guestj.name,ti.guestj.id,&ti.guestj.count,ti.guestj.flightname ; /*按格式读入记录*/ fclose fp ; /*关闭文件*/ printf 你已经成功从文件读取数据!nnnn ; /*显示读取成功*/ return n; /*返回记录数*/ /*主函数*/main int i; FLY flightQ; int length; /*保存记录长度*/ for
28、; /*无限循环*/ switch menu_select /*调用主菜单函数,返回值整数作开关语句的条件*/ case 0:length enter flight ;break;/*输入记录*/ case 1:list flight,length ;break; /*显示全部记录*/ case 2:search1 flight,length ;break; /*查找记录*/ case 3:search2 flight,length ;break; /*查找记录*/ case 4:book flight,length ;break; /*订票*/ case 5:quit flight,leng
29、th ;break; /*退票*/ case 6:channge flight,length ;break; /*修改航班信息*/ case 7:save flight,length ;break; /*保存文件*/ case 8:length load flight ; break; /*读文件*/ case 9:exit 0 ; /*如返回值为那么程序结束*/ 4.系统运行时窗口截图:VC6.0下的运行结果订票系统菜单窗口0.输入航班的信息1.列出航班的信息2.按航班号查询航班信息3.按城市来查询航班4.订票程序5.退票系统6.修改飞机航班的信息7.保存文件8.读取文件 、下载文件图的遍历
30、过程演示需求分析:设计程序完成如下功能:对给定的图的结构和起点,产生深度优先遍历和广度优先遍历,并列出求解的过程动态演示。主要设计思路: 设计思想:简而言之,深度优先,就是先遍历它的一个邻接点,这个邻接点的邻接点然后才遍历其他的邻接点。广度优先,就是先把它所有的邻接点都遍历完以后,再遍历它每个邻接点的邻接点 。存储结构为图的邻接多重表,它是无向图的一种链式存储结构。深度优先遍历:设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边 x,y 。假设发现顶点y已访问过,那么重新选择另一条从x出发的未检测过的边,否那么沿边 x,y 到达未曾访问过的y,对y访问并将其标记为已访问
31、过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。此时,假设x不是源点,那么回溯到在x之前被访问过的顶点;否那么图中所有和源点有路径相通的顶点 即从源点可达的所有顶点 都已被访问过,假设图G是连通图,那么遍历过程结束,否那么继续选择一个尚未被访问的顶点作为新源点,进行新的搜索过程。 广度优先遍历:设x和y是两个相继要被访问的未访问过的顶点。它们的邻接点分别记为x1,x2,xs和y1,y2,yt。 为确保先访问的顶点其邻接点亦先被访问,在搜索过程中使用队列来保存
32、已访问过的顶点。当访问x和y时,这两个顶点相继入队。此后,当x和y相继出队时,我们分别从x和y出发搜索其邻接点x1,x2,xs和y1,y2,yt,对其中未访者进行访问并将其入队。这种方法是将每个已访问的顶点入队,故保证了每个顶点至多只有一次入队。图的算法构造思想:1CreateALGraph 初始条件:V是图的顶点集,VR是图中弧的集合.操作结果:按V和VR是定义构造图G.2. DestroyGraph &G 初始条件:图G存在操作结果:销毁图G3LocateVex G,u 初始条件: 图G存在,u和G中顶点有相同的特征操作结果:假设图G中存在顶点u,那么返回该顶点在图中的位置;否那么返回其他
33、信息4. GetVex G,v 初始条件: 图G存在,v是G中顶点操作结果:返回v的值5. FirstAjvex G,v 初始条件: 图G存在,v是G中顶点操作结果:返回v的第一个邻接顶点,假设顶在图中没有邻接顶点,那么返回为空6. NextAjvex G,v,w 初始条件: 图G存在,v是G中顶点,w是v的邻接顶点操作结果:返回v的下一个邻接顶点,假设w是v的最后一个邻接顶点,那么返回空7. DeleteVexx &G,v 初始条件: 图G存在,v是G中顶点操作结果:删除顶点v已经其相关的弧8. DFStraverse ALGraph 初始条件: 图G存在,visit的顶点的应用函数操作结果
34、: 对图进行深度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,那么操作失败9. BFStraverse ALGraph 初始条件: 图G存在,visit的顶点的应用函数操作结果: 对图进行广度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,那么操作失败附图的结构体构造:ALGraph 数据对象V:V是具有相同特性的数据元素的集合,称为点集.数据关系R:R VR VR v,w |v,w属于V, v,w 表示v和w之间存在的路径 B队列的算法构造:1. Init_Seueue 操作结果:构造一个空队列Q2. DestryoQueue &Q
35、初始条件:队列Q已存在。 操作结果:队列Q被销毁,不再存在。3. In_Seueue 初始条件:队列Q已经存在操作结果:插入元素e为Q的新的队尾元素4. Out_Seueue 初始条件:Q为非空队列操作结果:删除Q的队尾元素,并用e返回其值5. Empty_Seueue 初始条件:队列已经存在操作结果:假设队列为空,那么返回TRUE,否那么返回FLASEC本程序包含的模板:1.程序模块 Main 取得顶点数和弧数;生成邻接表结构的图;深度遍历图;广度遍历图; 2造邻接表结构的图;3度优先遍历图;4度优先遍历图;5列的根本操作模块;6数声明模块;三.源程序代码: VC+6.0下运行 #inclu
36、de #include #include #define _VERTEX_NUM 50 /图的最大顶点数 #define QSIZE 200 /队列的最大容量 enum BOOL False,True ; /定义枚举变量typedef struct ArcNode /图的邻接表存储 int adjvex; /该弧所指向的顶点的位置 struct ArcNode *nextarc; /指向下一条弧的指针 ArcNode; /弧结点 typedef struct ArcNode* AdjList_VERTEX_NUM; /指向第一条依附该顶点的弧的指针 int vexnum,arcnum; /图的
37、当前顶点和弧数 Graph; typedef struct /队列结构 int elemQSIZE; /数据域 int front; /队头指针 int rear; /队尾指针 Sueue; BOOL visited_VERTEX_NUM; /全局变量访问标志数组 void CreateGraph Graph & ; /生成图的邻接表 void DFSTraverse Graph ; /深度优先搜索遍历图 void DFS Graph,int ; void BFSTraverse Graph ; /广度优先搜索遍历图 void Initial Sueue & ; /初始化一个队列 BOOL QueueEmpty Sueue ; /判断队列是否空 BOOL EnQueue Sueue &,int ; /将一个元素入队列 BOOL DeQueue Sueue &,int & ; /将一个元素出队列 int FirstAdjVex Graph,int ; /求图中某一顶点的第一个邻接顶点 int NextAdjVex Graph,int,int ; /求某一顶点的下一个邻接顶点 int main Graph G; /采用邻接表结构的图
限制150内