交通咨询系统

„„„„„„„„大学

算法与数据结构 课程设计报告

题 目: 交通咨询系统

设 计 者: 25045012

专业班级: 本网络

学 号:

指导教师:

所属系部: 计算机科学与技术系

2012年06月03日

目 录

1 问题描述及要求.................................................... 1 2 需求分析.......................................................... 1 3 算法思想描述...................................................... 1 4 概要设计.......................................................... 4 5 详细设计.......................................................... 5 6 测试数据及分析.................................................... 9 7课程设计总结 ..................................................... 11 8 参考资料......................................................... 11

这是我老师给我的题目我所真实上交的作品,在VC++6.0上完美运行,文档上也有截图。对于上传分享了这作品,我想说明两点:

一是我这个程序,不是绝对原创,但是所参考的那个程序是不完美的——首先界面并不友好,我已经重新设计了文字提示界面;原程序有个bug,就是在目的地和出发地重合的时候显示距离是无穷大,正确明显为0,我在老师的帮助下进行了修改算法解决了这个问题,在此我感谢我的指导老师龙老师认真负责对我进行指导,也很感谢原程序的作者为我提供程序主体和基本思路。这个word文档的其他部分90%是自己完成的(不否认有部分是参考了别人的)。

二是若有人想借鉴本作品,希望改得体无完肤,因为程序的算法和提示语我的个人风格很浓,容易辨认,如果你的老师不巧只需浏览了一次,真的可以一眼辨认你是网上抄的。

——写给 想借鉴本文档的 网友

交通咨询系统

1 问题描述及要求

设计一个交通咨询系统,能让旅客咨询从任一个城市定点到另一个城市定点之间的最短路径或最低花费或最少时间等问题。对于不同的咨询要求、可输入城市间的路程或所需时间或所需花费。 设计要求:

1. 建立交通网络网的存储结构。 2. 总体设计要画流程图。 3. 提供程序测试方案。 4. 界面友好。

2 需求分析

根据要求,需要在系统中建立无向图。系统应该有高度灵活性,可以由用户根据当前交通网络图输入初始数据,并且可以更改。系统根据用户的输入建立无向图的结构,并通过狄克斯特拉算法和弗洛伊德算法实现要求,并提供两种功能供用户选择。

3 算法思想描述

首先总体的思想步骤是:

4 概要设计

系统应该分为三个部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现两个城市顶点之间的最短路径问题。 1、 建立图的存储结构:无向图

首先定义交通图的存储结构。邻接矩阵是表示图形中顶点之间相邻关系的矩阵。设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下定义的n阶方阵。

⎧Wij,若(vi,vj)或∈E(G);⎨

0或∞,当不满足上述条件时。

A[i,j]=⎩

一个图的邻接矩阵表示是唯一的。图的邻接矩阵表示,除了需要用一个二维数

组存储顶点之间相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组来存储顶点信息,其中下标为i的元素存储顶点vi的信息

2、 单源最短路径:狄克斯特拉算法

初始化S和D,置空最短路径终点集,置初始的最短路径值;

S[v1]=TRUE;D[v1]=0;//S集初始时只有源点,源点到源点的距离为0; while(S集中顶点数

开始循环,每次求得v1到某个v顶点的最短路径,并加v到S集中; S[v]=TRUE;

更新当前最短路径及距离;

}

3、 任意一对顶点间最短路径:弗洛伊德算法 假设

为从到的只以

集合中的节点为中间节点的最短路径的长度。

1. 若最短路径经过点k,则2. 若最短路径不经过点k,则因此,最短路径

5 详细设计

程序源代码如下: //交通咨询系统 #include #include

#define Num 300 //定义常量Num #define Maxint 32767

enum boolean{FALSE,TRUE}; //定义布尔类型 typedef char VertexType; typedef int Adjmatrix; typedef struct {

VertexType vexs[Num]; Adjmatrix arcs[Num][Num]; }MGraph;

int D1[Num],P1[Num];

int D[Num][Num],P[Num][Num];

void CreateMGraph(MGraph *G,int n,int e); //构建城市的无向图的声明 void Dijkstra(MGraph *G,int v1,int n); //狄克斯特拉算法的声明 void Floyd(MGraph *G,int n); //弗洛伊德算法的声明 void main()

