交通咨询系统课程设计

来源:互联网 发布:伴奏软件下载 编辑:程序博客网 时间:2024/05/01 10:48

//////////**********************//////////////////////
//                  交通咨询系统v1.0               ///
//              作者:钱策 Author by QianCe        ///
//   班级 05计算机一班 学号:05205020120    ///
///         mail:sikes000@163.com  QQ:185028076   ///
/////////***********************//////////////////////

///////////////////////
//邻接矩阵类

//AdiMatrix.h

#ifndef ADJMATRIX_H
#define ADJMATRIX_H
#include<vector>
#include<string>
using namespace std;

const int MaxValue=100;//最大值
struct EdgeType{
 int iDistance;//路程
 int iCost;    //费用
 float fTime;  //所花费的时间
};
//城市结构体,包括城市名字以及城市在图中的编号
struct City{
 int Number;
 char *Name;

};
//交通网络图,有iVexNum个城市,城市之间有iEdgNum条路线,每条路线上的时间路程费用为
//Route[MaxValue][MaxValue]
class AdjMatrix{
public:
 //AdjMatrix();//图的初始化,构造函数
 AdjMatrix(int n);
 int   GetVexNum();//取得交通图的城市个数
 int   GetEdgNum();//取得交通图的路线数目
 char*  GetCityName  (const int i);//通过序号取得城市的名字
 int   GetCityNum(char* cityname);//通过城市名字取得城市的编号
 //EdgeType GetRoute (const int v1,const int v2);
 void Check(int &i,int &j);//检查输入的边的序号是否越界,若越界就重输
 void CreateGraph();//构造交通图
 void PrintGragh();//**************************供测试用
 void ShowRouteLength();//向用户显示路程长度
 void ShowRouteCost();//向用户显示路程车票
 void ShowRouteTime();//向用户显示路程时间
 void Dijkstra(int v,int dist[],int path[]);//求一个源点到其他点的最短性质
 void DijkstraShortDistance();//一个城市到其他城市的最短距离
 void DijkstraLessTime();//一个城市到其他城市的最少时间
 void DijkstraLessCost();//一个城市到其他城市的最少花费
 void Floyd(int dist[MaxValue][MaxValue],int path[MaxValue][MaxValue]);
 //两个点之间的最短性质
 void FloydShortDistance();//两个城市之间的最段距离
 void FloydLessTime();//两个城市之间的最少时间
 void FloydLessCost();//两个城市之间的最少花费
private:
 int iVexNum;//顶点数,即城市个数
 int iEdgNum;//边数,即城市间的路线
 City city[MaxValue];//图的顶点,即城市
 EdgeType Route[MaxValue][MaxValue];//各边的权值,即路线的时间费用以及路程
};
#endif 

 

 

 

//AdjMatrix.cpp

#include "AdjMatrix.h"
#include<iostream>
using namespace std;
AdjMatrix::AdjMatrix(int n)//初始化有n个顶点的邻接矩阵
{
 for(int i=0;i<n;i++)
  for(int j=0;j<n;j++)
  {
   if(i==j)
   {
    Route[i][j].fTime=0;
    Route[i][j].iCost=0;
    Route[i][j].iDistance=0;
   }    
   else
   {
    Route[i][j].fTime=MaxValue;
    Route[i][j].iCost=MaxValue;
    Route[i][j].iDistance=MaxValue;
   }     
  }
 iVexNum=iEdgNum=0;
}

int AdjMatrix::GetVexNum()
{
 return iVexNum; 
}
int AdjMatrix::GetEdgNum()
{
 return iEdgNum;
}
char* AdjMatrix::GetCityName(const int i)//取城市的名字
{
 if(i<0||i>iVexNum)
 {
  cerr<<"参数越界,发生错误了!"<<endl;
  exit(1);
 }
 return city[i].Name;
}

