校园导航系统课程设计,#校园管理系统

  ****校园导航系统****@大学 C++/C语言/数据结构/课设

1.课程设计目的
(1)为了进一步巩固课堂上所学到的知识,深刻把握为了进一步巩固课堂上所学到的知识,深刻掌握所学重要的数据结构类型的基本概念,逻辑结构和物理结构,以及主要应用算法。锻炼选择应用合适的数据结构解决不同实际问题的能力,利用一周时间,使用所学的一种数据结构完成一个具体项目的分析设计和开发。
(2)设计一个校园导游程序,为来访客人提供各种信息查询任务。设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介信息,以边表示路权,存放路径长度等相关信息。
(3)为来访客人提供图中任意景点相关信息的查询
(4)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

2.课程设计方案论证
校园导航系统包括:构建地点、查询地点、地点介绍和导航路径等。设计一个校园系统,以使上述业务可以借助计算机来完成。

2.1 用户基本需求
每要完成对整个导游图系统的功能实现,需要对的每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行。有以下设计思路:
(1).结合本校的实际情况,选出10个景点;
(2).人为手工为选出的10个景点赋上相关信息(名称、代号、简介信息、以及路权等等);
(3).根据选出来的10个景点用邻接矩阵存储校园图。
(4).依照景点的相关信息创建校园图。
(5).把纸质上的内容,利用C++编程语言编写查找景点相关信息的程序。
(6).根据人为赋值的路权,迪杰斯特拉算法计算任意两点之间的最短路径。
(7).综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。
为此,可把系统分为以下几个核心:图的初始化、图的遍历、求最佳路线。
2.2 功能要求
结合沈阳大学实际情况,我选出以下10个景点,从1到10编号:
编号 名称 编号 名称 编号 名称 编号 名称
1 体育馆 2 图书馆 3 小北门 4 大西门
5 自然馆 6 一食堂 7 二食堂 8 五舍
9 综合楼 10 北操场

2.2.1 图的初始化
由于邻接矩阵特殊的存储方式,它非常便于快速的查找两个顶点之间的边上的权值。所以,图采用带权的邻接矩阵存储。
决定了图的存储方式后,以沈阳大学10个景点的游览地图作为蓝本,把校园地图抽象化成顶点与边构成的图形式。

2.2.2图的遍历
图的遍历是图中最基本的操作。图的遍历是指从图中某一顶点出发,对图中所有顶点访问一次且仅访问一次。导游图需要把每条路径的信息都向游客展示,就需要读取每两个顶点间的路径信息。由于采用了带权的邻接矩阵存储结构进行存储,所以需要针对这一存储结构对路线进行遍历操作。