{ MGraph *G; //定义无向图G int n,e,v,w,k; int m=1;

G=(MGraph *)malloc(sizeof(MGraph));

printf("欢迎使用【交通咨询系统】!本系统约定:\n1.记一个城市为一个点,点用从1开始按顺序的编号表示,两个城市的连线为一条边;\n2.程序要求输入的文本都是按回车进行确认;\n3.程序输入输出均不带单位,单位默认为“公里”。\n\n"); printf("系统需要知道地图的结构,请输入顶点个数和边数,用“,”号隔开:\n"); scanf("%d,%d",&n,&e);

CreateMGraph(G,n,e); //调用CreateMGraph有向图函数 while(m!=0){

printf("===============================================================================\n"); printf("请输入数字:\n"); printf("0 : 退出\n");

printf("1 : 求一个城市到其他所有城市的最短路径\n"); printf("2 : 求任意的两个城市之间的最短路径\n"); scanf("%d",&m); if(m==2){ Floyd(G,n);

printf("请输入起点和终点,用“,”号隔开:\n"); scanf("%d,%d",&v,&w); k=P[v][w]; if(k==0)

printf("\n输出的结果:\n顶点%d到%d无路径!\n",v,w); else {

printf("\n输出的结果:\n从顶点%d到%d的最短路径是: %d",v,w,v); while(k!=w){ printf("→%d",k); k=P[k][w]; }

printf("→%d",w);

printf("\n 路径长度: %d\n",D[v][w]); } } else if(m==1){

printf("请输入起点编号:\n"); scanf("%d",&v); Dijkstra(G,v,n); } }

printf("程序已结束!谢谢您的使用!\n");

void CreateMGraph(MGraph *G,int n,int e) //构建城市的无向图 {

int i,j,k,w;