int AdjMatrix::GetCityNum(char* cityname)
{
 for(int i=1;i<=iVexNum;i++)
 {
  if (strcmp(city[i].Name,cityname)==0)
   return city[i].Number;   
 }
 cerr<<"您输入的城市有错误"<<endl;
   
  
 return -1;
}
void AdjMatrix::PrintGragh()//将图打印出来,最初测试之用
{
 for(int i=0;i<iVexNum;i++)
 {
  for(int j=0;j<iVexNum;j++)
  {
   if(100==Route[i+1][j+1].iDistance)
   {
    Route[i+1][j+1].iDistance=1000;

   }
    cout<<Route[i+1][j+1].iDistance<<"/t";

  }
  cout<<endl;
 }
}
 

void AdjMatrix::Check(int &i,int &j)//检查输入的边的序号是否越界,若越界就重输
{
 while(1)
 {
  if(i<0||i>iVexNum||j<0||j>iVexNum)
   cerr<<"参数越界,发生错误了,请重输!"<<endl;
  else return;
  cin>>i>>j;
 }
}
////////////////////////////////////done//////////////////////////////////
void AdjMatrix::CreateGraph()
//为了方便真是先把时间跟费用这两个权值给屏蔽掉了
{
 City city1,city2;
 int time,distance,cost;
 char flag='y';
 char *ch=new char(10);
 cout<<"请输入城市的数目:";
 cin>>iVexNum;

 cout<<"输入城市的信息:"<<endl;
 for(int i=1;i<=iVexNum;i++)
 {  
  cout<<"序号"<<i<<"的";
  cout<<"城市名字:";
  city[i].Name=new char;
  cin>>city[i].Name;
  city[i].Number=i;
 }
 cout<<"请输入路线的数目:"<<endl;
 cin>>iEdgNum;
 for(i=0;i<iEdgNum;i++)
 {  
   cout<<"输入两个城市的信息:"<<endl;
  // cout<<"城市1序号:";
  // cin>>city1.Number;
   cout<<"城市1名字:";
   city1.Name=new char;
   cin>>city1.Name;
  // cout<<"序号是"<<GetCityNum(city1.Name)<<endl;
  // cout<<"城市2序号:";
  // cin>>city2.Number;
   city1.Number=GetCityNum(city1.Name);
   cout<<"城市2名字:";
   city2.Name=new char;
   cin>>city2.Name;
   city2.Number=GetCityNum(city2.Name);        
  //cout<<"序号是"<<GetCityNum(city2.Name)<<endl;
  // cout<<"所用时间:";
  // cin>>time;
  // Route[city1.Number][city2.Number].fTime=time;
  // Route[city2.Number][city1.Number].fTime=time;
  // cout<<"所用费用:";
  // cin>>cost;
  // Route[city1.Number][city2.Number].iCost=cost;
  // Route[city2.Number][city1.Number].iCost=cost;
   cout<<"两地的路程:";
   cin>>distance;
   Route[city1.Number][city2.Number].iDistance=distance;
  // Route[city2.Number][city1.Number].iDistance=distance;  
  
 } 
 /*
 可以保存到相应的文件
 FILE *fp1,*fp2;
 if((fp1=fopen("city.txt","wb"))==NULL)
 {
  printf("无法打开文件!/n");
  return;
  } 
 for(int j=1;j<=iVexNum;j++)
 {
  fprintf(fp1,"%d->",city[j].Number);
  fprintf(fp1,"%s    ",city[j].Name); 
  fprintf(fp1,"/n");
 }
 fclose(fp1);
 if((fp2=fopen("info.txt","wb"))==NULL)
 {
  printf("无法打开文件!/n");
  return;
  }
 for(j=1;j<=iEdgNum;j++)
 {
  fprintf(fp2,"%d.distance: %d,cost: %d,time: %f",j,
         Route[city1.Number][city2.Number].iDistance,
         Route[city1.Number][city2.Number].iCost,
         Route[city1.Number][city2.Number].fTime);
 }
  fclose(fp2);
*/  return;
   
 
}


