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退出系统。

注意:输入格式不正确将会自动退出系统。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