您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程设计,校园图结构

2015-01-14 10:24 148 查看
《数据结构课程设计》

课程题目 GDOU校园图

课程编号 j1620102

学生姓名 莫燕红

所在专业 信息管理与信息系统

所在班级 信管1134-15

任课老师 易学明

实习时间 2015年1月08日

设计成绩

老师评语

目录:

一、实训目的......................................2

二、实训环境......................................2

三、实习题目......................................2

四、实验要求......................................2

五、代码实现的功能................................2

六、需求分析......................................3

1、打开校园图的界面....................................................3

2、输入校园的信息并存储................................................3

3、利用Floyd算法比较两地点路径的距离,找出最短路径,输出校园图的所有路径和距离.......................................................................6

七、源代码........................................11

八、收获、体会以及不足............................15

一、实训目的

通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握C++较复杂程序的组织和设计过程,调试技巧。学习解决实际问题的能力。

二、实训环境

计算机windows xp或其它版本,VC6.0或更高版本,或其它语言环境。

三、实习题目

题目0.GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。

四、实验要求

使用数据结构相关知识来做。语言工具不受限。

1、独立完成,设计算法并编写代码,调试通过。

2、写设计说明书。

五、代码实现的功能

1、存储学校的所有地点和地点之间的距离

2、输入两地点可以查找到两地点之间的最短距离

3、校园图如下图所示(单位:米)



六、需求分析

1、打开校园图的界面如下图所示:



2、输入校园的信息并存储

GDOU:: GDOU(string a,int n,int e)

{ int i,j,k,info;

vertexNum = n; //存储图的顶点数

arcNum = e; //存储图的边数

for(i=0;i<vertexNum;i++)

vertex[i]=a[i]; //存储校园图的顶点

for(i=0;i<vertexNum;i++) //初始化距离,请将不相邻的两个地点的距离初始值为最大值,这里使用10000

for(j=0;j<vertexNum;j++)

arc[i][j]=10000;

for(k=0;k<arcNum;k++) //输入校园图的相邻的地点信息,将校园图地点进行编号,从0开始

{ cout<<"请输入相邻的两个地点的编号"<<endl;

cin>>i>>j;

while(i>=vertexNum && j>=vertexNum)

{ cout<<"请重新输入"<<endl;

cin>>i>>j;

}

cout<<"请输入相邻的两个地点的距离"<<endl;

//输入校园图的相邻的两个地点的距离

cin>>info;

while(info < 0)

{ cout<<"请重新输入"<<endl;

cin>>info;

}

arc[i][j]=info;

}

}

实现的效果如下:











3、利用Floyd算法比较两地点路径的距离,找出最短路径,输出校园图的所有路径和距离

void GDOU::Floyd()

{ int i,j,k;

for(i=0;i<vertexNum;i++) //初始化dist和path

for(j=0;j<vertexNum;j++)

{ dist[i][j] = arc[i][j];

if(dist[i][j] !=10000)

path[i][j]=vertex[i]+vertex[j];

else path[i][j] =" ";

}

for(k=0;k<vertexNum;k++) //判定地点i j之间是否经过k

for(i=0;i<vertexNum;i++)

for(j=0;j<vertexNum;j++)

if(dist[i][k]+dist[k][j]<dist[i][j])

{ dist[i][j]=dist[i][k]+dist[k][j];

path[i][j]=path[i][k]+"-"+path[k][j];

}

}

void GDOU::print() //结点m到n的最短路径