void AdjMatrix::ShowRouteLength()//向用户显示各个城市之间路程长度
{
 cout<<"/t";
 for(int i=1;i<=iVexNum;i++)
  cout<<city[i].Name<<"/t";
 cout<<endl; 
 for(i=1;i<=iVexNum;i++)
 { 
  cout<<city[i].Name<<"/t";
  for(int j=1;j<=iVexNum;j++)
    cout<<Route[i][j].iDistance<<"/t";
  cout<<endl;
 }

}
void AdjMatrix::ShowRouteCost()//向用户显示各个城市之间路程车票

 cout<<"/t";
 for(int i=1;i<=iVexNum;i++)
  cout<<city[i].Name<<"/t";
 cout<<endl; 
 for(i=1;i<=iVexNum;i++)
 { 
  cout<<city[i].Name<<"/t";
  for(int j=1;j<=iVexNum;j++)
    cout<<Route[i][j].iCost<<"/t";
  cout<<endl;
 }

}
void AdjMatrix::ShowRouteTime()//向用户显示各个城市之间路程时间
{
cout<<"/t";
 for(int i=1;i<=iVexNum;i++)
  cout<<city[i].Name<<"/t";
 cout<<endl; 
 for(i=1;i<=iVexNum;i++)
 { 
  cout<<city[i].Name<<"/t";
  for(int j=1;j<=iVexNum;j++)
    cout<<Route[i][j].fTime<<"/t";
  cout<<endl;
 }

}

 


void AdjMatrix::Dijkstra(int v0,int dist[],int path[])//求一个源点到其他点的最短距离
//函数里面城市图的权值还是先展示用的两地路程 即iDistance
{
 int mindis;
 int *s=new int(10);
 int u;
 for(int i=1;i<=iVexNum;i++)
 {
  dist[i]=Route[v0][i].iDistance;
  s[i]=0;
  if(i!=v0&&dist[i]<MaxValue)
   path[i]=v0;
  else path[i]=-1; 
 }
 dist[v0]=0;
 s[v0]=1;
 for(i=1;i<iVexNum;i++)
 { 
  
  mindis=MaxValue;
  for(int j=1;j<=iVexNum;j++)
  {
   if(0==s[j]&&dist[j]<mindis)
   {
       u=j;
    mindis=dist[j];
   }
  }
  if(mindis==MaxValue)  return;
  s[u]=1;
  for(int w=1;w<=iVexNum;w++)
   if (0==s[w]&&Route[u][w].iDistance<MaxValue&&dist[u]+Route[u][w].iDistance<dist[w])
   {
    dist[w]=dist[u]+Route[u][w].iDistance;
    path[w]=u;
   }
   
 }


}


void AdjMatrix::DijkstraShortDistance()//求一个城市到其他城市的最短路程
//然后将这个路线打印出来,不过是倒着打的,要正打的话可以用一个栈来实现
{
 char *cityname=new char;
 cout<<"请输入您要查询的城市:";
 cin>>cityname;
 int v0=GetCityNum(cityname);
 int *dist=new int[iVexNum];
 int *path=new int[iVexNum];
 Dijkstra(v0,dist,path);
 cout<<"从"<<cityname<<"城市到其他城市的最短路程为:"<<endl;
 for(int i=1;i<=iVexNum;i++)
 {
  cout<<"到城市"<<GetCityName(i)
   <<"的最短距离为"<<dist[i]<<"/n";
  
  if(path[i]!=-1)
  {
   cout<<"路径为"<<GetCityName(i)<<"<-";
   int x=path[i];
   while(x!=v0)
   {
   
    cout<<GetCityName(x)<<"<-";
    x=path[x];
   }
   cout<<cityname;
   cout<<endl;
  }
  else cout<<endl;
 }
 

}
void AdjMatrix::DijkstraLessTime()
{
 char *cityname=new char;
 cout<<"请输入您要查询的城市:";
 cin>>cityname;
 int v0=GetCityNum(cityname);
 int *dist=new int[iVexNum];
 int *path=new int[iVexNum];
 Dijkstra(v0,dist,path);
 cout<<"从 "<<cityname<<"城市到其他城市的最少时间为:/n";
 for(int i=1;i<=iVexNum;i++)
 {
  cout<<"到城市"<<GetCityName(i)
   <<"的最少时间为"<<dist[i]<<endl;
 }
}
void AdjMatrix::DijkstraLessCost()
{
 char *cityname=new char;
 cout<<"请输入您要查询的城市:";
 cin>>cityname;
 int v0=GetCityNum(cityname);
 int *dist=new int[iVexNum];
 int *path=new int[iVexNum];
 Dijkstra(v0,dist,path);
 cout<<"从 "<<cityname<<"城市到其他城市的最少花费为:/n";
 for(int i=1;i<=iVexNum;i++)
 {
  cout<<"到城市"<<GetCityName(i)
   <<"的最少花费为"<<dist[i]<<endl;
 }
}

 

void AdjMatrix::Floyd(int dist[MaxValue][MaxValue],int path[MaxValue][MaxValue])
//求一个源点到其他点的最短距离
//函数里面城市图的权值还是先展示用的两地路程 即iDistance
{
 int i,j,k;
 for(i=1;i<=iVexNum;i++)
  for(j=1;j<=iVexNum;j++)
  {
   dist[i][j]=Route[i][j].iDistance;
   if(i!=j&&dist[i][j]!=MaxValue)
    path[i][j]=i;
   else
   
    if(i==j) path[i][j]=0;
    else     path[i][j]=-1;
   
  }
 for(k=1;k<=iVexNum;k++)
  for(i=1;i<=iVexNum;i++)
   for(j=1;j<=iVexNum;j++)
   {
    if (dist[i][j]>(dist[i][k]+dist[k][j]))
    {
     dist[i][j]=dist[i][k]+dist[k][j];
     path[i][j]=path[k][j];
    }
   }
}
void AdjMatrix::FloydShortDistance()//求一个城市到其他城市的最短路程
//然后将这个路线打印出来,不过是倒着打的,要正打的话可以用一个栈来实现
{
 char *cityname1=new char;
 char *cityname2=new char;
 int dist[MaxValue][MaxValue];
 int path[MaxValue][MaxValue];
 cout<<"请输入两个城市:";
 cout<<"城市1:";
 
 cin>>cityname1;
 cout<<"城市2:";
 cin>>cityname2;
 int i= GetCityNum(cityname1);
 int j= GetCityNum(cityname2); 
 Floyd( dist, path);
 cout<<"城市"<<cityname1<<"到城市"<<cityname2
  <<"的最短路径为"<<dist[i][j]<<endl;
 
 if(path[i][j]!=-1)
  {
   cout<<"路径为:"<<cityname2<<"<-";
   int x=path[i][j];
   while(x!=i)
   {
   
    cout<<GetCityName(x)<<"<-";
    x=path[i][x];
   }
   cout<<cityname1;
   cout<<endl;
  }
  else cout<<endl;
}

void AdjMatrix::FloydLessTime()
{
 char *cityname1=new char;
 char *cityname2=new char; 
 cout<<"请输入两个城市:";
 cout<<"城市1:";
 cin>>cityname1;
 cout<<"城市2:";
 cin>>cityname2;
 int i= GetCityNum(cityname1);
 int j= GetCityNum(cityname2);
 int dist[MaxValue][MaxValue];
 int path[MaxValue][MaxValue];
 Floyd( dist, path);
 cout<<"城市"<<cityname1<<"到城市"<<cityname2
  <<"的最少时间为"<<dist[i][j]<<endl;
}

void AdjMatrix::FloydLessCost()
{
 char *cityname1=new char;
 char *cityname2=new char; 
 cout<<"请输入两个城市:";
 cout<<"城市1:";
 cin>>cityname1;
 cout<<"城市2:";
 cin>>cityname2;
 int i= GetCityNum(cityname1);
 int j= GetCityNum(cityname2);
 int dist[MaxValue][MaxValue];
 int path[MaxValue][MaxValue];
 Floyd( dist, path);
 cout<<"城市"<<cityname1<<"到城市"<<cityname2
  <<"的最少花费为"<<dist[i][j]<<endl;
}

/*
//最初的代码。后来舍弃了
void AdjMatrix::CreateCity()
{
 int i=0,tempnumber=0;
 char temp='y';
 cout<<"请输入城市名字: "; 
 while('y'==temp||'Y'==temp)
 {
  City[i]=new char (MaxValue);
  cin>>City[i++];  
  cout<<"继续输入(y/n)?"<<endl;
  cin>>temp;
  cout<<"请输入城市名字: ";
  tempnumber++;
 }
 cout<<endl;
 iVexNum=tempnumber;
 
}

void AdjMatrix::CreateRoute()
{
 char *city1;
 char *city2;
 int cost;
 int time[2];
 int distance;
 cout<<"请输入各路线信息"<<endl;
 cout<<"起始城市:";
 cin>>city1;
 cout<<"目的城市:";
 cin>>city2;
 cout<<"路程:";
 cin>>distance;
 cout<<"费用:";
 cin>>cost;
 cout<<"开车时间:";
 scanf("%d:%d",&time[0],&time[1]);
 while(time[0]<0||time[0]>=24||time[1]<0||time[1]>=60)
        {
            cout<<"/n时间输入错误,请重输!"<<endl;            
            scanf( "%d:%d", &time[0], &time[1] );       
        }
 cout<<"到达时间:";
 scanf("%d:%d",&time[0],&time[1]);
 while(time[0]<0||time[0]>=24||time[1]<0||time[1]>=60)
        {
            cout<<"/n时间输入错误,请重输!"<<endl;            
            scanf( "%d:%d", &time[0], &time[1] );       
        }

 

}
  EdgeType AdjMatrix::GetRoute(const int v1,const int v2)//取权值
{
 if(v1<0||v1>iVexNum||v2<0||v2>iVexNum)
 {
  cerr<<"参数越界,发生错误了!"<<endl;
  exit(1);
 }
 return Route[v1][v2];
}
*/

//main.cpp

#include<iostream>
#include "AdjMatrix.h"
using namespace std;
AdjMatrix Gragh(10);
 ///////////////////////////////done///////////////////////////////////////////////
void Administrator()  //管理员管理项目的界面
//里面包括城市网络的初始化,以及增加城市等功能

 int i;
 cout<<endl;
 cout<<"*****这里是管理员的界面,欢迎进入*****"<<endl;
 cout<<"1=创建城市交通网络"<<endl
  <<"2=增加城市"<<endl
  <<"0=返回上一级菜单"<<endl;
 cout<<"请选择: ";
 cin>>i;
 while(i!=0)
 {
  switch(i)
  {
   case 1:Gragh.CreateGraph();break;
   case 2:{};break;//增加城市尚未实现(*^__^*)
  } 
  cout<<"1=创建城市交通网络"<<endl
   <<"2=增加城市"<<endl
   <<"0=返回上一级菜单"<<endl;
  cout<<"请选择: ";
  cin>>i;
 }
 return;
}
///////////////////////////////done///////////////////////////////////////////////
void OnetoAnotherInfo()//一个城市到其他城市信息的查询
{
 int i;
 cout<<endl;
 cout<<"1=咨询一个城市到其他城市的最短路径"<<endl
  <<"2=咨询一个城市到其他城市的最少时间"<<endl
  <<"3=咨询一个城市到其他城市的最少车票"<<endl
  <<"0=返回上一级菜单"<<endl;
 cout<<"请选择: ";
 cin>>i;
 while(i!=0)
 {
  switch(i)
  {
   case 1:Gragh.DijkstraShortDistance();break;
   case 2:Gragh.DijkstraLessTime();break;
   case 3:Gragh.DijkstraLessCost();break;
  } 
  cout<<"1=咨询一个城市到其他城市的最短路径"<<endl
   <<"2=咨询一个城市到其他城市的最少时间"<<endl
   <<"3=咨询一个城市到其他城市的最少车票"<<endl
   <<"0=返回上一级菜单"<<endl;
  cout<<"请选择: ";
  cin>>i;  
 }
 return; 
}

 

