全国交通咨询模拟系统C实现课程设计报告.doc

上传人:苏美尔 文档编号:8930004 上传时间:2021-01-25 格式:DOC 页数:23 大小:131.50KB
返回 下载 相关 举报
全国交通咨询模拟系统C实现课程设计报告.doc_第1页
第1页 / 共23页
全国交通咨询模拟系统C实现课程设计报告.doc_第2页
第2页 / 共23页
全国交通咨询模拟系统C实现课程设计报告.doc_第3页
第3页 / 共23页
全国交通咨询模拟系统C实现课程设计报告.doc_第4页
第4页 / 共23页
全国交通咨询模拟系统C实现课程设计报告.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《全国交通咨询模拟系统C实现课程设计报告.doc》由会员分享,可在线阅读,更多相关《全国交通咨询模拟系统C实现课程设计报告.doc(23页珍藏版)》请在三一文库上搜索。

1、全国交通咨询模拟 一、设计目的掌握线性表、栈、图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储结构求解最优路线问题,解决有关实际问题。得到软件设计技能的训练。二、问题描述交通咨询模拟。根据旅客的不同需要,要考虑到旅客希望在旅途中的时间尽可能短、希望旅费尽可能省等的要求。旅途用火车或飞机作为交通工具。用计算机编制程序,为旅客提供两种最优决策的交通咨询系统。三、基本要求1、对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;2、对城市间的两种交通工具:飞机和火车。对飞机航班和列车时刻表进行编辑:里程、航班和列车班次的添加

2、、修改、删除;3、提供两种最优决策:最快到达或最省钱到达。全程只考虑一种交通工具,可以不考虑回程;4、旅途中的耗费的总时间应包括中转站的等候时间。其中飞机至少二小时,火车至少一小时;5、咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟班机或列车何时到达何地。四、实现提示1、算法思路(1) 数据存储。城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。建议把城市信息存于文件前面,交

3、通信息存于文件的后面,用fread和fwrite函数操作。(2) 数据的逻辑结构。根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为有向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的等候时间)或旅费。(3) 数据的存储结构。采用邻接表和邻接矩阵都可作为数据的存储结构,但当邻接边不多时,宜采用邻接表,以提高空间的存储效率。这里建议采用邻接表作为数据的存储结构。(4) 用不同的功能模块对城市信息和交通信息进行编辑。添加、修改、删除功能可用菜单方式或命令提示方式。只要能方便的对城市信息和交通信息进行管理即可,但要注意人机界面,具体实现由学生自行设计,也可参考有关程序(

4、届时在网上提供)。这些工作有不小的工作量。(5) 最优决策功能模块(fast or province)。 读入城市信息和交通信息,用邻接表生成含权网络,表头数组中的元素存放城市名及对方城市到达该元素所代表城市的所有信息;表头数组中的元素所对应的单链表存放与该元素所代表的城市有交通联系的城市(代码、里程、航班、列车车次)。 根据具体最优决策的要求,用Dijkstra算法求出出发城市到其它各城市的最优值(最短时间或最小的费用),搜索过程中所经过城市的局部最优信息都保存在邻接表的表头数组中。其目的城市所代表的元素中就保存了所需的最优决策结果。这过程中,要用队列或栈保存局部最优决策值(局部最短的时间或

5、最省的费用)变小的城市,其相应的初始值可为,并在表头数组对应的城市元素中保存响应的信息。开始时,栈(队)中只有出发地城市,随着对栈(队)顶(首)城市有交通联系的城市求得决策值(最短时间或最小的费用),若该值是局部最优值且该城市不在栈(队)中,则进栈(队),直至栈(队)为空。 输出结果。从目的城市出发,搜索到出发城市,所经过的城市均入栈,再逐一出栈栈中的城市,输出保存在表头数组中对应城市的信息(对方城市的出发信息,里程、时间、费用等)及最终结果。即输出依次于何时何地乘坐几点的飞机或火车于何时到达何地;最终所需的最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间。(6) 主程序可以

6、有系统界面、菜单;也可用命令提示方式;选择功能模块执行,要求在程序运行过程中可以反复操作。2、数据结构本程序运用了关于图这种数据结构。他的抽象数据类型定义如下:typedef struct unDiGraph int numVerts; /结点 costAdj cost; /邻接矩阵unDiGraph,*UNG;基本操作:unDiGraph* CreateCostG()操作结果:构造带权(费用)图。unDiGraph* CreateTimeG()操作结果:构造带权(时间)图。构造飞机带权(费用)图。PathMat *Floyed(unDiGraph *D)操作结果:Floyed函数 求任意两点

7、的最短路径。3、算法思想 本程序运用了图的知识,构造了无向带权费用图和无向带权时间图。(如图1,图2所示) 图1. 十三城市之间火车费用表(权值表示费用) 图2. 十三城市之间火车行驶时间表 (权值表示时间)并利用Floyed函数求带权图两点之间的最短路径。通过对带权费用图和带权时间图求最短路径,就可以最短道从一城市到另一城市之间最省时间和最省费用的走法。 为了简洁直观,本设计对课本内的交通网进行了简化,原来的25个城市缩减为13个。但是基本实现了设计的目的。满足了基本要求。4、程序模块1 程序是用dos 版做的界面。2 主界面包括1.选择火车最短时间路线 2.选择火车最节约费用路线3.选择坐

8、飞机 4.管理员程序确 5.退出本程序3 程序的模块为#include #include #include #include #include #include /引用的文本件#define INF 65535 /定义一个最大数定为无穷值#define MAX 13typedef int costAdjMAX+1MAX+1;/图邻接矩阵从1开始记数int PathMAX+1MAX+1;/图邻接矩阵从1开始记数int o13,h;typedef struct unDiGraphint numVerts; /结点costAdj cost; /邻接矩阵unDiGraph,*UNG; /图的定义cos

9、tAdj B,L;void pr(int i)/选择城市void pri()/输出城市unDiGraph *CreateCostG()/构造带权(费用)图 返回首地址G:unDiGraph *CreateTimeG()/构造带权(时间)图 返回首地址G:unDiGraph *CreateFlyG()/飞机的相关信息void Floyed(unDiGraph *D,unDiGraph *M) /Floyed函数 求任意两点的最短路径:void prn_pass(int i,int j) /为了求从i到j的最短路径,只需要调用如下的过程void time()/求最少时间路径。void money(

10、)/求最少花费路径void administrator()/管理员功能void main()/main函数5、 主程序#include #include #include #include #include #include #define INF 65535 /定义一个最大数定为无穷值#define MAX 23static int c_number=13;static int k=0;staticint v=0,z=0,r=0,t=0;typedef struct zhuint c_cost;int c_time;int f_cost;int f_time;zhu;zhu m20,x20,

11、n20;typedef int costAdjMAX+1MAX+1;/图邻接矩阵从1开始记数int PathMAX+1MAX+1;/图邻接矩阵从1开始记数typedef struct unDiGraphint numVerts; /结点costAdj cost; /邻接矩阵unDiGraph,*UNG; /图的定义typedef struct c_editchar a10;c_edit;c_edit add10;costAdj B,L;int pr(int i,int j) int h=0;if (j=0) h=i;else if (j=1)cinaddi.a;switch(h)/运用swit

12、ch语句。 case(0):cout;break;case(1) : cout成都 ; break; case(2) : cout西安 ;break; case(3) : cout郑州 ;break; case(4) : cout武汉 ;break; case(5) : cout株洲 ;break; case(6) : cout贵阳 ;break; case(7) : cout柳州 ;break; case(8) : cout广州 ;break; case(9) : cout南宁 ;break; case(10) : cout徐州 ;break;case(11) : cout北京 ;break

13、; case(12) : cout天津 ;break; case(13) : cout上海 ;break;default: coutaddi-13.a;return 1;/输出城市列表及相应代码void pri()int i;cout 城市及其代码endlendlendl; cout *endl; for (i=1;i=c_number;i+)couti.;pr(i,0);coutendl *endlendlendlendlendlendl;/构造带权(费用)图 返回首地址G:unDiGraph *CreateCostG(int o)/火车的花费的存贮和编辑功能unDiGraph *G;int

14、 i,j;int a=0,b=0,f,h=1;if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph) /为G分配存储空间。return(NULL);for(i=1;ic_number+1;i+)for(j=1;jcostij=INF; /初始化使G-costij为无穷。G-numVerts=c_number;G-cost16=G-cost61=96;G-cost12=G-cost21=84;G-cost23=G-cost32=51;G-cost34=G-cost43=53;G-cost45=G-cost54=40;G-cost56=G-cost65=90;G-

15、cost58=G-cost85=67;G-cost57=G-cost75=67;G-cost67=G-cost76=60;G-cost79=G-cost97=25;G-cost311=G-cost113=69;G-cost1112=G-cost1211=13;G-cost1210=G-cost1012=67;G-cost310=G-cost103=34;G-cost1310=G-cost1013=65;G-cost135=G-cost513=118;if (o) while(h=1)v=v+1;pri();cout火车花费编辑endl;cout请输入开始城市的代码a;cout请输入结尾城市的代

16、码b;cout请输入你的两地花费mv.c_cost;nv.c_cost=a;xv.c_cost=b;cout请选择endl;cout*endl;cout1:继续更改城市费用endl;cout0:返回上一级菜单endl;cout*h;switch(h) case 1: h=1;break;case 0: h=0;break;default:cout选择出错costnv.c_costxv.c_cost=mv.c_cost;v=f;return(G);/构造带权(时间)图 返回首地址G:unDiGraph *CreateTimeG(int o)/火车的时间的存贮和编辑功能unDiGraph *G;i

17、nt i,j;int a=0,b=0,f,h=1;if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph) /为G分配存储空间。return(NULL);for(i=1;ic_number+1;i+)for(j=1;jcostij=INF;/初始化使G-costij为无穷。G-numVerts=c_number;G-cost16=G-cost61=9;G-cost12=G-cost21=8;G-cost23=G-cost32=5;G-cost34=G-cost43=5;G-cost45=G-cost54=4;G-cost56=G-cost65=9;G-cost5

18、7=G-cost75=6;G-cost58=G-cost85=6;G-cost67=G-cost76=6;G-cost79=G-cost97=2;G-cost311=G-cost113=6;G-cost1112=G-cost1211=1;G-cost1210=G-cost1012=6;G-cost310=G-cost103=3;G-cost1310=G-cost1013=6;G-cost135=G-cost513=11;if (o) while(h=1)z=z+1;pri();cout火车时间编辑endl;cout请输入开始城市的代码a;cout请输入结尾城市的代码b;cout请输入你的两地时

19、间mz.c_time;nz.c_time=a;xz.c_time=b;cout请选择endl;cout*endl;cout1:继续更改城市时间endl;cout0:返回上一级菜单endl;cout*h;switch(h) case 1: h=1;break;case 0: h=0;break;default:cout选择出错costnz.c_timexz.c_time=mz.c_time;z=f;return(G);unDiGraph *CreateTimeF(int o)/飞机的时间的存贮和编辑功能unDiGraph *G;int i,j;int a=0,b=0,f,h=1;if(!(G=(

20、unDiGraph *)malloc(sizeof(unDiGraph) /为G分配存储空间。return(NULL);for(i=1;ic_number+1;i+)for(j=1;jcostij=INF;/初始化使G-costij为无穷。G-numVerts=c_number;G-cost16=G-cost61=3;G-cost12=G-cost21=2;G-cost23=G-cost32=1;G-cost34=G-cost43=2;G-cost45=G-cost54=4;G-cost56=G-cost65=3;G-cost57=G-cost75=6;G-cost58=G-cost85=6;

21、G-cost67=G-cost76=6;G-cost79=G-cost97=2;G-cost311=G-cost113=6;G-cost1112=G-cost1211=1;G-cost1210=G-cost1012=2;G-cost310=G-cost103=3;G-cost1310=G-cost1013=6;G-cost135=G-cost513=1;if (o) while(h=1)t=t+1;pri();cout飞机时间编辑endl;cout请输入开始城市的代码a;cout请输入结尾城市的代码b;cout请输入你的两地时间mt.f_time;nt.f_time=a;xt.f_time=b

22、;cout请选择endl;cout*endl;cout1:继续更改城市时间endl;cout0:返回上一级菜单endl;cout*h;switch(h) case 1: h=1;break;case 0: h=0;break;default:cout选择出错costnt.f_timext.f_time=mt.f_time;t=f;return(G);unDiGraph *CreateCostF(int o)/飞机花费的存贮和编辑功能unDiGraph *G;int i,j;int a=0,b=0,f,h=1;if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph

23、) /为G分配存储空间。return(NULL);for(i=1;ic_number+1;i+)for(j=1;jcostij=INF; /初始化使G-costij为无穷。G-numVerts=c_number;G-cost16=G-cost61=960;G-cost12=G-cost21=840;G-cost23=G-cost32=501;G-cost34=G-cost43=530;G-cost45=G-cost54=400;G-cost56=G-cost65=900;G-cost58=G-cost85=670;G-cost57=G-cost75=670;G-cost67=G-cost76=

24、600;G-cost79=G-cost97=200;G-cost311=G-cost113=690;G-cost1112=G-cost1211=310;G-cost1210=G-cost1012=670;G-cost310=G-cost103=340;G-cost1310=G-cost1013=650;G-cost135=G-cost513=1180;if (o) while(h=1)r=r+1;pri();cout飞机花费编辑endl;cout请输入开始城市的代码a;cout请输入结尾城市的代码b;cout请输入你的两地花费mr.f_cost;nr.f_cost=a;xr.f_cost=b;

25、cout请选择endl;cout*endl;cout1:继续更改城市费用endl;cout0:返回上一级菜单endl;cout*h;switch(h) case 1: h=1;break;case 0: h=0;break;default:cout选择出错costnr.f_costxr.f_cost=mr.f_cost;r=f;return(G); /Floyed函数 求任意两点的最短路径:void Floyed(unDiGraph *D,unDiGraph *M) int i,j,k,n;costAdj A,C;n=c_number; for(i=1;i=n;i+) for(j=1;jcos

26、tij;/初始化矩阵A。Cij=M-costij; Pathij=-1; /初始化矩阵p, 置-1. for(k=1;k=n;k+) /k为逐步加入的中间结点 for(i=1;i=n;i+) /i为A中行号for(j=1;j=n;j+)if(Aik+AkjAij)Aij=Aik+Akj;Cij=Cik+Ckj; Pathij=k;/若i经过k到j比i到j小,则令Aij=Aik+Akj。 Bij=Aij;Lij=Cij; elseBij=Aij;Lij=Cij;/end-for coutn最短路径为: endl;/end-Floyed/为了求从i到j的最短路径,只需要调用如下的过程:void p

27、rn_pass(int i,int j) if(Pathij!=-1) prn_pass(i,Pathij);/输出最短路径经过的所有点 pr(Pathij,0);/求最少时间路径。void time()int Bcity,Ecity;/起始成市号码和终点城市号码 int l,h=1;do pri();/输出城市列表及相应代码。 cout请输入起始城市和目的城市的代码,中间以空格隔开,范围(1- c_numberBcity; cinEcity;/输入起始城市和终点城市的代码。 if (!(0Bcity&Bcityc_number+1)&(0Ecity&Ecityc_number+1)&Bcit

28、y!=Ecity) coutn出错啦! 输入城市号码请在1-c_number之间,且两城市不能相等!5000|LBcityEcity10000) cout两地间还没有线路通过endl;elsecout火车花的钱是LBcityEcity元endl;cout火车花的时间是BBcityEcity小时endl; printf(nn 1.继续最少花费查找n 2.返回主菜单n 清选择.); scanf(%d,&l); /输入1或2选择是否继续。 h=l; while(h=1); printf(n);void f_time()int Bcity,Ecity;/起始成市号码和终点城市号码 int l,h=1;

29、do pri();/输出城市列表及相应代码。 cout请输入起始城市和目的城市的代码,中间以空格隔开,范围(1- c_numberBcity; cinEcity;/输入起始城市和终点城市的代码。 if (!(0Bcity&Bcityc_number+1)&(0Ecity&Ecityc_number+1)&Bcity!=Ecity) coutn出错啦! 5000|LBcityEcity10000) cout两地间还没有线路通过endl;elsecout飞机花的钱是LBcityEcity元endl;cout飞机花的时间是BBcityEcity小时endl; printf(nn 1.继续最少花费查找

30、n 2.返回主菜单n 清选择.); scanf(%d,&l); /输入1或2选择是否继续。 h=l; while(h=1); printf(n);/求最少花费路径。void money() int Bcity,Ecity;/起始成市号码和终点城市号码 char l,h=1;/*unDiGraph *G;*/do pri();/输出城市列表及相应代码。cout请输入起始城市和目的城市的代码,中间以空格隔开,范围(1- c_numberBcity;cinEcity;/输入起始城市和终点城市的代码。if (!(0Bcity&Bcityc_number+1)&(0Ecity&Ecityc_number+1)&Bcity!=Ecity) coutn出错啦! 5000|LBcityEcity10000) cout两地间还没有线路通过endl;else

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1