数据结构课程设计 信管1134班 洪量



                     课程设计报告

                    ---校园景点间路径问题

 

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、运行结果:


主界面:


数据结构课程设计 信管1134班 洪量_第1张图片


功能1:查看学校地图


数据结构课程设计 信管1134班 洪量_第2张图片


功能2:查看路程信息


数据结构课程设计 信管1134班 洪量_第3张图片


功能3:提供游览景点的最短路径


数据结构课程设计 信管1134班 洪量_第4张图片


功能4:提供游览学校的一种最佳路径

 

数据结构课程设计 信管1134班 洪量_第5张图片


功能5:退出

数据结构课程设计 信管1134班 洪量_第6张图片


输入错误时显示:

数据结构课程设计 信管1134班 洪量_第7张图片


7、总结与体会

    这次的课程设计,相比起大一时的无从下手已经有了很大的进步,说明这一个学期真正学到了知识获得了进步。很为自己感到高兴。但是同时在编写程序过程中遇到很多的问题,包括思路设计、代码书写等等各方面。还是感觉自己基础不够牢固,知识面不够广。需要更加深入地去研究数据结构这门课,花更多的心思在编程上。希望下学期能有更大的进步。 


你可能感兴趣的:(数据结构,课程设计)