⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 导游.cpp

📁 数据结构课设做的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				{   
					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 + -