1、课 程 设 计 任 务 书课程设计名称 数 据 结 构 课 程 设 计 专 业计 算 机 科 学 与 技 术( 物 联 网 方 向 )学生姓名 班级 学号题目名称 最短路径求解起止日期 2015 年 1 月 5 日起至 2015 年 1 月 16 日止课设内容和要求:内容:给出一张无向图,图上的每个顶点表示一个城市,顶点间的边表示城市间存在路径,边上的权值表示城市间的距离。试编写程序求解从某一个城市出发到达任意其他任意城市的最短路径问题。要求: 1) 能够提供简单友好的用户操作界面,可以输入城市的基本信息,包括城市名称,城市编号等;2) 利用矩阵保存城市间的距离;3) 利用 Floyd 算法求
2、最短路径;4) 独立完成系统的设计,编码和调试;5) 系统利用 C 语言完成;6) 按照课程设计规范书写课程设计报告。参考资料:算法与数据结构C 语言程序设计教 研 室 审 核 意 见 : 教 研 室 主 任 签 字 :指导教师(签名) 年 月 日学 生(签名) 年 月 日目 录第 1 章 概要设计 .11.1 题目的内容与要求 11.2 总体结构 1第 2 章 详细设计 .22.1 主模块 22.2 构建城市无向图 32.3 添加城市 42.4 修改城市距离 52.5 求最短路径 6第 3 章 调试分析 .73.1 调试初期 73.2 调试中期 73.3 调试末期 7第 4 章 测试及运行结
3、果 .7附页(程序清单) .10第 1 章 概要设计1.1 题目的内容与要求内容:给出一张无向图,图上的每个顶点表示一个城市,顶点间的边表示城市间存在路径,边上的权值表示城市间的距离。试编写程序求解从某一个城市出发到达任意其他任意城市的最短路径问题。要求: 1) 能够提供简单友好的用户操作界面,可以输入城市的基本信息,包括城市名称,城市编号等;2) 利用矩阵保存城市间的距离;3) 利用 Floyd 算法求最短路径;4) 独立完成系统的设计,编码和调试;5) 系统利用 C 语言完成;6) 按照课程设计规范书写课程设计报告。1.2 总体结构本程序主要分为四个模块(功能模块见图 1.1):主模块对整
4、个程序起一主导作用,开始构建一城市无向图,对其进行添加城市顶点,以及对原来的距离数据进行修改,整体构建结束可以实现求一城市到其他城市的最短路径问题。Floyd 算法求最短路径修改城市距离求最短路径建城市图图 1.1 功能模块图添加城市顶点沈阳航空航天大学课程设计报告 1第 2 章 详细设计2.1 主模块用户根据屏幕上显示的操作提示输入要进行操作的模块,通过调用相对应的模块程序,达到用户所想进行操作。程序的总框架大致分为四个模块:1.建立城市无向图 2.添加城市模块 3.修改城市距离 4.求最短路径。具体实现过程见2.2:建立城市无向图 2.3:添加城市 2.4:修改城市距离 2.5:求最短路径
5、。流程图中通过输入 n,由 n 的值来选择调用相对应子函数,实现所选择的功能,调用完后可以返回调用主函数进行下一次选择,从而实现反复调用子函数而实现四个模块的功能等。图 2.1 主模块流程图开始建城市无向图图添加城市 修改城市距离 退出调用各子函数 Exit 退出程序结束输入选择 n求最短路径2.2 构建城市无向图根据提示输入城市,对城市无向矩阵图进行初始化,开始 g.vmn.path的路径值赋为-2 表示 p 城到 q 城间中间没有可达的路径不经过其他城市,而g.vmn.distance 赋值为 0 表示 p 到 p 的距离为 0。流程图中的 MAX 表示的是最多的城市数量,其值为 20;p
6、,q 表示城市的编号,而 path 和 distance分别表示的路径和城市间距离。g.vpq.distace 表示 p、q 代表的城市间的距离图 2.2 构建城市无向图流程图否是否是开始p=0,q=0return g结束输入城市qm,则 d(vi,vj)=m,否则为 k,依次类推,直到所有的 vi 到 vj 的中间城市比较完,最后 d(vi,vj)的值即为最短距离,同时在比较的过程中保存路径信息,最后在查询时即可输出路径。具体见第四章:测试及运行结果中求最短路径界面图 2.4 修改城市距离流程图否是否是否 是是是开始i=j=k=0kg.vik.distance+g.vkj.distance;
7、g.vij.distance=g.vik.distance+g.vkj.distance path=kj+ k+ i+输入城市求路径第 3 章 调试分析3.1 调试初期由于编写的程序具有模块化的特性,且 VC 6.0 的调试显然由于 TC 及个人对 VC 的熟练程度远优于 TC 等方面,我选择先在 VC 6.0 环境下完成除图形化演示算法过程函数的其他过程。由于数据结构选择的较合理,对 Floyd 算法的理解较为深刻,所以在此环境下的调试并没有太多困难。3.2 调试中期在上机输入完程序后,出现了许多错误,其中有一些小错误,比如说忘记写分号,在这些错误上双击,找到位置,加上分号。还有就是程序中的
8、有的变量在前面没有定义,只要在前面添加上就可以了。再有就是前后的类型要保持一致,在这块我也犯了个错误。前面是指针类型,后面却是取地址类型,解决办法就是把前面的改成指针类型,保持前后一致。还有就是遗忘分号,逗号,解决方法就是,一步一步的把遗忘的分号,逗号补上。忘记定义变量的类型。比 i 应该是整型的却忘记申明。解决方法就是在函数内先申明 int 类型的 i.。粗心导致很多细节问题,比如该输入英文的括号的,却输成中文的括号,解决方法,把中英文分开。注意细节问题。3.3 调试末期输入的数据无法找出正确的路径,解决方法,一步一步的调试,找出问题的所在,改正逻辑错误。在同学的帮助下,找到了逻辑错误,一步
9、一步地改正,终于得到预期的结果。第 4 章 测试及运行结果建图过程:根据屏幕上的显示输入,你会看到如下界面;沈阳航空航天大学课程设计报告 7添加城市过程:根据界面提示操作,结果如下,添加一城市后如下:我总共添加了三个城市,最后结果如下界面:求最短路径过程:根据提示我输入了 0 2 号城市编号,结果如下:同理根据提示输入要修改的城市编号,输入后,屏幕上会显示原来的距离,输入修改后的距离即可修改成功。沈阳航空航天大学课程设计报告 9附页(程序清单)#include “stdafx.h“#include#include#include#include #define MAX 20 /城市数量type
10、def structint path;int distance; Vert;typedef structint n;/存放顶点数char nameMAX60;/城市名称及编号Vert vMAXMAX; Mgraph;void path(Mgraph g,int m,int n,int f)int k,i,a21;for(i=0;i=0)f+;af=k;k=g.vmk.path;path(g,m,k,f);k=g.vkn.path;path(g,k,n,f);for(i=1;ai=0;i+)printf(“%s 到%s 途经:“,g.namem,g.namen);printf(“%s “,g.n
11、ameai );void Floyd(Mgraph g)int i,j,k,m,n,h=0,w=0,f=0,s;for(k=0;kg.vik.distance+g.vkj.distance)g.vij.distance=g.vik.distance+g.vkj.distance;g.vji.distance=g.vij.distance;g.vij.path=k;g.vji.path=g.vij.path;printf(“输入你要查询的两城市编号n“);printf(“以下是城市相对应的编号:n“);for(i=0;i=0)path(g,m,n,f);Mgraph Modify(Mgraph
12、g) / 修改俩城市的数据 int p,q,s;printf(“输入要修改的两城市编号n“,g.vpq.distance);scanf(“%d%d“,printf(“原来两城市距离为%dn“);printf(“修改两城市间的距离n“);scanf(“%d“,g.vpq.distance=s;沈阳航空航天大学课程设计报告 11return g;Mgraph ADD(Mgraph g) / 添加新的城市int p=0,q=0,dis;char s;printf(“请输入添加城市的名字n“);scanf(“%s“,for(q=0;qg.n;q+)printf(“%s 和%s 是否邻接 是的:1 不是
13、:0n“,g.nameq,g.nameg.n);scanf(“%d“,if(p=1)/邻接信息g.vqg.n.path=-1;printf(“请输入%s 和%s 间的距离n“,g.nameq,g.nameg.n);scanf(“%d“,g.vqg.n.distance=dis;g.vg.nq.distance=dis;elseg.vqg.n.distance=99999;/99999 表示距离的无限大值g.vg.nq.distance=99999;/99999 表示距离的无限大值g.n+;return g;/添加结束Mgraph Init(Mgraph g)/初始化一个邻接矩阵无向图int q
14、=0,p=0;g.n=1;printf(“请输入第一个城市的名称n“);scanf(“%s“,g.name0);for(q=0;qMAX;q+)for(p=0;pMAX;p+)g.vpq.path=-2;g.vqq.distance=0 ;return g;/初始化结束void main()int i,m=0;Mgraph p;doprintf(“|_|n“);printf(“| 选择操作 |n“);printf(“| 1. 创建一个图 |n“);printf(“| 2. 添加一个新的城市 |n“);printf(“| 3. 修改现有城市的数据 |n“);printf(“| 4. 求最短路径
15、|n“);printf(“| 5.退出程序 |n“);printf(“|_|n“);scanf(“%d“,switch(i)case 1:p=Init(p);break;/初始化case 2:p=ADD(p);break;/添加城市case 3:p=Modify(p);break;/修改城市数据case 4:Floyd(p);break;/弗洛伊的算法case 5:exit(0);break;/退出程序printf(“是否继续 1:继续 0:退出n“);scanf(“%d“,system(“cls“);while(m=1);沈阳航空航天大学课程设计报告13课程设计总结:开始拿到题后感觉很难,没
16、有一点思绪,就借了一些数据结构与 C 语言设计方面的书看了一些才慢慢有点思路,于是就尝试开始编程序在写程序的过程中总是会查课本去注意一些细节方面的问题,也让我懂得了即使是再小再细的东西在学习的过程中也要重视,深深体会到了细节可以决定成功与否的道理。同时编程序的过程也让我掌握了一些没学过的知识并且也深深巩固了以前的知识。这让我明白并且也给了我以后学这门专业的一方向:经常找一些实用的问题去编,提高自己的专业知识同时也提高实践能力,而不只是光会纸上谈兵。当我上机实践时,编译后出现了很多错误,开始耐下性一个一个检查,慢慢就灰心了。编译过程让我明白自己要加强英语水平,同时也要注意细节,也要有耐性,对一些常见的错误要熟记,下次再出现同样错误就可以第一时间反映出来,可以节省一些时间。总之这次课设受益匪浅,感受颇多,知道了自己在计算机方面的还了解的不多,以后会努力提高自身综合素质。