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

2023-10-23 09:20

本文主要是介绍数据结构课程设计--旅游区景点导游系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

CSDN下载链接

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

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

        1、数据格式

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

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

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

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

        3、查询、编辑景点信息

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

截图给出程序运行效果。

  1. 旅游区景点显示

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

截图给出程序运行效果。

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

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

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

截图给出程序运行效果。

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

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

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

截图给出程序运行效果。

        7、最佳游览路线推荐

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

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

截图给出程序运行效果。

        8、设计总结

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

效果展示:

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

 缺陷:

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

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

代码如下:

#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";}elsecout << "未查到该景点" << "\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";}elsecout << "          未找到该景点";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";}elsecout << "    未找到该景点,修改信息不成功\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]);elseprintf("\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";}elsecout << "未找到该景点。\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";}elsecout << "未找到该景点。\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;}elsecout<<"重置密码失败!"<<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;//修改辅助变量1break;}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;//修改辅助变量2break;case 2:set_password();flag2=0;//修改辅助变量2break;default:cout << "输入错误,请正确输入!\n";break;}}break;//登录成功后需立即跳出循环统计错误次数}if(i!=0)cout << "密码错误,请重新输入(你还有" << i << "次输入机会)\n";elsecout << " 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;
}

这篇关于数据结构课程设计--旅游区景点导游系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/266929

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识