2.2.3求最短路径
基于本程序中图的存储是邻接矩阵结构存储的图结构,因而采用适合该存储结构的迪杰斯特拉算法用于解决求最短路径的问题。
辅助数组dist[n]:元素dist[i]表示当前找到的从源点到终点vi的最短路径的长度。初态为:若从v到vi有弧,则dist[i]为弧上的权值;否则置dist[i]为∞。若当前求得的终点为vk,则根据下式进行迭代
:dist[i]=min{dist[i],dist[k]+arc[k][i]} 1≦i≦n
辅助数组path[n]:元素path[i]是一个串,表示当前所找到的从源点到终点vi的最短路径。初态为:若从v到vi有弧,则path[i]为“vvk”,否则置path[i]为空串。
数组s[n]:存放源点和已经生成的终点(即集合S),初态为只有一个源点v。
算法的伪代码描述是:
1.初始化数组dist、path和s;
2.while(s中的元素个数 (1)在dist[n]中求最小值,其下标为k(则vk为正在生成的终点);
(2) 输出dist[j]和path[j];
(3) 修改数组dist和path;
(4) 将顶点vk添加到数组s中;

校园导航系统课程设计,#校园管理系统_第1张图片

图1 图的遍历算法执行效果示意图

2.3 概要设计
校园导航系统课程设计,#校园管理系统_第2张图片
图2 功能模块图
2.3.1功能模块说明
1.创建校园图:
(1)先手工画好华农的10个景点的草图,再用C++语言输出抽象化的校园地图。
(2)再用C++语言定义节点个数N,编写函数name( )为景点赋值各类信息项,函数information( ),输入各个景点的简介。
(3)读入道路的起始点,为邻接矩阵的边赋相应的值。
2.利用函数travgraph来查找景点信息。
3.创建一个校园图creat(Matrix_Graph *G),然后为相应的边赋上现实意义上的权值。
4.用path( )函数来求任意两景点之间的最短路径。
5. 如果不查询则调用exit( )函数退出。
6.用main函数来输出导游界面。
2.3.2 程序代码及说明
(1)显示已初始化的校园地名,使用case语句输入学校地名,若景点编号输入错误,则用break退出。
void Name(int i)
{
switch(i)
{
case 1:
printf(“1:体育馆\n\n”);break;
case 2:
printf(“2:图书馆 \n\n”);break;
case 3:
printf(“3:小北门\n\n”);break;
case 4:
printf(“4:大西门\n\n”);break;
case 5:
printf(“5:自然馆\n\n”);break;
case 6:
printf(“6:一食堂\n\n”);break;
case 7:
printf(“7:二食堂\n\n”);break;
case 8:
printf(“8:五舍\n\n”);break;
case 9:
printf(“9:综合楼\n\n”);break;
case 10:
printf(“10:北操场\n\n”);break;
default:
printf(“景点编号输入错误!请输入1-10的数字编号!\n\n”); break;
}
}

(2)构建校园地图网络
void creat(Matrix_Graph *G)
{
int i,j;
for(i=1;i<=N;i++) G->vexs[i]=i;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++) G->arcs[i][j]=0;
G->arcs[1][2]=1; G->arcs[1][9]=7;
G->arcs[2][1]=1; G->arcs[2][3]=2; G->arcs[2][4]=9; G->arcs[2][9]=6;
G->arcs[3][2]=2; G->arcs[3][4]=7; G->arcs[3][7]=3; G->arcs[3][9]=4; G->arcs[3][10]=15; G->arcs[4][2]=9; G->arcs[4][3]=7;
G->arcs[4][6]=25; G->arcs[4][10]=22;
G->arcs[5][6]=6; G->arcs[5][7]=18; G->arcs[5][8]=10;
G->arcs[6][4]=25; G->arcs[6][5]=6; G->arcs[6][7]=2; G->arcs[6][10]=9;
G->arcs[7][6]=2; G->arcs[7][3]=3; G->arcs[7][5]=18; G->arcs[7][8]=5; G->arcs[7][10]=10;
G->arcs[8][5]=10; G->arcs[8][7]=5; G->arcs[8][9]=9;
G->arcs[9][1]=7; G->arcs[9][2]=6; G->arcs[9][3]=4; G->arcs[9][8]=9;
G->arcs[10][3]=15; G->arcs[10][4]=22; G->arcs[10][6]=9; G->arcs[10][7]=10;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
if(G->arcs[i][j]==0) G->arcs[i][j]=MAX;
}

(3)退出系统
case ‘0’:
clrscr();
printf("\n\t\t--------按任意键退出!--------\n\n");
printf("\n\t\t--------谢谢您的使用!--------\n");
getchar();
exit(0);
break;
default:
printf("\n输入错误,请重新输入0-3之间的数字:\n");
getchar();
break;
}
}
getchar();

}

3.运行结果及分析
(1)程序运行主界面如下。
校园导航系统课程设计,#校园管理系统_第3张图片
图3 程序运行主界面

(2)沈阳大学校园地图,结果如下图所示
校园导航系统课程设计,#校园管理系统_第4张图片
图4 抽象化的沈阳大学校园导游地图

(3)查询景点界面以及界面介绍,结果如下图所示。
校园导航系统课程设计,#校园管理系统_第5张图片
图5 查询景点界面
(4)地图地点的最短路径,结果如下图所示。
校园导航系统课程设计,#校园管理系统_第6张图片
图6 最短路径界面
(5) 退出系统,结果如下图所示。
校园导航系统课程设计,#校园管理系统_第7张图片
图7 退出系统界面
4.课程设计总结
经过这次课程设计,我对调试掌握的更加熟练了,改变了过去只调试不知道如何对照程序语言修改程序的坏习惯,对调试也有了新的认识,意识到了程序语言的规范性以及我们在编程时要有严谨的态度,同时在写程序时如果加一定量的注释,既增加了程序的可读性,也可以使自己在读程序时更容易。
编译和调试工具:选择Visual C++6.0,该工具稳定,其中有一个强大的调试工具,但我不是熟悉。还需要进一步的练习。在一周的时间里,不断地对程序及各模块进行修改、编译、调试、运行,其间遇到很多问题:程序在起初设计的时候,经常出现溢出错误,而且不只一处。为了修正这些溢出错误,耗费了大量的时间,修正解释之后再看源程序,才发现原来只是因为开始的函数定义的数据类型出现了问题,对函数的定义不清楚,字符的不正确定义造成了后期大量的纠错工作,测试用例具有一定的广泛性。运行程序时输入了多种不同字符信息,经过多次修改结果达到了预期效果。说明程序具有一定的可靠性和稳定性。通过调试我自己认为,在哈夫曼编码译码系统中用出栈入栈进行哈夫曼译码编码译码要简单于使用数组,而使用结构体数组来存储待编译的字符,编码译码时通过结构体数组来实现要优于使用链表。
在本次课设中遇到很多问题,从而解决开始遇到的问题。从此可见有时候上网查一些资料会比自己的想法好些,我们不能过分依赖网上的资源,但是借鉴一下网上资源还是可以的,学会把握分寸就行了。
例如其中一个问题,就是在英文文件扩大的时候发生了一些错误,编码和译码都发生了错误,从后就开始一步步的检查错误,从译码函数开始分析,一直到发现错误在编码的时候,终于发现那个选取的最大值已经小了,所以会导致编码和译码发生错误。从中可以学到,当我们写好一个源程序后这只是一个开始,真正的麻烦才开始,调试这个源程序才是关键,这就需要我们能够耐心的去一步步的发现错误并改正错误。因此这需要一个很好的毅力。
通过本次课程设计,我学会了当拿到一个题目时,如何去一步步的分析直到解决这个问题。其中包括了建立模型,找到相应的数据结构和实现方法,实际运行程序,反复调试和修改最终实现其功能。

5.参考文献
[1] 谭浩强.C程序设计[M].北京:清华大学出版社.2010.06:293-351
[2] 鹿旸. 数据结构与算法课程教学方法的思考[J].计算机教育.2010.05:88-90
[3]刘海峰.数据结构应用探索[J].电子制作.2014,23(20):43-56
[4]陈红梅,肖清,王丽珍,孔兵.数据结构实验方法探索[J].当代教育理论与实践.2015,14(04):23-34
[5]马克·艾伦·维斯.数据结构与算法分析:Java语言描述(原书第3版).机械工业出版社.2016-03-01

6.附录
在这里插入代码片
源程序清单
#define N 10
#define MAX 25
#define MAXedg 30
#include
#include
#include
#include

void clrscr()
{
system(“cls”);
}

typedef int AdjMatrix[MAX][MAX];

typedef struct
{
int vexs[MAX];
AdjMatrix arcs;
}Matrix_Graph;

typedef struct
{
char name[10];
char information[100];
struct edgenode *link;
}vexnode;

typedef struct edgenode
{
int adjvex;
int length;
char info[10];
char info2[100];
struct edgenode *next;
}edgenode, *Node ;

typedef struct Edge
{
int lengh;
int ivex, jvex;
struct Edge *next;
} EdgeType;

typedef struct
{
int num;
char name[10];
} vertex;

typedef struct
{
vertex vexs[MAX];
int edges[MAX][MAX];
}adjmax;

void Name(int i)
{

switch(i)
{
case 1: 
	printf("1:体育馆\n\n");break;
case 2: 
	printf("2:图书馆 \n\n");break; 
case 3: 
	printf("3:小北门\n\n");break; 
case 4: 
	printf("4:大西门\n\n");break; 
case 5: 
	printf("5:自然馆\n\n");break; 
case 6:
	printf("6:一食堂\n\n");break; 
case 7: 
	printf("7:二食堂\n\n");break; 
case 8: 
	printf("8:五舍\n\n");break; 
case 9: 
	printf("9:综合楼\n\n");break; 
case 10: 
	printf("10:北操场\n\n");break; 
default:
	printf("景点编号输入错误!请输入1-10的数字编号!\n\n"); break; 
}

}

void Information(int i)/景点介绍/
{
switch(i)
{
case 1:
printf(“体育馆:沈阳大学举办活动的地方。建筑中西结合,每届毕业班照相处。\n\n”);break;
case 2:
printf(“图书馆:为白色圆顶建筑,外观华美。日常重要报告召开地。\n\n”);break;
case 3:
printf(“小北门:为学校日常餐饮点,外观壮丽,是沈阳大学的标志性建筑。 \n\n”);break;
case 4:
printf(“大西门:坐落沈阳学生区。校门豪华,气势磅礴。\n\n”);break;
case 5:
printf(“自然馆:是沈阳大学全校最大设施最先进齐全的自然标本,平时各类生物比赛都在这里进行。\n\n”);break;
case 6:
printf(“一食堂:面积宽广,里面有众多珍贵菜品。\n\n”);break;
case 7:
printf(“二食堂:校内高档食堂,为外校嘉宾专设。\n\n”);break;
case 8:
printf(“五舍:我现在住的寝室。。\n\n”);break;
case 9:
printf(“综合楼:行政办公大楼。\n\n\n”);break;
case 10:
printf(“北操场场:面积不大,为同学和老师而设立的运动场。\n\n”);break;
default:
printf(“景点编号输入错误!请输入1->10的数字编号!\n\n”); break;
}
}

void travgraph(vexnode g[],int n,adjmax adj) //查找指定景点信息
{
int i = 1,flag = 1,len;
char ch;
printf("\t\t\t请输入您要查询的景点序号:、\n\n");
printf("\t\t\t1.体育馆 2.图书馆 3.小北门 4.大西门 5.自然馆\n");
printf("\t\t\t6.一食堂 7.二食堂 8.五舍 9.综合楼 10.北操场\n");
printf(“你的选择是”);
scanf("%d",&len);
getchar();
printf(“此景点的名称是:”);
Name(len);
printf(“此景点的介绍是:”);
Information(len);
do{
printf("\t\t是否继续? Y/N \n");
printf("\t\t你的选择是:");
scanf("%c",&ch);
getchar();
if(ch == ‘Y’ || ch == ‘y’)
{
clrscr();
flag = 1;
i = 1;
printf("\t\t\t请再次输入您要查询的景点序号:\n\n");
printf("\t\t\t1.体育馆 2.图书馆 3.小北门 4.大西门 5.自然馆\n");
printf("\t\t\t6.一食堂 7.二食堂 8.五舍 9.综合楼 10.北操场\n");
printf(“你的选择是”);
scanf("%d",&len);
getchar();
printf(“此景点的名称是:”);
Name(len);
printf(“此景点的介绍是:”);
Information(len);
continue ;
}
else
{ flag = 0;
printf("\t\t请再次按回车键或者任意键加回车键返回至主菜单");
}
break;
}while(1);
}

