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#include #include //引入输入输出格式头文件 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退出系统。
注意:输入格式不正确将会自动退出系统。