for(i=1;ivexs[i]=(char)i; for(i=1;i

for(j=1;j

G->arcs[i][j]=Maxint; //距离初始化 if(i==j)

G->arcs[i][j]=0; }

printf("\n请输入%d条边的两端点序号和长度,用“,”号隔开\n例如:1号城市到2号城市的长度为3,则输入1,2,3): \n",e); for(k=1;k

scanf("%d,%d,%d",&i,&j,&w);

G->arcs[i][j]=w; //建立城市之间的距离 G->arcs[j][i]=w; }

printf("\n地图的结构建立成功!\n"); }

void Dijkstra(MGraph *G,int v1,int n) //狄克斯特拉算法求一个城市到任意一个城市的距离 {

int D2[Num],P2[Num]; int v,i,w,min;

enum boolean S[Num];

for (v=1;v

S[v]=FALSE; //s[]置空 D2[v]=G->arcs[v1][v]; //距离初始化

if(D2[v]

}

else

P2[v]=0;

P2[v1]=0;S[v1]=TRUE; //源点V1放入s中 for(i=2;i

min=Maxint; //Maxint置最小长度初值 for(w=1;w

if(!S[w]&&D2[w]

for(w=1;w

if(!S[w]&&(D2[v]+G->arcs[v][w]

}

{ }

D2[w]=D2[v]+G->arcs[v][w]; P2[w]=v;

printf("\n输出的结果:\n");

printf("路径长度 路径\n"); //输出最短路径 for(i=1;i

printf("←%d",v); v=P2[v];

}

printf("\n"); } }

void Floyd(MGraph *G,int n) //用弗洛伊德算法求任意两顶点最短距离 {

int i,j,k; //定义三个变量 for(i=1;i

} for(j=1;jarcs[i][j]!=Maxint) //距离初始化 else P[i][j]=0; P[i][j]=j; //路径初始化 D[i][j]=G->arcs[i][j];

6 测试数据及分析

假如某交通网络上有4个城市(序号为1,2,3,4),4个城市之中有5条道路(不同长度),交通网络图如下图所示:

打开本系统,界面如图:

输入4,5之后按下键盘上的回车键:

根据交通网络图输入线路数据后按回车:

选择1回车后,再输入城市2,求得出的结果如下:

选择2后,要计算1到3的最短距离和路径,输入1,3,得到结果,并与输入3,1的输出结果作对比如下:

7课程设计总结

在我对作品完成了最后的调试和运行之后,紧张的一个星期的课程设计终于暂时告一段落。这个课程设计的课题虽然总体来说难度不大,因为在书上可以找到很多例子供参考。但是由于平时经常不认真听课,虽然看得明例题,但是要用到自己的作品中还是造有一定的压力。对此我因为过去的学习态度而懊悔。但是课程设计是个锻炼自己的极好机会,缺失的知识现在得补上!并且设计的过程是发现自身知识空点的最好的机会,以往不会遇到的情况,在实践练习中一一浮出水面,面对着它们,虽然短短一个星期,但是也经历了很多挫折,有过气馁,但是真正的迈过去以后才感觉到畅快和欣喜,所以遇到的问题,我想到的放弃念头很快被打消,坚持到了作品完成。

课程设计具的实践意义,正如军事锻炼是对我们精神意志的磨练,它是对我们的一次考核和知识补充,对未来工作的演习。老师也为了我们能顺利完成作品,悉心指导,孜孜不倦,所以面对这次课程设计,我感到充实和感谢!

8 参考资料

[1] 徐凤生,《数据结构与算法C语言版》,机械工业出版社,2010

„„„„„„„„大学

算法与数据结构 课程设计报告

题 目: 交通咨询系统

设 计 者: 25045012

专业班级: 本网络

学 号:

指导教师:

所属系部: 计算机科学与技术系

2012年06月03日

目 录

1 问题描述及要求.................................................... 1 2 需求分析.......................................................... 1 3 算法思想描述...................................................... 1 4 概要设计.......................................................... 4 5 详细设计.......................................................... 5 6 测试数据及分析.................................................... 9 7课程设计总结 ..................................................... 11 8 参考资料......................................................... 11

这是我老师给我的题目我所真实上交的作品,在VC++6.0上完美运行,文档上也有截图。对于上传分享了这作品,我想说明两点:

一是我这个程序,不是绝对原创,但是所参考的那个程序是不完美的——首先界面并不友好,我已经重新设计了文字提示界面;原程序有个bug,就是在目的地和出发地重合的时候显示距离是无穷大,正确明显为0,我在老师的帮助下进行了修改算法解决了这个问题,在此我感谢我的指导老师龙老师认真负责对我进行指导,也很感谢原程序的作者为我提供程序主体和基本思路。这个word文档的其他部分90%是自己完成的(不否认有部分是参考了别人的)。

二是若有人想借鉴本作品,希望改得体无完肤,因为程序的算法和提示语我的个人风格很浓,容易辨认,如果你的老师不巧只需浏览了一次,真的可以一眼辨认你是网上抄的。

——写给 想借鉴本文档的 网友

交通咨询系统

1 问题描述及要求

设计一个交通咨询系统,能让旅客咨询从任一个城市定点到另一个城市定点之间的最短路径或最低花费或最少时间等问题。对于不同的咨询要求、可输入城市间的路程或所需时间或所需花费。 设计要求:

1. 建立交通网络网的存储结构。 2. 总体设计要画流程图。 3. 提供程序测试方案。 4. 界面友好。

2 需求分析

根据要求,需要在系统中建立无向图。系统应该有高度灵活性,可以由用户根据当前交通网络图输入初始数据,并且可以更改。系统根据用户的输入建立无向图的结构,并通过狄克斯特拉算法和弗洛伊德算法实现要求,并提供两种功能供用户选择。

3 算法思想描述

首先总体的思想步骤是:

4 概要设计

系统应该分为三个部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现两个城市顶点之间的最短路径问题。 1、 建立图的存储结构:无向图

首先定义交通图的存储结构。邻接矩阵是表示图形中顶点之间相邻关系的矩阵。设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下定义的n阶方阵。

⎧Wij,若(vi,vj)或∈E(G);⎨

0或∞,当不满足上述条件时。

A[i,j]=⎩

一个图的邻接矩阵表示是唯一的。图的邻接矩阵表示,除了需要用一个二维数

组存储顶点之间相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组来存储顶点信息,其中下标为i的元素存储顶点vi的信息

2、 单源最短路径:狄克斯特拉算法

初始化S和D,置空最短路径终点集,置初始的最短路径值;

S[v1]=TRUE;D[v1]=0;//S集初始时只有源点,源点到源点的距离为0; while(S集中顶点数

开始循环,每次求得v1到某个v顶点的最短路径,并加v到S集中; S[v]=TRUE;

更新当前最短路径及距离;

}

3、 任意一对顶点间最短路径:弗洛伊德算法 假设

为从到的只以

集合中的节点为中间节点的最短路径的长度。

1. 若最短路径经过点k,则2. 若最短路径不经过点k,则因此,最短路径

5 详细设计

程序源代码如下: //交通咨询系统 #include #include

#define Num 300 //定义常量Num #define Maxint 32767

enum boolean{FALSE,TRUE}; //定义布尔类型 typedef char VertexType; typedef int Adjmatrix; typedef struct {

VertexType vexs[Num]; Adjmatrix arcs[Num][Num]; }MGraph;

int D1[Num],P1[Num];

int D[Num][Num],P[Num][Num];

void CreateMGraph(MGraph *G,int n,int e); //构建城市的无向图的声明 void Dijkstra(MGraph *G,int v1,int n); //狄克斯特拉算法的声明 void Floyd(MGraph *G,int n); //弗洛伊德算法的声明 void main()

{ MGraph *G; //定义无向图G int n,e,v,w,k; int m=1;

G=(MGraph *)malloc(sizeof(MGraph));

printf("欢迎使用【交通咨询系统】!本系统约定:\n1.记一个城市为一个点,点用从1开始按顺序的编号表示,两个城市的连线为一条边;\n2.程序要求输入的文本都是按回车进行确认;\n3.程序输入输出均不带单位,单位默认为“公里”。\n\n"); printf("系统需要知道地图的结构,请输入顶点个数和边数,用“,”号隔开:\n"); scanf("%d,%d",&n,&e);

CreateMGraph(G,n,e); //调用CreateMGraph有向图函数 while(m!=0){

printf("===============================================================================\n"); printf("请输入数字:\n"); printf("0 : 退出\n");

printf("1 : 求一个城市到其他所有城市的最短路径\n"); printf("2 : 求任意的两个城市之间的最短路径\n"); scanf("%d",&m); if(m==2){ Floyd(G,n);

printf("请输入起点和终点,用“,”号隔开:\n"); scanf("%d,%d",&v,&w); k=P[v][w]; if(k==0)

printf("\n输出的结果:\n顶点%d到%d无路径!\n",v,w); else {

printf("\n输出的结果:\n从顶点%d到%d的最短路径是: %d",v,w,v); while(k!=w){ printf("→%d",k); k=P[k][w]; }

printf("→%d",w);

printf("\n 路径长度: %d\n",D[v][w]); } } else if(m==1){

printf("请输入起点编号:\n"); scanf("%d",&v); Dijkstra(G,v,n); } }

printf("程序已结束!谢谢您的使用!\n");

void CreateMGraph(MGraph *G,int n,int e) //构建城市的无向图 {

int i,j,k,w;

