数据结构课程设计--旅游区景点导游系统

 分享了一下我大二自己写的数据结构的课程设计,花费了很多时间,下面题目的基本功能都实现了,代码里面也给出了详细的注解,类似的管理系统都可以参照这份代码,希望可以帮到你,帮到各位也很开心,加油吧,代码要是有不理解的可以评论或者私信我。

后期我会补上我自己写的课程设计书,里面有更加详细的代码解释和功能展示,可以帮助更好进行理解

CSDN下载链接

如果想要百度网盘分享,也可以在评论区评论或者私聊

【题目】旅游区景点导游系统

        1、数据格式

用文件存储数据,文件中存储哪些数据,数据格式是什么。

一定要将文件中的数据格式描述清楚,可以对文件中的数据进行截图后解释。

        2、数据结构(读文件创建图

将文件中的数据读入内存,建立图的存储结构,可以选择邻接表或邻接矩阵作为存储结构,存储结构要准确记录旅游区各旅游景点及其相邻景点之间的相关信息。给出存储结构的C语言定义。

        3、查询、编辑景点信息

提供用户操作的菜单和界面,实现对景点信息的查询、添加、删除、修改等操作,注意数据间的关联性。编辑后的信息需要保存回文件。

截图给出程序运行效果。

  1. 旅游区景点显示

显示游客当前所在景点及所有与游客所在景点相邻景点信息。                                 

截图给出程序运行效果。

        5、查询从每个景点出发到其他任一景点的最短简单路径及距离

用户输入任一景点,输出旅游区每个景点到该景点的最短简单路径及距离。

描述算法,可使用自然语言、流程图、伪码、带注解的源码等方式,根据算法描述的清晰程度评定成绩。

截图给出程序运行效果。

        6、查询任意两个景点之间所有简单路径及距离、最短简单路径及距离

用户输入任意两个景点,输出两个景点间所有简单路径及距离、最短简单路径及距离。

描述算法,可使用自然语言、流程图、伪码、带注解的源码等方式,根据算法描述的清晰程度评定成绩。

截图给出程序运行效果。

        7、最佳游览路线推荐

输入某一景点,输出从改经典出发经过景区所有景点(景点可以重复)且距离最短的游览路线。

描述算法,可使用自然语言、流程图、伪码、带注解的源码等方式,根据算法描述的清晰程度评定成绩。

截图给出程序运行效果。

        8、设计总结

可以包括调试过程中遇到的问题是如何解决的以及对设计与实现的回顾和分析、经验和体会等。

效果展示:

只展示了部分功能 ,代码应该复制粘贴以后创建几个本地txt文件就可以直接运行

 缺陷:

登录的账户信息没有像景点信息一样进行单独文件存放,很简单,只是懒得弄了

功能9按照我自己的思考已经实现,就是dijskra算法的多次使用,但是我不是很确定,可以重新思考一下

---


txt文件的读取与存入

代码实现的逻辑是逐行进行读取

第一行是景点个数 5

第二行是道路条数 18

接下来是5x5的邻接矩阵(一个数据单独一行进行存入,也可以直接写出邻接矩阵,但是在读取出来以后需要对文本进行切割)

然后是五个景点的信息,依次是名称、简介、价格,都是单独成为一行存入

偷懒小技巧:

你如果还是没有理解读取文件的逻辑,你可以先新建一个两行都是0的文件,然后运行代码,按照代码的提示依次添加景点进行保存就好了(理论上应该是可以的,自己去试试咯)

下面是我的sites.txt文件

5
18
0
10
140
200
240
10
0
150
160
80
140
150
0
90
60
200
160
90
0
30
240
80
60
30
0
黄鹤楼
昔人已乘黄鹤去,此地空余黄鹤楼。黄鹤一去不复返,白云千载空悠悠。
30
晴川阁
晴川历历汉阳树,芳草萋萋鹦鹉洲。日暮乡关何处是?烟波江上使人愁。
0
三峡大坝
长江三峡水利枢纽工程,又称三峡工程,是目前世界上规模最大的水电站和清洁能源基地。
100
武当山
武当山是我国著名的道教圣地、太极拳的发祥地、国家重点风景名胜区、全国十大避暑胜地。
223
神农架
集奇树、奇花、奇洞、奇峰与山民奇风异俗为一体,以反映原始悠古、猎奇探秘为主题的原始生态旅游区。
100

代码如下:

#include <iostream>
#include <cstring>
#include <malloc.h>
#include <cstdio>
#include <cstdlib>//清屏函数头文件
#include <sstream>
#include <fstream>
#include <windows.h>
#include <stack>

#define M 100
#define INF 999666333
#define Path "sites.txt"

using namespace std;

string tour_id="123456";
string tour_password="000000";
string admin_id="456789";
string admin_password="111111";

typedef struct Node{
	string name;
	string intro;
	int price;
}Node;//单个景点

typedef struct Map
{
    int count;//景点总数量
    int edge;//道路数量
    int m[M][M];//景点邻接矩阵
    Node Pname[M];//各个景点的信息
}Map;

//读出数据
void read_graph(Map* p){
	ifstream fin(Path,ios::in);
	if(fin.is_open()==false)
    {
		cout << "打开文件" << Path << "失败\n";
		return ;
	}
	string temp;
	fin >> temp;
	int t = stoi(temp);
	p->count = stoi(temp);
	fin >> temp;
	p->edge = stoi(temp);
	for(int i = 1; i <= p->count; i++)
		for(int j = 1; j <= p->count; j++)
		{
			fin >> temp;
			p->m[i][j]=stoi(temp);
		 }
	for(int i = 1;i <= p->count; i++)
	{
		fin >> temp;
		p->Pname[i].name = temp;
		fin >> temp;
		p->Pname[i].intro = temp;
		fin >> temp;
		p->Pname[i].price = stoi(temp);
	}
	fin.close();
}

//写入数据
void write_graph(Map* p){
	ofstream fout(Path,ios::out);
	if(fout.is_open()==false)
    {
		cout << "打开文件" << Path << "失败\n";
		return ;
	}
	fout << p->count <<"\n";
	fout << p->edge <<"\n";
	for(int i = 1; i <= p->count; i++)
		for(int j=1;j <= p->count; j++)
		fout << p->m[i][j] <<"\n";
	for(int i = 1; i <= p->count; i++)
    {
		fout << p->Pname[i].name <<"\n";
		fout << p->Pname[i].intro <<"\n";
        fout << p->Pname[i].price <<"\n";
	}
	fout.close();
}

//输出景点信息
void print_graph(Map* p)
{
    cout << "景点个数:" << p->count << "\n";
    cout << "道路条数:" << p->edge << "\n";
    cout << "\n";
    cout << "景点路径信息:(邻接矩阵)\n";//输出路径信息
    cout << "          ";
    for(int i=1;i<=p->count;i++)//通过printf语句控制输出信息所占空格个数
        printf("%-10s",p->Pname[i].name.c_str());//-:左对齐
    cout << "\n";
    for(int i=1;i<=p->count;i++)
    {
        printf("%-10s",p->Pname[i].name.c_str());//.c_str():转化为char数组,便于调整输出格式
        for(int j=1;j<=p->count;j++)
		printf("%-10d",p->m[i][j]);
		cout << "\n";
    }
    cout << "\n";
    cout << "      ***景点信息***\n";//输出景点信息
    for(int i = 1; i <= p->count; i++)
    {
        cout << "景点编号:" << i << "\n";
        cout << "\t名称:" << p->Pname[i].name << "\n";
        cout << "\t简介:" << p->Pname[i].intro << "\n";
        cout << "\t价格:" << p->Pname[i].price << "\n";
        cout << "\t---------------------------------------\n";
    }
    cout << "                        输出成功\n";
    cout << "----------------------------------------------------------\n";
}

//查找景点(辅助函数)
int search_num(Map* p,string name)//返回查找到的景点编号
{
	for(int i=1;i<=p->count;i++)
		if(p->Pname[i].name==name) return i;
    return -1;
}

//添加景点
void append_graph(Map* p)
{
    string name;
    string intro;
    int price;
    p->count++;
    int n;
    cout << "请输入景点名称:";
    cin >> name;
    p->Pname[p->count].name = name;
    cout << "请输入景点简介:";
    cin >> intro;
    p->Pname[p->count].intro = intro;
    cout << "请输入景点价格:";
    cin >> price;
    p->Pname[p->count].price = price;
    for(int j=1;j<=p->count;j++)
    {
        p->m[p->count][j]=INF;
        p->m[j][p->count]=INF;
    }
    p->m[p->count][p->count]=0;
    cout << "请输入相邻景点个数";
    cin >> n;
    int i=0;
    while(i!=n)
    {
        string temp;
        cout << "请输入景点" << i+1 << "名称:";
        cin >> temp;
        int t=search_num(p,temp);
        if(t!=-1)
        {
            int len;
            cout << "请输入路径" << i+1 << "长度:";
            cin >> len;
            p->m[p->count][t]=len;
            p->m[t][p->count]=len;
            p->edge+=2;
        }
        else cout << "未找到该景点\n";
        i++;

    }
    cout << "                  添加成功\n";
    cout << "--------------------------------------------\n";
    write_graph(p);
}

//管理查找景点
void admin_search_graph(Map* p)
{
    string name;
    cout << "请输入查找景点名称:";
    cin >> name;
    int n=search_num(p,name);
	if(n>0&&n<=p->count)
    {
        cout << "景点编号:" << n << "\n";
        cout << "\t名称:" << p->Pname[n].name << "\n";
        cout << "\t简介:" << p->Pname[n].intro << "\n";
        cout << "\t价格:" << p->Pname[n].price << "\n";
        cout << "\t---------------------------------------\n";
    }
	else
    {
        cout << "未查到该景点" << "\n";
        cout << "是否需要添加该景点(1:是  0:否)\n";
        int t;
        cin >> t;
        if(t) append_graph(p);//是否添加景点
    }
    cout << "                  查找结束\n";
    cout << "--------------------------------------------\n";
}

//游客查找景点
void tour_search_graph(Map* p)
{
    string name;
    cout << "请输入查找景点名称:";
    cin >> name;
    int n=search_num(p,name);
	if(n>0&&n<=p->count)
    {
        cout << "景点编号:" << n << "\n";
        cout << "\t名称:" << p->Pname[n].name << "\n";
        cout << "\t简介:" << p->Pname[n].intro << "\n";
        cout << "\t价格:" << p->Pname[n].price << "\n";
        cout << "\t---------------------------------------\n";
    }
	else
        cout << "未查到该景点" << "\n";
    cout << "                  查找结束\n";
    cout << "--------------------------------------------\n";
}

//删除景点
void delete_graph(Map* p)
{
    string name;
    cout << "请输入删除景点名称:";
    cin >> name;
    int t = search_num(p , name),i,j;

    if(t!=-1)
    {
        int c=0;
        //删除节点信息
        for(i=t;i<p->count-1;i++)
            p->Pname[i] = p->Pname[i+1];
        //统计删除边数
        for(i=1;i<=p->count;i++)
            if(p->m[t][i]!=0&&p->m[t][i]!=INF)c+=2;//默认无向图,删除边数统计单行或单列乘以二
        //向左移删列
        for(i=1;i<=p->count;i++)
            for(j=t;j<p->count;j++)
                p->m[i][j]=p->m[i][j+1];
        //向上移删行
        for(i=0;i<p->count;i++)
            for(j=t;j<p->count;j++)
                p->m[j][i]=p->m[j+1][i];
        p->count--;
        p->edge-=c;
        cout << "                  删除成功\n";
    }
    else
        cout << "          未找到该景点";
    cout << "--------------------------------------------\n";
    write_graph(p);
}

//修改景点
void change_graph(Map* p)
{
    string n;
    cout << "请输入要修改的景点名称:";
    cin >> n;
    int t=search_num(p,n);
    if(t!=-1)
    {
        cout << "修改选项\n";
        cout << "1:名称\n";
        cout << "2:简介\n";
        cout << "3:价格\n";
        cout << "4:路径\n";
        cout << "0:退出\n";
        int s=1;
        while(s)
        {
            cout << "请输入修改选项:";

            string temp;
            cin >> s;
            switch(s)//控制修改信息
            {
                case 1:
                    {
                        cout << "请输入新名称:";
                        cin >> temp;
                        p->Pname[t].name=temp;
                        break;
                    }

                case 2:
                    {
                        cout << "请输入新简介:";
                        cin >> temp;
                        p->Pname[t].intro=temp;
                        break;
                    }
                case 3:
                    {
                        cout << "请输入新价格:";
                        cin >> temp;
                        p->Pname[t].price=stoi(temp);
                        break;
                    }
                case 4:
                    {
                        string name2;
                        cout << "请输入路径景点:";
                        cin >> name2;
                        int q=search_num(p,name2);
                        if(q!=-1)//找到终点景点
                        {
                            int m;
                            cout << "请输入具体长度:(-1:无穷)";
                            cin >>m;
                            if(m!=-1)
                            {
                                p->m[t][q]=m;
                                p->m[q][t]=m;
                            }
                            else
                            {
                                p->m[t][q]=INF;
                                p->m[q][t]=INF;
                                p->edge--;
                            }
                        }
                    }
                default:
                    break;
            }
        }
        cout << "    找到该景点,修改信息成功\n";


    }
    else
        cout << "    未找到该景点,修改信息不成功\n";
    cout << "--------------------------------------------\n";
    write_graph(p);//修改景区信息以后需要写入数据
}

//展示附近景点
void show_around(Map* p)
{
    string name;
    cout << "请输入当前景点名称:";
    cin >> name;
    int n = search_num(p,name);
    if(n!=-1)
    {
        cout << "\t***当前景点:" << "\n";
        cout << "名称:" << p->Pname[n].name << "\n";
        cout << "简介:" << p->Pname[n].intro << "\n";
        cout << "价格:" << p->Pname[n].price << "\n";
        cout << "\t***附近景点:" << "\n";
        for(int i=1;i<=p->count;i++)//遍历单行或单列
        {
            if(p->m[n][i]!=0&&p->m[n][i]!=INF)//排除距离为0(本身),距离为INF(无穷)的节点
            {
                cout << "名称:" << p->Pname[i].name << "\n";
                cout << "简介:" << p->Pname[i].intro << "\n";
                cout << "价格:" << p->Pname[i].price << "\n";
                cout << "距离:" << p->m[n][i] << "\n";
                cout << "\n";
            }
        }

    }
}

//迪杰斯特拉算法
void dijkstra(int m[M][M],int s,int n,int* dist,int* path)//通过dist数组和path数组传递路径信息
{
    int final[M];//标记是否找到最短路径
    int v,w,i,j,min;
    //初始化:final置0;path置-1(默认开始都无前驱);dist置INF(无穷);
    //第一步:遍历出发点对应的行,更新dist(直达路径),同时把(直达路径)path(前驱节点)设置为出发点编号
    for(v=1;v<=n;v++)//初始化和第一步同时进行
    {
        final[v]=0;
        path[v]=-1;
        dist[v]=m[s][v];
        if(dist[v]!=INF&&dist[v]!=0)
        {
            path[v]=s;
        }
    }
    final[s]=1;//第一步:出发点dist[s]=0肯定已经是最短路径,final[s]=1(标记为已找到)
    dist[s]=0;
    //循环遍历,循环n-1次每次找出dist最短同时未找到最短路径的节点,该节点已找到最短路径,同时更新与该节点直接相连节点的最短路径
    for (i = 1; i < n; ++i)
    {
        min=INF;
        for (w = 1; w <=n ; ++w)//找出dist最短同时未找到最短路径的节点
			if (!final[w]&&dist[w]<min)
            {
                v = w;
                min = dist[w];
            }
        final[v]=1;//标记为已找到最短路径
        for (w = 1; w <= n; ++w)//更新与该节点直接相连节点的最短路径
        {
			if (!final[w] && min < INF && m[v][w] < INF && (min + m[v][w] < dist[w]))//如若修改dist,则同时也要修改path(前驱节点)
			{
				dist[w] = min + m[v][w];
                path[w]=v;//修改path(前驱节点)
            }
        }
    }
    //n-1遍循环结束,各个节点都找到最短路径
}

//单一最短路径
void shortone_graph(Map* p)
{
    int dist[M],path[M];//两个辅助数组
    cout << "请输入起点:";
    string name;
    cin >> name;
    int t = search_num(p,name);
    if(t!=-1)
    {
        dijkstra(p->m,t,p->count,dist,path);
        cout << "\t    ***最短路径信息***\n";//直接输出迪杰斯特拉算法得出的距离和前驱景点
        cout << "\t景点名称 最短路径  前驱景点  \n" ;
		for(int i=1;i<=p->count;i++)
        {
            if(i==t)
                printf("\t%-8s %-8d 出发景点\n",p->Pname[i].name.c_str(),dist[i]);
            else
                printf("\t%-8s %-8d %-8s\n",p->Pname[i].name.c_str(),dist[i],p->Pname[path[i]].name.c_str());

        }
        cout << "\n";
        //输出具体路径,通过栈“先进后出”的特点来帮助我们进行实现
        cout << "请输入终点:";
        cin >> name;
        int n = search_num(p,name);
        if(n!=-1)//找到终点
        {
            stack<int> s;
            s.push(n);//终点编号入栈
            while(n!=t)//依次压入前驱景点编号,直到压入起点景点编号
            {
                s.push(path[n]);
                n=path[n];
            }
            cout << "最短路径:\n";
            n = s.top();//返回栈顶景点编号,即起点编号,不删除
            s.pop();//弹出栈顶元素,删除栈顶
            cout << p->Pname[n].name;//起点特殊处理
            while(!s.empty())//依次弹栈,直到栈为空,同时通过t和m记录前后两个编号,便于我们输出路径长度
            {
                n = s.top();
                s.pop();
                cout << "--" << p->m[t][n] << "->";//输出路径长度
                cout << p->Pname[n].name;
                t = n;//让t等于刚刚弹出编号,下一次循环n接收栈顶元素,这样就很好记录了路径前后两个编号,便于输出路径长度
            }
            cout << "\n";
        }
        else//未找到终点
            cout << "未找到该景点。\n";
    }
    else
        cout << "未找到该景点。\n";
    cout << "--------------------------------------------\n";
}

//弗洛伊德算法
void floyd(int m[M][M],int path[M][M],int n )
{
    for(int i=1;i<=n;i++)
            for(int j=0;j<n;j++)
                path[i][j]=-1;
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(m[i][j]>m[i][k]+m[k][j])
                {
                    m[i][j]=m[i][k]+m[k][j];
                    path[i][j]=k;
                }
            }
        }
    }
}

//全局最短路径
void shortall_graph(Map* p)
{
    int n[M][M],path[M][M];
    for(int i=1;i<=p->count;i++)
            for(int j=1;j<=p->count;j++)
                n[i][j]=p->m[i][j];
    floyd(n,path,p->count);
    for(int i=1;i<=p->count;i++)
    {
        for(int j=1;j<=p->count;j++)
                printf("%15d",n[i][j]);
        cout << "\n";
    }
    cout << "---------------------------------------------------------------------------\n";
    for(int i=1;i<=p->count;i++)
    {
        for(int j=1;j<=p->count;j++)
                printf("%15d",path[i][j]);
        cout << "\n";
    }
}

//所有简单路径
void all_paths(Map* p,int start,int end,int* visit,int* path,int path_idx,int path_len)
{
    //将当前节点标记为已访问,将当前节点添加到路径中,并更新当前路径长度
	visit[start] = 1;
    path[path_idx] = start;
    path_idx++;
    path_len += p->m[path[path_idx - 2]][start];

	if(start==end)//如果当前节点是目标节点,则打印当前路径和路径长度
	{
		cout << "Path:";
		int i;
		for (i = 0; i < path_idx-1; i++)
        	cout << p->Pname[path[i]].name << "--" << p->m[path[i]][path[i+1]] << "->";
        	cout << p->Pname[path[i]].name << "\n";
        	cout << "Distance: " << path_len << "\n";
        	cout << "\n";
	}
	else//如果当前节点不是目标节点
	{
		for (int i = 1; i <= p->count; i++)
        	if (p->m[start][i] != INF && visit[i] == 0)//对当前节点的所有未访问的邻居节点进行递归调用,继续查找路径
            	all_paths(p, i, end, visit, path, path_idx, path_len);
	}
	//将当前节点的访问状态重新标记为未访问,并将当前节点从路径中删除,同时更新路径长度
	visit[start] = 0;
    path_idx--;
    path_len -= p->m[path[path_idx - 1]][start];
}

//所有简单路径以及最短简单路径
void all_shortpath(Map* p)
{
    string start,end;
    int t,n;
    cout << "请输入起点:";
    cin >> start;
    t=search_num(p,start);
    if(t!=-1)
    {
        cout << "请输入终点:";
        cin >> end;
        n=search_num(p,end);
        if(n!=-1)
        {
            int visit[M]={0};
            int path1[M]={0};
            cout << "所有简单路径:\n";
            all_paths(p,t,n,visit,path1,0,0);
            int dist[M];
            int path2[M];
            cout << "最短简单路径:\n";
            dijkstra(p->m,t,p->count,dist,path2);
            stack<int> s;
            s.push(n);//终点编号入栈
            while(n!=t)//依次压入前驱景点编号,直到压入起点景点编号
            {
                s.push(path2[n]);
                n=path2[n];
            }
            cout << "最短路径:\n";
            n = s.top();//返回栈顶景点编号,即起点编号,不删除
            s.pop();//弹出栈顶元素,删除栈顶
            cout << p->Pname[n].name;//起点特殊处理
            while(!s.empty())//依次弹栈,直到栈为空,同时通过t和m记录前后两个编号,便于我们输出路径长度
            {
                n = s.top();
                s.pop();
                cout << "--" << p->m[t][n] << "->";//输出路径长度
                cout << p->Pname[n].name;
                t = n;//让t等于刚刚弹出编号,下一次循环n接收栈顶元素,这样就很好记录了路径前后两个编号,便于输出路径长度
            }
            cout << "\n";
        }
        else//未找到终点
            cout << "未找到该景点。\n";

    }
    else//未找到终点
        cout << "未找到该景点。\n";
    cout << "-----------------------------------------------\n";
}