void creat(Matrix_Graph *G)
{
int i,j;
for(i=1;i<=N;i++) G->vexs[i]=i;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++) G->arcs[i][j]=0;
G->arcs[1][2]=1; G->arcs[1][9]=7;
G->arcs[2][1]=1; G->arcs[2][3]=2; G->arcs[2][4]=9; G->arcs[2][9]=6;
G->arcs[3][2]=2; G->arcs[3][4]=7; G->arcs[3][7]=3; G->arcs[3][9]=4; G->arcs[3][10]=15; G->arcs[4][2]=9; G->arcs[4][3]=7;
G->arcs[4][6]=25; G->arcs[4][10]=22;
G->arcs[5][6]=6; G->arcs[5][7]=18; G->arcs[5][8]=10;
G->arcs[6][4]=25; G->arcs[6][5]=6; G->arcs[6][7]=2; G->arcs[6][10]=9;
G->arcs[7][6]=2; G->arcs[7][3]=3; G->arcs[7][5]=18; G->arcs[7][8]=5; G->arcs[7][10]=10;
G->arcs[8][5]=10; G->arcs[8][7]=5; G->arcs[8][9]=9;
G->arcs[9][1]=7; G->arcs[9][2]=6; G->arcs[9][3]=4; G->arcs[9][8]=9;
G->arcs[10][3]=15; G->arcs[10][4]=22; G->arcs[10][6]=9; G->arcs[10][7]=10;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
if(G->arcs[i][j]==0) G->arcs[i][j]=MAX;
}

