分享了一下我大二自己写的数据结构的课程设计,花费了很多时间,下面题目的基本功能都实现了,代码里面也给出了详细的注解,类似的管理系统都可以参照这份代码,希望可以帮到你,帮到各位也很开心,加油吧,代码要是有不理解的可以评论或者私信我。
后期我会补上我自己写的课程设计书,里面有更加详细的代码解释和功能展示,可以帮助更好进行理解
如果想要百度网盘分享,也可以在评论区评论或者私聊
【题目】旅游区景点导游系统
1、数据格式
用文件存储数据,文件中存储哪些数据,数据格式是什么。
一定要将文件中的数据格式描述清楚,可以对文件中的数据进行截图后解释。
2、数据结构(读文件创建图)
将文件中的数据读入内存,建立图的存储结构,可以选择邻接表或邻接矩阵作为存储结构,存储结构要准确记录旅游区各旅游景点及其相邻景点之间的相关信息。给出存储结构的C语言定义。
3、查询、编辑景点信息
提供用户操作的菜单和界面,实现对景点信息的查询、添加、删除、修改等操作,注意数据间的关联性。编辑后的信息需要保存回文件。
截图给出程序运行效果。
- 旅游区景点显示
显示游客当前所在景点及所有与游客所在景点相邻景点信息。
截图给出程序运行效果。
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压缩包,下载到本地以后解压就可以直接运行了