//最优路线规划
void best_path(Map* p)
{
    string name;
    cout << "请输入出发景点:";
    cin >> name;
    int start=search_num(p,name);
    if(start!=-1)
    {
        int dist[M],path[M],visit[M];//两个辅助数组
        int sum=0;
        dijkstra(p->m,start,p->count,dist,path);
        int v,min;
        for(int i=1;i<=p->count;i++)
            visit[i]=0;
        cout << "最优路径:\n";
        cout << p->Pname[start].name;//起点特殊处理
        visit[start]=1;
        while(1)
        {
            min=INF;
            for(int i=1;i<=p->count;i++)//找到最短的路径
            {
                if(!visit[i]&&min>dist[i])
                {
                    v=i;
                    min=dist[i];
                }
            }
            int t=start,n=v;
            stack<int> s;
            s.push(n);//终点编号入栈
            while(n!=t)//依次压入前驱景点编号,直到压入起点景点编号
            {
                s.push(path[n]);
                n=path[n];
            }
            t = s.top();//返回栈顶景点编号,即起点编号,不删除
            s.pop();//弹出栈顶元素,删除栈顶
            while(!s.empty())//依次弹栈,直到栈为空,同时通过t和m记录前后两个编号,便于我们输出路径长度
            {
                n = s.top();
                s.pop();
                cout << "--" << p->m[t][n] << "->";//输出路径长度
                sum+=p->m[t][n];
                cout << p->Pname[n].name;
                t = n;//让t等于刚刚弹出编号,下一次循环n接收栈顶元素,这样就很好记录了路径前后两个编号,便于输出路径长度
            }
            start = v;
            visit[start]=1;
            int flag=1;
            for(int i=1;i<=p->count;i++)
                if(visit[i]==0) flag=0;
            if(flag==1) break;
            dijkstra(p->m,start,p->count,dist,path);
        }
        cout << "\n";
        cout << "最优路径长度:" << sum << "\n";
    }
    else
        cout << "未找到该景点。\n";
    cout << "-----------------------------------------------\n";

}

