校园导航 c++

校园导航

校园导航问题@

【问题描述】

以我校为例,设计一个校园导航系统,主要为来访的客人提供信息查询。系统有两类登陆账号,一类是游客,使用该系统方便校内路线查询;一类是管理员,可以使用该系统查询校内路线,可对校园景点路线可编辑。

【需求分析】

设计学校的平面图,至少包括10个以上景点(场所),每两个景点间可以有不同道路,且路长也可能不同,找出在游人所在景点到其他景点的最短路径,或游人输入的任意两个景点的最短路径。 要求: (1) 以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,路径权重为路径长度。 (2) 为游人提供任意景点相关信息查询。 (3)为游人提供任意景点的问路查询,即任意两个景点之间的最短路径。

在这里插入图片描述

实现提示: 一般情况下,校园道路是双向通行的,可设计校园平面图是一个无向图。顶点和边均含有相关信息。 选做内容: (1)提供图的编辑功能:增删景点;增删道路;修改已有信息等。 (2)校园导游图的仿真界面。

我的代码:

#include<bits/stdc++.h>
#include <iostream>
#include <string>
#include <stack>
#include <windows.h>
#include<iomanip>
#define MAXNUM 100 //最大景点数量
#define INF 1e6 //路径最大长度,表示此路不通

//管理员账号  hbu
//管理员密码 123456



using namespace std;


void delay();//延迟
void init ();//初始化
void campus_maps();//地图全貌
int find_node(string name);//找位置
void Dijkstra (int start,int end);//Dijkstra 求最短路径,并打印出来
void Visiter();//游客系统
void Administrator();//管理员系统
void add_Info();//增加景点
void delete_Info();//删除景点
void add_path();//增加道路
void delete_path();//删除道路

int path[MAXNUM][MAXNUM]; //保存下一个结点
int short_path[MAXNUM][MAXNUM]; //最短路径的长度

struct building
{
    string name; //建筑名称
    int code;//代号
    string information;//建筑信息
};

int building_number = 31;
struct building ve[MAXNUM];



//---------------邻接矩阵存储顶点和边

int weight[MAXNUM][MAXNUM] = {{0}}; //权重就是长度

//-----------延迟----

void delay()
{
    for(long long i = 0; i < 1e9; i++);
}


void init ()
{
    //-------------数组存储相关信息

    ve[0] = {"校医院", 0, " "};
    ve[1] = {"生科院", 1, " "};
    ve[2] = {"逸夫楼", 2, " "};
    ve[3] = {"理化中心", 3, " "};
    ve[4] = {"建工学院", 4, " "};
    ve[5] = {"宿舍梅园3、4、5号", 5, " "};
    ve[6] = {"宿舍梅园6号", 6, " "};
    ve[7] = {"宿舍梅园2号", 7, " "};
    ve[8] = {"宿舍梅园1号", 8, " "};
    ve[9] = {"操场", 9, " "};
    ve[10] = {"篮球场 网球场", 10, " "};
    ve[11] = {"北院餐厅", 11, " "};
    ve[12] = {"化学学院", 12, " "};
    ve[13] = {"电信学院", 13, " "};
    ve[14] = {"物理学院", 14, " "};
    ve[15] = {"竞学楼", 15, " "};
    ve[16] = {"南1门", 16, " "};
    ve[17] = {"南2门", 17, " "};
    ve[18] = {"北1门", 18, " "};
    ve[19] = {"北2门", 19, " "};
    ve[20] = {"文苑楼", 20, " "};
    ve[21] = {"图书馆", 21, " 河北大学图书馆现位于保定市河北大学新校区内,原河北大学图书馆——北疆博物馆始建于1921年,是法国天主教会在天津创办的工商大学附设的图书馆。建筑面积32846平方米,馆藏图书390万余册,是国务院批准文化部确定的全国古籍重点保护单位之一。在经济全球化、社会知识化、信息数字化的时代,信息资源无穷的穿透力,已经成为现代大学教学科研的核心支撑力。对于一所高等院校来说,没有高效完备的现代化图书馆和图书情报信息服务,就不可能建成名副其实、和谐发展的现代化大学,随着河北大学的快速发展,河北大学图书馆正朝着研究型、高层位的现代化图书馆目标迈进。"};
    ve[22] = {"南苑餐厅", 22, " "};
    ve[23] = {"第七教学楼", 23, " "};
    ve[24] = {"多功能厅", 24, " "};
    ve[25] = {"主楼", 25, " "};
    ve[26] = {"第九教学楼", 26, " "};
    ve[27] = {"第八教学楼", 27, " "};
    ve[28] = {"综合教学楼", 28, " "};
    ve[29] = {"国际交流学院", 29, " "};
    ve[30] = {"敏秀园", 30, " "};

//----权重表示长度 邻接矩阵存储
    weight[0][1]=weight[1][0] = 82;
    weight[1][2]=weight[2][1] = 92;
    weight[1][4]=weight[4][1] = 111;
    weight[2][17]=weight[2][17] = 93;

    weight[2][3]=weight[3][2] = 105;
    weight[2][12]=weight[12][2] = 178;
    weight[3][4] =weight[4][3]= 80;
    weight[4][11]=weight[11][4] = 84;
    weight[4][12]=weight[12][4] = 91;
    weight[5][11]=weight[11][5] = 44;
    weight[5][6] =weight[6][5]= 92;
    weight[5][10]=weight[10][5] = 49;
    weight[11][12]=weight[12][11] = 114;
    weight[11][10]=weight[10][11] = 25;
    weight[11][13]=weight[13][11] = 102;
    weight[10][6] =weight[6][10]= 20;
    weight[10][13]=weight[13][10] = 15;
    weight[10][9] =weight[9][10]= 5;
    weight[6][7] =weight[7][6]= 20;
    weight[7][9] =weight[9][7]= 10;
    weight[7][8] =weight[8][7]= 134;
    weight[9][8]=weight[8][9] = 10;
    weight[9][13]=weight[13][9] = 70;
    weight[12][13]=weight[13][12] = 108;
    weight[12][14]=weight[14][12] = 57;
    weight[13][15]=weight[15][13] = 115;
    weight[14][15]=weight[15][14] = 53;
    weight[14][17]=weight[17][14] = 179;
    weight[14][16]=weight[16][14] = 59;
    weight[15][16]=weight[16][15] = 56;
    weight[16][17]=weight[17][16] = 202;
    weight[16][19]=weight[19][16] = 39;
    weight[17][18]=weight[18][17] = 37;
    weight[18][19]=weight[19][18] = 210;
    weight[18][20]=weight[20][18] = 60;
    weight[18][21]=weight[21][18] = 134;
    weight[19][21]=weight[21][19] = 77;
    weight[19][24]=weight[24][19] = 96;
    weight[19][25]=weight[25][19] = 114;
    weight[20][22]=weight[22][20] = 93;
    weight[20][27]=weight[27][20] = 44;
    weight[22][23]=weight[23][22] = 150;
    weight[22][27]=weight[27][22] = 75;
    weight[22][28]=weight[28][22] = 110;
    weight[23][28]=weight[28][23] = 144;
    weight[28][27]=weight[27][28] = 42;
    weight[27][26]=weight[26][27] = 87;
    weight[28][26]=weight[26][28] = 73;
    weight[28][29]=weight[29][28] = 169;
    weight[26][21]=weight[21][26] = 78;
    weight[26][29]=weight[29][26] = 167;
    weight[26][30]=weight[30][26] = 20;
    weight[26][25]=weight[25][26] = 190;
    weight[30][29]=weight[29][30] = 139;
    weight[30][25]=weight[25][30] = 20;
    weight[25][24]=weight[24][25] = 91;

}

//--------------打印地图

void campus_maps()
{
    int count=0;
    printf(" ==========================================================================\n");
    cout << "||                   *** 河北大学所有景点***                              ||"<< endl;
    cout << "||                                                                        ||"<< endl;
    cout <<"||";
    for(int i=0; i<building_number; i++)
    {
        printf("%2d、",ve[i].code);
        cout <<setiosflags(ios::left)<<setw(20)<< ve[i].name;
        count++;
        if(count==3)
        {
            cout <<"||"<< endl;
            count=0;
            cout <<"||";
        }
    }
    cout << endl;
    printf(" ==========================================================================\n");

}

//---------查询模式--打印相关点的信息

int find_node(string name)
{
    for(int i = 0; i < building_number; i++)
    {
        if(ve[i].name == name)
        {
            return i; //找到了,返回相对应的位置
            break;
        }
    }
    return -1;//没有找到返回-1

}

//问路模式------Dijkstra 求最短路径,并打印出来