{ int a,b,i;

cout<<"GDOU校园图的所有路径如下:"<<endl;

for(i=0;i<vertexNum;i++) //输出校园图的所有路径信息

{ for(int j=0;j<vertexNum;j++)

cout<<setw(12)<<setiosflags(ios::left)<<path[i][j]<<" "; //12个字符位置,且左对齐

cout<<endl;

}

cout<<"GDOU校园图的所有路径长如下:"<<endl;

for(i=0;i<vertexNum;i++) //输出校园图的各边长信息

{ for(int j=0;j<vertexNum;j++)

cout<<setw(5)<<setiosflags(ios::left)<<dist[i][j]<<" "; //5个字符位置,且左对齐

cout<<endl;

}

cout<<"您想了解哪两个地点的最短路径?请输入这两个地点"<<endl;

string ch1,ch2;

cin>>ch1>>ch2; //输入要判定的两个地点,请输入校园图的地点字符。

for(i=0;i<vertexNum;i++)

if(vertex[i] == ch1) a=i;

for(i=0;i<vertexNum;i++)

if(vertex[i] == ch2) b=i;

cout<<ch1<<"到"<<ch2<<"的最短路径为:"<<path[a][b]<<"距离为"<<dist[a][b]<<endl;

system("pause");

}

实现的效果如下:

所有路径:









所有路径距离如下:





输入两地点,输出两地点的最短路径和距离:



七、源代码

#include <iostream>

#include <string>

#include<iomanip> //引入输入输出格式头文件

using namespace std;

const int Maxsize = 25; //图中最多顶点数个数为25

class GDOU //创建一个学校的类

{

public:

GDOU(string a,int n,int e); //构造函数,建立字符串a和具有n个顶点e条边的图

void Floyd(); //Floyd算法

void print(); //输出校园信息的函数

private:

string vertex[Maxsize]; //存放图中顶点的数组

int arc[Maxsize][Maxsize]; //存放图中边的数组

int vertexNum,arcNum; //校园图的顶点数和边数

int dist[Maxsize][Maxsize]; //辅助数组,存放在迭代过程中求得的最短路径的距离

string path[Maxsize][Maxsize]; //辅助数组,在迭代过程中存放ch1到ch2的最短路径

};

/*....................................以下是类GDOU的成员函数的定义........................................*/

GDOU:: GDOU(string a,int n,int e)

{ int i,j,k,info;

vertexNum = n; //存储图的顶点数

arcNum = e; //存储图的边数

for(i=0;i<vertexNum;i++)

vertex[i]=a[i]; //存储校园图的顶点

for(i=0;i<vertexNum;i++) //初始化距离,请将不相邻的两个地点的距离初始值为最大值,这里使用10000

for(j=0;j<vertexNum;j++)

arc[i][j]=10000;

for(k=0;k<arcNum;k++)

//输入校园图的相邻的地点信息,将校园图地点进行编号,从0开始

{ cout<<"请输入相邻的两个地点的编号"<<endl;

cin>>i>>j;

while(i>=vertexNum && j>=vertexNum)

{ cout<<"请重新输入"<<endl;

cin>>i>>j;

}

cout<<"请输入相邻的两个地点的距离"<<endl; //输入校园图的相邻的两个地点的距离

cin>>info;

while(info < 0)

{ cout<<"请重新输入"<<endl;

cin>>info;

}

arc[i][j]=info;

}

}

void GDOU::Floyd()

{ int i,j,k;

for(i=0;i<vertexNum;i++) //初始化dist和path

for(j=0;j<vertexNum;j++)

{ dist[i][j] = arc[i][j];

if(dist[i][j] !=10000)

path[i][j]=vertex[i]+vertex[j];

else path[i][j] =" ";

}

for(k=0;k<vertexNum;k++) //判定地点i j之间是否经过k

for(i=0;i<vertexNum;i++)

for(j=0;j<vertexNum;j++)

if(dist[i][k]+dist[k][j]<dist[i][j])

{ dist[i][j]=dist[i][k]+dist[k][j];

path[i][j]=path[i][k]+"-"+path[k][j];

}

}

void GDOU::print() //结点m到n的最短路径

