校园导游实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
校园导游实验报告
一、需求分析及规格说明
用无向网表示学校的校园景点平面图,所含景点不少于十个。图中顶点表示主要景点,存放景点的代码和名称等信息,图中的边表示景点间的道路,存放路径长度等信息。设计一个校园导游程序,为来访的客人提供各种信息查询服务。
a)简易菜单管理,界面友好。
b)对城市信息(城市名、城市间的里程)进行录入和编辑(可选);
c)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径,给出相应的距离。
d)对于任意两个景点之间的一条最短的简单路径,给出所经过景点的信息和距离。对景点采用相应的字符选择。
二、概要设计
1、数据存储结构:
class Graph //双向图
{
private:
int m_maxsize; //图的最大顶点数
int m_vexNum; //图中存储的点的数量
string * m_name; //顶点的名称
int **m_mat; //邻接矩阵
int *m_path, //存放求最短路径时的路径
int *m_distance; //求最短路径时,最短路径的长度
bool *m_visited; //求最短路径时,点是否已访问
int MinVex();
void Dijkstra(int st); //Dijkstra算法
public:
Graph(int size, int n,const string *name, int **mat); //构造函数
~Graph(); //析构函数
int GetNum(); //获取图中顶点个数
string& GetVex(int i); //获取i号点的名称
bool AddVex(const string& name); //增加顶点
bool AddEdge(int x, int y, int dis); //增加边
bool DeleteVex(int n); //删除点
bool DeleteEdge(int x, int y); //删除边
void Print()const; //打印图的信息
void PrintPath(int st, int de); //打印最短路径
int ShortPath(int st, int de); //获取最短路径长度};
2、基本操作
//从文件读取数据
void ReadFile(int &n, int &m, int **mat, string* L);
//手动输入数据
void InputData(int &maxsize, int &n, int &m, int **mat, string *L);
三、详细设计
Graph(int size, int n,const string *name, int **mat)
{
//第一个参数为图的最多点的数量
//第二个参数为图中点的个数
//m_name申请size大小的string空间,并用第三个参数进行赋值
//m_mat申请size*size的int二维空间,并用第四个参数进行赋值
// m_path 申请size大小的int空间
//m_distance申请size大小的int空间
//m_visited 申请size大小的int空间
}
~Graph()
{
//释放m_name的空间;
//释放m_path的空间;
//释放m_distance的空间;
//释放m_visited的空间;
//释放m_mat的二维空间;
}
void Graph::Dijkstra(int st)
{
//将m_visited数组初始化为false,表示全部未访问
//将m_distance数组的值初始化为该点到起点的距离
//将m_path数组的值初始化为起点的坐标
//置顶点为已访问,即设置m_visited[]为true
//查找为访问点中,到起点距离最近的点,并置该点为已访问
//调整经过该点到起点的距离比较近的点,重置最短距离及路径的信息
}
void Graph::PrintPath(int st, int de)
{
//调用Dijkstra(st)
//定义int类型的栈,存放路径信息,并将终点坐标入栈
//通过m_path,将最短路径上的点一个个按顺序入栈,直到走到终点,栈中存放的是从终点到起点的路径
//重新从栈中将点出栈,打印,得到从起点到终点的路径
}
bool Graph::AddVex(const string& name)
{
//点的数量加1,并将字符串存入名字数组中
//并在邻接矩阵下方增加一行,右方增加一列,初始值为最大
}
bool Graph::AddEdge(int x, int y, int dis)
{
//重置邻接矩阵中对应的位置的值为传入的第三个参数
}
bool Graph::DeleteVex(int n)
{
//点的数量减1
//删除其在邻接矩阵中对应的行与列,即将其下方数据全部向上移,其右方数据全部往左移}
bool Graph::DeleteEdge(int x,int y)
{
//重置邻接矩阵中对应的位置的值为最大,代表没有边
}
四、调试分析
1、在进行求最短距离的操作的过程中,输出结果超出int范围,无法得到结果。通过反复调试,发现最大值去INT_MAX时,由于可能会执行INT_MAX+dist语句,使得结果无法判断。将最大值该为INT_MAX/2,解决问题。