void Dijkstra (int start, int end)
{
    int dis[building_number];
    int path[building_number];
    for(int i = 0; i < building_number; i++) //初始化dis path
    {
        if(start != i && weight[start][i] == 0)
            dis[i] = INF;
        else if(weight[start][i] != 0)
            dis[i] = weight[start][i];
        else if(start == i)
            dis[i] = 0;
        path[i] = -1;
    }
    bool visited[building_number] = {false};
    // int s=start;
    visited[start] = true;
    while(1)
    {
        int j;
        bool flag = false;
        for(j = 0; j < building_number; j++)
        {
            if(visited[j] == false)
            {
                flag = true;
                break;
            }
        }
        int min = j;
        if(flag == false)
            break;
        for(int i = 0; i < building_number; i++)
        {
            if(visited[i] == false)
                if(dis[min] > dis[i])
                    min = i;

        }


        visited[min] = true; //收录的条件就是dis里面最小的
        for(int i = 0; i < building_number; i++)
        {
            if(weight[min][i] != 0 && visited[i] == false) //i是min的邻接点
                if(dis[i] > dis[min] + weight[min][i])
                {
                    dis[i] = dis[min] + weight[min][i];
                    //暂时的,还不能收入,不确定是不是dist最小的,或者不确定后面有没有更小的
                    path[i] = min; //暂时的
                }

        }
    }
    if(dis[end]==INF)
        cout << "从" << ve[start].name << "->" << ve[end].name<<"不通"<< endl;
    else
    {
        cout << "从" << ve[start].name << "->" << ve[end].name << "的最短路径为:  " << dis[end] << "km\n"<< "路径为:";
        int n = end;
        stack<int> st;
        st.push(end);
        while(path[n] != -1)
        {
            st.push(path[n]);
            n = path[n];
        }
        st.push(start);
        cout << ve[st.top()].name;
        st.pop();
        while (!st.empty())
        {
            cout << "->" << ve[st.top()].name;
            st.pop();
        }
        cout << endl;
    }
}


//-------游客系统
void Visiter()
{
    campus_maps();
    int a = 1;
    char ch;
    while(a == 1)
    {
        printf(" ================================================================ \n");
        printf("||               卍 欢迎来到河北大学校园导航系统卍              ||\n");
        printf("||                                                              ||\n");
        printf("||                    ***游客系统***                            ||\n");
        printf("||                                                              ||\n");
        printf("||                  <1>查询任意景点                             ||\n");
        printf("||                  <2>问路查询                                 ||\n");
        printf("||                  <3>退出系统                                 ||\n");
        printf("||                                                              ||\n");
        printf(" ================================================================ \n");
        printf("请输入您的指令:  ");
        cin >> ch;
        if(ch != '1' && ch != '2' && ch != '3')
        {
            cout << "输入错误,请重新输入" << endl;
            cin >> ch;
        }
        //------查询模式
        while(ch == '1')
        {
            string find_name;
            cout << "你想要查:";
            cin >> find_name;
            int i = find_node(find_name);
            while(i == -1)
            {
                cout << "无此信息,请重新输入" ;
                cin >> find_name;
                i = find_node(find_name);
            }
            cout << "所查信息为:" << ve[i].name << endl;
            cout << "简介:" << ve[i].information << endl;
            delay();
            break;
        }
        //----问路模式
        while(ch == '2')
        {
            string start_name;
            cout << "输入起点:";
            cin >> start_name;
            int i = find_node(start_name);
            while(i == -1)
            {
                cout << "无此信息,请重新输入" << endl;
                cin >> start_name;
                i = find_node(start_name);
            }
            string end_name;
            cout << "输入终点:";
            cin >> end_name;
            int j = find_node(end_name);
            while(j == -1)
            {
                cout << "无此信息,请重新输入" << endl;
                cin >> end_name;
                j = find_node(end_name);
            }
            Dijkstra(i, j);
            delay();
            break;
        }
        while(ch == '3')
        {
            cout << "谢谢,再见!" << endl;
            a=0;
            break;
            exit(0);
        }


    }
}

//--------管理员系统