//管理主界面
void admin_mainface(Map* p)
{
    system("cls");
    while(1)
    {
        cout << "\t**************************************************************\n" ;
		cout << "\t-------------------欢迎进入景区景点管理系统-------------------\n" ;
		cout << "\t    *                 主菜单                             *    \n" ;
		cout << "\t    *          【1】展示所有景点                         *    \n" ;
		cout << "\t    *          【2】查找景点                             *    \n" ;
		cout << "\t    *          【3】添加景点                             *    \n" ;
		cout << "\t    *          【4】删除景点                             *    \n" ;
		cout << "\t    *          【5】修改景点                             *    \n" ;
		cout << "\t    *          【6】展示当前景点附近景点                 *    \n" ;
		cout << "\t    *          【7】两景点最短路径规划                   *    \n" ;
		cout << "\t    *          【8】两景点所有简单路径和最短简单路径     *    \n" ;
		cout << "\t    *          【9】景区最佳游览路径规划                 *    \n" ;
		cout << "\t    *          【10】写入数据                            *    \n" ;
		cout << "\t    *          【11】清屏                                *    \n" ;
		cout << "\t    *          【0】清屏                                 *    \n" ;
		cout << "\t提示:本系统只会在开始时读出文件,退出系统以后写入文件,中间可以用过指令完成写入\n" ;
		cout << "\t******************************************************\n" ;
		cout << "\n\t请选择您的操作 (0-10):" ;
        int t;
        cin >> t;
        cout << "操作" << t << "\n";
        while(!(t>=0&&t<=10))//检测输入数据
        {
            cout<<"*输入有误,请重新输入:";
            cin >> t;
            cout << "操作" << t << "\n";
        }
        switch(t)
        {
            case 1:
                print_graph(p);break;
            case 2:
                admin_search_graph(p);break;
            case 3:
                append_graph(p);break;
            case 4:
                delete_graph(p);break;
            case 5:
                change_graph(p);break;
            case 6:
                show_around(p);break;
            case 7:
                shortone_graph(p);break;
            case 8:
                all_shortpath(p);break;
            case 9:
                best_path(p);break;
            case 10:
                write_graph(p);break;
            case 11:
                system("cls");;break;
            case 0:
                cout<<"\n\t\t\t*按任意键关闭本系统*\n";
                exit(0);
                break;
        }
    }
}

