课程设计报告
---校园景点间路径问题
1、目的
通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握C++较复杂程序的组织和设计过程,调试技巧。学习解决实际问题的能力。
2、题目要求
GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。
3、功能
(1)能够实现查看学校的地图;
(2)能够实现查看景点之间的路程信息;
(3)能够通过用户输入起始点提供游览景点的最短路径
(4)能够实现提供最佳旅游路径
(5)用户输入错误时会提示输入错误
4、设计思路
选择学校的8个点:门口、行政楼、水生博物馆、主楼、钟海楼、图书馆、中心广场、科技楼,将它们转化为图上的8个顶点。将信息存储在顶点中,通过对图的操作实现查询顶点信息和计算路径的问题。
5、源程序代码
#ifndef GUIDE_H //定义头文件
#define GUIDE_H
#include //引入标准库中的头文件
using namespace std;
const int MaxSize=12; //图中最多顶点个数
template
class Guide
{
public:
Guide(int* a, T* v,int n); //构造函数,初始化具有n个顶点的图
~Guide( ) { } //析构函数
void Dijkstra( int v,int endv); //最小距离
void PutOutArcInfo(); //输出路径
void TSP(int v); //求最优路径
private:
T vertex[MaxSize]; //存放图中顶点的数组
int arc[MaxSize][MaxSize]; //存放图中边的数组
int vertexNum; //图的顶点数和边数
};
#endif
#include
#include //引入标准库中的头文件
#include "Guide.cpp" //引用 ParkGuide.cpp 文件
#include "TSP.cpp" //引用解决最佳旅游路线的TSP文件
using namespace std;
int main(int argc, char* argv[])
{
const int numv = 8; //顶点数
int control=1; //控制
int which; //功能选择变量
string name; //插入顶点的值
int border[numv][numv]={ //按邻接矩阵确定顶点的权值
{10000,1,2,2,10000,10000,10000,10000}, //0号景点
{1,10000,10000,10000,10000,5,10000,10000},//1号景点
{2,10000,10000,3,3,10000,4,10000}, //2号景点
{2,10000,3,10000,10000,3,2,3}, //3号景点
{10000,10000,3,10000,10000,10000,1,10000},//4号景点
{10000,5,10000,3,10000,10000,5,2}, //5号景点
{10000,10000,4,2,1,5,10000,4}, //6号景点
{10000,10000,10000,3,10000,2,4,10000} //7号景点
};
string vname[numv]={"校门口","行政楼","水生博物馆","主楼","钟海楼","图书馆","中心广场","科技楼"}; //初始化各顶点
int* p; //定义指针p
string* q; //定义指针q
p = &border[0][0]; //p指针指向cost数组的起始位置
q = vname; //q指针指向vname数组
Guide g(p, q, numv ); //调用Graph程序
while ( control==1 ) //控制
{
cout<<" ****************************************** "<> which;
switch( which ) //功能选择
{
case 1: //输出图的各顶点的值
cout<<" [学校地图] "< 科技楼 "< 中心广场 . <5>图书馆 "< 钟海楼 . . . . . "<主楼 . "<水生博物馆 . <1> 行政楼 "< 校门口 "<>vv;
cout<<"请输入您想到的景点序号,若要全部显示请输入9:"<<"\n";
int vvt ;
cin>>vvt;
try
{
g.Dijkstra(vv,vvt);
}
catch(char*)
{
cout<<"输出顶点不正确!"<
#include
#include //引入标准库中的头文件
#include "Guide.h" //引入头文件
using namespace std;
/* 前置条件:图不存在
输入:无
功能:图的初始化
输出:无
后置条件:构造一个有值的图
*/
template
Guide::Guide(int* a,T* v, int n ) //构造图
{
int i,j;
vertexNum=n; //顶点数
for (i=0; i
void Guide::PutOutArcInfo() //输出图中所有的路径
{
int i=0; //假设源点是第0个顶点,即顶点序号是0
int j=0;
if ( i>vertexNum|| j>vertexNum) throw "位置"; //错误抛出异常
else
{ for(i=0;i
void Guide::Dijkstra(int v,int endv) //求从v顶点到endv点的最短路径
{
if ( v>vertexNum) throw "位置"; //v顶点或endv顶点输出不正确则抛出异常
int numv=vertexNum; //顶点数
int dist[MaxSize]; //最短长度
int path[MaxSize]; //当前找到的最短路径
int s[MaxSize]; //存放源点和已生成的终点的集合
int max= 10000; //代表无穷大
int i,j,k,wm;
for(i=0;i=0 ) //endv点存在
{
string mmm=""; //初始化字符串
int j =endv;
while(j > -1 )
{
string nnn = vertex[j]; //依次把顶点存放在nnn字符串中
nnn+=mmm;
mmm = " "+nnn;
j = path[j];
}
cout<<"从 "< -1 )
{
string nnn = vertex[j]; //依次把顶点存放在nnn字符串中
nnn+=mmm;
mmm = " "+nnn;
j = path[j];
}
cout<<"从 "<
#include
#include //引入标准库中的头文件
#include "Guide.h" //引入头文件
using namespace std;
/* 前置条件:图已存在
输入:起点
功能:用贪心法进行图的遍历
输出:所求得的最优路径及所经历的位置
后置条件:图保持不变
*/
template
void Guide::TSP(int v) //求最优旅游路线,从V点出发,最后回到V点
{
int pathsum=0; //用于存放路径和
int max= 10000; //代表无穷大
int minpath; //用于存放当前找到的最小路径
int visited[12]={1}; //记录顶点的访问情况:visited[d]=0表示d点未访问,visited[d]=1表示d点已被访问
int j=0; //临时存放顶点编号,以便传递给顶点v
//让所有点都记录为未访问。visited[c]=0.
for(int d=1;darc[v][k] && visited[k]==0)
//相邻的两个点进行路径大小比较,求出最小路径:逐一比较,保证minpath值为最小值
{
minpath=arc[v][k];
j=k;
}
}
if(minpath("<
6、运行结果:
主界面:
功能1:查看学校地图
功能2:查看路程信息
功能3:提供游览景点的最短路径
功能4:提供游览学校的一种最佳路径
功能5:退出
输入错误时显示:
7、总结与体会
这次的课程设计,相比起大一时的无从下手已经有了很大的进步,说明这一个学期真正学到了知识获得了进步。很为自己感到高兴。但是同时在编写程序过程中遇到很多的问题,包括思路设计、代码书写等等各方面。还是感觉自己基础不够牢固,知识面不够广。需要更加深入地去研究数据结构这门课,花更多的心思在编程上。希望下学期能有更大的进步。