数据结构课设任务内容

校园导游咨询(图的应用)

[问题描述]
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息;
(2)提供基本信息的修改功能;
(3)为来访客人提供图中任意景点相关信息的查询;
(4)为来访客人提供景点的问路查询,即已知一个景点,查询到某景点之间的一条最短路径及长度。

设计思路

构建结构体

typedef struct{		//景点相关信息
	char name[M];//景点名称
	char number[M];//景点代号
	char Introduction[M];//景点简介
}Datatype;
typedef struct{
	int num; //景点编号
	Datatype data;//景点信息
}View;
typedef struct {
	View view[MAXNum];//存放顶点的一堆数组,在0位单元没有
	int pathlen[MAXNum][MAXNum];//存放路径的长度
	int m,n;
}MGraph;
MGraph MGr;//全局变量,定义MGr为MGraph类型
int pathlen[MAXNum][MAXNum];//存储路径
int shortest[MAXNum][MAXNum];//定义最小路径

创建函数方法

void Init()//构建景点信息
void ChangeMapMes()/*修改景点信息*/
void Map()//景点地图
void ViewMes()/*查看景点信息*/ 
void Floyd()//弗洛伊德算法
void PrintPath(){/打印路径
void Shortest()//最短路径
void Menu()//界面菜单
int main()//主函数

采用Floyd算法求景点之间的路径

void Floyd(){//弗洛伊德算法
	int i,j,k;
	for( i=1;i<=12;i++){
		for( j=1;j<=12;j++){//初始化数组
			shortest[i][j]=MGr.pathlen[i][j];
			if (shortest[i][j]<M&&i!=j) pathlen[i][j]=i;
			else pathlen[i][j]=0;
		} 
	}
	for( k=1;k<=12;k++){
		for( i=1;i<=12;i++){
			for( j=1;j<=12;j++){
				if((shortest[i][k]+shortest[k][j])<shortest[i][j]){//存在更短的路径 
					shortest[i][j]=shortest[i][k]+shortest[k][j]; //更新值
					pathlen[i][j]=pathlen[k][j];//记录经过的路径 
				}	
			}
		}
	} 
}

源代码(如下)

#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#define MAXNum 50 //景点最大个数
#define Max 65434 //最大无穷值
const int M=1000;
typedef struct{		//景点相关信息
	char name[M];//景点名称
	char number[M];//景点代号
	char Introduction[M];//景点简介
}Datatype;
typedef struct{
	int num; //景点编号
	Datatype data;//景点信息
}View;
typedef struct {
	View view[MAXNum];//存放顶点的一堆数组,在0位单元没有
	int pathlen[MAXNum][MAXNum];//存放路径的长度
	int m,n;
}MGraph;
MGraph MGr;//全局变量,定义MGr为MGraph类型
int pathlen[MAXNum][MAXNum];//存储路径
int shortest[MAXNum][MAXNum];//定义最小路径

void Init(){//构建景点信息
	int count=1,k=1,i,j; 
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS001");
	strcpy(MGr.view[count].data.name,"国际教育学院教学楼");
	strcpy(MGr.view[count].data.Introduction,"这里的人说好超好听,我超喜欢在里面呢!");
	count++,k++;
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS002");
	strcpy(MGr.view[count].data.name,"北苑篮球场");
	strcpy(MGr.view[count].data.Introduction,"学生打球的地方,也是上体育课的重要圣地!");
	count++,k++;
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS003");
	strcpy(MGr.view[count].data.name,"北苑餐厅");
	strcpy(MGr.view[count].data.Introduction,"美食的集结地!");
	count++,k++;
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS004");
	strcpy(MGr.view[count].data.name,"健身房");
	strcpy(MGr.view[count].data.Introduction,"集结于锻炼艰苦意志力大学生圣地!");
	count++,k++;
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS005");
	strcpy(MGr.view[count].data.name,"体育馆");
	strcpy(MGr.view[count].data.Introduction,"这里有各种运动的场地!");
	count++,k++;
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS006");
	strcpy(MGr.view[count].data.name,"北苑操场");
	strcpy(MGr.view[count].data.Introduction,"一些大型活动的举办地点!");
	count++,k++;
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS007");
	strcpy(MGr.view[count].data.name,"图书馆");
	strcpy(MGr.view[count].data.Introduction,"提供各种各样的书,适于阅读,学习!");
	count++,k++;
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS008");
	strcpy(MGr.view[count].data.name,"教学楼区");
	strcpy(MGr.view[count].data.Introduction,"学习的重要领地区域,坚不可摧!");
	count++,k++;
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS009");
	strcpy(MGr.view[count].data.name,"南苑餐厅");
	strcpy(MGr.view[count].data.Introduction,"美食的集结地!");
	count++,k++; 
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS010");
	strcpy(MGr.view[count].data.name,"南苑操场");
	strcpy(MGr.view[count].data.Introduction,"乐于运动的人的眼中好地方!");
	count++,k++;
	MGr.view[count].num=k;
	strcpy(MGr.view[count].data.number,"TS011");
	strcpy(MGr.view[count].data.name,"工业训练中心");
	strcpy(MGr.view[count].data.Introduction,"各专业工地实习地点!");
	count++,k++;
	for(i=1;i<=k;i++){
		for(j=1;j<=k;j++){
			if(i==j){
				MGr.pathlen[i][j]=0;
				pathlen[i][j]=0;
			}else{
				MGr.pathlen[i][j]=Max;
				pathlen[i][j]=Max;	
			}	
		}
	}//下方为景点之间的路程,根据个人需要可以更改
	MGr.pathlen[1][2]=MGr.pathlen[2][1]=100;
	MGr.pathlen[2][3]=MGr.pathlen[3][2]=100;
	MGr.pathlen[2][4]=MGr.pathlen[4][2]=50;
	MGr.pathlen[1][4]=MGr.pathlen[4][1]=100;
	MGr.pathlen[3][1]=MGr.pathlen[1][3]=100;
	MGr.pathlen[5][6]=MGr.pathlen[6][5]=100;
	MGr.pathlen[6][7]=MGr.pathlen[7][6]=200;
	MGr.pathlen[7][8]=MGr.pathlen[8][7]=300;
	MGr.pathlen[8][9]=MGr.pathlen[9][8]=200;
	MGr.pathlen[9][10]=MGr.pathlen[10][9]=250;
	MGr.pathlen[10][11]=MGr.pathlen[11][10]=50;
}
void ChangeMapMes(){//修改景点信息
	cout <<">>请输入您要修改的景点的编号:";
	int i=0,k=1;
	cin>>i;
	cout <<"1.景点名称\n";	
	cout <<"2.景点代号\n";
	cout <<"3.景点简介\n";
	cout <<">>请选择您要修改的景点信息:"<<endl; 
	while(k)
	{int chose;
	cin>>chose;
	switch(chose){
	case 1:	cout <<"请输入修改成的景点名称:";cin>>MGr.view[i].data.name;k=0;break;
	case 2:	cout <<"请输入修改成的景点代号:";cin>>MGr.view[i].data.number;k=0;break;
	case 3:	cout <<"请输入修改成的景点简介:";cin>>MGr.view[i].data.Introduction;k=0; break;
	default:cout <<"输入错误,请输入正确的选择.";break;
	}
	}
	cout <<"修改成功,修改后的景点信息为:\n";
	cout <<"景点代号:"<<MGr.view[i].data.number<<endl;
	cout <<"景点名称:"<<MGr.view[i].data.name<<endl;
	cout <<"景点简介:"<<MGr.view[i].data.Introduction<<endl; 
}
void Map()//景点地图,此图为我校地图,也可以更改
{
	cout << endl;
	cout << "     ★---------★---------★---------★---------★---------★-------★" << endl;
	cout << "                            【1】国际教育学院教学楼" << endl;
	cout << "     ☆                           |                                  ☆" << endl;
	cout << "       【2】北苑篮球场<-----------|------------->【3】北苑餐厅       " << endl;
	cout << "		【4】健身房<-------		   |                                    " << endl;		
	cout << "     ☆                           |                                  ☆" << endl;
	cout << "                                  |                                    " << endl;
	cout << "     ☆	【5】体育馆 <------    |---->【6】北苑操场                ☆" << endl;
	cout << "                                  |                                    " << endl;
	cout << "     ☆                           |                                  ☆" << endl;
	cout << "                               【7】图书馆                            " << endl;
	cout << "     ☆                           |                                  ☆" << endl;
	cout << "                                  |				 " << endl;
	cout << "     ☆        北                 |                                  ☆" << endl;
	cout << "               | 【8】教学楼区<---|---->【9】南苑餐厅                  " << endl;
	cout << "     ☆		|       		   |                                  ☆" << endl;
	cout << "               |                  |-------------->【10】南苑操场     " << endl;
	cout << "     ☆        南                 |                                  ☆" << endl;
	cout << "                                【11】工业实训基地                     " << endl;
	cout << "     ★---------★---------★---------★---------★---------★-------★" << endl;
}
/*查看景点信息*/ 
void ViewMes(){
	cout<<"请输入您要查看的景点信息的编号:";
	int i;
	cin>>i;
	cout<<"编号为"<<i<<"的景点的信息为:\n";
	cout<<"---------------------------------------------\n";
	cout<<"景点代号:"<<MGr.view[i].data.number<<endl;
	cout<<"景点名称:"<<MGr.view[i].data.name<<endl;
	cout<<"景点简介:"<<MGr.view[i].data.Introduction<<endl; 
	cout<<"---------------------------------------------"<<endl;
}
void Floyd(){//弗洛伊德算法
	int i,j,k;
	for( i=1;i<=12;i++){
		for( j=1;j<=12;j++){//初始化数组
			shortest[i][j]=MGr.pathlen[i][j];
			if (shortest[i][j]<M&&i!=j) pathlen[i][j]=i;
			else pathlen[i][j]=0;
		} 
	}
	for( k=1;k<=12;k++){
		for( i=1;i<=12;i++){
			for( j=1;j<=12;j++){
				if((shortest[i][k]+shortest[k][j])<shortest[i][j]){//存在更短的路径 
					shortest[i][j]=shortest[i][k]+shortest[k][j]; //更新值
					pathlen[i][j]=pathlen[k][j];//记录经过的路径 
				}	
			}
		}
	} 
}
void PrintPath(int i,int j){//打印路径
	int next=i;
	cout<<">>路径为:\n";
	while(next!=j){
		cout<<MGr.view[next].data.name;
		next=pathlen[next][j];//当前的后继点的编号 
	}
	cout<<MGr.view[j].data.name<<endl;
}
void Shortest(){//最短路径
	Floyd();//预处理所有的最短路径
	cout<<"对照校园平面图,输入您当前所在景点位置及要去的景点的编号:";
	int s,e;
	cin>>s>>e;
	if(s<=12&&s>=0&&e<=12&&e>=0){
		cout<<MGr.view[s].data.name<<"到"<<MGr.view[e].data.name<<"的最短路径长度为:"<<shortest[s][e]<<endl;
		//PrintPath(s,e); 
	}else{
		cout<<"编号输入错误,请重新输入正确的景点编号!\n";
		Shortest(); 
	}

}
void Menu(){ 
	cout<<"----------------欢迎进入校园导航系统----------------\n";
	cout<<"\n----------------------------------------------------\n";
	cout<<"1.查看校园平面图\n";
	cout<<"2.修改景点信息\n";
	cout<<"3.查看景点信息\n"; 
	cout<<"4.最短路径查询\n";
	cout<<"5.退出\n";
	cout<<"----------------------------------------------------"<<endl;
	cout<<"请输入您要选择的功能:"<<endl;
}
int main()
{
	Init(); 
	cout<<"景点信息初始化成功,进入主界面"<<endl;
	int p=1;
	while(p){
	int c;
	Menu();
	cin>>c;
	switch(c)
		{
		case 1: Map();system("pause");break;
		case 2: ChangeMapMes();system("pause");break;
		case 3:	ViewMes();system("pause");break;
		case 4:	Shortest();system("pause");break;
		case 5: p=0;system("pause");break;
		default :cout<<"您的选择有误,请重新选择!"<<endl; break;
		}
	system("cls");
	}
	return 0;
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值