//用户主界面
void tour_mainface(Map* p)
{
    system("cls");
    while(1)
    {
        cout << "\t***************************************************************\n" ;
		cout << "\t--------------------欢迎进入景区景点管理系统-------------------\n" ;
		cout << "\t    *                  主菜单                             *    \n" ;
		cout << "\t    *          【1】展示所有景点                          *    \n" ;
		cout << "\t    *          【2】查找景点                              *    \n" ;
		cout << "\t    *          【3】展示当前景点附近景点                  *    \n" ;
		cout << "\t    *          【4】两景点最短路径规划                    *    \n" ;
		cout << "\t    *          【5】两景点所有简单路径和最短简单路径      *    \n" ;
		cout << "\t    *          【6】景区最佳游览路径规划                  *    \n" ;
		cout << "\t    *          【7】写入数据                              *    \n" ;
		cout << "\t    *          【8】清屏                                  *    \n" ;
		cout << "\t    *          【0】清屏                                  *    \n" ;
		cout << "\t提示:本系统只会在开始时读出文件,退出系统以后写入文件,中间可以用过指令完成写入\n" ;
		cout << "\t******************************************************\n" ;
		cout << "\n\t请选择您的操作 (0-7):" ;
        int t;
        cin >> t;
        cout << "操作" << t << "\n";
        while(!(t>=0&&t<=7))//检测输入数据
        {
            cout<<"*输入有误,请重新输入:";
            cin >> t;
            cout << "操作" << t << "\n";
        }
        switch(t)
        {
            case 1:
                print_graph(p);break;
            case 2:
                tour_search_graph(p);break;
            case 3:
                show_around(p);break;
            case 4:
                shortone_graph(p);break;
            case 5:
                all_shortpath(p);break;
            case 6:
                best_path(p);break;
            case 7:
                write_graph(p);break;
            case 8:
                system("cls");;break;
            case 0:
                cout<<"\n\t\t\t*按任意键关闭本系统*\n";
                exit(0);
                break;
        }
    }
}

//设置密码
void set_password()
{
	cout << "***提示:本系统可修改游客和管理的账户密码***\n";
    string id;
    string old_password;
    cout << " 帐号:";
    cin >> id;
    cout << "旧密码:" ;
    cin >> old_password;
    if(old_password == tour_password && id == tour_id)//修改游客密码
    {
        cout << "请输入新密码:";
    	cin >> tour_password;
        cout<<"游客密码重置成功"<<endl;
	}
	else if(old_password == admin_password && id == admin_id)//修改管理密码
    {
        cout << "请输入新密码:";
    	cin >> admin_password;
        cout<<"管理密码重置成功"<<endl;
	}
    else
        cout<<"重置密码失败!"<<endl;

}

//登录账号
void log_in()
{
    Map p;
    read_graph(&p);
    string id ,password;
    int flag1;
	flag1=1;//辅助变量,便于退出循环,以免卡入死循环
	while(flag1)//多层嵌套循环实现不同界面之间的转化
	{
        system("cls");
        cout<<"             景区登陆界面\n";
        cout<<"*************************************\n";
        cout<<"            1. 游客登陆\n";
        cout<<"            2. 管理登录\n";
        cout<<"            3. 退出\n";
        cout<< "请输入选项编号:";
        int option;
        cin >> option;
        switch (option)
        {
            case 1:
                {
                    cout << "***游客登陆***\n";
                    cout << "   账号:";
                    cin >> id;
                    if(id==tour_id)
                    {
                        cout << "   密码:";
                        cin >> password;
                        if(password==tour_password)
                        {
                            cout << "           游客登陆成功,欢迎您!\n";
                            cout << "提示:系统将在6秒后跳转界面\n";
                            cout<<"主界面进入中\n";
                            _sleep(6*1000);
                            tour_mainface(&p);
                            return;
                        }
                        else
                        {
                            cout << "***密码错误***\n";
                            _sleep(7*1000);
                        }

                    }
                    flag1=0;//修改辅助变量1
                    break;
                }
            case 2:
                {
                    cout << "***管理登陆***\n";
                    for(int i=3;i>=0;i--)
                    {
                        cout << "   账号:";
                        cin >> id;
                        cout << "   密码:";
                        cin >> password;
                        if (id==admin_id && password==admin_password)
                        {
                            cout<<"           管理登陆成功!\n";
                            cout<<"请选择以下操作\n";
                            cout<<"*************\n";
                            cout<<"*************\n";
                            cout<<"******1.进入管理系统******\n";
                            cout<<"******2.修改密码    ******\n";
                            cout<< "请输入选项编号:";
                            int option;
                            cin >> option;
                            int flag2=1;//辅助变量2,便于退出循环,以免卡入死循环
                            while(flag2)
                            {
                                switch(option)
                                {
                                    case 1:
                                        cout << "           管理登陆成功,欢迎您!\n";
                                        cout << "提示:系统将在6秒后跳转界面\n";
                                        cout<<"主界面进入中\n";
                                        _sleep(6*1000);
                                        admin_mainface(&p);
                                        flag2=0;//修改辅助变量2
                                        break;
                                    case 2:
                                        set_password();
                                        flag2=0;//修改辅助变量2
                                        break;
                                    default:
                                        cout << "输入错误,请正确输入!\n";
                                        break;
                                }
                            }
                            break;//登录成功后需立即跳出循环统计错误次数
                        }
                        if(i!=0)
                            cout << "密码错误,请重新输入(你还有" << i << "次输入机会)\n";
                        else
                            cout << " 4次输入错误,此账号已冻结!\n";
                    }
                    break;
                }
                case 3:
                cout<<"退出成功!\n";
                    _sleep(4*1000);
                    return ;
                default:
                    cout<<"输入错误,请正确输入!\n";
                    break;
        }
	}
}

