C语言校园导航系统

合集下载

校园导航系统的两个代码

校园导航系统的两个代码

#1 数据结构实验之校园导游咨询#include<stdlib.h>#include<stdio.h>#include<iostream.h>#include<string.h>#include<math.h>#include "stdio.h"#define null 0#define num 20#define maxdist 10000typedef struct{char data[num];int edges[num][num];}graph;void dijkstra(graph g,int n,int i,int d[num],int p[num]) {int s[num];int mindist,dist;int j,k,u;for(j=0;j<n;j++){d[j]=g.edges[i][j];s[j]=0;if((d[j]<maxdist)&&(d[j]!=0)) p[j]=i;elsep[j]=-1;}s[i]=1;for(j=0;j<n-1;j++){mindist=maxdist;u=i;for(k=0;k<n;k++)if((s[k]==0)&&(d[k]<mindist)) {u=k;mindist=d[k];}s[u]=1;for(k=0;k<n;k++)if(s[k]==0){dist=d[u]+g.edges[u][k];if(dist<d[k]){d[k]=dist;p[k]=u;}}}void opdijk(int v0,int n,int d[],int p[]) {int i,pre;for(i=0;i<n;i++)if(i!=v0){printf("\n%d",i);pre=p[i];while(pre!=-1){printf("<--%d",pre);/****************************/ pre=p[pre]; }if(d[i]==maxdist)printf("<--%d",v0);printf("\tshortestway:%d",d[i]);}}void floyd(graph g,int n,int d[][num],int p[][num]){int i,j,k;for(i=0;i<n;i++)for(j=0;j<n;j++){d[i][j]=g.edges[i][j];if((d[i][j]<maxdist)&&(d[i][j]!=0))p[i][j]=j;elsep[i][j]=-1;}for(i=0;i<n;i++)d[i][i]=0;for(k=0;k<n;k++)for(i=0;i<n;i++)for(j=0;j<n;j++)if(d[i][j]>d[i][k]+d[k][j]){d[i][j]=d[i][k]+d[k][j] ;p[i][j]=p[i][k];}}void opfloy(int n,int d[][num],int path[][num]) {int i,j,next;for(i=0;i<n;i++){printf("\n\nyuandian is v%d:",i);for(j=0;j<n;j++){printf("\nthe shortest way from%dto%dis:\n",i,j);printf("%d",i);next=path[i][j];while(next!=-1){printf("->%d",next);next=path[next][j];}if(d[i][j]==maxdist)printf("<-%d",j);/***************************/ printf("\t%d",d[i][j]);}}}void main(){graph g;int i,j,k,n;int d[num],p[num],sd[num][num],sp[num][num];//clrscr();n=11;g.data[0]='a';g.data[1]='b';g.data[2]='c';g.data[3]='d';g.data[4]='e';g.data[5]='f';g.data[6]='g';g.data[7]='h';g.data[8]='i';g.data[9]='j';g.data[10]='k';for(i=0;i<n;i++)for(j=0;j<n;j++)g.edges[i][j]=maxdist; for(j=0;j<n;j++)g.edges[i][j]=0;g.edges[0][2]=30;g.edges[0][5]=40;g.edges[0][1]=20;g.edges[1][5]=60;g.edges[1][4]=40;g.edges[1][6]=30;g.edges[2][3]=35;g.edges[2][7]=40;g.edges[3][10]=20;g.edges[3][8]=15;g.edges[4][9]=30;g.edges[4][8]=35;g.edges[4][10]=10;g.edges[5][10]=10;g.edges[5][8]=45;g.edges[5][2]=20;g.edges[6][0]=70;g.edges[7][0]=50;g.edges[8][9]=20;g.edges[9][1]=55;g.edges[10][0]=125;//clrscr();printf("\t --WELCOME TOU USE GUIDE!!--\n");printf("\t*****************************************\n");printf("\t* *\n");printf("\t*\tINFOMATION-i\tVISIT-v\t\t*\n\t*\t ABOUT ME-a\tQUIT-q\t\t*\n");printf("\t*\t\t\t\t\t*\n\t*\t\t\t\t\t*\n\t*\t\t\t\t\t*\n\t*\t\t\t\t\t*\n \t*\t\t\t\t\t*\n");printf("\t*****************************************\n");printf("\t*PLEASE ENTER AN ORDER:i? v? m? q?\t*\n");printf("\t*CLEAR THE SCREEN:c\t\t3\t*\n");printf("\t*****************************************\n");do{/*gets(t);*/switch(getchar()){case'a':{printf("NAME:****** CLASS:02computer(3)\n"); printf("PRIVATE EMAIL:devo800@\n"); }break;/* case'g':{FILE *tp;*//* break; */case'i':{FILE *tp;char ch;if((tp=fopen("d:\\info.txt","rt"))==null) {printf("\ncan't open!");getchar();exit(1);}ch=fgetc(tp);while(ch!=EOF){putchar(ch);ch=fgetc(tp);}fclose(tp);}break;case'c':break;case'v':{do{printf("\nINPUT JIE DIAN(0-10):\n"); scanf("%d",&i);{dijkstra(g,n,i,d,p);printf("\n\nyuandian is v%d:",i); opdijk(i,n,d,p);}}while(1);}break;default: exit(1);}}while(getchar());getchar();}*--------------------校园导游系统------------------*/#include<stdio.h>#include<process.h>#define INT_MAX 1000000#define n 10int cost[n][n];//边的值int shortest[n][n];//两点间的最短距离int path[n][n];//经过的景点的;void floyed();int display(int i,int j);void introduce()//introduce of the palce{ int a;printf("Place 1:凯旋门\n"); printf("Place 2:图书馆\n");printf("Place 3:行政楼\n"); printf("Place 4:飞翔门\n"); printf("Place 5:大广场\n");printf("Place 6:ABC教学楼\n"); printf("Place 7:体育场\n"); printf("Place 8:月亮湾\n"); printf("Place 9:English Coner\n"); printf("Place 10:树人广场\n");do{printf("您想查询哪个景点的详细信息?请输入景点编号:");scanf("%d",&a);getchar();switch(a){case 1:。

c语言校园导航最短距离-floyd算法

c语言校园导航最短距离-floyd算法

校园导航最短距离-Floyd算法一、引言在现代社会中,校园导航成为了大学生、教师、甚至游客日常生活中的重要组成部分。

特别是大一新生,对校园的地理布局尚不熟悉,更需要一种高效的导航方式来帮助他们更快地找到教学楼、食堂、宿舍等地点。

而作为计算机科学领域的重要一环,C语言通过应用Floyd算法来解决校园导航最短距离的问题,给校园导航增添了新的可能性。

二、校园导航最短距离-Floyd算法的基本概念在介绍C语言以及Floyd算法在校园导航中的应用之前,我们先来了解一下校园导航最短距离-Floyd算法的基本概念。

Floyd算法是一种用于寻找加权图中顶点对之间最短路径的算法,主要用于解决多源点之间的最短路径问题。

在校园导航中,可以将校园内不同的地点看作图中的顶点,而顶点之间的路径长度则可以看作边的权重,Floyd算法就可以帮助我们快速找到任意两个地点之间的最短路径。

而C语言作为一种结构化程序设计语言,其高效、灵活的特性可以很好地支持Floyd算法的实现。

三、C语言在校园导航最短距离中的应用1. 基于邻接矩阵的图表示在C语言中,我们可以利用二维数组来表示图的邻接矩阵,用来存储不同地点之间的路径长度。

通过邻接矩阵的方式,我们可以方便地在程序中存储校园内各个地点之间的距离,为Floyd算法的实现提供了基础。

2. Floyd算法的实现在C语言中,我们可以通过嵌套循环来实现Floyd算法。

我们需要初始化一个二维数组来存储任意两个地点之间的最短距离,然后通过三重循环来不断更新这个数组,直到找到所有顶点对之间的最短路径。

C 语言的结构化特性使得Floyd算法的实现变得简洁清晰,同时也可以充分利用C语言的指针和数组操作来提高算法的效率。

四、校园导航最短距离-Floyd算法的个人观点和理解作为一名计算机科学专业的学生,我对校园导航最短距离-Floyd算法的应用深感兴趣。

我认为Floyd算法的高效性和C语言的灵活性为校园导航提供了新的可能性,可以帮助校园内的师生更快捷、准确地找到目的地。

校园导航系统 数据结构课程设计 C++开发

校园导航系统 数据结构课程设计  C++开发

分类号编号华北***大学North China Institute of Water Conservancy andHydroelectric Power课程设计题目校园导航院系信息工程学院专业计算机科学与技术姓名******学号201117000指导教师*****2012年7月6 日目录1.需求分析 (1)1.1问题描述 (1)1.2课程设计目的 (1)1.3设计要求 (1)2.概要设计 (2)2.1任务定义 (2)2.2数据结构 (2)2.3 校园平面图展示 (2)2.4系统功能图 (4)3.详细设计 (4)3.1各个模块名称和功能 (4)3.2具体函数模块详解 (5)3.2.1校园平面图展示 (5)3.2.2任意两点的所有路径 (5)3.2.3校园基础设施介绍 (6)3.2.4指定两点间最短路径 (6)3.2.5单点到其他左右顶点间最短路径 (6)3.2.6华北水利水电学院简介 (7)3.2.7访客留言 (7)3.2.8浏览访客留言 (7)3.3 主要算法思想描述 (7)3.4各函数之间的调用关系示意图 (7)4.测试与分析 (8)4.1测试显示 (8)4.2调试分析 (12)4.2.1调试过程中遇到的问题与解决方案 (12)4.2.2算法的时空复杂度分析 (12)5.用户使用说明 (12)6.实验总结 (14)7.参考文献 (14)8.附件 (15)校园导航系统1.需求分析1.1问题描述我们熟悉一个地方的地形情况通常是借助于一张地图,通常的地图包含的信息十分的有限,而且具体到某一个建筑物,你不能了解到它的进一步的详细的情况。

因此,导航系统就应运而生了。

具体到本系统,作为用户浏览校园时,只拿着学校的地图是能够游遍全校,但是各建筑内部的情况就必须实地考察才能了解,既费时又费力。

有了我们的校园的导航系统,用户可以根据自己的需要,迅速找到所关心的地点,并且可以看到它的详细的信息。

