校园导游
#include<iostream>//数据结构课程设计 11、校园导游咨询(***)
#include<string>
#include<fstream>
#include<iomanip>
using namespace std;
#include<windows.h>
#define WHITE SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
//↑设置文字显示颜色为白色
#define YELLOW SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
//↑设置文字显示颜色为黄色
#define RED SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
//↑设置文字显示颜色为红色
#define GREEN SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY);
//↑设置文字显示颜色为绿色
#define BLUE SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
//↑设置文字显示颜色为蓝色
#define MAX 15//最大景点数量
typedef struct{//结构图用于储存景点信息
int num;//景点代号
string name;//名称
string jianjie;//简介
}node;
typedef struct{
node dingdian[MAX];//储存顶点的数组
int arcs[MAX][MAX];//邻接矩阵,元素值储存权值
int dnum,bnum;//顶点数量、边数量
}Graph;//无向网
void menu();//显示主菜单
void initGraph(Graph &G);//初始化网
void show(Graph &G);//显示所有景点信息
int getSuffix(Graph &G,int num);//传入序号,返回该序号顶点在数组中的下标
void numFind(Graph &G,int num);//根据代号查询景点信息
void nameFind(Graph &G,string name);//根据名称查询景点信息
void DIJ(Graph &G,int m,int n);//迪杰斯特拉算法,输出代号为m、n之间的顶点的最短路径
int main()
{
WHITE
int i,j,k,m,n;
string str;
fstream fs;
Graph G;
initGraph(G);
fs.open("data.txt",ios::in);//打开文件
if(!fs)
{
cout<<"打开文件失败!data.txt\n";
return 0;
}
i=0;
while(true)
{
fs>>m;
if(m==-1)//景点信息读取结束
break;
G.dingdian[i].num=m;//序号
fs>>G.dingdian[i].name;//名称
fs>>G.dingdian[i++].jianjie;//简介
G.dnum++;//顶点数量计数
}
//cout<<G.dnum<<endl;//测试:打印顶点数量
while(true)
{
fs>>i;
if(!fs)//文件读取结束
break;
fs>>j>>k;//边的两个顶点序号、权值
//cout<<i<<" "<<j<<"--";
i=getSuffix(G,i);//i为序号i的顶点的数组下标
j=getSuffix(G,j);
//cout<<i<<" "<<j<<endl;
G.bnum++;//边数量计数
//cout<<G.bnum<<endl;//测试:打印边数量
G.arcs[i][j]=G.arcs[j][i]=k;//权值存入矩阵,矩阵沿对角线对称,arcs[i][j]=arcs[j][i]均为i、j间边的权值
}
/*for(i=0;i<MAX;i++)//测试:打印邻接矩阵
{
for(j=0;j<MAX;j++)
cout<<G.arcs[i][j]<<" ";
cout<<endl;
}*/
fs.close();
while(true)
{
cin>>i;
switch(i)
{
case 1:show(G);break;
case 2:
cout<<"请输入景点代号:";
cin>>j;
numFind(G,j);break;
case 3:
cout<<"请输入景点名称:";
cin>>str;
nameFind(G,str);break;
case 4:
cout<<"请分别输入出发地、目的地景点代号(以空格间隔):\n";
cin>>m>>n;
default: return 0;
}
}
}
void DIJ(Graph &G,int m,int n)//迪杰斯特拉算法,输出代号为m、n之间的顶点的最短路径
{
}
void numFind(Graph &G,int num)//根据代号查询景点信息
{
GREEN
int i;
cout<<"查找结果:\n";
for(i=0;i<G.dnum;i++)
{
if(G.dingdian[i].num==num)
{
cout<<"代号:"<<G.dingdian[i].num<<" 名称:"<<G.dingdian[i].name<<" 简介:"<<G.dingdian[i].jianjie<<endl;
break;
}
}
if(i==G.dnum)
cout<<"无符合条件的景点!\n";
WHITE
}
void nameFind(Graph &G,string name)//根据名称查询景点信息
{
GREEN
int i;
cout<<"查找结果:\n";
for(i=0;i<G.dnum;i++)
{
if(G.dingdian[i].name==name)
{
cout<<"代号:"<<G.dingdian[i].num<<" 名称:"<<G.dingdian[i].name<<" 简介:"<<G.dingdian[i].jianjie<<endl;
break;
}
}
if(i==G.dnum)
cout<<"无符合条件的景点!\n";
WHITE
}
void show(Graph &G)//显示所有景点信息
{
cout.setf(ios::left);//靠左对齐
RED
cout<<setw(5)<<"代号"<<setw(20)<<"名称"<<"简介"<<endl;
GREEN
for(int i=0;i<G.dnum;i++)
cout<<setw(5)<<G.dingdian[i].num<<setw(20)<<G.dingdian[i].name<<G.dingdian[i].jianjie<<endl;
WHITE
}
void initGraph(Graph &G)//初始化网
{
G.bnum=G.dnum=0;
int i,j;
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
G.arcs[i][j]=-1;//邻接矩阵初始化为-1,表示i、j之间无边
/*for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
cout<<G.arcs[i][j]<<endl;*/
}
int getSuffix(Graph &G,int num)//传入序号,返回该序号顶点在数组中的下标
{
int i;
for(i=0;i<G.dnum;i++)
{
if(G.dingdian[i].num==num)
return i;
}
}
void menu()//显示主菜单
{ RED
cout<<"╔═════════════主菜单═════════════╗\n";
cout<<"║请选择操作: ║\n";
cout<<"║1、显示所有景点信息; ║\n";
cout<<"║2、输入代号查询景点信息; ║\n";
cout<<"║3、输入名称查询景点信息; ║\n";
cout<<"║4、最短路线查询; ║\n";
cout<<"║输入其它数字可退出系统。 ║\n";
cout<<"╚═════════════════════════════╝\n";
WHITE
}