//账户设置
void Account()
{
    system("color 70");
	system("cls");
	int flag;
	flag=1;
	while(flag)
	{
        system("cls");
        cout<<"             景区管理系统\n";
        cout<<"*************************************\n";
        cout<<"            1. 登陆系统\n";
        cout<<"            2. 退出系统\n";
        string tempt;
        cout<< "请输入选项编号:";
        cin >> tempt;
        int option;
        option=stoi(tempt);
        switch (option)
        {
            case 1:
                log_in();
                flag=0;
                break;
            case 2:
                cout<<"退出成功!"<<endl;
                flag=0;
                break;
            default:
                cout<<"输入错误,请正确输入!"<<endl;
                break;
        }
	}
}

//欢迎界面
void Welcome(){
	cout<<               "\n\n\t\t******欢迎使用景区旅游信息管理系统******\n\n";
    cout<<" \t \t \t 按任意键进入系统... ...";
    getchar();
    Account();
}

//主函数
int main()
{
    Welcome();
    return 0;
}

注意:

在文章最开始我给出了具体的zip压缩包,下载到本地以后解压就可以直接运行了

  • 21
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
在旅游景区,经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离,这类游客不喜欢按照导游图的线路来游览,而是挑选自己感兴趣的景点游览。为于帮助这类游客信息查询,就需要计算出所有景点之间最短路径和最短距离。算法采用迪杰斯特拉算法或弗洛伊德算法均可。建立一个景区旅游信息管理系统,实现的主要功能包括制订旅游景点导游线路策略和制订景区道路铺设策略。 任务中景点分布是一个无向带权连通图,图中边的权值是景点之间的距离。 (1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入口景点,建立一个导游线路图,导游线路图用有向图表示。遍历采用深度优先策略,这也比较符合游客心理。 (2)为了使导游线路图能够优化,可通过拓朴排序判断图中有无回路,若有回路,则打印输出回路中的景点,供人工优化。 (3)在导游线路图中,还为一些不愿按线路走的游客提供信息服务,比如从一个景点到另一个景点的最短路径和最短距离。在本线路图中将输出任意景点间的最短路径和最短距离。 (4)在景区建设中,道路建设是其中一个重要内容。道路建设首先要保证能连通所有景点,但又要花最小的代价,可以通过求最小生成树来解决这个问题。本任务中假设修建道路的代价只与它的里程相关。 归纳起来,本任务有如下功能模块:(1)创建景区景点分布图;(2)输出景区景点分布图(邻接矩阵)(3)输出导游线路图;(4)判断导游线路图有无回路;(5)求两个景点间的最短路径和最短距离;(6)输出道路修建规划图。(7)主程序用菜单选项供用户选择功能模块。  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值