问题描述
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息;
(2)提供基本信息的修改功能;
(3)为来访客人提供图中任意景点相关信息的查询;
(4)为来访客人提供景点的问路查询,即已知一个景点,查询到某景点之间的一条最短路径及长度。
算法思想
用直接赋值的方法给予各个景点信息,若两景点之间可达,则对路径长度赋值,对于自己到自己的路径,赋值为0,其他均赋成最大值。查看所有景点时,就遍历结构体数组,然后全部输出;查询景点,根据输入的景点代号,遍历数组然后利用字符串比较方法找到所查询的景点,输出景点的具体信息;修改景点信息的第一步为查找到该景点,然后将该景点的所有信息清空,重新输入即可;问路求最短路径及长度即是采用弗洛伊德算法,获得具体的最短路径时,从后往前追溯走过的结点,并且用一个数组记录下它的位置,然后再遍历数组输出所经过的每个点的信息。
算法设计
1、菜单显示void menu()——供用户选择的功能菜单。
2、输出所有景点信息void Allprint(AMGragh G)——输出景点名称、代号和简介。
3、建图void CreateUDG(AMGragh &G)——用直接赋值的方法给予各个景点信息,若两景点之间可达,则对路径长度赋值,对于自己到自己的路径,赋值为0,其他均赋成最大值。
4、修改信息void Change(AMGragh &G)——修改景点信息的第一步为查找到该景点,然后将该景点的所有信息清空,重新输入即可。
5、查询景点void Query(AMGragh G)——查询景点,根据输入的景点代号,遍历数组然后利用字符串比较方法找到所查询的景点,输出景点的具体信息。
6、弗洛伊德算法void Floyd(AMGragh G)——获得最短路径及长度。
7、获得具体路径void Path(AMGragh G,int a,int b)——从后往前追溯走过的结点,并且用一个数组记录下它的位置,然后再遍历数组输出所经过的每个点的信息。
8、问路void Ask(AMGragh G)——调用函数输出具体路径及长度。
9、主函数int main()——先调用建图函数,然后用while循环实现不断地对功能进行选择。
代码实现
#include<stdio.h>//实验四
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define Max 11
#define MX 999999
int D[Max][Max];
int path[Max][Max];
typedef struct Ver{//顶点信息
char num[5];
char name[51];
char instruct[101];
}Ver;
typedef struct{//邻接矩阵
Ver vex[Max];//顶点表
int arcs[Max][Max];
int vnum,arcnum;
}AMGragh;
void menu(){
cout<<"************欢迎您************"<<endl;
cout<<" 1、查看所有景点 "<<endl;
cout<<" 2、景点查询 "<<endl;
cout<<" 3、问路 "<<endl;
cout<<" 4、修改景点基本信息 "<<endl;
cout<<" 5、退出 "<<endl;
cout<<"**********************************"<<endl;
cout<<"请选择..."<<endl;
}
void Allprint(AMGragh G){//输出所有景点信息
cout<<"---------------校园景点总览---------------"<<endl;
cout<<"景点名称 "<<" "<<"代号"<<" "<<" 简介"<<endl;
for(int i=0;i<G.vnum;i++){
cout<<G.vex[i].name<<" "<<G.vex[i].num<<" "<<G.vex[i].instruct<<endl;
}
cout<<endl;
}
void CreateUDG(AMGragh &G){//建图
G.vnum=10;
strcpy(G.vex[0].num,"01");
strcpy(G.vex[1].num,"02");
strcpy(G.vex[2].num,"03");
strcpy(G.vex[3].num,"04");
strcpy(G.vex[4].num,"05");
strcpy(G.vex[5].num,"06");
strcpy(G.vex[6].num,"07");
strcpy(G.vex[7].num,"08");
strcpy(G.vex[8].num,"09");
strcpy(G.vex[9].num,"10");
strcpy(G.vex[0].name,"北苑美食城");
strcpy(G.vex[1].name,"北操场 ");
strcpy(G.vex[2].name,"体育馆 ");
strcpy(G.vex[3].name,"图书馆 ");
strcpy(G.vex[4].name,"广场1 ");
strcpy(G.vex[5].name,"广场2 ");
strcpy(G.vex[6].name,"湿地公园 ");
strcpy(G.vex[7].name,"公园2 ");
strcpy(G.vex[8].name,"湖 1 ");
strcpy(G.vex[9].name,"公园3 ");
strcpy(G.vex[0].instruct,"北苑美食城里面有各种各样的美食,可以让你大饱口福");
strcpy(G.vex[1].instruct,"北操场是北苑的一个运动场地,也是一个篮球场");
strcpy(G.vex[2].instruct,"体育馆设施齐全,建筑优美,在此可以尽情享受运动的快乐!");
strcpy(G.vex[3].instruct,"图书馆环境安适,藏书丰富,让人感受阅读的美好");
strcpy(G.vex[4].instruct,"广场1与学校西门相邻,也是升国旗的地方");
strcpy(G.vex[5].instruct,"广场2上会举办一些文艺晚会和校园招聘会,更是轮滑爱好者的乐园");
strcpy(G.vex[6].instruct,"湿地公园有小石桥和美丽的树木,让人心旷神怡");
strcpy(G.vex[7].instruct,"公园2的标志是一对白色的大海豚,坐落在水中央,夏天水中开有漂亮的莲花");
strcpy(G.vex[8].instruct,"湖 1的水清澈见底,还能看到活泼的小鱼");
strcpy(G.vex[9].instruct,"公园3里往届校友栽的树,生机勃勃,代表着他们对母校的爱");
G.arcs[1][2]=G.arcs[2][1]=2;
G.arcs[1][9]=G.arcs[9][1]=19;
G.arcs[2][3]=G.arcs[3][2]=3;
G.arcs[2][4]=G.arcs[4][2]=5;
G.arcs[3][4]=G.arcs[4][3]=2;
G.arcs[4][5]=G.arcs[5][4]=3;
G.arcs[4][7]=G.arcs[7][4]=29;
G.arcs[4][10]=G.arcs[10][4]=33;
G.arcs[5][6]=G.arcs[6][5]=6;
G.arcs[6][7]=G.arcs[7][6]=7;
G.arcs[7][8]=G.arcs[8][7]=8;
G.arcs[8][9]=G.arcs[9][8]=1;
G.arcs[9][10]=G.arcs[10][9]=2;
for(int i=1;i<=10;i++)//初始化路径长度
for(int j=1;j<=10;j++){
if(G.arcs[i][j]==0&&i!=j)
G.arcs[i][j]=MX;
}
G.arcnum=13;
}
void Change(AMGragh &G){//修改信息
Allprint(G);
cout<<"请输入要修改信息的代号:";
char c[5];
cin>>c;
for(int i=0;i<G.vnum;i++){
if(strcmp(c,G.vex[i].num)==0)//字符串比较的方法进行查找
{
memset(G.vex[i].name,0,sizeof(G.vex[i].name));
memset(G.vex[i].num,0,sizeof(G.vex[i].num));
memset(G.vex[i].instruct,0,sizeof(G.vex[i].instruct));
char num1[5];
char name1[51];
char instruct1[101];
cout<<"请输入修改后的景点信息:"<<endl;
cout<<"景点名称:";
scanf("%s",name1);
cout<<"代号:";
scanf("%s",num1);
cout<<"简介:";
scanf("%s",instruct1);
strcpy(G.vex[i].name,name1);
strcpy(G.vex[i].num,num1);
strcpy(G.vex[i].instruct,instruct1);
cout<<"修改成功!"<<endl;
break;
}
}
}
void Query(AMGragh G){//查询景点
cout<<"请输入查询景点的代号:";
char c[5];
cin>>c;
int i;
for(i=0;i<G.vnum;i++)
if(strcmp(c,G.vex[i].num)==0)
{
cout<<"景点名称:"<<G.vex[i].name<<" ";
cout<<"代号:"<<G.vex[i].num<<" ";
cout<<"简介:"<<G.vex[i].instruct<<endl;
break;
}
if(i==G.vnum)
cout<<"该代号不存在!"<<endl;
}
void Floyd(AMGragh G){//弗洛伊德算法,获得最短路径
int i,j,k;
for(i=1;i<=G.vnum;++i)
for(j=1;j<=G.vnum;j++){
D[i][j]=G.arcs[i][j];
if(D[i][j]<MX&&i!=j)
path[i][j]=i;
else
path[i][j]=-1;
}
for(k=1;k<=G.vnum;k++)
for(i=1;i<=G.vnum;++i)
for(j=1;j<=G.vnum;j++)
if(D[i][k]+D[k][j]<D[i][j]){
D[i][j]=D[i][k]+D[k][j];
path[i][j]=path[k][j];
}
}
void Path(AMGragh G,int a,int b){//获得具体路径
int p[Max];
p[0]=b;
int i=1;
while(a!=b){
b=path[a][b];
p[i]=b;
++i;
}
cout<<"路径:"<<G.vex[a-1].name;
i=i-2;
while(i>=0){
cout<<"--->"<<G.vex[p[i]-1].name;
--i;
}
}
void Ask(AMGragh G){//问路
Allprint(G);
cout<<"请输入起点和目的地(1~10,即第几个景点,中间用空格隔开):";
int a,b;
cin>>a>>b;
Floyd(G);
cout<<endl<<endl<<"从"<<G.vex[a-1].name<<"到"<<G.vex[b-1].name<<":"<<endl<<endl<<"最短路径长度:"<<D[a][b]*10<<"米"<<endl;
Path(G,a,b);
cout<<endl;
}
int main(){
AMGragh G;
memset(G.arcs,0,sizeof(G.arcs));
CreateUDG(G);
int m;
while(m!=5){
menu();
cin>>m;
switch(m){
case 1:
Allprint(G);
break;
case 2:
Query(G);
break;
case 3:
Ask(G);
break;
case 4:
Change(G);
break;
case 5:
cout<<"感谢您的使用!"<<endl;
return 0;
default:
cout<<"没有该选项!"<<endl;
}
system("pause");
system("cls");
}
return 0;
}