void Administrator()
{
    int a = 1;
    char ch;
    campus_maps();
    while(a == 1)
    {
        printf(" ================================================================ \n");
        printf("||               卍 欢迎来到河北大学校园导航系统 卍             ||\n");
        printf("||                                                              ||\n");
        printf("||                    ***管理员系统***                          ||\n");
        printf("||                                                              ||\n");
        printf("||                  <1>查询任意景点                             ||\n");
        printf("||                  <2>问路查询                                 ||\n");
        printf("||                  <3>增加景点                                 ||\n");
        printf("||                  <4>删除景点                                 ||\n");
        printf("||                  <5>增加道路                                 ||\n");
        printf("||                  <6>删除道路                                 ||\n");
        printf("||                  <7>退出系统                                 ||\n");
        printf("||                                                              ||\n");
        printf(" ================================================================ \n");
        printf("请输入您的指令:  ");
        cin >> ch;
        if(ch != '1' && ch != '2' && ch != '3'&&ch!='4'&&ch!='5'&&ch!='6'&&ch!='7')
        {
            cout << "输入错误,请重新输入" << endl;
            cin >> ch;
        }
        //------查询模式
        while(ch == '1')
        {
            string find_name;
            cout << "你想要查:";
            cin >> find_name;
            int i = find_node(find_name);
            while(i == -1)
            {
                cout << "无此信息,请重新输入" ;
                cin >> find_name;
                i = find_node(find_name);
            }
            cout << "所查信息为:" << ve[i].name << endl;
            cout << "简介:" << ve[i].information << endl;
            delay();
            break;
        }
        //----问路模式
        while(ch == '2')
        {
            string start_name;
            cout << "输入起点:";
            cin >> start_name;
            int i = find_node(start_name);
            string end_name;
            cout << "输入终点:";
            cin >> end_name;
            int j = find_node(end_name);
            while(i == -1||j==-1)
            {
                cout << "无此信息,请重新输入" << endl;
                cout << "输入起点:";
                cin >> start_name;
                i=find_node(start_name);
                cout << "输入终点:";
                cin >> end_name;
                j=find_node(end_name);
            }
            Dijkstra(i, j);
            delay();
            break;
        }
        while(ch == '3')
        {
            add_Info();
            break;
        }
        while(ch == '4')
        {
            delete_Info();
            break;
        }
        while(ch == '5')
        {
            add_path();
            break;
        }
        while(ch == '6')
        {
            delete_path();
            break;
        }
        while(ch == '7')
        {
            cout << "谢谢,再见!" << endl;
            a=0;
            exit(0);
            break;
        }

    }


}




/*

//-----------问路模式---实现指定点到所有点的最短路径

void short_path_floyd(int weight[][MAXNUM], int path[][MAXNUM], int short_path[][MAXNUM])
{
    for (int i = 0; i < building_number; i++)//初始化  path_matrix  和  short_path_table
    {
        for (int j = 0; j < building_number; j++)
        {
            short_path[i][j] = weight[i][j];
            path[i][j] = j;
        }
    }
    for (int i = 0; i < building_number; i++)
    {
        for (int j = 0; j < building_number; j++)
        {
            for (int k = 0; k< building_number; k++)
            {
                if (short_path[j][k] > short_path[j][i] + short_path[i][k])
                {
                    short_path[j][k] = short_path[j][i] + short_path[i][k];
                    path[j][k] = path[j][i];
                }
            }
        }
    }
}

*/




//-------增加景点

void add_Info()
{
    struct building info;
    string add_name;
    cout << "请输入增加的景点名称:" ;
    cin >> add_name;
    int i=find_node(add_name);
    while(i!=-1)
    {
        cout << "该景点已存在,请重新输入"<< endl;
        cout << "请输入增加景点名称:";
        cin >> add_name;
        i=find_node(add_name);
    }
    string brief;
    cout << "请输入景点信息简介:";
    cin >> brief;
    info.code = building_number ;
    info.name = add_name;
    info.information = brief;
    ve[building_number]=info;
    building_number++;
    cout << "景点添加成功!" << endl;
    campus_maps();

}

void delete_Info()
{
    string info_name;
    cout << "请输入您要删除的景点:";
    cin >> info_name;
    int i = find_node(info_name);
    while(i == -1)
    {
        cout << "无此信息,请重新输入"  << endl;
        cin >> info_name;
        i = find_node(info_name);
    }
    cout << "您要删除的景点名称:" << ve[i].name << endl;
    cout << "是否确认删除?确认输入1" << endl;
    char ch;
    cin >> ch;
    if(ch == '1')
    {
        cout << "正在删除景点...." << endl;
        for(int k=i; k<building_number-1; k++)
        {
            ve[k].name=ve[k+1].name;
            ve[k].information=ve[k+1].information;
        }
        int m,n;
        for(int m=i; m<building_number-1; m++)
        {
            for(int n=0; n<building_number; n++)
            {
                weight[m][n]=weight[m+1][n];
            }
        }
        building_number--;
        cout << "景点删除成功" << endl;
        campus_maps();
    }
}


