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