📄 导游.cpp
字号:
{
if(weight[i][j]>weight[i][k]+weight[k][j])
{
weight[i][j]=weight[i][k]+weight[k][j];
path[i][j]=k;
if(i==s && j==t)
{
fp<<k;
}
}
}
}
}
fp<<'@';
}
/*********************************************************************************************************************/
int Findclose(Algraph &J)//查找两点间的最短距离
{
fstream Afile,vfile,fp;
char bh,ch;
int Route[100][100];
int w,c ,x;
int weight[100][100];
int path[50][50];
char sign[20];
fp.open("sp.txt",ios::in|ios::out);
if(fp.fail())
{
cout<<"打开sp文件出错"<<endl;
exit(0);
}
J=Revert(J);
cout<<endl<<"\t下面将显示该学校的景点名称,请按编号选择想要查询最短距离的两个景点"<<endl;
show(J);
cout<<endl<<"\t输入第一个景点编号:"<<"\t";
cin>>bh;
cout<<"\t输入第二个景点编号:"<<"\t";
cin>>ch;
w=locate(J,bh);
c=locate(J,ch);
if(w==-1||c==-1)
{
cout<<endl<<endl<<"\t\t\t抱歉,无此结点"<<endl;
return 0;
}
CreateMatirx(J, Route);
Floyd(Route,J.vexnum,weight,path,w,c);
fp.getline(sign,20,'\n');
cout<<endl<<endl<<"\t此两点的最短距离是:";
cout<<weight[w][c]<<endl;
cout<<endl<<"\t此两间最短路径的路线:"<<endl;
cout<<"\t\t"<<J.vert[w].title.Name<<"->";
for(int i=0;sign[i]!='@';i++)
{
x=(int)sign[i];
x=x-48;
cout<<J.vert[x].title.Name<<"->";
}
cout<<J.vert[c].title.Name<<endl;
system("pause");
fp.close();
return 1;
}
/********************************************************************************************************************/
int FirstAdjVex( Algraph J, int v,int Route[100][100] )//返回第一个邻接顶点
{
int i = 1;
while( Route[v][i]==25699 && i <= J.vexnum && Route[v][i]!=1 )
{
i++;
}
if( i <= J.vexnum )
{
return i;
}
else
{
return -1;
}
}
int NextAdjVex( Algraph J, int v, int w ,int Route[100][100])//返回v的相对于w的下一个邻接顶点
{
int i = w+1;
if( w == J.vexnum )
{
return -1;
}
else
{
while(Route[v][i]==25699 && i <= J.vexnum && Route[v][i]!=1 )
{
i++;
}
if( i <= J.vexnum )
{
return i;
}
else
{
return -1;
}
}
}
void FindAll( Algraph &J,int v,int w,int length ,int Route[100][100])//递归查找
{
int i = 1;
int j = -1;
path[length] = v;
visited[v] = true;
if( v == w )
{
printf("Found one path:");
for(i=0; path[i] != 0; i++)
{
cout<<J.vert[path[i]].title.Name<<"->";
}
cout<<"!到达!";
cout<<endl;
visited[v] = false;
path[length] = 0;
}
else
{
for(j=FirstAdjVex( J, v, Route ); j>0; j=NextAdjVex( J, v, j ,Route))
{
if( !visited[j] )
{
FindAll( J, j, w, length+1,Route );//继续寻找
}
}
visited[v] = false;//允许曾经被访问过的结点出现在另一条路径中
path[length] = 0;
}
}
void FindAllpath(Algraph &J)//查找所有路径
{
J=Revert(J);
char vh,wh;
int v,w,i;
show(J);
cout<<endl<<"\t\t请输入要查结点的第一个标号:"<<endl<<"\t\t";
cin>>vh;
cout<<endl<<"\t\t请输入要查结点的第二个标号:"<<endl<<"\t\t";
cin.ignore();
cin>>wh;
v=locate(J,vh);
w=locate(J,wh);
for(i=1; i<=J.vexnum; i++ )
{
visited[i] = false;
}
for(i=1; i<=100; i++ )
{
path[i] = 0;
}
int Route[100][100];
CCreateMatirx(J,Route);
FindAll(J,v,w,0,Route);
}
/*********************************************************************************************************************/
int login()//初始化,初始化之后你将成为管理员
{
fstream fp;
int i;
char usenamea[10],usenameb[10];
int sign=1,sigm=1;
cout<<endl<<endl<<"\t\t\t初始化用户名"<<endl<<endl<<endl;
while(sign==1&&sigm<3)
{
cout<<"\t\t请输入用户名(注意是输入六位数字!!)"<<endl<<"\t\t\t";
cin.getline(usenamea,10,'\n');
if(strlen(usenamea)>=7)
{
cin.ignore(20,'\n');
return 0;
}
cout<<"\t\t请再次输入用户名(注意是输入六位数字!!)"<<endl<<"\t\t\t";
cin.getline (usenameb,10,'\n');
for( i=0;i<6;i++)
{
if(usenamea[i]!=usenameb[i])
{
cout<<endl<<"\t\t\t两次输入不相同!"<<endl;
cout<<endl<<"\t\t\t请再次输入"<<endl;
sign=1;
sigm=sigm+1;
break;
}
}
if(i==6)
{
sign=2;
}
}
if(sigm==3)
{
system("cls");
cout<<endl<<endl<<endl<<"\t\t\t抱歉,你总是输入错误,只好退出"<<endl;
}
fp.open("key.dat",ios::in|ios::out|ios::binary|ios::trunc);
if(fp.fail())
{
cout<<"打开文件失败"<<endl;
exit(0);
}
fp.write((char*)&usenamea,sizeof(usenamea));
fp.close();
return 1;
}
/*********************************************************************************************************************/
int Affirm()//确认是否是管理员
{
fstream fp;
int k,sign;
char key[10],name[10];
fp.open("key.dat",ios::in);
if(fp.fail())
{
cout<<"打开文件失败"<<endl;
exit(0);
}
fp.read((char*)&key,sizeof(key));
cout<<endl<<endl<<endl<<endl<<"\t\t请输入用户名:(注意是六位数字!)\t"<<endl<<"\t\t\t";
cin.ignore();
cin.getline(name,10,'\n');
k=strlen(name);
sign=1;
while(k>6&&sign<=1)
{
cin.ignore();
cin.getline(name,10,'\n');
k=strlen(name);
sign=sign+1;;
}
if(sign>3)
{
cout<<endl<<endl<<"\t\t\t抱歉你总是输入错误,退出了"<<endl;
return 0;
}
for(int i=0;i<6;i++)
{
if(name[i]!=key[i])
{
return 0;
break;
}
}
return 1;
system("cls");
}
/***********************************************************************************************/
void showM(Algraph &J)
{
char ch;
cout<<endl<<endl<<"\t请选择你要进行的操作"<<endl<<endl;
cout<<"\t\ta 添加景点"<<endl;
cout<<"\t\tb 添加道路"<<endl;
cout<<"\t\tc 删除景点"<<endl;
cout<<"\t\td 删除道路"<<endl;
cout<<"\t\te 更新景点和道路的信息"<<endl;
cout<<"\t\tf 重新建立系统信息(建议非不得已的情况下才使用!!!!!!!)"<<endl;
cout<<endl<<"\t请输入选择:"<<endl<<"\t\t\t";
cin>>ch;
system("pause");
system("cls");
switch(ch)
{
case 'a':
{
AddVnode(J);
cout<<"添加景点完毕"<<endl;
}
break;
case 'b':
{
Addside(J);
cout<<"添加道路完毕"<<endl;
}
break;
case 'c':
{
DeleteVnode(J);
cout<<"删除景点完毕"<<endl;
}
break;
case 'd':
{
Deleteside(J);
cout<<"删除道路完毕"<<endl;
}
break;
case'e':
{
UpdateInfo(J);
cout<<"更新景点和道路的信息完毕"<<endl;
}
break;
case'f':
{
cout<<"确认要修改吗?请选择(y|n):"<<endl;
cin>>ch;
while(ch=='y')
{
Create(J);
cout<<"创建过程中出现错误了吗(y|n)"<<endl;
cin>>ch;
}
}break;
default :cout<<endl<<endl<<endl<<endl<<"\t\t\t\t出错啦!!!"<<endl;
}
}
/*****************************************/
void Manange(Algraph &J)
{
int i;
char ch;
cout<<endl<<endl<<endl<<"\t\t\t确认一下你是不是管理员";
system("cls");
i=Affirm();
if(i==0)
{
cout<<"\t\t抱歉,你不是管理员,不能进行下面的操作!"<<endl;
system("pause");
}
else
{
system("cls");
showM(J);
system("pause");
system("cls");
cout<<endl<<endl<<endl<<"\t\t\t还要继续处理吗?请选择(y|n)"<<endl;
cout<<"\t\t\t输入:"<<endl<<"\t\t\t";
cin>>ch;
if(ch=='n')
{
cout<<"退出此管理系统"<<endl;
}
while(ch=='y')
{
showM(J);
system("cls");
cout<<endl<<endl<<endl<<endl<<endl<<"\t\t\t还要继续处理吗?请选择(y|n)"<<endl;
cout<<"\t\t\t输入:"<<endl;
cin>>ch;
if(ch=='n')
{
cout<<"\t\t\t\t退出此管理系统"<<endl;
break;
}
}
cout<<"谢谢使用"<<endl;
}
}
/******************************************************************************************************/
void Menushow()
{
system("cls");
cout<<endl<<endl<<endl;
cout<<endl;
cout<<"\t\t **********用户主菜单********* "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"\t\t a.查询景点信息 "<<endl<<endl;
cout<<"\t\t b.查询两个景点间的最短路径 "<<endl<<endl;
cout<<"\t\t c.查询两个景点间的所有路径 "<<endl<<endl;
cout<<"\t\t d.修改系统信息 "<<endl<<endl;
cout<<"\t\t e.退出系统 "<<endl;
cout<<"\t\t "<<endl;
cout<<"\t\t 请选择: "<<endl;
cout<<"\t\t\t";
}
/******************************************************************************************************/
void MainMenu(Algraph &J)
{
system("cls");
char ch;
int sign =1;
cout<<endl<<endl<<endl;
cout<<endl<<endl<<"\t^************************************************************^"<<endl;
cout<<endl<<"\t\t\t欢迎使用校园导游系统!"<<endl<<endl;
cout<<"\t^************************************************************^"<<endl;
system("pause");
Menushow();
cin>>ch;
if(ch=='e')
{sign=2;}
if(ch=='a')
{sign=1;}
if(ch=='b')
{sign=1;}
if(ch=='c')
{sign=1;}
if(ch=='d')
{sign=1;}
system("cls");
while(sign==1)
{
switch(ch)
{
case 'a':
{
system("cls");
Lookup(J);
cout<<"返回用户菜单"<<endl;
system("pause");
sign=1;
Menushow();
cin>>ch;
} break;
case 'b':
{
system("cls");
Findclose(J);
cout<<"返回用户菜单"<<endl;
sign=1;
system("pause");
Menushow();
cin>>ch;
}break;
case 'c':
{
system("cls");
FindAllpath(J);
sign=1;
system("pause");
Menushow();
cin>>ch;
}
case 'd':
{
cout<<endl<<endl;
Manange(J);
cout<<"返回用户菜单"<<endl;
sign=1;
Menushow();
cin>>ch;
}break;
case 'e':
{
sign=2;
}break;
default: cout<<"出错啦!!!!"<<endl;
}
}
system("pause");
system("cls");
cout<<endl<<endl<<endl<<"\t\t\t\t退出系统,欢迎再次使用"<<endl;
}
void Init( Algraph &J)
{
char ch;
int sign=1;
cout<<endl<<endl<<"\t\t请选择要不要进行初始化(y|n)"<<endl<<endl;
cout<<"\t\t初始化之后你就将拥有管理权限......"<<endl;
cout<<"请输入你的选择:\t\t";
cin>>ch;
cin.ignore(20,'\n');
if(ch=='y')
{
login();
sign=2;
system("cls");
}
system("cls");
if(ch=='n'||sign==2)
{
system("cls");
MainMenu(J);
}
}
/*********************************************************************************************************************/
void main()
{
Algraph J;
Init(J);
//login();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -