1、问题分析和任务定义
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】
以江苏科技大学长山校区为例。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网.顶点和边均含有相关信息.
2、数据结构的选择和概要设计、
输入
第一行输入两个整数n(1≤n≤20) 和 m(0≤m≤n*(n-1)/2);n 代表学校有 n 个景点,m 代表有 m 条路。
接下来 n 行输入景点信息:每行输入三个字符串str1,str2,str3分别表示景点名称,代号和简介。
接下来m行:每行三个整数u(1≤u≤n),v(1≤v≤n),w(1≤w≤100);u表示起点,v表示终点,w表示两景点间的距离。
接下来一行输入一个整数op(1≤op≤10)表示操作次数。
接下来op行,每行有一条命令,命令有三种形式。
1.Query 1 str:景点查询,表示查询景点str的相关信息。
2.Query 2 str1 str2:路径查询,表示查询景点str1到达景点str2的最短路径及长度。
3.Modify x str1 str2 str3:表示修改某个的景点信息 ,str1表示景点名称,str2表示景点代号,str3表示景点简介。
输出
Query 1 str:输出一行,str的景点信息。
Query 2 str1 str2:输出两行,第一行输出最短路径长度,第二行输出最短路径
流程图:
3、详细设计和编码、
#include <iostream>
#include <string>
#include<iomanip>//引入输入输出格式头文件
using namespace std;
const int Maxsize = 50;
typedef struct
{
string code;
string name;
string intro;
}vertex;
class MGraph
{
public:
MGraph(int n, int e);
void Seek(int i);
void Floyd();
void Allpaths();
void Allpathlengths();
void Printshortpath();
private:
vertex a[Maxsize];
int arc[Maxsize][Maxsize];
int vertexNum, arcNum;
int dist[Maxsize][Maxsize];
string path[Maxsize][Maxsize];
};
MGraph::MGraph(int n, int e)
{
int i, j;
vertexNum = n;
arcNum = e;
a[0].code = "a";
a[0].name = "西苑食堂";
a[0].intro = "学校西面食堂,有3层楼";
a[1].code = "b";
a[1].name = "明德园";
a[1].intro = "小公园";
a[2].code = "c";
a[2].name = "文体中心";
a[2].intro = "内有篮球馆,乒乓球馆等,且经常做核酸地点";
a[3].code = "d";
a[3].name = "文理大楼";
a[3].intro = "全校最高的大楼";
a[4].code = "e";
a[4].name = "计算机学院楼";
a[4].intro = "5层楼,是计算机实验经常去的地方";
a[5].code = "f";
a[5].name = "笃学楼";
a[5].intro = "普通教学楼";
a[6].code = "g";
a[6].name = "图书馆";
a[6].intro = "内有大量图书,适合自习";
a[7].code = "h";
a[7].name = "东苑食堂";
a[7].intro = "学校东边的食堂";
a[8].code = "i";
a[8].name = "南门";
a[8].intro = "南边的门";
a[9].code = "j";
a[9].name = "北门";
a[9].intro = "北边的门";
a[10].code = "k";
a[10].name = "东门";
a[10].intro = "东边的门";
for (i = 0; i < vertexNum; i++) //初始化边,请将不到达边初始值为最大值,这里使用10000
for (j = 0; j < vertexNum; j++)
arc[i][j] = 10000;
arc[0][1] = 100;
arc[1][2] = 150;
arc[1][3] = 120;
arc[1][5] = 270;
arc[2][5] = 190;
arc[3][4] = 40;
arc[4][9] = 210;
arc[4][6] = 310;
arc[5][6] = 110;
arc[5][8] = 310;
arc[6][10] = 170;
arc[6][7] = 80;
}
void MGraph::Seek(int i)
{
cout << "景点代号:" << a[i].code << endl;
cout << "景点名称:" << a[i].name << endl;
cout << "景点简介:" << a[i].intro << endl;
cout << "***************************************" << endl;
}
void MGraph::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] = a[i].code + a[j].code;
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 MGraph::Allpaths()
{
cout << "****************************************" << endl;
cout << "***景点代号: ***" << endl;
cout << "***a西苑食堂 b明德园 c文体中心***" << endl;
cout << "***d文理大楼 e计算机学院楼 f笃学 ***" << endl;
cout << "***g图书馆 h东苑食堂 i南门 ***" << endl;
cout << "***j北门 k东门 ***" << endl;
cout << "****************************************" << endl;
cout << "图的所有路径如下:" << endl;
for (int i = 0; i < vertexNum; i++) //输出图的所有路径信息
{
for (int j = 0; j < vertexNum; j++)
cout << setw(12) << setiosflags(ios::left) << path[i][j] << " "; //10个字符位置,且左对齐
cout << endl;
}
}
void MGraph::Allpathlengths()
{
cout << "图的所有路径长如下:" << endl;
for (int i = 0; i < vertexNum; i++) //输出图的各边长信息
{
for (int j = 0; j < vertexNum; j++)
if (dist[i][j] == 10000)
cout << " ";
else
cout << setw(5) << setiosflags(ios::left) << dist[i][j] << " ";//3个字符位置,且左对齐
cout << endl;
}
}
void MGraph::Printshortpath() //结点m到n的最短路径
{
cout << "****************************************" << endl;
cout << "***景点代号: ***" << endl;
cout << "***a西苑食堂 b明德园 c文体中心***" << endl;
cout << "***d文理大楼 e计算机学院楼 f笃学 ***" << endl;
cout << "***g图书馆 h东苑食堂 i南门 ***" << endl;
cout << "***j北门 k东门 ***" << endl;
cout << "****************************************" << endl;
cout << "您想了解哪两个点的最短路径?" << endl;
cout << "代号如上图,请分别输入这两个点的代号并以空格分开" << endl;
int n, m, i;
string ch1, ch2;
cin >> ch1 >> ch2; //输入要判定是的顶点,请输入顶点字符。
for (i = 0; i < vertexNum; i++)
if (ch1 == a[i].code) n = i;
for (i = 0; i < vertexNum; i++)
if (a[i].code == ch2) m = i;
cout << ch1 << "到" << ch2 << "的最短路径为:" << path[n][m] << endl;
cout << ch1 << "到" << ch2 << "的最短路径长为:" << dist[n][m] << endl;
system("pause");
}
void meau()
{
cout << "***************************************" << endl;
cout << "***欢迎使用校园导游咨询系统 ***" << endl;
cout << "***输入1执行景点信息查询 ***" << endl;
cout << "***输入2执行最短路径查询 ***" << endl;
cout << "***输入3执行输出所有路径 ***" << endl;
cout << "***输入4执行输出所有路径长度 ***" << endl;
cout << "***输入0执行退出系统 ***" << endl;
cout << "***************************************" << endl;
}
int main()
{
MGraph m(11, 17);
meau();
int choice;
while (true)
{
cout << "请输入您要执行功能的编号:";
cin >> choice;
switch (choice)
{
case 1:
cout << "****************************************" << endl;
cout << "***景点代号: ***" << endl;
cout << "***1西苑食堂 2明德园 3文体中心***" << endl;
cout << "***4文理大楼 5计算机学院楼 6笃学 ***" << endl;
cout << "***7图书馆 8东苑食堂 9南门 ***" << endl;
cout << "***10北门 11东门 ***" << endl;
cout << "****************************************" << endl;
cout << "编号如上图,请输入您要查询景点的编号:";
int code;
cin >> code;
m.Seek(code);
break;
case 2:m.Floyd();
m.Printshortpath();
break;
case 3:m.Floyd();
m.Allpaths();
break;
case 4:m.Floyd();
m.Allpathlengths();
break;
case 0:return 0;
default:
cout << "输入非法,已退出程序";
return 0;
break;
}
}
return 0;
}
4、测试结果及其分析
查询西苑食堂景点信息:
查西苑食堂和东门的最短路径:
查询所有路径:
查询所有路径长度:
5、用户使用说明
用户在菜单通过输入1,2,3,4,5数字来进行菜单操作,输入1进入景点信息查询,会显示景点数字代号,只要接着输入代号即可并会返回菜单;输入2进入景点路径查询,会显示景点的字母代号,输入的俩个代号中间要空格,如a k;输入3查询所有路径;输入4查询所有路径的长度;输入5退出系统。文章来源:https://www.toymoban.com/news/detail-500157.html
注意:输入格式不正确将会自动退出系统。文章来源地址https://www.toymoban.com/news/detail-500157.html
到了这里,关于数据结构实验——项目2:校园导游咨询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!