void TwoCityInfo()//两个城市之间的信息查询
{
 int i;
 cout<<endl; 
 cout<<"1=咨询两个城市之间的最短路程"<<endl
  <<"2=咨询两个城市之间的最少时间"<<endl
  <<"3=咨询两个城市之间的最少车票"<<endl
  <<"0=返回上一级菜单"<<endl;
 cout<<"请选择: ";
 cin>>i;
 while(i!=0)
 {
  switch(i)
  {
   case 1:Gragh.FloydShortDistance();break;
   case 2:Gragh.FloydLessTime();break;
   case 3:Gragh.FloydLessCost();break;
  } 
  cout<<"1=咨询两个城市之间的最短路程"<<endl
   <<"2=咨询两个城市之间的最少时间"<<endl
   <<"3=咨询两个城市之间的最少车票"<<endl
   <<"0=返回上一级菜单"<<endl;
  cout<<"请选择: ";
  cin>>i;  
 }
 return; 
}

void Passenger()//用户的界面
{
 int i;
 cout<<endl;
 cout<<"*****这里是乘客的界面,欢迎进入*****"<<endl;
 
 cout<<"1=咨询一个城市到其他城市的信息"<<endl
  <<"2=咨询两个城市之间的信息"<<endl
  <<"0=返回上一级菜单"<<endl;
 cout<<"请选择: ";
 cin>>i;
 while(i!=0)
 {
  switch(i)
  {
   case 1:OnetoAnotherInfo();break;
   case 2:TwoCityInfo();break;
  } 
  cout<<"1=咨询一个城市到其他城市的信息"<<endl
   <<"2=咨询两个城市之间的信息"<<endl
   <<"0=返回上一级菜单"<<endl;
  cout<<"请选择: ";
  cin>>i; 
 
 }
 return; 


}


///////////////////////////////done///////////////////////////////////////////////
void ShowTrafficNet()//显示交通网络
{
 
 int i;
 cout<<endl;
 cout<<"*****显示交通网,里面有个路线的长度,车票以及时间,欢迎进入*****"<<endl;
 cout<<"1=显示路程长度"<<endl
  <<"2=显示路线相对应的车票"<<endl
  <<"3=显示路线相对应的时间长度"<<endl
  <<"0=返回上一级菜单"<<endl;
 cout<<"请选择: ";
 cin>>i; 
 while(i!=0)
 {
  switch(i)
  {
   case 1:Gragh.ShowRouteLength();break;//显示城市间的路程
   case 2:Gragh.ShowRouteCost();break;//显示城市之间的费用
   case 3:Gragh.ShowRouteTime();break;//显示城市之间的所花时间
  } 
  cout<<"1=显示路程长度"<<endl
   <<"2=显示路线相对应的车票"<<endl
   <<"3=显示路线相对应的时间长度"<<endl
   <<"0=返回上一级菜单"<<endl;
  cout<<"请选择: ";
  cin>>i; 
 }
 return; 

}

///////////////////////////////done///////////////////////////////////////////////
int main()//主函数
{
 int i;
 cout<<"*****你好!这里是钱策版的交通系统咨询,欢迎使用*****"<<endl;
    cout<<"现在请您选择您的身份:"<<endl
        <<"1=管理员"<<endl
        <<"2=用户"<<endl
  <<"3=显示交通网(用矩阵形式)"<<endl
  <<"0=退出"<<endl;
 cout<<"请选择: ";
    cin >> i;
 while(i!=0)
 {
  switch(i)
  {
   case 1:Administrator();break;//此处要显示管理员的界面
   case 2:Passenger();break;//此处显示用户的界面  
   case 3:ShowTrafficNet();break;
  }
 cout<<"现在请您选择您的身份:"<<endl
        <<"1=管理员"<<endl
        <<"2=用户"<<endl
  <<"3=显示交通网(用矩阵形式)"<<endl
  <<"0=退出"<<endl;
 cout<<"请选择: ";
    cin >> i; 
 } 
    return 1; 
}