1、I学号:XXXXXXXXXXXXXXXX 大学程序设计课程设计(报告)课程题目 基于佛洛依德算法的导游软件 学生姓名 指导教师 所在班级 所在学院 信息工程学院 提交日期 201x 年 xx 月 xx 日 目 录1. 引言 1XXXXXX计算机 xxxII1.1 背景 11.2 要解决的问题 12. 系统框架 23. 数据结构设计 33.1 景点坐标 .33.2 节点间边的权值 .44. 关键技术 45. 系统运行结果 .115.1 运行环境 .115.2 运行结果 .115.2.1 系统主界面 115.2.2 功能测试 125.2.3 容错测试 125.2.4 初始化复位 136. 调试和改
2、进 146.1 路径合理性问题 147. 结论 14参考文献 .15附录源代码 .15程序设计课程设计报告11.引言本小节介绍选题的背景、系统所要解决的问题。本软件的功能包括校园全景查询,景点最短路径查询,查看景点信息,查看推荐线路。导游系统可以为海事大学访客提供最佳的游览路线。1.1 背景xxxx 大学新校园占地面积 133 万余平方米,总建筑面积 60 万平方米,绿化率 52%,水域面积 8 万平方米。新校区及其完善的功能配套设施将成为学校更好地为上海国际航运中心建设、为中国和世界海运事业发展服务的一个新的平台。随着学校的名气扩大,越来越多的校际访问学者和慕名而来的考生学校参观考察。但由于
3、学校占地面积较大,且校内道路较为复杂,给每届新生和来访的学者带来极大不便。在这个背景下,我们决定开发一个校园导游软件。软件将会带来以下好处:(1)软件以海事大学三维鸟瞰图为背景,让访客对校园地形有个整体了解。(2)软件内有海事大学各个景点的信息介绍,让访客对景点有个初步了解。(3)软件提供了景点标示功能,访客只需选定景点名称,系统就会在地图上用相应地标示出来,免去了访客的自己查找的不便。(4)访客输入起点和终点后,系统能够计算并给出最短的行程,并且在地图上直观的标示出路线图,为访客制定游览路线提供一定的辅助作用。所以,本设计旨在开发一个基于弗洛伊德算法的校园导游系统,该系统的难度等级为 HAR
4、D。1.2 要解决的问题本系统主要提供以下功能:(1) 设计一个 Windows 窗口应用程序,界面友好,让各种类型的用户都能在不读操作指南的情况下都能自如的使用本软件,界面操作简单易懂。(2) 校园地图展示功能。在程序的主界面,展示上海海事大学三维鸟程序设计课程设计报告2瞰图,让用户一目了然的观看。对海事大学地形和各个景点有个大致了解,以便他们制定旅游计划。(3) 景点介绍功能。选中相应的景点后,软件会介绍该近点的信息,本系统整合了学校所有景点的介绍信息,免去访客自己查找的不便。(4) 景点位置标示功能。选中景点后,会在地图上标示出相应景点的位置,免去游客在地图上寻找的不便。(5) 游览线路
5、推荐功能。用户选择自己现在所在位置和想去的地方后,系统将会推荐距离最短的游览线路,给出每一步的路线,并在地图上直观的显示路线图,方便用户参考。2.系统框架本软件以上海海事大学三维鸟瞰图作为程序主界面背景。需要用户从给定的景点中选择开始地址和终点地址,软件会给出所选景点的位置和景点信息。在点击“计算最短路径和距离”按钮后,将会根据弗洛伊德算法自动计算出最短路线,同时计算相应的距离值,并文本框中显示,同时也会在地图上画出路线图。点击“初始化复位”按钮后,将会清除之前显示的景点信息、最短路线和路线图等信息,还原软件初始状态。选择起点选择终点画出路线图显示最短路径显示最短距离显示景点信息显示景点位置显
6、示景点信息显示景点位置打开软件显示学校地图计算最短路径 复位程序设计课程设计报告3图 2.1 系统框架图3.数据结构设计3.1 景点坐标第一类数据为景点名称、景点介绍、景点坐标。为景点名定义了字符串数组 static string Vex_sight、景点介绍 static string Vex_info,景点位置定义了两个整型数组 static int Vex_location_x,static int Vex_location_y。共建立 27 个景点的数据,各数据如下表所示:表 3.1 景点数据结构表景点编号Vex_number景点名称Vex_sight景点横坐标Vex_location
7、_x景点横坐标Vex_location_y1 大礼堂 Vex_location_x1 = 783 Vex_location_y1 = 2272 第三教学区 Vex_location_x2 = 695 Vex_location_y2 = 3093 第二教学区 Vex_location_x3 = 631 Vex_location_y3 = 3254 第一教学区 Vex_location_x4 = 593 Vex_location_y4 = 3255 文理学院 Vex_location_x5 = 631 Vex_location_y5 = 3656 交通运输学院 Vex_location_x6 =
8、582 Vex_location_y6 = 3967 经济管理学院 Vex_location_x7 = 582 Vex_location_y7 = 4278 法学院 Vex_location_x8 = 523 Vex_location_y8 = 3969 外国语学院 Vex_location_x9 = 465 Vex_location_y9 = 39610 信息工程学院 Vex_location_x10 = 532 Vex_location_y10 = 45111 物流工程学院 Vex_location_x11 = 442 Vex_location_y11 = 43612 海洋科学与工程学院
9、Vex_location_x12 = 494 Vex_location_y12 = 46913 行政楼 Vex_location_x13 = 416 Vex_location_y13 = 48214 图书馆 Vex_location_x14 = 457 Vex_location_y14 = 33715 海琴楼 Vex_location_x15= 366 Vex_location_y15 = 36516 商船学院 Vex_location_x16= 285 Vex_location_y16 = 39617 泰山科研楼 Vex_location_x17= 285 Vex_location_y17
10、= 43618 总体育馆 Vex_location_x18= 128 Vex_location_y18 = 37619 学生服务中心 Vex_location_x19= 476 Vex_location_y19 = 27920 海馨楼 Vex_location_x20= 490 Vex_location_y20 = 22721 校医院 Vex_location_x21= 618 Vex_location_y21 = 12522 海联楼 Vex_location_x22= 683 Vex_location_y22 = 15023 西一桥 Vex_location_x23= 383 Vex_loc
11、ation_y23 = 32524 东一桥 Vex_location_x24= 548 Vex_location_y24 = 36525 东二桥 Vex_location_x25= 654 Vex_location_y25 = 39326 缆绳雕塑 Vex_location_x26= 407 Vex_location_y26 = 289程序设计课程设计报告427 十字路口 Vex_location_x27=638 Vex_location_y27 = 2403.2 节点间边的权值以景点为一个节点构造一个带权无向图,可直达的节点间存在边,各边权值为各个景点间实际距离;不可直达的节点间不存在边。该
12、图的邻接矩阵如下,两节点之间的距离 d 的单位为(10m),不可达两点的距离赋值为 Max,在邻接矩阵中缩写为 M。3.1 2 3 4 5 6 7 8 9 101112131415161718192021221 0 5298452 520 5 3 5 0 5 404 5 0 7 3240 5 7 0 22156 220 4 3 7 4 0 109 8 323 100 2 209 2 0 188 22109 180 114 118 110 9 1620124 9 0 8 13168 0 201440200 2035411522200 10162035100 8 1617208 0 18160 1
13、940410 8 20988 0 475321470 14224515531402 节点邻接矩阵4.关键技术4.1 地图展示功能为直观的向用户展示上海海事大学全景地图,方便其他功能的实现,将地图作为软件窗体的背景图片直接显示。在 Microsoft Visual Studio Windows 窗体应用程序设计中,设计程序主界面。右键主窗体,选中“属性” 这一菜单项,在BackgroundImage 选项中导入海事大学三维鸟瞰图,并修 BackgroundImage- Layout(图片布局)的属性为 Stretch,让后依照下图输窗口的标题。程序设计课程设计报告5图 4.1 程序主窗口属性4.
14、2 景点介绍功能为了实现景点介绍功能,在两个下拉选择框内分别提供所有景点名称以供选择。当选定一个景点时,该选择框下方的文本框将会自动显示该景点的介绍信息;同时,地图上也将标示出相应景点的位置。为了实现以上各个功能,在程序主窗体上放置两个 comboBox,命名为comboBoxbegin 和 comboBoxend,两个 textBox,命名为 textBox1 和 textBox2,将景点的介绍信息放进 Vex_info字符串数组中,分别对两个 comboBox 添加消息响应程序,由于是多分支选择语句,我们选择用 swith-case 语句,而不是 if语句,再通过调用 display()函
15、数在 textBox 中显示景点的信息。主要的功能代码如下:private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)box = 2;pictureInitialize(2);if (comboBox2.Text = comboBox1.Text /return;switch (comboBox2.Text)程序设计课程设计报告6case “大礼堂“:display(Vex_number1);pictureBox23.Visible = true;break;.case “海联楼“:display(Vex_nu
16、mber22);pictureBox44.Visible = true;break;/从下拉框中选择景点时,显示相应的景点表示图标,在地图上标示出该景点的位置。此处是comboBox2的操作。/ / 定义display函数/ / display函数的形参,景点号private void display(int x)if (box = 1)textBox1.Text = Vex_infox;else if (box = 2)textBox2.Text = Vex_infox;/选框内容进行函数调用,分别为显示信息,在地图上画点标注地理位置4.3 景点位置标示功能为了实现访客选定景点后在地图上标示
17、出其位置的功能,我们想用 C#的图标控件的显示与隐藏的属性来实现这一功能。为了实现以上功能,我们选择用 pictureBox 这一控件,在每个景点上方放置 2 个 pictureBox 控件,一个用于起点景点的显示,一个用于终点景点的显示。还定义了一个 pictureInitialize()函数来修改 pictureBox 的 Visible 属性,为 true的时候显示,为 false 的时隐藏。程序开始运行的时候是不显示点的,所以我们在程序段的顶部就要调用 pictureInitialize()来吧所有的 pictureBox.Visible 的属性程序设计课程设计报告7置为 false。
18、主要的功能代码如下:public partial class Form1 : Form/ / 定义主窗口/ public Form1()createGraph();/在主窗体中进行函数调用 /Graphics a;InitializeComponent();pictureInitialize(1);pictureInitialize(2);/初始化panel控件上的pictureBox,将它的的Visible属性全部置成falseprivate void pictureInitialize(int box)if (box = 1)pictureBox1.Visible = false;pict
19、ureBox2.Visible = false;.pictureBox22.Visible = false;else if (box = 2)pictureBox23.Visible = false;case “大礼堂“:display(Vex_number1);pictureBox1.Visible = true;/在地图上显示图标break;4.4 游览路线推荐功能为了实现游览路线的推荐功能,也就是求最短路径的功能。在实现前面功程序设计课程设计报告8能的基础上,通过调用 Floyd 算法来计算地图上两点间的最短路线及距离,并利用控件的绘图事件在地图上画出这条路线。为了实现上述功能,添加 b
20、utton1 按钮来调用 Floyd 算法,利用弗洛伊德算法在所给图上计算出最短路径,定义 showroad()函数来显示中间节点,并在textBox4 文本框内显示路线,在 textBox3 文本框内显示距离。为了在地图上绘出路线图,我们在 showroad()函数中创建 Panel 控件的 Graphics 对象,通过调用 Graphics 对象的 Drawline 函数来绘制最短路线。弗洛伊德算法的基本思想是通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。从图的带权邻接矩阵 A=a(i,j) nn 开始,递归地进行 n 次更新,即由矩阵 D(0)=A,按一个公式,构造出矩阵 D(1)
21、;又用同样地公式由 D(1)构造出 D(2); ;最后又用同样的公式由 D(n-1)构造出矩阵 D(n)。矩阵 D(n)的 i 行 j 列元素便是 i 号顶点到 j 号顶点的最短路径长度,称 D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵 path 来记录两点间的最短路径。采用的是(松弛技术) ,对在 i 和 j 之间的所有其他点进行一次松弛。所以时间复杂度为 O( );其状态转移方程如下:mapi,j:=minmapi,k+mapk,j,mapi,j3mapi,j表示 i 到 j 的最短距离,K 是穷举 i,j 的断点 ,mapn,n初值为 0。主要代码如下:private void
22、Floyd()distance = 0;Arc_Legth1, 2 = Arc_Legth2, 1 = 520;Arc_Legth1, 27 = Arc_Legth27, 1 = 450;Arc_Legth3, 19 = Arc_Legth19, 3 = 400;/标明地图上两点间的距离for (int c = 1; c / 显示出最短路径,并且在节点间加上/ private void showroad()int n = 0, k = 0;int p = 0, q = 0;Graphics g = panel1.CreateGraphics(); Pen myPen1 = new Pen(Co
23、lor.Blue, 2F);for (int m = 1; m 23. / 定义主窗口24. / 25. public Form1()26. 27. createGraph();/在主窗体中进行函数调用 28. /Graphics a;29. InitializeComponent();30. pictureInitialize(1);31. pictureInitialize(2);/初始化panel控件上的pictureBox,将它的的程序设计课程设计报告16Visible属性全部置成false32. 33.34. / public void DrawLine(Pen pen, int x
24、1, int y1, int x2, int y2);35.36. static int N = 28; /声明共有27个节点37. int MAX = 20000;/声明全局变量,不可达的两点之间的距离38. int distance = 0;/两点之间的距离39. / public bool, , P = new boolN, N, N;40.41. static int Vex_location_x = new intN; /667,631,602,581,615,566,566,507,449,516,432,478,400,441,350,269,112,460,474,602,66
25、7;/建立节点的横坐标数组42. static int Vex_location_y = new intN;/建立节点的纵坐标数组43.44. public int box;/ = 0;/标注当前光标所在框的编号,供display函数调用45. 46. static int Vex_number = new intN;/建立节点编号的数组47. 48. static string Vex_info = new stringN-5;/建立景点介绍的数组49. static string Vex_sight = new stringN;/建立景点的名称的数组50.51. static int, A
26、rc_Legth = new intN, N;/建立节点间距的数组52.53. string, new_vexnum = new stringN, N;/建立中间点的字符输出方式54.55. static int newPath_value = new intN;/建立保存新的带权路线的长度 56.57. / 58. / 节点的名称、景点的信息介绍、节点间的距离的初始化设定,对节点进行编号操作59. / 60. public void createGraph()61. 62. for (int i = 1; i 148. / 对pictureInitialize函数的定义149. / 150.
27、 / 供display函数判断把Vex_info【】传给哪个textBox151. private void pictureInitialize(int box)152. 153. if (box = 1)154. 155. pictureBox1.Visible = false;156. pictureBox2.Visible = false;157. pictureBox3.Visible = false;158. pictureBox4.Visible = false;159. pictureBox5.Visible = false;160. pictureBox6.Visible =
28、false;161. pictureBox7.Visible = false;162. pictureBox8.Visible = false;163. pictureBox9.Visible = false;164. pictureBox10.Visible = false;165. pictureBox11.Visible = false;166. pictureBox12.Visible = false;167. pictureBox13.Visible = false;168. pictureBox14.Visible = false;169. pictureBox15.Visible
29、 = false;170. pictureBox16.Visible = false;171. pictureBox17.Visible = false;172. pictureBox18.Visible = false;173. pictureBox19.Visible = false;174. pictureBox20.Visible = false;175. pictureBox21.Visible = false;176. pictureBox22.Visible = false;177. 178. else if (box = 2)179. 180. pictureBox23.Vis
30、ible = false;181. pictureBox24.Visible = false;182. pictureBox25.Visible = false;183. pictureBox26.Visible = false;184. pictureBox27.Visible = false;185. pictureBox28.Visible = false;186. pictureBox29.Visible = false;187. pictureBox30.Visible = false;188. pictureBox31.Visible = false;程序设计课程设计报告21189
31、. pictureBox32.Visible = false;190. pictureBox33.Visible = false;191. pictureBox34.Visible = false;192. pictureBox35.Visible = false;193. pictureBox36.Visible = false;194. pictureBox37.Visible = false;195. pictureBox38.Visible = false;196. pictureBox39.Visible = false;197. pictureBox40.Visible = fal
32、se;198. pictureBox41.Visible = false;199. pictureBox42.Visible = false;200. pictureBox43.Visible = false;201. pictureBox44.Visible = false;202. 203. 204. 205.206.207.208. / 209. / 定义display函数210. / 211. / display函数的形参,景点号212. private void display(int x)213. 214. /int i = 1;215. /for (i = 1; i 231. /
33、 弗洛伊德算法具体实现232. / 程序设计课程设计报告22233. private void Floyd()234. 235. distance = 0;236. Arc_Legth1, 2 = Arc_Legth2, 1 = 520;237. Arc_Legth2, 3 = Arc_Legth3, 2 = 50;238. Arc_Legth3, 4 = Arc_Legth4, 3 = 50;239. Arc_Legth4, 5 = Arc_Legth5, 4 = 70;240. /Arc_Legth5, 6 = Arc_Legth6, 5 = 220;241. Arc_Legth6, 7
34、= Arc_Legth7, 6 = 40;242. /Arc_Legth4, 8 = Arc_Legth8, 4 = 320;243. Arc_Legth7, 8 = Arc_Legth8, 7 = 100;244. Arc_Legth8, 6 = Arc_Legth6, 8 = 30;245. Arc_Legth7, 10 = Arc_Legth10, 7 = 90;246. Arc_Legth8, 9 = Arc_Legth9, 8 = 20;247. Arc_Legth9, 15 = Arc_Legth15, 9 = 220;248. Arc_Legth10, 12 = Arc_Legt
35、h12, 10 = 40;249. Arc_Legth10, 11 = Arc_Legth11, 10 = 110;250. Arc_Legth11, 13 = Arc_Legth13, 11 = 160;251. Arc_Legth12, 13 = Arc_Legth13, 12 = 80;252. Arc_Legth4, 14 = Arc_Legth14, 4 = 400;253. Arc_Legth8, 14 = Arc_Legth14, 8 = 200;254. Arc_Legth11, 16 = Arc_Legth16,11 = 200;255. Arc_Legth14, 16 =
36、Arc_Legth16,14 = 350;256. Arc_Legth16, 17 = Arc_Legth17, 16 = 80;257. Arc_Legth13, 17 = Arc_Legth17, 13 = 200;258. Arc_Legth14, 15 = Arc_Legth15, 14 = 200;259. Arc_Legth15, 16 = Arc_Legth16, 15 = 100;260. Arc_Legth19, 20 = Arc_Legth20, 19 = 80;261. Arc_Legth16, 18 = Arc_Legth18, 16 = 160;262. /Arc_L
37、egth14, 19 = Arc_Legth19, 14 = 410;263. Arc_Legth1, 22 = Arc_Legth22, 1 = 450;264. Arc_Legth21, 22 = Arc_Legth22, 21 = 140;265. Arc_Legth20, 21 = Arc_Legth21, 20 = 470;266. Arc_Legth20, 22 = Arc_Legth22, 20 = 530;267. Arc_Legth5, 25 = Arc_Legth25, 5 = 150;268. Arc_Legth25, 6 = Arc_Legth6, 25 = 200;2
38、69. Arc_Legth4, 24 = Arc_Legth24, 4 = 200; 270. Arc_Legth24, 14 = Arc_Legth14, 24 = 195;271. Arc_Legth24, 8 = Arc_Legth8, 24 = 105;272. Arc_Legth14, 23 = Arc_Legth23, 14 = 100;273. /Arc_Legth23, 19 = Arc_Legth19, 23 = 300;274. Arc_Legth23, 15 = Arc_Legth15, 23 = 200;275. Arc_Legth11, 12 = Arc_Legth1
39、2, 11 = 90;276. Arc_Legth9, 11 = Arc_Legth11, 9 = 80;程序设计课程设计报告23277. Arc_Legth10, 9 = Arc_Legth9, 10 = 180;278. Arc_Legth23, 26 = Arc_Legth26, 23 = 145;279. Arc_Legth26, 19 = Arc_Legth19, 26 = 145;280. Arc_Legth19, 27 = Arc_Legth27, 19 = 500;281. Arc_Legth2, 27 = Arc_Legth27, 2 = 200;282. Arc_Legth
40、1, 27 = Arc_Legth27, 1 = 450;283. Arc_Legth3, 19 = Arc_Legth19, 3 = 400;284.285. /标明地图上两点间的距离286.287. 288. for (int c = 1; c 340. / 显示出最短路径,并且在节点间加上341. / 342. private void showroad()343. 344. /Floyd();345. /Rectangle aa;346. 347. int n = 0, k = 0;348. int p = 0, q = 0;349.350. Graphics g = panel1.C
41、reateGraphics();351. 352. Pen myPen1 = new Pen(Color.Blue, 2F);353. 354. for (int m = 1; m 424. / 定义panel控件的Paint事件425. / 426. / 427. / 428. private void panel1_Paint(object sender, PaintEventArgs e)429. 430. Graphics a = panel1.CreateGraphics();431. 432.433.434. / 435. / 添加最短路径button按钮的事件触发436. / 4
42、37. / 438. / 439. private void button1_Click(object sender, EventArgs e)440. 441. panel1.Refresh();442. Floyd();443. showroad(); 444. /a.DrawLine(myPen1, 602 + 32 / 2, 91 + 34 / 2, 667 + 32 / 2, 116 + 34 / 2);程序设计课程设计报告27445. 446.447.448. / 449. / 添加初始化复位button按钮的事件触发450. / 451. / 452. / 453. private void button2_Click(obj