数据结构实验——项目2:校园导游咨询

这篇具有很好参考价值的文章主要介绍了数据结构实验——项目2:校园导游咨询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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:输出两行,第一行输出最短路径长度,第二行输出最短路径

流程图:

数据结构实验——项目2:校园导游咨询

3、详细设计和编码

数据结构实验——项目2:校园导游咨询

#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、测试结果及其分析

查询西苑食堂景点信息:

数据结构实验——项目2:校园导游咨询

 查西苑食堂和东门的最短路径:

数据结构实验——项目2:校园导游咨询

查询所有路径:

数据结构实验——项目2:校园导游咨询

查询所有路径长度:

数据结构实验——项目2:校园导游咨询

5、用户使用说明

用户在菜单通过输入1,2,3,4,5数字来进行菜单操作,输入1进入景点信息查询,会显示景点数字代号,只要接着输入代号即可并会返回菜单;输入2进入景点路径查询,会显示景点的字母代号,输入的俩个代号中间要空格,如a k;输入3查询所有路径;输入4查询所有路径的长度;输入5退出系统。

注意:输入格式不正确将会自动退出系统。文章来源地址https://www.toymoban.com/news/detail-500157.html

到了这里,关于数据结构实验——项目2:校园导游咨询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法、数据结构、计算机系统、数据库MYSQL、概率论、数学实验MATLAB、数学建模、马原、英语、杂项、QT项目

    可以三个条件 以此类推 (condition1)?x:(condition2)?y:z string变成int int 变成string 可以用循环 模运算展开式推导 我们要证明等式: (a * b) mod m = ((a mod m) * (b mod m)) mod m 假设 a = q1 * m + r1 ,其中 q1 是 a 除以 m 的商, r1 是 a 除以 m 的余数。类似地,假设 b = q2 * m + r2 ,其中

    2024年02月08日
    浏览(66)
  • 校园导航系统 数据结构

    系统概述 1.开发环境:windows 10,Clion2022 2.开发语言:C++ 设计内容: 设计学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所最短路径,以及从任意场所到达所有场所的最短路径。 图1-1 学校平面图设计

    2024年02月09日
    浏览(49)
  • 数据结构课设 校园导航系统

    1、设计目的 (1)为了进一步巩固课堂上所学到的知识,深刻把握为了进一步巩固课堂上所学到的知识,深刻掌握所学重要的数据结构类型的基本概念,逻辑结构和物理结构,以及主要应用算法。锻炼选择应用合适的数据结构解决不同实际问题的能力,使用所学的一种数据结

    2024年02月06日
    浏览(40)
  • 数据结构大作业 校园导航系统

    【问题描述】 以我校为例,设计一个校园导航系统,主要为来访的客人提供信息查询。系统有两类登陆账号,一类是游客,使用该系统方便校内路线查询;一类是管理员,可以使用该系统查询校内路线,可对校园景点路线可编辑。 【需求分析】 设计学校的平面图,至少包括

    2024年02月09日
    浏览(40)
  • 数据结构课设(C语言)——校园导航系统

    校园导航系统不是很难,因为最短路径已经有了Dijkstra算法,这就可以直接用。 我们需要的只是往这个算法里面加参数还有对界面的创作,这些都很简单。不过用算法还得需要了解算法,所以建议大家还是去理解一下这个算法的内涵。实际运行可能和我的运行结果有出入,应

    2024年02月02日
    浏览(41)
  • 数据结构实验——实验三--栈实验

    一、 实验任务 1.1 顺序栈实验任务 (1)利用顺序栈实现将10进制数转换为x进制数,2=x=36,除了阿拉伯数字字符,不够字符使用大写英文字符。要求键盘输入10进制数和转换的目标进制数。比如:37转换为20进制数为1H。 第一组数据:4 第二组数据:311 第三组数据:7254 第四组数据

    2023年04月09日
    浏览(35)
  • 数据结构实验———图实验

    一、实验内容 1.打印出图(网)的两种遍历序。 实验测试数据基本要求: 第一组数据: udg8.grp 第二组数据: udg115.grp 第三组数据: dg6.grp 第四组数据: f14.grp 2.求给定图中的边(或弧)的数目。    实验测试数据基本要求:第一组数据: udg8.grp 第二组数据: udg115.grp 第

    2024年02月08日
    浏览(47)
  • 基于C语言的数据结构课程设计(学生管理系统、停车场管理、家谱管理、校园导航系统)

    一、设计目的 本课程设计是软件工程学生的必修课程,数据结构与算法课程设计既是一门基础课程,又是一门实践性课程。 通过本实训课程的学习和训练,使同学学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据逻辑结构和存储结构,以及相应的运

    2024年02月09日
    浏览(62)
  • 【数据结构】实验六:图论

    采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度。 输入格式: 输入第一行中给出2个整数i(0i≤10),j(j≥0),分别为图G的顶点数和边数。 输入第二行为顶点的信息,每个顶点只能用一个字符表示。 依次输入j行,每行输入一条边依附的顶点。 输出格式: 依次输出各顶点的

    2024年02月05日
    浏览(49)
  • 折半查找实验 (数据结构)

    一、实验目的 掌握折半查找算法的基本思想 掌握折半查找算法的实现方法 掌握折半查找的时间性能 掌握折半查找类的定义和使用 二、实验要求 熟悉C++语言编程 了解折半查找的原理 了解折半查找类的定义、应用 三、实验内容 1、问题描述 在一个有序序列中,折半查找一个

    2024年02月08日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包