void add_path()
{
    cout << "请输入要增加道路的两个景点:" << endl;
    string name1, name2;
    cin >> name1 >> name2;
    int i = find_node(name1);
    int j = find_node(name2);
    while(i == -1 || j == -1)
    {
        cout << "两个景点名称有错误,请重新输入" ;
        cin >> name1 >> name2;
    }
    int distance;
    cout << "请输入" << name1 << "与" << name2 << "之间道路的长度:";
    cin >> distance;
    cout << "正在添加道路......" << endl;
    weight[i][j] = distance;
    weight[j][i] = distance;
    cout << "道路添加成功" << endl;
}

void delete_path()
{
    cout << "请输入要删除道路的两个景点:" << endl;
    string name1, name2;
    cin >> name1 >> name2;
    int i = find_node(name1);
    int j = find_node(name2);
    while(i == -1 || j == -1)
    {
        cout << "两个景点名称有错误,请重新输入" ;
        cin >> name1 >> name2;
    }
    cout << "您要删除的是" << name1  << "与" << name2 << "之间的道路,是否确认删除这条道路?" << endl;
    cout << "确认请输入1" << endl;
    char ch;
    cin >> ch;
    if(ch == '1')
    {
        cout << "正在删除道路" << endl;
        weight[i][j] = 0;
        weight[j][i] = 0;
        delay();
        cout << "道路删除成功" << endl;
    }
}



int main()
{
    init(); //初始化,存储相关数据
    char mode;
    int a = 1;
    while(a == 1)
    {
        printf(" ================================================================ \n");
        printf("||               卍 欢迎来到河北大学校园导航系统卍              ||\n");
        printf("||                                                              ||\n");
        printf("||                                                              ||\n");
        printf("||                  <1>游客登录                                 ||\n");
        printf("||                  <2>管理员登录                               ||\n");
        printf("||                  <3>退出系统                                 ||\n");
        printf("||                                                              ||\n");
        printf(" ================================================================ \n");
        printf("请输入您的指令:  ");
        cin >> mode;
        while(mode != '1' && mode != '2' && mode != '3')
        {
            cout << "输入有误,请重新输入!" << endl;
            cin >> mode;
        }
        //--------游客登录界面
        while(mode == '1')
        {
            system("cls");
            Visiter();
            exit(0);
        }
        while(mode == '2')
        {
            cout << "请输入账号:";
            string account;
            string  password;
            cin >> account;
            cout << "请输入密码:";
            cin >> password;
            while(account != "hbu" && password != "123456")
            {
                cout << "账号或密码错误!请重新输入" << endl;
                cout << "请输入账号:";
                cin >> account;
                cout << "请输入密码:";
                cin >> password;
            }
            cout << "\t\t\t登录成功......" << endl;
            delay();
            Administrator();
            exit(0);
            a=0;
        }
        while(mode == '3')
        {
            cout << "谢谢,再见!" << endl;
            a = 0;
            exit(0);
        }
    }
}

【摘要】西南科技大学抓住西部大开发和绵阳科技城建设的历史机遇,践行“厚德、博学、笃行、创新”校训,建设出一座美丽的校园。为此通过对《数据结构》这一课程的应用,用图的模型对学校景点抽象。用邻接矩阵存储方法和狄克斯特拉算法及图的遍历实现对校园导游系统的模拟。此系统七个功能:浏览学校景点、查看单个景点信息、查看校园地图、导游推荐、查两景点最短路线、查两景点所有景点、退出系统。 目 录 一、问题描述及设计思路..............................................3 二、详细设计过程....................................................3 2.1设计校园平面图...............................................3 2.1.1景点分析.......................................................4 2.1.2平面图.........................................................4 2.2实现景点信息查询.............................................4 2.2.1景点存储.......................................................5 2.2.2景点信息查询功能实现...........................................5 2.3图实现路径查询...............................................5 2.3.1图的建立.......................................................5 2.3.2最短路径实现...................................................6 2.3.3两点间所有路径.................................................8 2.3.4路径查找设计结果...............................................8 、结论体会.......................................................11 四、附录...........................................................12 4.1.1Mai.cpp.......................................................124.1.3Sight.h.......................................................13 4.1.2G.h...........................................................15 五、参考文献.......................................................20
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值