for(i=1;ivexs[i]=(char)i; for(i=1;i

for(j=1;j

G->arcs[i][j]=Maxint; //距离初始化 if(i==j)

G->arcs[i][j]=0; }

printf("\n请输入%d条边的两端点序号和长度,用“,”号隔开\n例如:1号城市到2号城市的长度为3,则输入1,2,3): \n",e); for(k=1;k

scanf("%d,%d,%d",&i,&j,&w);

G->arcs[i][j]=w; //建立城市之间的距离 G->arcs[j][i]=w; }

printf("\n地图的结构建立成功!\n"); }

void Dijkstra(MGraph *G,int v1,int n) //狄克斯特拉算法求一个城市到任意一个城市的距离 {

int D2[Num],P2[Num]; int v,i,w,min;

enum boolean S[Num];

for (v=1;v

S[v]=FALSE; //s[]置空 D2[v]=G->arcs[v1][v]; //距离初始化

if(D2[v]

}

else

P2[v]=0;

P2[v1]=0;S[v1]=TRUE; //源点V1放入s中 for(i=2;i

min=Maxint; //Maxint置最小长度初值 for(w=1;w

if(!S[w]&&D2[w]

for(w=1;w

if(!S[w]&&(D2[v]+G->arcs[v][w]

}

{ }

D2[w]=D2[v]+G->arcs[v][w]; P2[w]=v;

printf("\n输出的结果:\n");

printf("路径长度 路径\n"); //输出最短路径 for(i=1;i

printf("←%d",v); v=P2[v];

}

printf("\n"); } }

void Floyd(MGraph *G,int n) //用弗洛伊德算法求任意两顶点最短距离 {

int i,j,k; //定义三个变量 for(i=1;i

} for(j=1;jarcs[i][j]!=Maxint) //距离初始化 else P[i][j]=0; P[i][j]=j; //路径初始化 D[i][j]=G->arcs[i][j];

6 测试数据及分析

假如某交通网络上有4个城市(序号为1,2,3,4),4个城市之中有5条道路(不同长度),交通网络图如下图所示:

打开本系统,界面如图:

输入4,5之后按下键盘上的回车键:

根据交通网络图输入线路数据后按回车:

选择1回车后,再输入城市2,求得出的结果如下:

选择2后,要计算1到3的最短距离和路径,输入1,3,得到结果,并与输入3,1的输出结果作对比如下:

7课程设计总结

在我对作品完成了最后的调试和运行之后,紧张的一个星期的课程设计终于暂时告一段落。这个课程设计的课题虽然总体来说难度不大,因为在书上可以找到很多例子供参考。但是由于平时经常不认真听课,虽然看得明例题,但是要用到自己的作品中还是造有一定的压力。对此我因为过去的学习态度而懊悔。但是课程设计是个锻炼自己的极好机会,缺失的知识现在得补上!并且设计的过程是发现自身知识空点的最好的机会,以往不会遇到的情况,在实践练习中一一浮出水面,面对着它们,虽然短短一个星期,但是也经历了很多挫折,有过气馁,但是真正的迈过去以后才感觉到畅快和欣喜,所以遇到的问题,我想到的放弃念头很快被打消,坚持到了作品完成。

课程设计具的实践意义,正如军事锻炼是对我们精神意志的磨练,它是对我们的一次考核和知识补充,对未来工作的演习。老师也为了我们能顺利完成作品,悉心指导,孜孜不倦,所以面对这次课程设计,我感到充实和感谢!

8 参考资料

[1] 徐凤生,《数据结构与算法C语言版》,机械工业出版社,2010


相关内容

  • 2017-2021年中国公路运输行业现状及发展趋势分析
  • ▄ 前言 行业研究是开展一切咨询业务的基石,通过对特定行业的长期跟踪监测,分析行业需求.供给.经营特性.获取能力.产业链和价值链等多方面的内容,整合行业.市场.企业.用户等多层面数据和信息资源,为客户提供深度的行业市场研究报告,以专业的研究方法帮助客户深入的了解行业,发现投资价值和投资机会,规避经营 ...

  • 某公司决策咨询管理报告(2)1
  • NANCHANG UNIVERSITY 决策咨询管理报告 公益自行车出行支持系统 学 院: 专业班级: 管理科学121班 学生姓名: A 公司决策咨询管理报告 --公益自行车出行支持系统 前言 改革开放以来,N 市的经济飞速发展,私家车的数量逐年增加,对当地的环境造成了严重的污染.近年来,随着人们对 ...

  • 产业园区规划
  • 商道成果 页 6 天河软件园高唐新建片区(节选) 一.规划背景 在全国软件产业中的地位:天河软件园位居我国软件产业基地综合规模第二位,仅次于北京中 关村软件园,其中高唐新建区是国内目前最大的单体软件园区. 在广东软件产业中的地位:广州天河软件园是广东三大软件产业基地之一,与深圳软件园.珠 海高新区软 ...

  • 特色评估工作报告(心理健康教育与咨询)
  • 云南交通职业技术学院 心理健康教育与咨询工作报告 健康的心理,是促进学生"德.技.力"全面发展的基础,师生内心世界的和谐,是实现我院"交融通达,和谐共生"办学理念的根本保证.心理健康教育与咨询中心建设项目的总体目标,就是要遵循心理教育规律,利用心理健康教育与咨 ...

  • 2017年天津地铁行业现状及发展趋势分析
  • ▄ 前言 行业研究是开展一切咨询业务的基石,通过对特定行业的长期跟踪监测,分析行业需求.供给.经营特性.获取能力.产业链和价值链等多方面的内容,整合行业.市场.企业.用户等多层面数据和信息资源,为客户提供深度的行业市场研究报告,以专业的研究方法帮助客户深入的了解行业,发现投资价值和投资机会,规避经营 ...

  • 构建真正的智慧园区
  • 构建真正的智慧园区 当今社会经济发展面临着日趋严重的资源约束和更加迫切的绿色环保要求,我国各类园区更是首当其冲,面临经济增长的艰巨任务和资源环境保护的巨大压力.传统园区建设者通常只提供水.电.气.交通.建筑等"硬件"基础设施,信息化.智能化都由入驻企业自行完成.随着信息技术的发展 ...

  • 广州市轨道交通新线建设工程设计变更管理办法
  • 目 录 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 附录A 附录B 附录C 附录D 附录E 附录F 总则 ................................................................................... 1 设 ...

  • 公路工程造价资质资格管理体系建设
  • 公路工程造价资质资格管理体系建设 作者:黄劲 来源:<建筑工程技术与设计>2015年第05期 [摘要] 公路工程造价的发展虽然很快,但是其管理仍然存在很多问题,由于工程造价的复杂性,只能由具备工程造价专业知识和技术的人员组成的单位来完成.因此,通过制定公路工程造价资质管理体系,规范公路工 ...

  • 福大各专业介绍
  • 2011年福州大学招生专业介绍 电气工程与自动化学院 (咨询电话:0591-22866590,22866584) 学院拥有电气工程一级学科博士点及博士后科研工作站,设有电机与电器.电力电子与电力传动.电力系统及其自动化.高电压与绝缘技术.电工理论与新技术等5个二级学科博士点.拥有控制科学与工程一级学 ...