void path(Matrix_Graph *G,int s,int e)
{
int i,j,u,c=1,t,v;
int r[N+1][N+1];
int T[N],flag[N],d[N];
for(i=0;i<=N;i++)
for(j=0;j<=N;j++) r[i][j]=0;
for(i=1;i<=N;i++)
{
T[i]=-1;
flag[i]=1;
d[i]=MAX;
}
flag[s]=0;
while(c<=N)
{
t=MAX;
for(i=1;i<=N;i++)
if(flag[i]&&G->arcs[s][i] {
t=G->arcs[s][i];v=i;r[v][1]=v;}
for(i=1;i<=c;i++)
for(j=1;j<=N;j++)
if(flag[j]&&d[i]+G->arcs[T[i]][j] {
t=d[i]+G->arcs[T[i]][j];v=j;
if(r[v][0]!=-1)
{
u=1;
while(r[T[i]][u]!=0)
{
r[v][u]=r[T[i]][u];u++;}
}
r[v][u]=v;
}
r[v][0]=-1;
T[c]=v;
flag[v]=0;
d[c]=t;
c++;
}
printf("\n最短路径是以下这条:\n(%d)",s);
j=1;
while(r[e][j]!=0)
{
printf("–>(%d)",r[e][j]);j++;}
printf("\n\n");
}
int main()
{
int i,j;
Matrix_Graph G;
creat(&G);
int n = 0;
vexnode g[MAX];
EdgeType e[MAXedg];
adjmax adj;
char choice = ‘x’;
while(1)
{
clrscr();
printf("\n\n\t\t\t 校-园-导-游");
printf("\n\t\t--------------------------------------\n\n");
printf("\t\t\t1. 华农校园地图:\n\n");
printf("\t\t\t2. 华农景点信息:\n\n");
printf("\t\t\t3. 查找两点间最短路径:\n\n");
printf("\t\t\t0. 退出\n\n");
printf("\n\t\t--------------------------------------\n\n");
printf("\t\t华南农业大学校训:修德 博学 求实 创新\n");
printf("\n\t\t--------------------------------------\n\n");
printf("\t\t请输入你的选择(0-3): ");
choice = getchar();

	switch(choice)
	{
	case '1':
      	clrscr();
		printf("\t\t -----华-----农-----地-----图-----\n\n");
		printf("                     <4.西园> . . . . . . . . . . <10.黑山运动场>\n");
		printf("                      .    .   .                   .     .    .     \n");
		printf("                     .     .        .   .       .        .    .     \n");
		printf("                    .      .               .  .         .     .     \n");
		printf("                   .       .            .         .   .       .      \n");
		printf("                  .        .       .                 .   .    .       \n");
		printf(" <1.校史馆>...<2.红满堂>..<3.行政楼>                .        .         \n");
		printf("      .           .            .   .               .       <6.树木园>    \n");
		printf("      .          .           .          .       .        .         . \n");
		printf("      .         .          .               .    .     .             . \n");
        printf("      .        .         .                  <7.竹园> . . . . .. . .  .  \n");
		printf("      .       .       .                        .                 <5.东区运动场> \n ");
		printf("      .     .      .                             .                  . \n");
		printf("      .    .   .                                    .             .\n ");
		printf("       .  .  .                                         .        .   \n");
		printf("     <9.老校门>   .      .                               .    .  \n ");
		printf("                               .    .      .      .   .<8.新校门>\n\n");
      	printf("\t\t输入任意键返回菜单");
		getchar();
        getchar();
		break;
	case '2':
		clrscr();
		travgraph(g,n,adj);
		getchar(); 
		break;
	case '3':
		clrscr();
    	printf("\t\t -----华-----农-----地-----图-----\n\n");
		printf("                     <4.西园> . . . . . . . . . . <10.黑山运动场>\n");
		printf("                      .    .   .                   .     .    .     \n");
		printf("                     .     .        .   .       .        .    .     \n");
		printf("                    .      .               .  .         .     .     \n");
		printf("                   .       .            .         .   .       .      \n");
		printf("                  .        .       .                 .   .    .       \n");
		printf(" <1.校史馆>...<2.红满堂>..<3.行政楼>                .        .         \n");
		printf("      .           .            .   .               .       <6.树木园>    \n");
		printf("      .          .           .          .       .        .         . \n");
		printf("      .         .          .               .    .     .             . \n");
        printf("      .        .         .                  <7.竹园> . . . . .. . .  .  \n");
		printf("      .       .       .                        .                 <5.东区运动场> \n ");
		printf("      .     .      .                             .                  . \n");
		printf("      .    .   .                                    .             .\n ");
		printf("       .  .  .                                         .        .   \n");
		printf("     <9.老校门>   .      .                               .    .  \n ");
		printf("                               .    .      .      .   .<8.新校门>\n\n");
 		printf("\2你现在的位置是(请输入1-10):\n");
		printf("\t\t\t1.校史馆 2.红满堂 3.行政楼 4.西园   5.东区运动场\n");
    	printf("\t\t\t6.树木园 7.竹园   8.新校门 9.老校门 10.黑山运动场\n");
        printf("\t你的输入是:");
		scanf("%d",&i);
		getchar();
		printf("\2你想要去的地方是(请输入1-10):\n");
		printf("\t\t\t1.校史馆 2.红满堂 3.行政楼 4.西园   5.东区运动场\n");
    	printf("\t\t\t6.树木园 7.竹园   8.新校门 9.老校门 10.黑山运动场\n");
        printf("\t你的输入是:");
		scanf("%d",&j);
		getchar();
		path(&G,i,j);
		getchar();
		creat(&G);
		do{
			printf("是否继续查询啊? Y/N");
			char ch;
			int flag=1;
			scanf("%c",&ch);
			getchar();	
			if(ch == 'Y' || ch == 'y')  
			{
				flag = 1;
				i = 1;
				printf("\2你现在的位置是(请输入1-10):\n");
				scanf("%d",&i);
				getchar();
				printf("\2你想要去的地方是(请输入1-10):\n");
				scanf("%d",&j);
				getchar();
				path(&G,i,j);
				getchar();
				creat(&G);
				continue ;
			}
			else
				flag = 0;   
			break;
		}while(1);
		break;
	case '0': 
		clrscr();
		printf("\n\t\t--------按任意键退出!--------\n\n");
		printf("\n\t\t--------谢谢您的使用!--------\n");
		getchar();
		exit(0);
		break;
	default:
		printf("\n输入错误,请重新输入0-3之间的数字:\n");
		getchar(); 
		break;
	}
} 
getchar();

}

你可能感兴趣的:(课程设计,数据结构,编程语言,mysql,c++,c语言)