1.2课程设计目的本课程设计的目的就是要达到理论与实际应用相结合,使我们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,培养程序设计技能如下:(1)了解并掌握数据结构算法的设计方法,具备初步的独立分析和设计能力;(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(3) 独立完成,提高运用所学的理论知识和方法独立分析和解决问题的能力;1.3设计要求设计一个校园导航系统,为来访的客人提供导航服务,具体要求:(1) 设计学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。

c语言课程设计校园导航

c语言课程设计校园导航

c语言课程设计校园导航一、课程目标知识目标:1. 理解C语言基础语法,掌握变量声明、数据类型、运算符等基本概念;2. 学会使用C语言控制结构,包括顺序、选择和循环结构;3. 了解数组、字符串和函数在C语言中的应用;4. 掌握结构体和文件操作,为校园导航系统设计提供数据结构支持。

技能目标:1. 培养学生运用C语言进行问题分析、设计和编程的能力;2. 培养学生运用所学知识解决实际问题的能力,如设计校园导航系统;3. 提高学生的逻辑思维能力和编程技巧,使其能够编写高效、可维护的代码;4. 培养学生的团队协作和沟通能力,以便在项目开发过程中进行有效的分工与协作。

情感态度价值观目标:1. 培养学生对计算机编程的兴趣和热情,激发他们主动探索新技术;2. 培养学生的创新意识,鼓励他们在项目中提出新观点、新方法;3. 培养学生的责任感和敬业精神,使其认识到编程对实际生活的影响;4. 培养学生遵守国家法律法规,尊重知识产权,树立正确的道德观念。

本课程针对高中年级学生,结合C语言课程特点,以实用性为导向,培养学生具备编程思维和解决实际问题的能力。

通过设计校园导航系统,使学生将所学知识应用于实际项目中,提高他们的学习兴趣和积极性。

课程目标具体、可衡量,便于教师进行教学设计和评估。

在课程实施过程中,教师需关注学生个体差异,提供个性化指导,确保学生能够达到预期学习成果。

二、教学内容1. C语言基础语法- 变量声明与赋值- 数据类型与运算符- 控制结构(顺序、选择、循环)2. 数组与字符串- 一维数组- 二维数组- 字符串操作3. 函数与模块化编程- 函数定义与调用- 作用域规则- 模块化设计4. 结构体与文件操作- 结构体定义与使用- 文件读写操作- 数据存储与检索5. 校园导航系统设计与实现- 需求分析- 功能模块划分- 编程实现与调试教学内容依据课程目标,结合教材相关章节,制定以下教学大纲:第一周:C语言基础语法及控制结构第二周:数组与字符串操作第三周:函数与模块化编程第四周:结构体与文件操作第五周:校园导航系统设计与实现(含小组讨论、编程实践与调试)教学内容科学、系统,符合教学实际。

数据结构-算法实验报告——校园导航系统

数据结构-算法实验报告——校园导航系统

数据结构与算法分析课程设计报告设计题目:校园导航咨询系统专业学号姓名2013 年3 月3 日一、问题描述设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)(参考课本P186-P192)。

二、需求分析本程序分为五个模块,分别是显示校园全景、查询景点信息、问路查询系统、查看游览路线和退出系统。

(1)显示校园全景展示校园概貌图和各景点编号、名称。

(2)查询景点信息输入要查询的景点编号,显示景点的编号、名称和景点的简单介绍。

(3)问路查询系统输入要参观的两个景点的编号(按从大到小输入),显示两个景点间的最短路径游览方式和最短路径长。

(4)查看游览路线查询某个景点到其他景点的所有路径,并显示其长度。

(5)退出系统查询完毕关闭窗口,显示退出系统的界面三、概要设计1、主要函数:void main() 主函数,程序入口csinfo() 初始化景点信息csroad() 初始化道路信息showpath() 显示校园全景search() 查询景点信息floyd() 弗洛伊德函数,查询两个景点之间的最短路径所要经过的中间节点print(int i,int j) 打印两个景点的路径及最短距离shortpath() 问路查询,求最短路径ShortestPath_DIJ(Maph * M) 利用Dijkstra算法来计算出起点到各个顶点之间的最短路径,以v0为起点menu() 显示菜单选项2、主要变量:ps[MaxPointNum] 定义主要景点信息,存放景点的编号、名称、简要介绍等信息char name[20] 景点名称char number[15] 景点编号char info[100] 景点简介信息MaxPointNum 最大景点个数INFINITY 近似无穷大,表示两景点不可达Maph M 全局变量,定义M为Maph类型int shortest[MaxPointNum][MaxPointNum] 定义全局变量存贮最短路径int path[MaxPointNum][MaxPointNum] 定义存贮路径3、存储结构:3.1 图的类型定义typedef struct{char name[20]; //景点名称char number[15]; //景点代号char info[100]; //景点信息}Elemtype; //景点类型3.2 定义景点typedef struct{int num; //顶点编号Elemtype data; //顶点信息}Point; //定义顶点3.3定义全局变量typedef struct{Point ps[MaxPointNum]; //存放顶点的一维数组int road[MaxPointNum][MaxPointNum];//存放路径的长度(邻接矩阵)int poinum,arcnum; //顶点数,边数}Maph;4、求解算法:迪杰斯特拉算法求解无向图的最短路径四、详细设计详细参见C语言源程序1.调试分析运行程序进行调试:1.进入主界面,出现校园导航咨询系统主菜单。

c语言课程设计校园导航

c语言课程设计校园导航

c语言课程设计校园导航一、教学目标本课程的目标是使学生掌握C语言编程的基本知识和技能,能够运用C语言进行简单的校园导航系统开发。

通过本课程的学习,学生将能够理解C语言的基本语法、数据类型、运算符、控制结构等,并能够运用这些知识编写简单的程序。

同时,学生将能够通过实践,提高问题解决能力和团队合作能力。

二、教学内容教学内容将按照C语言的基本语法和编程技巧进行。

首先,将介绍C语言的基本概念和环境配置,然后逐步深入到数据类型、运算符、控制结构等核心内容。

接下来,将讲解函数、数组和指针等高级概念,最后通过实例讲解面向对象编程的基本思想。

三、教学方法为了提高学生的学习兴趣和主动性,将采用多种教学方法。

首先,通过讲授法,为学生提供C语言的基本概念和理论知识。

然后,通过讨论法,引导学生主动思考和探索问题。

接下来,通过案例分析法,让学生通过分析实际案例,掌握C语言的编程技巧。

最后,通过实验法,让学生通过动手实践,巩固所学知识。

四、教学资源为了支持教学内容和教学方法的实施,将选择和准备适当的教学资源。

教材方面,将选择经典的C语言教材,如《C程序设计语言》。

参考书方面,将推荐学生阅读一些优秀的C语言编程书籍,如《C Primer Plus》。

多媒体资料方面,将制作一些教学视频和演示文稿,以帮助学生更好地理解C语言的编程原理。

实验设备方面,将准备计算机和网络设施,以供学生进行编程实验和实践。

五、教学评估本课程的评估方式将包括平时表现、作业和考试三个部分。

平时表现将根据学生在课堂上的参与度、提问和回答问题的积极性等进行评估。

作业将根据学生的编程实践能力和解决问题的能力进行评估。

考试将包括笔试和上机考试两部分,笔试主要测试学生对C语言理论知识的理解和掌握,上机考试主要测试学生的编程能力和实际操作能力。

六、教学安排本课程的教学进度将按照教材的章节进行安排,每个章节将安排2-3次的课堂讲授和实践操作。

教学时间将安排在每周的周二和周四下午,每次课2小时。

校园导航系统

校园导航系统

目录摘要 (2)正文 (3)1设计目的及要求 (3)2 设计原理 (3)2.1 C/C++语言简介 (3)2.2 开发环境 (3)2.3系统模块分析 (4)3设计内容 (4)3.1方案设计与论证 (4)3.2数据结构描述与定义 (5)3.3主要函数的说明 (6)3.4设计结果验证 (11)总结与致谢 (14)参考文献 (15)附录 (16)摘要与传统的地图相比较,地理信息系统有着不可比拟的优势,信息量大,切换方便,可扩展性强。

校园导航问题是基于校园中的不同的景点,从陌生人的角度,为来往的客人提供校园景点相关信息的查询以及为来往的客人提供校园中任意景点的问路查询,以便客人能用最短的时间从某一地点到达想要去的地方。

大大节约了旅客参观校园的时间。

本文是采用C++作为开发语言,又最大程度上用了C语言的有关的语法。

以visual c++6.0为开发工具。

旨在实现校园导航系统中,学校的简介,景点的介绍,路线查询等基本的问题。

为来往客人参观校园提供方便。

关键字:visual c++6.0 ;校园导航系统;正文1设计目的及要求1. 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3. 独立完成,提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

5. 设计学校平面图,至少包括10个以上场所,校园导航系统能自动找出校园平面图中任意起始点与终点的最佳路径(最短路径)。

求并输出路径及路径长度。

2 设计原理2.1 C/C++语言简介C语言是一种计算机程序设计语言。

它既具有高级语言的特点,又具有汇编语言的特点。

它由美国贝尔研究所的D.M.Ritchie于1972年推出。

1978后,C语言已先后被移植到大、中、小及微型机上。

校园导航问题(c语言)

校园导航问题(c语言)

#include<stdio.h>#include<string.h>#define MAXNUM 20#define INF 6789typedef struct {int adj;//该弧所指向的顶点的位置int *info;/* 该弧相关信息 */}sceneinfo;typedef struct adjlist{int num;// 景点编号char *sight;// 景点名称char *description; /*景点描述*/}adjlist;typedef struct algraph{adjlist ver[MAXNUM];sceneinfo arcs[MAXNUM][MAXNUM];int vexnum,arcnum;/* 图的当前顶点数和弧数*/} algraph;algraph m;// 把图定义为全局变量int visited[MAXNUM];// 全局数组,用来记录各顶点被访问的情况int r[MAXNUM];//全局数组。

用来存放路径上的各个顶点int p=11;//记录当前景点的个数int w=16;//记录当前景点边数的个数int a=0;// 全局变量,用来记录每对顶点之间的所有路径的条数int menu(void)// 用户操作界面{ int i;printf("\n---------------------------------------------\n");printf("1.图中任意景点的相关信息查\n");printf("2.任意两个景点间的最短路径\n");printf("3.任意两个景点间的所有路径\n");printf("4.增加有关景点和道路的信息\n");printf("5.删除更新有关景点和道路的信息 \n");printf("6.更新有关景点和道路的信息\n");printf("7.退出该系统 \n ");printf("---------------------------------------------\n");printf(" 请输入你要进行的操作:");scanf("%d",&i);return(i);}void picture(void)//创建图的函数{ int i,j;m.vexnum=11;m.arcnum=16;for(i=0;i<m.vexnum;i++)// 将每个景点进行编号m.ver[i].num=i;m.ver[0].sight="xiaomen";m.ver[1].sight=" 会通楼 ";m.ver[2].sight=" 大成楼 ";m.ver[3].sight=" 孔安道 ";m.ver[4].sight=" 体育馆 ";m.ver[5].sight=" 柳明湖 ";m.ver[6].sight=" 求知楼 ";m.ver[7].sight=" 清风楼 ";m.ver[8].sight=" 学生活动中心";m.ver[9].sight=" 信息楼 ";m.ver[10].sight=" 基础楼 ";m.ver[1].description=" 教学楼 1 及机电学院办公室";m.ver[2].description=" 教学楼 2 及经管学院办公室";m.ver[3].description=" 教学楼 3 及文学院办公室";m.ver[4].description=" 篮球场和羽毛球场";m.ver[5].description=" 公园和人工湖";m.ver[6].description=" 用于做学生的实验";m.ver[7].description=" 食堂 ";m.ver[8].description=" 举办各种学生活动和课外竞赛";m.ver[9].description=" 电信学院及办公室";m.ver[10].description=" 教学楼 4 及理学院办公室";for(i=0;i<m.vexnum;++i)// 将两景点间的距离初始化为 0 for(j=0;j<m.vexnum;++j)m.arcs[i][j].adj=INF;m.arcs[1][2].adj=m.arcs[2][1].adj=100;m.arcs[1][3].adj=m.arcs[3][1].adj=100;m.arcs[2][6].adj=m.arcs[6][2].adj=210;m.arcs[3][5].adj=m.arcs[5][3].adj=300;m.arcs[1][4].adj=m.arcs[4][1].adj=220;m.arcs[4][5].adj=m.arcs[5][4].adj=600;m.arcs[4][9].adj=m.arcs[9][4].adj=150;m.arcs[4][6].adj=m.arcs[6][4].adj=650;m.arcs[5][7].adj=m.arcs[7][5].adj=30;m.arcs[6][8].adj=m.arcs[8][6].adj=60;m.arcs[10][9].adj=m.arcs[9][10].adj=190;m.arcs[7][10].adj=m.arcs[10][7].adj=350;m.arcs[7][9].adj=m.arcs[9][7].adj=280;m.arcs[8][9].adj=m.arcs[9][8].adj=110;}void sceneplace(void)// 输出景点的名称{ int i;for(i=1;i<p;i++){if(m.ver[i].sight==NULL){ printf("%d. ",i);printf(" 该景点已被删除 \t");}elseprintf("%d.%s\t",i, m.ver[i].sight);}printf("\n\n");}void checkscene(algraph g)// 查询各个景点的信息{int i,j; charch;while(1){ sceneplace();printf(" 请输入你要查询的景点的编号:");scanf("%d",&i);if(i>p || i<0)printf(" 输入错误!! \n");else{for(j=0;j<=p;j++){ if(i==j){printf(" 你要查询的景点的相关信息如下:\n");printf("%d\t\t%s\n",g.ver[i].num,g.ver[i].sight);printf("%s\n",g.ver[i].description);}}}printf(" 是否继续查询 ?(y|n):");scanf("%s",&ch);if(ch=='N'||ch=='n')break;}}void ppath(algraph g,int path1[],int i,int v0)/* 输出最短路径 */{int k;k=path1[i];if(k==v0)/* 找到最短路径,则返回*/return;ppath(g,path1,k,v0);/* 否则,递归调用之 */ printf("%s->",g.ver[k].sight);/* 依次输出路径中的景点名称 */}void dispath(algraph g,int dist[],int path1[],int s[],int n,int v0,int i)//由 path1 计算从v0到i 的最短路径{if(s[i]==1&& i!=v0)//当v0 不等于i,且i∈ s{printf("从 %s 到 %s 的最短游览路径是:\n",g.ver[v0].sight,g.ver[i].sight);printf("%s->",g.ver[v0].sight);ppath(g,path1,i,v0);// 调用ppath 函数,输出路径中的顶点printf("%s",g.ver[i].sight);printf(" 路径长度: %d 米 \n",dist[i]);}}void Dijkstra(algraph g)// 采用狄克斯特拉算法求从顶点v0 到顶点po 的最短路径{char ch;int path1[MAXNUM]; int dist[MAXNUM];//path1[i]中存放顶点i 的当前最短路径上该点的前趋顶点;//dist[i] 中存放顶点i 的当前最短路径长度int s[MAXNUM];//s 为已找到最短路径的终点集合,若s[i]=1, 则 i ∈s;int mindis,i,j,u,n=p;int l,k;int v0,po;while(1){sceneplace();printf(" 请输入出发景点的序号:");scanf("%d",&v0);printf(" 请输入目的景点的序号:");scanf("%d",&po);//在网中找到其编号与输入的目地景点的编号相同的顶点for(i=0;i<n;i++){dist[i]=g.arcs[v0][i].adj;//距离初始化s[i]=0;//s[] 置空if(g.arcs[v0][i].adj!=INF)// 路径初始化path1[i]=v0;elsepath1[i]=-1;}s[v0]=1;path1[v0]=0;for(i=0;i<n;i++){mindis=INF;u=-1;for(j=0;j<n;j++)if(s[j]==0 && dist[j] < INF){u=j;mindis=dist[j];//源点编号 v0// 选取不在放入 s 中s 中具有最小距离的顶点u}s[u]=1;// 顶点u 加入s 中for(j=0;j<n;j++)//修改不在s 中的顶点的距离if(s[j]==0)if(g.arcs[u][j].adj< INF&&dist[u]+g.arcs[u][j].adj<dist[j])// 修正 dist[i],path1[i]{dist[j]=dist[u]+g.arcs[u][j].adj;path1[j]=u;}}dispath(g,dist,path1,s,n,v0,po);//输出最短路径printf("\n 是否继续查询 ?(y|n):");scanf("%s",&ch);if(ch=='N'||ch=='n')break;}}void path(algraph g,int i,int j,int k)// 输出任意两个景点的所有路径{int s,ko;if(r[k]==j)// 找到一条路径{a++;//路径的条数值加1printf(" 第 %d 条 :",a);for(s=0;s<=k-1;s++)//输出一条路径{printf("%s",g.ver[r[s]].sight);printf("-->");}printf("%s\n",g.ver[r[s]].sight);}s=0;while(s<g.vexnum){if(s!=i)// 保证找到的是简单路径{ ko=r[k];if(g.arcs[ko][s].adj != INF && visited[s]==0)// 当 vk 与 vs 之间有边存在且vs 未被访问过{visited[s]=1;// 置访问标志位为 1,即已访问的r[k+1]=s;//将顶点 s 加入到 p 数组中path(g,i,j,k+1);// 递归调用之visited[s]=0;// 重置访问标志位为0,即未访问的,以便该顶点能被重新使用}}s++;}}void alldistance(algraph g)// 查询图中任意两个景点间的所有路径{int i,j,k,l;char sh;while(1){ sceneplace();// 输出景点的名称printf("\n 请选择出发景点的序号: ");scanf("%d",&i);printf("\n 请选择目地景点的序号: ");scanf("%d",&j);for(k=0;k<g.vexnum;k++)//g.vexnum 表示网中的顶点个数if(i==g.ver[k].num) i=k;// 在网中找到其编号与输入的出发景点的编号相同的顶点for( l=0;l<g.vexnum;l++)if(j==g.ver[l].num) j=l;// 在网中找到其编号与输入的目地景点的编号相同的顶点printf(" 从 %s 到 %s 的所有游览路径有:\n",g.ver[i].sight,g.ver[j].sight);/*输出出发景点和目地景点的名称 */r[0]=i;for(k=0;k<1;k++){ visited[i]=0;//初始化各顶点的访问标志位,即都为未访问过的a=0;// 初始化路径的条数path(g,i,j,0);//通过调用path 函数,找到从vi 到 vj 的所有路径并输出}printf(" 继续查询 ?(y|n):");scanf("%s",&sh);if(sh=='N'||sh=='n')break;}}void addscene(algraph g)// 增加有关景点和道路的信息{int j,i,b;char yi,mon[10],moh[100];while(1){ sceneplace();g.ver[p].num=p;printf(" 请输入新景点的名称: ");scanf("%s",mon);m.ver[p].sight=(char*)malloc(10);strcpy(m.ver[p].sight,mon);printf("\n 请输入新景点的相关简介: ");scanf("%s",moh);m.ver[p].description=(char*)malloc(100);strcpy(m.ver[p].description,moh);g.vexnum=g.vexnum+1;for(j=0;j<p;++j){m.arcs[p][j].adj=INF;m.arcs[j][p].adj=INF;}printf("\n请问有几个景点与该景点直接相通:");scanf("%d",&i);printf("\n请输入与该景点相通的景点的序号及它们之间的距离:");for(j=0;j<i;j++){ printf("\n 请输入第 %d 个景点的序号 :",j+1);scanf("%d",&b);printf("\n 请输入该两个景点之间的距离: ");scanf("%d",&g.arcs[p][b].adj);g.arcs[b][p].adj=g.arcs[p][b].adj;m.arcs[b][p].adj=g.arcs[p][b].adj;m.arcs[p][b].adj=m.arcs[b][p].adj;}printf(" 你输入的景点信息是:\n");printf("%d \t%s \t%s\n\n", g.ver[p].num,m.ver[p].sight,m.ver[p].description);g.arcnum=g.arcnum+i;p=p+1;m.vexnum=p;sceneplace();printf(" 是否继续添加 ?(y|n):");scanf("%s",&yi);if(yi=='N'||yi=='n')break;}}void delscene(algraph g)// 删除有关景点和道路的信息{ int i,j,k,l;char sh;while(1){sceneplace();printf("\n请输入你将要删除的景点序号:");scanf("%d",&i);for(k=0;k<g.vexnum;k++)//g.vexnum 表示网中的顶点个数if(i==g.ver[k].num) j=k; //在网中找到其编号与输入的出发景点的编号相同的顶点m.ver[j].sight=NULL;for(l=1;l<m.vexnum;++l){m.arcs[l][j].adj=INF;m.arcs[j][l].adj=INF;}m.vexnum=m.vexnum-1;sceneplace();printf(" 删除继续 ?(y|n):");scanf("%s",&sh);if(sh=='N'||sh=='n')break;}}void change(algraph g)//更新有关景点和道路的信息{ int i,b,j,th,fh,k;char sh,mon[10],moh[100];while(1){sceneplace();printf(" 请输入你将要修改信息的景点序号:");scanf("%d",&i);for(k=0;k<g.vexnum;k++)//g.vexnum 表示网中的顶点个数if(i==g.ver[k].num) j=k; //在网中找到其编号与输入的出发景点的编号相同的顶点printf("-----------------------------------------\n");printf("1. 景点名称 \t2.景点简介 \t3.道路消息 \n");printf("-----------------------------------------\n");printf("请输入你要进行的操作的序号:");scanf("%d",&th);switch(th){ case 1:printf(" 请输入新景点名称:");scanf("%s",mon);g.ver[j].sight=mon;m.ver[j].sight=g.ver[j].sight;break;case 2:printf(" 请输入新景点简介:");scanf("%s",moh);m.ver[j].description=(char*)malloc(100);strcpy(m.ver[j].description,moh);break;case 3:printf(" 请输入要修改的与该景点相通的景点的距离的序号个数:");scanf("%d\n",&fh);for(k=0;k<fh;k++){ printf(" 请输入要修改的第 %d 个景点的序号 :",j+1);scanf("%d\n",&b);printf(" 请重新输入该两个景点之间的距离:");scanf("%d",&m.arcs[j][b].adj);m.arcs[b][j].adj=m.arcs[j][b].adj;}}sceneplace();printf(" 继续修改 ?(y|n):");scanf("%s",&sh);if(sh=='N'||sh=='n')break;}}int main(){picture();printf("\n---------欢迎进入佛科院校园导航系统-------------\n");sceneplace();for(;;){switch(menu()){ case 1:checkscene(m);break;// 查询各个景点的信息case 2:Dijkstra(m);break;// 查询图中任意两个景点间的最短路径case 3:alldistance(m);break;// 查询图中任意两个景点间的所有路径case 4:addscene(m);break;// 增加有关景点和道路的信息case 5:delscene(m);break;//删除有关景点和道路的信息case 6:change(m);break;//更新有关景点和道路的信息case 7:printf(" 感谢你使用该系统!! 再见 !!\n");exit(0);default:printf(" 输入错误 !! 请重新输入你要进行的操作!!\n");}}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告课程设计题目:校园导航专业:计算机科学与技术班级:1230701学号:2学生姓名:胡玖龙指导教师:刘志锋2014年6月19日1 / 17实验题目:校园导航系统实验时间:2014/6/16-2014/6/19实验地点:软件楼402实验目的:综合运用所学的数据结构知识解决一个关于学校导航系统的问题,侧重对图的相关内容特别是求最短路径的应用,使得能进一步熟悉掌握数据结构的基础知识,进一步提升自己的解决问题和编程调试能力,为后续专业课程的学习打下基础。

实验要求:设计学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从某个场所到达另一场所的最佳路径。

求最短路径用Dijkstra或Floryd算法实现。

2 / 17实现思路:先分析需求,本程序的主要目的是提供本学校地点的路径查询,并提供其他各种信息查询服务。

需求:1、提供校园平面图,使得能直观的了解学校。

2、提供地点信息查询,为各地点提供简短的介绍。

3、提供任意两地点间最短路径查询,并计算总路程。

根据要求,先将校园平面图信息抽象为无向网,用邻接矩阵存储。

需求1:定义map()函数,功能是输出校园的平面图。

可简单的通过printf()函数实现。

需求2:定义Query()函数,功能是查询输出地点信息。

可直接输出无向网中的顶点信息。

需求3:根据输入的起点和终点,运用Floryd算法,求出最短路径,计算路径长度并输出。

考虑到使用者并不一定需要使用所有的功能,所以开始时需要一个选择菜单。

定义Menu()函数,功能是提供功能选择。

输入1,选择查看学校平面图输入2,选择查看各地点信息输入3,选择查找两地点间最短路径输入4,退出程序3 / 17总流程图:4 / 17平面图模块流程图:地点信息查询模块流程图:5 / 17求最短路径模块流程图:实现过程:从学校的平面图中选取出12个比较重要的地点,将其抽象成无向带权网并用邻接矩阵来表示。

以图中的顶点代表地点,存放地点名称、编号、简介等信息,权值代表两地之间的距离。

最短路径用Floyd算法求出。

地点间距离用地图软件测出。

6 / 17将得到的信息绘制成无向网:程序用到的函数:MGraph InitGraph(MGraph &G) //构造校园图void Menu() //初始菜单void Map() //校园平面图V oid Number() //输出地点编号,在其他操作中会用到void Query(MGraph G) //查找函数,可以输出地点名称和介绍void floyd(MGraph G) //floyd算法void shortestPath_Floyd(MGraph &G) //求最短路径void main(); //主函数(1)图的存储结构:typedef struct{char name[30]; //地点名称int num; //地点编号char introduction[200]; //地点介绍1.体育馆2.北区宿舍3.图书馆4.樱花广场5.三教6.东门7.青春广场8.西区食堂9.西区宿舍10.南区食堂11.南区宿舍12.南门7 / 17}VertexType;typedef struct{VertexType vexs[MAX]; //地点int arcs[MAX][MAX]; //存储图的邻接矩阵int vexNum,arcNum; //地点数,路径数}MGraph;(2)构造校园图:MGraph InitGraph(MGraph &G) //构造校园图{int i,j;G.vexNum=12;G.arcNum=16;for(i=1;i<=G.vexNum;i++)G.vexs[i].num=i;strcpy(G.vexs[1].name,"体育馆");strcpy(G.vexs[1].introduction,"有田径场及各种体育活动场馆");strcpy(G.vexs[2].name,"北区宿舍");strcpy(G.vexs[2].introduction,"学校北区的宿舍");strcpy(G.vexs[3].name,"图书馆");strcpy(G.vexs[3].introduction,"有着丰富的藏书,是学习、自习的好地方");strcpy(G.vexs[4].name,"樱花广场");strcpy(G.vexs[4].introduction,"有很多樱花树,适合早读");strcpy(G.vexs[5].name,"三教");strcpy(G.vexs[5].introduction,"学校的教学区");strcpy(G.vexs[6].name,"东门");strcpy(G.vexs[6].introduction,"学校的正门");strcpy(G.vexs[7].name,"青春广场");strcpy(G.vexs[7].introduction,"经常有各种各样的社团活动");strcpy(G.vexs[8].name,"西区食堂");strcpy(G.vexs[8].introduction,"西区的食堂,饭菜很好吃");strcpy(G.vexs[9].name,"西区宿舍");strcpy(G.vexs[9].introduction,"学校西区的宿舍,既有男生宿舍也有女生宿舍");strcpy(G.vexs[10].name,"南区食堂");strcpy(G.vexs[10].introduction,"南区食堂,饭菜很好吃");strcpy(G.vexs[11].name,"南区宿舍");strcpy(G.vexs[11].introduction,"学校南区的宿舍,全是男生宿舍");strcpy(G.vexs[12].name,"南门");strcpy(G.vexs[12].introduction,"学校的南门,比较小");for(i=0;i<G.vexNum;i++)8 / 17for(j=0;j<G.vexNum;j++){G.arcs[i][j]=INFINITY; //不存在的路径长度设为无穷大G.arcs[0][1]=170;G.arcs[1][2]=200;G.arcs[1][4]=150;G.arcs[2][3]=30;G.arcs[2][4]=150;G.arcs[2][5]=300;G.arcs[3][4]=30;G.arcs[4][6]=170;G.arcs[4][7]=160;G.arcs[5][6]=500;G.arcs[5][10]=570;G.arcs[6][7]=100;G.arcs[7][8]=160;G.arcs[8][9]=180;G.arcs[9][10]=100;G.arcs[10][11]=20;}for(i=0;i<G.vexNum;i++) //无向网的邻接矩阵关于对角线对称for(j=0;j<G.vexNum;j++)G.arcs[j][i]=G.arcs[i][j];return G;}(3)菜单模块:void Menu() //初始菜单{printf("\n\n 东华理工大学校园导游系统\n");printf(" ┏━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf(" ┃编号┃功能┃\n");printf(" ┣━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");printf(" ┃1 ┃查看学校平面图┃\n");printf(" ┃2 ┃查看地点信息┃\n");printf(" ┃3 ┃查找两地点间最短路径┃\n");printf(" ┃4 ┃退出┃\n");printf(" ┗━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("输入你的选择:");}9 / 17(4)平面图模块:void Map() //校园平面图{printf("\n");printf(" ┏━━━━━━━┓\n");printf(" ┃┃ \n");printf(" ┃ 1.体育馆┃\n");printf(" ┃┃\n");printf(" ┗━━━┳━━━┛\n");printf(" ┃\n");printf(" ┏━━━┻━━━┓\n");printf(" ┃┃\n");printf(" ┏━━━━━━━━━┳━━━┫ 2.北区宿舍┣━━━┓\n");printf(" ┃┃┃┃┃\n");printf(" ┃┃┗━━━━━━━┛┃\n");printf(" ┃┏━━━━━━━┓┃┃\n");printf(" ┃┃┃┃┃\n");printf(" ┏━━┓┃┃┃┃┣┓\n");printf(" ┃┣╋┫ 3.图书馆┣┫┃┃6. \n");printf(" ┃4. ┃┃┃┃┃┃┃东\n");printf(" ┃樱┃┃┃┃┣━━━━━━━━━━━━━━━┫┃门\n");printf(" ┃花┃┃┗━━━━━━━┛┃┃┃\n");printf(" ┃广┃┃┏━━━━━━━┓┃┃┃\n");printf(" ┃场┃┃┃┃┃┣┛\n");printf(" ┃┃┃┃┃┃┃\n");printf(" ┃┣┻┫ 5.三教┣┫┃\n");printf(" ┗━━┛┃┃┃┃\n");printf(" ┃┃┃┃\n");printf(" ┗━━━━━━━┛┣━━━━┳━━━━━━━━━━┫\n");printf(" ┃┏━━━┻━━━┓┃\n");printf(" ┏━━━━━━━┓┃┃┃┃\n");printf(" ┃┃┃┃┃┃\n");printf(" ┃┃┃┃7.青春广场┃┃\n");printf(" ┃8.西区食堂┣╋┫┃┃\n");printf(" ┃┃┃┃┃┃\n");printf(" ┃┃┃┃┃┃\n");printf(" ┗━━━━━━━┛┃┗━━━━━━━┛┃\n");printf(" ┃┃\n");printf(" ┏━━━━━━━┓┃┃\n");printf(" ┃┃┃┃\n");printf(" ┃┃┃┃\n");printf(" ┃9. ┃┃┃\n");printf(" ┃西┃┃┃\n");printf(" ┃区┣┫┃\n");10 / 17printf(" ┃宿┃┃┃\n");printf(" ┃舍┃┃┃\n");printf(" ┃┃┃┃\n");printf(" ┃┃┃┃\n");printf(" ┃┃┃┃\n");printf(" ┗━━━━━━━┛┃┃\n");printf(" ┃┃\n");printf(" ┃┏━━━━━━━━━━━┓┃\n");printf(" ┏━━━━━━━┓┃┃┃┃\n");printf(" ┃┃┃┃┃┃\n");printf(" ┃┃┃┃┃┏┻┓\n");printf(" ┃10.南区食堂┣┻┫11.南区宿舍┣━┫┃\n");printf(" ┃┃┃┃┗━┛\n");printf(" ┃┃┃┃12.南门\n");printf(" ┗━━━━━━━┛┃┃\n");printf(" ┗━━━━━━━━━━━┛\n");printf("请按任意键继续!");getch();}(5)地点编号函数:V oid Number() //输出地点编号,在其他操作中会用到{int v;printf("\n\n┏━━┳━━━━━━┓\n");printf("┃编号┃地点名称┃\n");for(v=1;v<=G.vexNum;v++){printf("┃%-4d┃%-12s┃\n",G.vexs[v].num,G.vexs[v].name);}printf("┗━━┻━━━━━━┛\n");}(6)地点信息查询模块:void Query(MGraph G) //查找函数,可以输出地点名称和介绍{int k,i=1;Number();while(i){printf("请输入要查询的地点编号,输入0退出:");scanf("%d",&k);if(k<0||k>G.vexNum){printf("地点编号不存在!请重新输入地点编号:");scanf("%d",&k);}printf("%d.%s %-62s\n\n",G.vexs[k].num,G.vexs[k].name,G.vexs[k].introduction);if(k==0)i=0;}}(7)Floyd算法求最短路径:int D[MAX][MAX],Path[MAX][MAX];void floyd(MGraph G) //Floyd算法{int i,j,k;for(i=0;i<G.vexNum;i++)for(j=0;j<G.vexNum;j++){D[i][j]=G.arcs[i][j];if(i!=j&&G.arcs[i][j]<INFINITY) Path[i][j]=i;else Path[i][j]=-1;}for(k=0;k<G.vexNum;k++)for(i=0;i<G.vexNum;i++)for(j=0;j<G.vexNum;j++)if(D[i][k]+D[k][j]<D[i][j]){D[i][j]=D[i][k]+D[k][j];Path[i][j]=Path[k][j];}}void shortestPath_Floyd(MGraph &G) //求最短路径{int i,j,p,m,k;int b[100];floyd(G);Number();do{printf("请输入起点编号:");scanf("%d",&i);printf("请输入终点编号:");scanf("%d",&j);if(i==j)printf("起点和终点一样,请重新输入\n");else if(i>12||i<0||j>12||j<0)printf("输入错误,请重新输入\n");}while(i==j||i>12||i<0||j>12||j<0);i=i-1;j=j-1;if(i!=j){printf("起点:%s,终点:%s\n最短路径:",G.vexs[i+1].name,G.vexs[j+1].name);p=Path[i][j];if(p==-1) printf("empty\n");else{m=0;b[m++]=j;while(p!=i){b[m++]=p; p=Path[i][p];}b[m]=i;for(k=m;k>0;k--) printf("%s->",G.vexs[b[k]+1].name);printf("%s,路程为%d米\n",G.vexs[b[0]+1].name,D[i][j]);}}printf("\n\n按任意键继续\n\n");getch();}(8)主函数:void main() //主函数{InitGraph(G);int i;Menu(G);scanf("%d",&i); //输入选择while(i!=4) //输入4,则退出{switch(i){ //每次选择后会调用清屏函数,使界面美观case 1:system("CLS");Map();Menu(G);break; //若输入1,则输出平面图case 2:system("CLS");Query(G);Menu(G);break; //若输入2,则查找并输出地点名称和介绍case 3:system("CLS");shortestPath_Floyd(G);Menu(G);break; //若输入3,则找出最短路径case 4:;break;default:printf("输入错误,清重新输入\n");}scanf("%d",&i);}}运行结果:图1:初始菜单,输入1查看学校平面图,输入2查看地点信息,输入3查找两地点间最短路径,输入4退出。

相关文档
最新文档