《创新设计》报告
( 2008- 2009 年度第 2 学期)
设计题目:
校园导航系统
学
专
姓
学
院:
业:
名:
号:
软 件 学 院
软 件 工 程
高小波
220700321
指导教师:
江兰帆
日期: 2009 年 6 月
设计报告:
[问题描述]
校园导航问题
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
[基本要求]
(1)设计福州大学新校区的校园平面图,所含景点不少于十个。以图中
顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表
示路径,存放路径长度等信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个顶点之
间的一条最短的简单路径。
一、需求分析
1.从福州大学新校区的校园平面图选取 13 个有代表性的景点,抽象成一个
无向带权图,以图中顶点表示景点,边上的权值表示两地之间的距离。
2.本程序的目的是为来访客人提供图中任意景点相关信息的查询,提供图中
任意景点的问路查询,即查询任意两个顶点之间的一条最短的简单路径,提供任
意两个景点之间的所有路径查询,提供通过多点的所有路径查询。
3.测试数据(附后)。
二、概要设计
1.平面图的数据类型定义
struct Graph{
数据对象:
数据关系:
}
bool Errorstr(Graph& G,string x)
初始条件:图 G 已存在,名称 x 被传入
操作结果:判断 x 这条信息是否在 G 中
bool Errornum(Graph& G,int x)
初始条件:图 G 已存在,代号 x 被传入
操作结果:判断 x 这条信息是否在 G 中
string Inttostr(Graph& G,int x)
初始条件:图 G 已存在代号 x 被传入
操作结果:返回把 x 相应的名称
void ReadData(Graph& G)
初始条件:图 G 已存在
操作结果:从文件 input.txt 读入数据
2.查询各个景点的信息
search(Graph& G)
初始条件:图 G 已存在
操作结果:查找用户输入的景点名称,并显示到屏幕上
3.查询任意两个景点之间的最短路径
Floyd (Graph& G)
初始条件:图 G 已存在
操作结果:查找到用户输入的两个景点的最短路径,并显示到屏幕上
PrintShortestPath ( int*
*c,
int*
*path, Graph& G,
string x,string y)
初始条件:图 G 已存在,并且用户输入了要查找的两个景点名称
操作结果:显示查找到的两个景点的最短路径到屏幕上
PrintPath1( int i, int j, int* *path ,Graph& G)
初始条件:图 G 已存在
操作结果:查找到用户输入的两个景点的最短路径
4.查找两个顶点间的所有路径
SearchAllPath(const Graph& G, Path& path, Mark& visited, int &v, int &des, int
length)
初 始 条 件 : 图 G 存 在 , 一 维 数 组 path 和 visited 都 已 存 在 , 其 中 visited
[0]~visited[MAX_N]都为 false ,用户输入起始点 v 与终点 des ,当前的路
径长度设为 1
操作结果:查找两点的所有路径,并把所有路径显示到屏幕
void Search ( Graph& G)
初始条件:图G存在
操作结果:把从屏幕读到的数据传给 SearchAllPath
5.查找通过多个顶点的最短路径
SearchAllPath1(const Graph& G, Path& path, Mark& visited, int &v, int &des, int
length,string *pp,int n)
初 始 条 件 : 图 G 存 在 , 一 维 数 组 path 和 visited 都 已 存 在 , 其 中 visited
[0]~visited[MAX_N]都为 false ,用户输入起始点 v 与终点 des ,当前的路
径长度设为 1,用户传人通过其他的顶点,及通过的所有顶点总数
操作结果:查找确定起点和终点,并且通过多点的最短路径
void Searchmore ( Graph& G)
初始条件:图G存在
操作结果:把从屏幕读到的数据传给 SearchAllPath1
Printpath3(Path& path, int length,const Graph& G,string *pp,int n)
初始条件:图G存在,一维数组 path 存在,用户输入起始点 v 与终点 des ,
用户传人通过其他的顶点,及通过的所有顶点总数
操作结果:把查找到的最短路径写入到文本文件中
6.界面函数
jiemian (Graph G)
初始条件:图G存在
操作结果:把各功能显示到屏幕,供用户使用
7.主函数
void main()
三、详细设计
1.图的类型及新定义的数据类型、检错函数
struct Graph
{
int num[MAX_N];
//地点的代号
string name[MAX_N];
//地点的名称
string intro[MAX_N];
//地点的简介
int AdjMatrix[MAX_N][MAX_N];
// 邻接矩阵,如果图中 i,j 相邻则
G[i][j] 是 i 到 j 的路径的长度值,否则 G[i][j]=0
};
const int MAX_N = 13;
typedef int Path[MAX_N];
// 最多的节点数目
// 用来存储路径
typedef bool Mark[MAX_N];
// 标记访问过的节点
int k2=0;
int igg2=0;
int *PATH=new int[MAX_N];
//全局变量
//全局变量
bool Errorstr(Graph& G,string x)
//检验传入的字符 x 是否正确
//如果 x 可以在图中找到,正确
//如果 x 不可以在图中找到。错误
bool Errornum(Graph& G,int x)
//检验传入的代号 x 是否正确
//如果代号可以找到正确
//否则错误
string Inttostr(Graph& G,int x)
//把整数的代号 x 转化为对应的名称
void ReadData(Graph& G)
//从文件"input.txt"读入数据
{
ifstream in(
"input.txt"
);
……
}
2.查询各顶点信息的伪代码算法
void search(Graph& G)
{
//用户选择查询信息的方式
int i;
cin>>i;
if(i==1)
//按代号查询
{……}
//如果代号和 G.num[j]相同,则找到,并输出,否则不存在这条信息
else if(i==2) //按名称查询
//如果代号和 G.name[j]相同,则找到,并输出,否则不存在这条信
{……}
息
else
{ cout<<"选择查询方式出错! "<
}
}
Floyd (Graph& G)
{
string x;//存放起点名称
string y;/存放终点名称/
//用户选择查询信息的方式
int h;
cin>>h;
if(h==1)
//按代号查询
{……}
//输入起点终点代号,把代号转成相应的名称,放入 x
,
y 中
else if(h==2) //按名称查询
{……}
//输入起点终点名称,放入 x
,
y 中
Else{}
//选择出错
*c, *
*path; // c[i][j] 存放的是从代号为 i 的点到代号为 j 的点的最短
int*
路径
// path[i][j]用来记录路径
PrintShortestPath ( c,
path , G,x,y);
}
4.查找两个顶点间的所有路径
SearchAllPath(const Graph& G, Path& path, Mark& visited, int &v, int &des, int
length)
{ //如果当前这个点访问过了,就结束执行这个函数
//否则,把当前的点存到 path 数组里面
if (v == des) {//如果起点等于目的终点,就输出 path 数组存放的代号对应
的地点名称
for (int i = 0; i