全国交通咨询模拟一、设计目的掌握线性表、栈、图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储结构求解最优路线问题,解决有关实际问题。
得到软件设计技能的训练。
二、问题描述交通咨询模拟。
根据旅客的不同需要,要考虑到旅客希望在旅途中的时间尽可能短、希望旅费尽可能省等的要求。
三、基本要求1、对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;2、对城市间的交通工具:火车。
对列车时刻表进行编辑:里程、和列车班次的添加、修改、删除;3、提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具,可以不考虑回程;4、咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。
由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟列车何时到达何地。
四、具体实现1、思路(1) 数据存储。
城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
在实验中本想用文本储存数据,但操作不熟悉,而是改用图的邻接矩阵储存原始信息,而后用数组进行添加删改(2) 数据的逻辑结构。
根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为无向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的时间)或旅费。
(3) 数据的存储结构。
采用邻接表和邻接矩阵都可作为数据的存储结构,这里建议采用邻接矩阵作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
添加、修改、删除功能可用菜单方式或命令提示方式。
只要能方便的对城市信息和交通信息进行管理即可,但要注意人机界面,具体实现由学生自行设计,也可参考有关程序(届时在网上提供)。
这些工作有不小的工作量。
(5) 最优决策功能模块① 读入城市信息和交通信息,用邻接表生成含权网络,表头数组中的元素存放城市名及对方城市到达该元素所代表城市的所有信息;表头数组中的元素所对应的单链表存放与该元素所代表的城市有交通联系的城市(代码、里程、列车车次)。
② 根据具体最优决策的要求,用floyd算法求出出发城市到其它各城市的最优值(最短时间或最小的费用),搜索过程中所经过城市的局部最优信息都保存在邻接表的表头数组中。
其目的城市所代表的元素中就保存了所需的最优决策结果。
其相应的初始值可为∞,并在表头数组对应的城市元素中保存响应的信息。
③主程序可以有系统界面、菜单;也可用命令提示方式;选择功能模块执行,要求在程序运行过程中可以反复操作。
2、数据结构本程序运用了关于图这种数据结构。
他的抽象数据类型定义如下:typedef struct unDiGraph{int numVerts; //结点 costAdj cost; //邻接矩阵}unDiGraph,*UNG;基本操作:unDiGraph* CreateCostG()操作结果:构造带权(费用)图。
unDiGraph* CreateTimeG()操作结果:构造带权(时间)图。
构造飞机带权(费用)图。
PathMat *Floyed(unDiGraph *D)操作结果:Floyed 函数 求任意两点的最短路径。
3、算法思想图1.火车路程表图 城市之间火车行驶表并利用Floyed 函数求带权图两点之间的最短路径。
通过对带权费用图和带权时间图求最短路径,就可以最短道从一城市到另一城市之间最省时间和最省费用的走法。
为了简洁直观,本设计对课本内的交通网进行了简化,原来的25个城市缩减为13个。
但是基本实现了设计的目的。
满足了基本要求。
4、程序模块704 651349 15791385 2368812511 2553北京徐州 西安成都 郑州 广州 上海1.程序是用dos 版做的界面。
2.主界面包括 1.选择火车最短时间路线 2.选择火车最节约费用路线 3.选择坐飞机 4.管理员程序确 5.退出本程序3.程序的模块为#include <windows.h>#include <stdio.h>#include <crtdbg.h>#include <string.h>#include<iostream.h>#include <malloc.h>#define INF 10000 //定义一个最大数定为无穷值#define MAX 7static int cnumber=7;static int k=0;static int v=0,z=0;//定义静态变量typedef struct zhu//定义结构体zhu{int ccost;//定义结构变量int ctime;}zhu;zhu m[20],x[20],n[20];//定义数组为struct zhu 类型数组,且三个数组分别储存添加后的数据,且表示花费m,起点n,和终点xtypedef int costAdj[MAX+1][MAX+1];//定义图的邻接矩阵,并从1开始int Path[MAX+1][MAX+1];//路程矩阵,表示经过存放的点ktypedef struct unDiGraph{int numV;//结点costAdj cost;//邻接矩阵}unDiGraph,*UNG;typedef struct cedit{char a[10];}cedit;cedit add[10];costAdj B,L;//功能一输出相应的城市信息int pr(int i,int j)//pr函数表输出功能{int h=0;if (j==0){h=i;}else if (j==1){cin>>add[i].a;}switch (h){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;}return 1;}void pri()//声明pri函数,即利用pr函数输出代码为i的城市信息{int i;cout<<"城市以及其代码"<<endl;cout<<"**************************************"<<endl;for(i=1;i<=cnumber;i++){cout<<i<<".";pr(i,0);}cout<<"****************************************"<<endl; }//构造CostG图,表示其费用unDiGraph *CreateCostG(int o)//火车的花费的存贮和编辑功能{unDiGraph *G;int i;int j;//定义的 i,j做循环变量int a=0,b=0,f=1,h=1;//f变量初始为1, h初始值为1,a=0,b=0临时表示开始城市代码以及目的城市代码if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G图分配存储空间。
{return(NULL);}for(i=1;i<=cnumber;i++){for(j=1;j<=cnumber;j++){G->cost[i][j]=INF;//初始化矩阵cost每一项,使其无穷大}}G->numV=cnumber;G->cost[1][6]=G->cost[6][1]=90;G->cost[1][2]=G->cost[2][1]=84;G->cost[2][3]=G->cost[3][2]=51;G->cost[2][5]=G->cost[5][2]=67;G->cost[3][4]=G->cost[4][3]=53;G->cost[4][5]=G->cost[5][4]=40;G->cost[4][7]=G->cost[7][4]=88;G->cost[5][6]=G->cost[6][5]=90;G->cost[5][7]=G->cost[7][5]=67;G->cost[6][7]=G->cost[7][6]=60;if (o){while(h==1)//h初始值为1{v=v+1;//V为全局静态变量,初始值为0 ,v表示编辑的火车花费的组数,三个编辑数组中的存放代码pri();cout<<"火车花费编辑"<<endl;cout<<"请输入开始城市的代码"<<endl;cin>>a;cout<<"请输入目的城市的代码"<<endl;cin>>b;cout<<"请输入你的两地花费"<<endl;cin>>m[v].ccost;n[v].ccost=a;x[v].ccost=b;cout<<"请选择"<<endl;cout<<"*********************************************************"<<endl;cout<<"1:继续更改城市费用"<<endl;cout<<"0:返回上一级菜单"<<endl;cout<<"*********************************************************"<<endl;cin>>h;switch(h) {case 1:h=1;break;case 0:h=0;break;default:{cout<<"选择出错"<<endl;}}}}f=v+1;//初始定义变量f为1,全局变量v为0,即1=0+1while (v++) //v++代表的意思{G->cost[n[v].ccost][x[v].ccost]=m[v].ccost;}v=f;return(G);}//构造TimeG图,表示其花费时间unDiGraph *CreateTimeG(int o)//火车的时间的存贮和编辑功能{unDiGraph *G;int i,j;//循环变量int a=0,b=0,f,h=1;//a,b 表增加城市的代码if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G分配存储空间。