{ int a,b,i;

cout<<"GDOU校园图的所有路径如下:"<<endl;

for(i=0;i<vertexNum;i++) //输出校园图的所有路径信息

{ for(int j=0;j<vertexNum;j++)

cout<<setw(12)<<setiosflags(ios::left)<<path[i][j]<<" "; //12个字符位置,且左对齐

cout<<endl;

}

cout<<"GDOU校园图的所有路径长如下:"<<endl;

for(i=0;i<vertexNum;i++) //输出校园图的各边长信息

{ for(int j=0;j<vertexNum;j++)

cout<<setw(5)<<setiosflags(ios::left)<<dist[i][j]<<" "; //5个字符位置,且左对齐

cout<<endl;

}

cout<<"您想了解哪两个地点的最短路径?请输入这两个地点"<<endl;

string ch1,ch2;

cin>>ch1>>ch2; //输入要判定的两个地点,请输入校园图的地点字符。

for(i=0;i<vertexNum;i++)

if(vertex[i] == ch1) a=i;

for(i=0;i<vertexNum;i++)

if(vertex[i] == ch2) b=i;

cout<<ch1<<"到"<<ch2<<"的最短路径为:"<<path[a][b]<<"距离为"<<dist[a][b]<<endl;

system("pause");

}

/*..................................................主函数...............................................*/

int main()

{

cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<end;

cout<<"~~ ★ ★ ~~"<<endl;

cout<<"~~ ★★ ★★ ~~"<<endl;

cout<<"~~ ★★★ 欢迎进入GDOU! ★★★ ~~"<<endl;

cout<<"~~ ★★ ★★ ~~"<<endl; cout<<"~~ ★ ★ ~~"<<endl;

cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<end;

cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<end;

cout<<"~~~~~~查找校园路径的时候,请用下面的字母代表以下的地点~~~~~~~"<<endl;

cout<<"~~ ~~"<<endl; cout<<"~~ a:校门口 b:美食街 c:运动场1 d:商业街 ~~"<<endl;

cout<<"~~ e:饭堂1 f:宿舍1 g:体育馆 h:主楼 ~~"<<endl;

cout<<"~~ i:图书馆 j:中心广场 k:科技楼 l:钟海楼 ~~"<<endl;

cout<<"~~ m:蝴蝶湖 n:博物馆 o:医院 p:运动场2 ~~"<<endl;

cout<<"~~ q:饭堂2 r:饭堂3 s:宿舍2 t:宿舍3 ~~"<<endl;

cout<<"~~ u:宿舍4 ~~"<<endl;

cout<<"~~ ~~"<<endl;

cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<end;

int n,e;

string ch;

cout<<"请输入总地点数和边数,空格格开:"<<endl;

cin>>n>>e;

cout<<"请依次输入各个地点相关的字符串:"<<endl;

cin>>ch;

GDOU m(ch,n,e); //创建类GDOU的对象m,调用函数GDOU

m.Floyd(); //调用Floyd算法

m.print(); //调用输出校园图信息print函数

return 0;

}

八、收获、体会以及不足

该课程设计是一个校园图,一个有向图,涉及图的结构的知识,特别是求图中的最短路径,核心算法为Floyd算法。做该课程设计让我巩固了关于图的知识,理解如何用邻接矩阵存储图的信息,更加理解Floyd算法,理解如何求最短路径。不过一开始做的时候,不知到如何下手,通过查看书籍和网上资料,参考他们的写法,读懂看懂到会写。首先,我在草稿纸上画出校园图和路径,然后按照所画的图写代码,输入图的所有信息并实现邻接矩阵存储的图的所有路径和距离,输入两地点,实现输出两点之间的最短路径和距离。虽然得到了我想要的效果,但是只能做出这么简单的程序,想做一个更加复杂的程序出来还不行,所以需要更加努力学习,写更多的代码,需要更多的实践。如果再不努力学习,在大学4年里做不出一个项目出来,可以说把大学的大部分时间都浪费了。学习过程中要学会如何高效率学习,个人认为,想做出一个更好的项目出来,架构和算法很重要。所以要有目标和计划学习,不然会不知如何学起和浪费很多时间,就和现在的我一样,所以要改变自我。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: