数据结构 -- 校园导游咨询系统源码

本文介绍了如何运用C++实现校园导游咨询系统,通过数据结构如顶点、邻接矩阵管理景点信息和路径,包括增加、删除、修改和查询功能。管理员和用户权限区分,超级用户可全权操作,普通用户只能浏览。重点展示了弗洛伊德算法用于计算最短路径和用户咨询功能的实现。
摘要由CSDN通过智能技术生成

数据结构-- 校园导游咨询系统课程设计报告书


课题要求

一、 基本功能:

  1. 设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
  2. 为来访客人提供图中任意景点相关信息的查询。
  3. 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
  4. 增加、删除、更新有关景点和道路的信息。

二、 扩展功能:

  1. 定义用户类型:用户(用户编号,用户名,密码,类型),其中,类型值为0表示超级用户,为1表示普通用户,超级用户具备所有权限,普通用户只具备浏览(查询)权限。采用顺序表作为存储结构。
  2. 实现创建用户功能。不少于3个超级用户和是10个普通用户。
  3. 实现设置密码功能。用户可以修改自己的密码。
  4. 实现登录系统功能。当用户名和密码输入都正确后才能使用该系统。
  5. 用户数据以文本文件格式存储。

任务要求

  1. 根据需求分析给出概要设计和详细设计,并编程实现相关功能模块,本系统包括以下功能模块:实现增加功能、实现删除功能、实现修改功能、实现查询功能等。
  2. 结合课题利用数据结构相关知识,利用C++语言实现该系统的所有上述功能,要求界面友善,程序运行正常。
  3. 提交课程设计报告1份(具体写作要求参考样例),可运行的系统和源代码电子版一套。

测试样例

景点信息.txt

景点名称代号简介
下沉广场01下沉广场是升国旗的场所,也会举办一些文艺晚会和校园招聘会,更是轮滑爱好者的乐园!
图书馆02图书馆环境安适,藏书丰富,配备现代化管理设施,是阅读书籍期末复习备战考研的绝佳场所!
莲 湖04莲湖湖水清澈见底,这里能看到许多活泼的小鱼,还有几只抱团的鸭鸭!
钟楼广场05食堂包括第一、第二、第三食堂,里面的美食种类丰富,可以让你大饱口福!
餐 厅06钟楼广场是平时社团举办活动的场所,经常会举办一些大型活动!
学生宿舍07学生宿舍为标准四/六人间,宿舍配备空调暖气,冬暖夏凉,空间充裕,居住舒适!
操 场08操场包括网球场,篮球场,足球场等,你可以在田径场挥洒汗水,晚上可能会举办音乐会哦!
体育训练中心09体育馆设施齐全,包括乒乓球场,羽毛球场,攀岩场地等,快来和大家一起运动吧!
实验实训中心10实验实训中心提供场地和设施让学生进行物理、生物实验和金工、电子工艺实习!

源码

#include <iostream>
#include <cstring>
#include <iomanip>
#include <conio.h>
using namespace std;

#define Max 11    //矩阵阶数
#define MX 999999 //定义无穷大

int D[Max][Max]; //表示顶点到顶点的最短路径权值和的矩阵
int path[Max][Max]; //表示对于顶点的最小路径前驱矩阵

struct Users //账号密码
{
    char account[30];
    char password[30];
} use[50];
typedef struct Ver //顶点信息
{
    char num[4];        //顶点代号
    char name[41];      //顶点名称
    char instruct[401]; //顶点说明
} Ver;
typedef struct //邻接矩阵
{
    Ver vex[Max];       //顶点表
    int arcs[Max][Max]; //邻接矩阵
    int vexnum, arcnum; //图的当前顶点数和边数
} AMGragh;

int Login_System();                           //河南工业大学校园导游咨询系统登录系统
int Administrator_Login();                    //管理员登录界面
int Registered_Account();                     //管理员注册账号
int Login();                                  //管理员账号密码登录
void CreateUDG(AMGragh &G);                   //根据基本信息建图
int Administrators();                         //管理员功能(开放所有功能)
int User();                                   //用户功能(开放部分功能)
void Administrators_Menu();                   //管理员菜单界面
void User_Menu();                             //游客菜单界面
void Introduce();                             //河南工业大学简介
void Map();                                   //河南工业大学平面简图
void Query(AMGragh G);                        //查询景点基本信息
void All_Print(AMGragh G);                    //输出所有景点信息
void Modify_vertex(AMGragh &G);               //景点基本信息管理
void Modify_Edge(AMGragh &G);                 //路径基本信息管理
void Floyd(AMGragh G);                        //弗洛伊德算法获得两点最短路径
void Ask(AMGragh G);                          //用户咨询最短路径
void Path_Out(AMGragh G, int start, int end); //获得具体路径

int main(void) //主函数
{
    system("color F0"); //背景为黑,字体为亮白色
    Login_System();
    return 0;
}

int Login_System() //河南工业大学校园导游咨询系统登录系统
{
    int select;
    cout << "**********欢迎使用河南工业大学校园导游咨询系统**********" << endl;
    cout << "*                                                      *" << endl;
    cout << "*                   请选择登录方式                     *" << endl;
    cout << "*                                                      *" << endl;
    cout << "*     ★1.管理员登录   ★2.游客临时登录   ★3.退出     *" << endl;
    cout << "*                                                      *" << endl;
    cout << "********************************************************" << endl;
    cout << "请输入要选择的编号:" << endl;
    cin >> select;
    switch (select)
    {
    case 1:
        Administrator_Login();
        break;
    case 2:
        system("pause");
        system("cls");
        User();
        break;
    case 3:
        cout << "成功退出,欢迎下次使用..." << endl;
        system("pause");
        return 0;
        break;
    default:
        cout << "输入错误!没有该选项对应的操作!" << endl;
        break;
    }
    return 0;
}

int Administrator_Login() //管理员登录界面
{
    int select;
    while (select != 3)
    {
        system("cls");
        cout << "*********************管理员登录界面*********************" << endl;
        cout << "*                                                      *" << endl;
        cout << "*               ★1.账号密码直接登录                   *" << endl;
        cout << "*                                                      *" << endl;
        cout << "*               ★2.增添管理账号密码                   *" << endl;
        cout << "*                                                      *" << endl;
        cout << "*               ★3.退出                               *" << endl;
        cout << "*                                                      *" << endl;
        cout << "********************************************************" << endl;
        cout << "请输入要选择的编号:" << endl;
        cin >> select;
        switch (select)
        {
        case 1:
            Login();
            break;
        case 2:
            Registered_Account();
            break;
        case 3:
            cout << "成功退出,欢迎下次使用..." << endl;
            system("pause");
            return 0;
            break;
        default:
            cout << "输入错误!没有该选项对应的操作!" << endl;
            system("pause");
            break;
        }
    }
    return 0;
}

int Registered_Account() // 注册账号功能
{
    char account[30];
    char password[6], pd[6];
    int i, a = 0, flag = 0;

    cout << "注册帐号..." << endl;
    cout << "请输入用户账号和密码(账号、密码可以为数字,中文字母,英文字母,符号,密码必须6位)" << endl;
    cout << "请输入账号:" << endl;
    cin >> account;

    FILE *fp = fopen("Date.txt", "a+");
    while (!feof(fp))
    {
        fscanf(fp, "%s %sn", &use[a].account, &use[a].password);
        if ((strcmp(account, use[a].account) == 0))
        {
            cout << "注册失败,该账号已存在,请重新输入!" << endl;
            system("pause");
            flag = 1;
            fclose(fp);
            break;
        }
        a++;
    }

    if (flag == 1)
        return 0;

    strcpy(use[a].account, account);
    cout << "请你输入密码:" << endl;
    for (i = 0; i < 6; i++)
    {
        password[i] = _getch();
        cout << "*";
        use[a].password[i] = password[i];
        if (password[i] == '\r')
        {
            cout << "注册失败,请重新注册账号" << endl;
            return 0;
        }
    }
    cout << endl;
    cout << "再次确认密码:" << endl;
    for (i = 0; i < 6; i++)
    {
        pd[i] = _getch();
        cout << "*";
        if (use[a].password[i] != pd[i])
        {
            cout << "密码不对,请重新注册账号" << endl;
            return 0;
        }
    }
    fprintf(fp, "账号\t密码\n");
    fprintf(fp, "%s\t%s\n", use[a].account, use[a].password);
    printf("\n注册成功!!!\n");
    fclose(fp);
    system("pause");
    system("cls");
}

int Login() //登录账号功能
{
    char account[30];
    char ad[20], password;
    int i, j, a = 0;
    int flag = 0;

    cout << "**********************登录账号**********************" << endl;
    for (i = 0; i < 3; i++)
    {
        cout << "请输入帐号:" << endl;
        cin >> account;
        cout << "请输入密码:" << endl;
        for (j = 0; j < 6; j++)
        {
            password = _getch();
            cout << "*";
            ad[j] = password;
        }
        FILE *fp;
        fp = fopen("Date.txt", "r"); //读取文件操作
        while (!feof(fp))
        {
            fscanf(fp, "%s %sn", &use[a].account, &use[a].password);
            if ((strcmp(account, use[a].account) == 0) && (strcmp(ad, use[a].password) == 0))
            {
                flag = 1;
                fclose(fp);
                break;
            }
            a++;
        }
        cout << endl;
        if (flag == 1)
        {
            cout << "登录成功!" << endl;
            system("pause");
            system("cls");
            Administrators();
            break;
        }
        else
        {
            cout << "账号或者密码输入错误,你还有" << 2 - i << "次机会,请重新输入:" << endl;
        }
    }
    if (i == 3)
    {
        cout << "登录失败" << endl;
        system("pause");
        return 0;
    }
}

void CreateUDG(AMGragh &G) //根据基本信息建图
{
    G.vexnum = 10;
    strcpy(G.vex[0].num, "01");
    strcpy(G.vex[1].num, "02");
    strcpy(G.vex[2].num, "03");
    strcpy(G.vex[3].num, "04");
    strcpy(G.vex[4].num, "05");
    strcpy(G.vex[5].num, "06");
    strcpy(G.vex[6].num, "07");
    strcpy(G.vex[7].num, "08");
    strcpy(G.vex[8].num, "09");
    strcpy(G.vex[9].num, "10");
    strcpy(G.vex[0].name, "下沉广场");
    strcpy(G.vex[1].name, "图书馆");
    strcpy(G.vex[2].name, "4号教学楼");
    strcpy(G.vex[3].name, "莲 湖");
    strcpy(G.vex[4].name, "钟楼广场");
    strcpy(G.vex[5].name, "餐 厅");
    strcpy(G.vex[6].name, "学生宿舍");
    strcpy(G.vex[7].name, "操 场");
    strcpy(G.vex[8].name, "体育训练中心");
    strcpy(G.vex[9].name, "实验实训中心");
    strcpy(G.vex[0].instruct, "下沉广场是升国旗的场所,也会举办一些文艺晚会和校园招聘会,更是轮滑爱好者的乐园!");
    strcpy(G.vex[1].instruct, "图书馆环境安适,藏书丰富,配备现代化管理设施,是阅读书籍期末复习备战考研的绝佳场所!");
    strcpy(G.vex[2].instruct, "4号教学楼是、主要教学大楼,配备现代化教学设施,是老师上课和学生自习的场所,学习氛围浓厚!");
    strcpy(G.vex[3].instruct, "莲湖湖水清澈见底,这里能看到许多活泼的小鱼,还有几只抱团的鸭鸭!");
    strcpy(G.vex[4].instruct, "食堂包括第一、第二、第三食堂,里面的美食种类丰富,可以让你大饱口福!");
    strcpy(G.vex[5].instruct, "钟楼广场是平时社团举办活动的场所,经常会举办一些大型活动!");
    strcpy(G.vex[6].instruct, "学生宿舍为标准四/六人间,宿舍配备空调暖气,冬暖夏凉,空间充裕,居住舒适!");
    strcpy(G.vex[7].instruct, "操场包括网球场,篮球场,足球场等,你可以在田径场挥洒汗水,晚上可能会举办音乐会哦!");
    strcpy(G.vex[8].instruct, "体育馆设施齐全,包括乒乓球场,羽毛球场,攀岩场地等,快来和大家一起运动吧!");
    strcpy(G.vex[9].instruct, "实验实训中心提供场地和设施让学生进行物理、生物实验和金工、电子工艺实习!");
    G.arcs[1][2] = G.arcs[2][1] = 8;
    G.arcs[1][3] = G.arcs[3][1] = 3;
    G.arcs[2][5] = G.arcs[5][2] = 17;
    G.arcs[2][4] = G.arcs[4][2] = 4;
    G.arcs[2][10] = G.arcs[10][2] = 31;
    G.arcs[3][6] = G.arcs[6][3] = 21;
    G.arcs[4][5] = G.arcs[5][4] = 12;
    G.arcs[5][6] = G.arcs[6][5] = 6;
    G.arcs[5][7] = G.arcs[7][5] = 5;
    G.arcs[5][9] = G.arcs[5][9] = 27;
    G.arcs[7][8] = G.arcs[8][7] = 21;
    G.arcs[8][9] = G.arcs[9][8] = 13;
    G.arcs[9][10] = G.arcs[10][9] = 18;
    for (int i = 1; i <= 10; i++) //初始化路径长度
        for (int j = 1; j <= 10; j++)
        {
            if (G.arcs[i][j] == 0 && i != j)
                G.arcs[i][j] = MX;
        }
    G.arcnum = 13;        
}

int Administrators() //管理员功能(开放所有功能)
{
    AMGragh G;
    memset(G.arcs, 0, sizeof(G.arcs));
    CreateUDG(G);
    int m;
    while (m != 8)
    {
        Administrators_Menu();
        cin >> m;
        switch (m)
        {
        case 1:
            Introduce();
            break;
        case 2:
            Map();
            break;
        case 3:
            Query(G);
            break;
        case 4:
            All_Print(G);
            break;
        case 5:
            Ask(G);
            break;
        case 6:
            Modify_vertex(G);
            break;
        case 7:
            Modify_Edge(G);
            break;
        case 8:
            cout << "感谢您的使用!" << endl;
            return 0;
        default:
            cout << "没有该选项!" << endl;
        }
        system("pause");
        system("cls");
    }
    return 0;
}

int User() //用户功能(开放部分功能)
{
    AMGragh G;
    memset(G.arcs, 0, sizeof(G.arcs));
    CreateUDG(G);
    int m;
    while (m != 5)
    {
        User_Menu();
        cin >> m;
        switch (m)
        {
        case 1:
            Introduce();
            break;
        case 2:
            Map();
            break;
        case 3:
            Query(G);
            break;
        case 4:
            Ask(G);
            break;
        case 5:
            cout << "感谢您的使用!" << endl;
            return 0;
        default:
            cout << "没有该选项!" << endl;
        }
        system("pause");
        system("cls");
    }
    return 0;
}

void Administrators_Menu() //管理员菜单界面
{
    cout << "***************欢迎您**************" << endl;
    cout << "*       ★1、查看校园详细信息     *" << endl;
    cout << "*       ★2、查看该校园平面图     *" << endl;
    cout << "*       ★3、校园景点信息查询     *" << endl;
    cout << "*       ★4、输出所有景点信息     *" << endl;
    cout << "*       ★5、景点最短路径查询     *" << endl;
    cout << "*       ★6、修改景点基本信息     *" << endl;
    cout << "*       ★7、修改路径基本信息     *" << endl;
    cout << "*       ★8、 返回上一级菜单      *" << endl;
    cout << "***********************************" << endl;
    cout << "请选择..." << endl;
}

void User_Menu() //用户菜单界面
{
    cout << "***************欢迎您**************" << endl;
    cout << "*       ★1、查看校园详细信息     *" << endl;
    cout << "*       ★2、查看该校园平面图     *" << endl;
    cout << "*       ★3、校园景点信息查询     *" << endl;
    cout << "*       ★4、景点最短路径查询     *" << endl;
    cout << "*       ★5、退出                 *" << endl;
    cout << "***********************************" << endl;
    cout << "请选择..." << endl;
}

void Introduce() //河南工业大学简介
{
    cout << endl;

    cout << "河南工业大学(Henan University of Technology)位于河南省会郑州市,是河南省人民政府和国家粮食局共建高校;始建于1956年,先后隶属国家粮食部、商业部和国内贸易部;1959年开展本科教育,1981年开始硕士研究生教育,2013年开始博士研究生教育,2017年获批硕士研究生推免资格,2018年获批博士学位授予单位; 1998年划归河南省管理,河南省人民政府和国家粮食局于2010年签约共建河南工业大学。" << endl;

    cout << "建校至今,学校坚持“扎根中原,立足行业,服务全国,面向世界”的办学定位,严守“育人为本、质量立校、特色发展”的办学理念,秉承“明德、求是、拓新、笃行”的校训,大力弘扬“崇尚科学、勇于探索、报国兴学、自强不息”的工大精神,凝练形成了“团结进取,务实高效”的校风、“博学奉献”的教风和“勤奋诚信”的学风。" << endl;

    cout << "经过历代工大人的励精图治和薪火传承,学校已经发展成为一所以工学为主,涵盖理学、经济学、管理学、法学、文学、艺术学和农学等学科协调发展的多科性大学,不仅具备完整的学士、硕士、博士三级人才培养体系,而且作为第二单位成功入选国家首批“ 2011协同创新计划”,是教育部“中西部高校基础能力建设工程”和“卓越工程师教育培养计划”建设高校,在推动行业、区域和国家经济社会发展,实现教育振兴的过程中做出了应有贡献,在人才培养、科学研究、社会服务等方面均取得了优异成绩。 " << endl;

    cout << endl;
}

void Map() //河南工业大学平面简图
{
    cout << " ————————————————————————————" << endl;
    cout << "|                   河南工业大学平面图                  |" << endl;
    cout << " ————————————————————————————" << endl;
    cout << "|                           北门                        |" << endl;
    cout << "|           [8]操场————————[7]宿舍              |" << endl;
    cout << "|            |                      |                   |" << endl;
    cout << "|            |                      |                   |" << endl;
    cout << "|            |—————————[5]钟楼广场——         |" << endl;
    cout << "|            |                  |      |       |        |" << endl;
    cout << "|          [9]体育中心          |      |     [6]餐厅    |" << endl;
    cout << "|西门       |                   |      |       |    东门|" << endl;
    cout << "|           |             [4]莲湖      |       |        |" << endl;
    cout << "|           |                 |        |       |        |" << endl;
    cout << "|           |               [2]图书馆—        |        |" << endl;
    cout << "|   [10]基础实训中心 —————|               |        |" << endl;
    cout << "|        北                    |———[3]4号教学楼      |" << endl;
    cout << "|        ↑                    |                        |" << endl;
    cout << "|  西 ← — →东             [1]下沉广场                |" << endl;
    cout << "|        ↓                                             |" << endl;
    cout << "|        南                  南门                       |" << endl;
    cout << " ————————————————————————————" << endl;
}

void Query(AMGragh G) //查询景点基本信息
{
    cout << "请输入查询景点的代号(例如 06):";
    char c[5];
    cin >> c;
    int i;
    for (i = 0; i < G.vexnum; i++) // n较小,采用顺序查找即可
    {
        if (strcmp(c, G.vex[i].num) == 0)
        {
            cout << "代号:" << G.vex[i].num << endl;
            cout << "景点名称:" << G.vex[i].name << endl;
            cout << "简介:" << G.vex[i].instruct << endl;
            break;
        }
    }
    if (i == G.vexnum)
    {
        cout << "该代号不存在!" << endl;
    }
}

void All_Print(AMGragh G) //输出所有景点信息
{
    cout << "----------------------------------河南工业大学景点信息----------------------------------" << endl;
    cout << setw(16) << setiosflags(ios::left) << "景点名称"
         << setw(8) << setiosflags(ios::left) << "代号"
         << setw(16) << setiosflags(ios::left) << "简介" << endl;
    for (int i = 0; i < G.vexnum; i++)
    {
        cout << setw(16) << G.vex[i].name << setw(8) << G.vex[i].num << setw(60) << G.vex[i].instruct << endl;
    }
    cout << endl;
}

void Modify_vertex(AMGragh &G) //景点基本信息管理
{
    All_Print(G);
    int flag = 0;
    cout << "请输入要修改信息的代号(例如 06):";
    char c[5];
    cin >> c;
    for (int i = 0; i < G.vexnum; i++)
    {
        if (strcmp(c, G.vex[i].num) == 0) //字符串比较的方法进行查找
        {
            flag = 1;
            memset(G.vex[i].name, 0, sizeof(G.vex[i].name)); //把G.vex[i].**中所有字节换做字符“0”,对字符串的初始化
            memset(G.vex[i].instruct, 0, sizeof(G.vex[i].instruct));
            char name1[41];
            char instruct1[401];
            cout << "请输入修改后的景点信息:" << endl;
            cout << "景点名称:";
            cin >> name1;
            cout << "简介:";
            cin >> instruct1;
            strcpy(G.vex[i].name, name1); //字符串拷贝函数
            strcpy(G.vex[i].instruct, instruct1);
            cout << "修改成功!" << endl;
            break;
        }
    }
    if (flag == 0)
    {
        cout << "输入错误!" << endl;
    }
}

void Modify_Edge(AMGragh &G) //路径基本信息管理
{
    Map();
    int i, j, k;
    cout << "请输入待修改的边(例如5 8):" << endl;
    cin >> i >> j;
    if ((G.arcs[i][j] != MX && G.arcs[j][i] != MX) && (i >= 1 && i <= 10) && (j >= 1 && j <= 10))
    {
        cout << "请输入修改后的边长(例如 6):";
        cin >> k;
        G.arcs[i][j] = G.arcs[j][i] = k;
        cout << "修改成功!" << endl;
    }
    else
    {
        cout << "输入错误!" << endl;
    }
}

void Ask(AMGragh G) //用户咨询最短路径
{
    Map();
    cout << "请输入起点和目的地(例如06 08):";
    int i, j;
    cin >> i >> j;
    if ((i >= 1 && i <= 10) && (j >= 1 && j <= 10))
    {
        Floyd(G);
        cout << endl
             << endl
             << "从" << G.vex[i - 1].name << "到" << G.vex[j - 1].name << ":" << endl
             << endl
             << "最短路径长度:" << D[i][j] * 10 << "米" << endl; //存的路径为缩小10倍的距离,按比例尺还原
        cout << endl;
        Path_Out(G, i, j);
    }
    else
    {
        cout << "输入错误!" << endl;
    }
    cout << endl;
}

void Floyd(AMGragh G) //弗洛伊德算法,获得两点最短路径
{
    int i, j, k;
    for (i = 1; i <= G.vexnum; ++i) //初始化
        for (j = 1; j <= G.vexnum; j++)
        {
            D[i][j] = G.arcs[i][j];
            if (D[i][j] < MX && i != j)
                path[i][j] = i;
            else
                path[i][j] = -1;
        }
    for (k = 1; k <= G.vexnum; k++) //更新最短路径
        for (i = 1; i <= G.vexnum; ++i)
            for (j = 1; j <= G.vexnum; j++)
                if (D[i][k] + D[k][j] < D[i][j])
                {
                    D[i][j] = D[i][k] + D[k][j];
                    path[i][j] = path[k][j];
                }
}

void Path_Out(AMGragh G, int start, int end) //获得具体路径
{
    int p[Max];
    p[0] = end;
    int i = 1;
    while (start != end)
    {
        end = path[start][end];
        p[i] = end;
        ++i;
    }
    cout << "路径:" << G.vex[start - 1].name;
    i = i - 2;
    while (i >= 0)
    {
        cout << "→" << G.vex[p[i] - 1].name;
        --i;
    }
    cout << endl;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会思想的苇草i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值