校园导航小助手—课程设计

东软校园导航小助手

功能描述

1. 设计校园平面图。其中具有代表性的地点至少含有 12 个,平面图中顶点表示校内代表性的地点,边上的权值表示两地点之间 的距离;

2. 为实现校园导航系统子功能的管理,设计主控菜单;

3. 为来访客人提供图中任意地点相关信息的查询;

4. 为来访客人提供图中任意两地点之间最短路线的查询、指点地 点到其他所有地点最短路线的查询。

 

具体功能

本程序包含 3 个模块:主程序模块、工作区模块和无向网操作模块。其调用关系如图所示。

主界面如下:

图 1 主界面 

 

1.存放景点代号、名称、简介等信息供用户查询,为来访客 人提供图中任意景点相关信息的查询,如图所示(说明:以下提供的仅是范例,含12个景点,并不代表是学院的真实地图)。 

图 2 查询各景点信息

 

 2.可以根据用户输入的起始景点编号,求出该景点到其他景点的最短路径线路及距离,如图所示。

 图3 查询指定景点到其他所有景点最短路径线路及距离

 

 3.为来访客人提供图中任意景点之间的最短路径查询,如图所示。

 图 4 任意景点之间的最短路径查询

 

 4.选择主界面的修改地图信息,出现子菜单,可以为校园平面图增加和删除景点或边,修改边上的权值等。如图所示。

 图 5 修改图的信息

子菜单功能就不展示了下面给出源码,自己去试试吧。编译器用的是Dev C++ 5.6.3,应该没有严重bug,可能有小bug,这个完成课程设计已经够了,就没有过多的调试。

 

代码

代码只给了部分注释,核心的东西基本都注释了,其他的太多了不想注释了,不懂的或者有建议的可以跟我说。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INFINITY 65535      /* ∞设为双字节无符号整数的最大值65535*/
#define Max 100
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */
 
int Dist[Max][Max], Path[Max][Max];
 
typedef struct DataType
{
	int num;      //地点序号
	char name[100];  //地点名称
	char information[1000];  //简单得不能再简单的地点简介
}DataType;
 
typedef struct MGraph
{
	DataType Data[13];   //初始图中有12个顶点 
	WeightType G[Max][Max]; //图中两点间的弧线权值,也即路程 
	int Nv, Ne;    // 图中顶点个数和边数 
}MGraph;
 
void Menu();//一级菜单 
void Menu2(); //二级菜单 
void choose(MGraph* Map);//一级菜单选择
void choose2(MGraph* Map); //二级菜单的功能选择 
MGraph* CreateGraph(); //初始化图  
MGraph* ShortFloyd(MGraph* Map);  //弗洛伊德算法求最短路径 
void Data_Observe(MGraph* Map);//景点总览 
void ShortPath_Observe(MGraph* Map);//最短路径查询 
void Path_Observe(MGraph* Map); //路径查询 
void Data_Ob(MGraph* Map);//景点信息查看 
void New_CreateGraph(MGraph* Map); //重新建立图 
void UpDate(MGraph* Map); //更新景点信息 
void Add_Node(MGraph* Map); //增加景点 
void Add_Edge(MGraph* Map); //增加路径 
void Delete_Node(MGraph* Map); //删除景点 
void Delete_Edge(MGraph* Map);//删除路径 
 
int main()
{
	int i, j;
	MGraph* Map = CreateGraph();
	for (i = 1; i <= Map->Nv; i++)
		for (j = 1; j <= Map->Nv; j++)
			Dist[i][j] = INFINITY;    //  任意两点间最短路径初始化为极大值 
	Map = ShortFloyd(Map);
	choose(Map);
	return 0;
 
}
 
void Menu()   //  一级界面函数 
{
	printf("\n\n\n");
	printf("--------------------------------------------------------------------------------------\t\n");
	printf("                                欢迎使用校园导航小助手                                \t\n");
	printf("                                                                                      \t\n");
	printf("                                欢迎来到广东东软学院 !                               \t\n");
	printf("                                                                                      \t\n");
	printf("                    1.景点信息总览                 2.最短路线查询                     \t\n");
	printf("                                                                                      \t\n");
	printf("                    3.路线信息查询                 4.景点信息查询                     \t\n");
	printf("                                                                                      \t\n");
	printf("                    5.更改图信息                   6.退出                             \t\n");
	printf("                                                                                      \t\n");
	printf("--------------------------------------------------------------------------------------\t\n");
	printf("\n\n请选择你需要的功能,输入代号:\n");
}
 
void Menu2() //二级界面菜单 
{
	printf("\n\n\n");
	printf("--------------------------------------------------------------------------------------\t\n");
	printf("                                                                                      \t\n");
	printf("                    1.再次建图                 2.更新信息                             \t\n");
	printf("                                                                                      \t\n");
	printf("                    3.增加景点                 4.增加路径                             \t\n");
	printf("                                                                                      \t\n");
	printf("                    5.删除景点                 6.删除路径                             \t\n");
	printf("                                                                                      \t\n");
	printf("                                    7.退出                                            \t\n");
	printf("                                                                                      \t\n");
	printf("--------------------------------------------------------------------------------------\t\n");
	printf("\n\n请选择你需要的功能,输入代号:\n");
}
 
void choose(MGraph* Map) //一级菜单选择 
{
	int num;
	while (1) {
	a:		Menu();//  输出界面栏 
		scanf("%d", &num);//接受选项 
		system("pause");
		system("cls");
		switch (num)
		{
		case 1: Data_Observe(Map);
			system("pause");
			system("cls");
			goto a;
		case 2:ShortPath_Observe(Map);
			system("pause");
			system("cls");
			goto a;
		case 3:Path_Observe(Map);
			system("pause");
			system("cls");
			goto a;
		case 4:Data_Ob(Map);
			system("pause");
			system("cls");
			goto a;
		case 5:choose2(Map);
			system("pause");
			system("cls");
			goto a;
		case 6: exit(0);
		default:
			break;
		}
	}
}
 
void choose2(MGraph* Map)
{
	int num;
	while (1) {
	a:		Menu2();//  输出界面栏 
		scanf("%d", &num);//接受选项 
		system("pause");
		system("cls");
		switch (num)
		{
		case 1: New_CreateGraph(Map);
			system("pause");
			system("cls");
			goto a;
		case 2:UpDate(Map);
			system("pause");
			system("cls");
			goto a;
		case 3:Add_Node(Map);
			system("pause");
			system("cls");
			goto a;
		case 4:Add_Edge(Map);
			system("pause");
			system("cls");
			goto a;
		case 5:Delete_Node(Map);
			system("pause");
			system("cls");
			goto a;
		case 6:Delete_Edge(Map);
			system("pause");
			system("cls");
			goto a;
		case 7: choose(Map);
		default:
			break;
		}
	}
}
 
MGraph* CreateGraph()   //  初始化图 
{
	MGraph* Map;
	int i, j, k;
	Map = (MGraph*)malloc(sizeof(MGraph));  //开辟内存 
 
	Map->Ne = 22;   //  图有22条边 
	Map->Nv = 13;   //   图有12个顶点 
	for (i = 1; i <= Map->Nv; i++)
		Map->Data[i].num = i;    //初始化顶点编号为1-12
	for (j = 1; j <= Map->Nv; j++)
		for (k = 1; k <= Map->Nv; k++)
		{
			Map->G[j][k] = INFINITY;  // 初始化每两个点间的距离为极大值 
		}
 
 
	Map->G[1][2] = Map->G[2][1] = 1200;   //北门南门的校外公路距离1200
	Map->G[1][6] = Map->G[6][1] = 350;    //北门到AB座350
	Map->G[2][3] = Map->G[3][2] = 20;     //南门到国教院20
	Map->G[2][4] = Map->G[4][2] = 600;    //南门到行政楼600
	Map->G[2][11] = Map->G[11][2] = 15;   //南门到继续教育学院15
	Map->G[2][12] = Map->G[12][2] = 200;   //南门到图书馆200
	Map->G[3][9] = Map->G[9][3] = 450;      //国教院到宿舍450    
	Map->G[3][10] = Map->G[10][3] = 500;  	//国教院到二食堂500
	Map->G[4][6] = Map->G[6][4] = 30;  	   //行政楼到AB座30
	Map->G[4][11] = Map->G[11][4] = 250;   //行政楼到继续教育学院250
	Map->G[4][12] = Map->G[12][4] = 370;   //行政楼到图书馆370
	Map->G[5][6] = Map->G[6][5] = 150;  //体育场到AB座150
	Map->G[5][8] = Map->G[8][5] = 200;  //AB座到C座200
	Map->G[6][12] = Map->G[12][6] = 380; //AB座到图书馆380
	Map->G[7][8] = Map->G[8][7] = 100;   //EF座到C座100
	Map->G[7][9] = Map->G[9][7] = 100;   //EF座到宿舍100
	Map->G[7][10] = Map->G[10][7] = 30; //EF座到食堂30
	Map->G[7][12] = Map->G[12][7] = 50;  //EF座到图书馆30
	Map->G[8][10] = Map->G[10][8] = 60;  //C座到食堂60	
	Map->G[8][12] = Map->G[12][8] = 20;  //C座到图书馆20
	Map->G[9][10] = Map->G[10][9] = 50;  //宿舍到食堂 50
	Map->G[10][12] = Map->G[12][10] = 40;  //宿舍到图书馆40
 
 
	strcpy(Map->Data[1].name, "学校北门");   //存储图中每个点的名字,依次赋值存储
	strcpy(Map->Data[2].name, "学院南正门");
	strcpy(Map->Data[3].name, "国际教育学院");
	strcpy(Map->Data[4].name, "行政楼");
	strcpy(Map->Data[5].name, "体育场");
	strcpy(Map->Data[6].name, "AB座教学楼");
	strcpy(Map->Data[7].name, "EF座教学楼");
	strcpy(Map->Data[8].name, "C座教学楼");
	strcpy(Map->Data[9].name, "宿舍区");
	strcpy(Map->Data[10].name, "学二食堂");
	strcpy(Map->Data[11].name, "继续教育学院");
	strcpy(Map->Data[12].name, "图书馆");
 
	strcpy(Map->Data[1].information, "此门里华师最近");    //为图中每个景点存储关于它的简介 
	strcpy(Map->Data[2].information, "学校大门、学校班车进出口");
	strcpy(Map->Data[3].information, "学院国际化的窗口,楼高6层");
	strcpy(Map->Data[4].information, "行政办公大楼、楼高6层");
	strcpy(Map->Data[5].information, "室外标准篮球场");
	strcpy(Map->Data[6].information, "最早的教学楼之一、学院最大系--计算机系在此!楼高4层");
	strcpy(Map->Data[7].information, "计算机系集中上课的地方、翻转课堂区域、楼高4层");
	strcpy(Map->Data[8].information, "实验室集中区、楼高4层");
	strcpy(Map->Data[9].information, "新生宿舍、教师公寓、教授公寓、楼高5层");
	strcpy(Map->Data[10].information, "干饭人冲!!!");
	strcpy(Map->Data[11].information, "离公交站最近、出门就能坐公交");
	strcpy(Map->Data[12].information, "建筑面积46000平米、楼高4层");
	return Map;
}
 
MGraph* ShortFloyd(MGraph* Map)    //  弗洛伊德算法,求最短路径 
{
 
	int v, w, k; // v,w,k分别表示出发点,目的地,新加入的点 
	for (v = 1; v < Map->Nv; v++) {
		for (w = 1; w < Map->Nv; w++)
		{
			Dist[v][w] = Map->G[v][w]; // Dist代表两点间最短路径,初始化为两点间权值 
			Path[v][w] = w;   //  Path记录最短路径的前一个点 
		}
	}
	for (k = 1; k < Map->Nv; k++) //利用三阶循环,找出每两个点的最短路径 
	{
		for (v = 1; v < Map->Nv; v++)
		{
			for (w = 1; w < Map->Nv; w++)
			{
				if ((Dist[v][k] != INFINITY || Dist[k][w] != INFINITY) && (Dist[v][w] > (Dist[v][k] + Dist[k][w])))
				{
					Dist[v][w] = Dist[v][k] + Dist[k][w];
					Path[v][w] = Path[v][k];
					/* 如果新加入的点组成的路径小于最小路径,更新最小路径,
					并且将新加入的点加入最短路径中 */
				}
			}
		}
	}
	return Map;  // 返回图的类型 
}
 
void Data_Observe(MGraph* Map)//景点总览 
{
	int i;
	printf("\n广东东软学院共有以下%d处景点:\n\n", Map->Nv - 1);
	for (i = 1; i < Map->Nv; i++)
	{
		printf("%d.", Map->Data[i].num);   //输出景点编号 
		printf("%s: ", Map->Data[i].name);   //输出景点名字 
		printf("%s\n\n", Map->Data[i].information);  // 输出景点简介 
	}
}
 
void ShortPath_Observe(MGraph* Map) //最短路径查询 
{
	int start, pass, end;
	printf("请输入当前景点编号和你想要去的景点编号(空格隔开):\n");
	scanf("%d %d", &start, &end);   // start end分别接受出发点与目的地编号 
	while (start < 1 || start>Map->Nv - 1 || end < 1 || end>Map->Nv - 1)  //非法输入 
	{
		printf("\n输入错误,请重新输入:\n");
		scanf("%d %d", &start, &end);
	}
	if (start == end)  //非法输入 
	{
		printf("\n输入错误,你已经在此地,请重新输入:\n");
		scanf("%d %d", &start, &end);
	}
	system("cls");
	if (Dist[start][end] == INFINITY)
		printf("不能到达\n");
	if(Dist[start][end] != INFINITY){
	printf("\n%s->%s的最小路径为:%d米\n", Map->Data[start].name, Map->Data[end].name, Dist[start][end]);
	pass = Path[start][end];  // pass作为中间变量用来接受最短路径中的父亲节点 
	printf("\n最短路径为:   %s", Map->Data[start].name);   // 输出最短路径 
	while (pass != end)
	{
		printf("-> %s", Map->Data[pass].name);
		pass = Path[pass][end];  //  不断更新pass中间节点 
	}
	printf("-> %s\n", Map->Data[end].name);
	}
 
}
 
void Path_Observe(MGraph* Map) //路径查询 
{
	int i, j;
	int num;
	printf("请输入一个起始景点的编号:");
	scanf("%d", &num);
	while (num < 1 || num>Map->Nv - 1)  //非法输入 
	{
		printf("\n输入错误,请重新输入:\n");
		scanf("%d", &num);
	}
	system("cls");
	printf("--------------------------------------------------------------------------------------\t\n");
	for (i = 1; i < Map->Nv; i++) {
		if (i != num) {
			j = Path[num][i];  // j作为中间变量用来接受最短路径中的父亲节点 
			printf("\n沿途路径为: %s", Map->Data[num].name);   // 输出最短路径 
			while (j != i)
			{
				printf("-> %s", Map->Data[j].name);
				j = Path[j][i];  //  不断更新j节点 
			}
			printf("-> %s\n", Map->Data[i].name);
			if (Dist[num][i] == INFINITY)
				printf("不能到达\n");
			if (Dist[num][i] != INFINITY)
			    printf("%s到%s的最路线总长为: %d米\n", Map->Data[num].name, Map->Data[i].name, Dist[num][i]);
			printf("--------------------------------------------------------------------------------------\t\n");
 
		}
	}
}
 
void Data_Ob(MGraph* Map) //景点信息查看 
{
	int num;
	printf("请输入一个景点的编号:");
	scanf("%d", &num);
	while (num < 1 || num>Map->Nv - 1)  //非法输入 
	{
		printf("\n输入错误,请重新输入:\n");
		scanf("%d", &num);
	}
	system("cls");
	printf("--------------------------------------------------------------------------------------\t\n");
	printf("%d.", Map->Data[num].num);   //输出景点编号 
	printf("%s: \n\n", Map->Data[num].name);   //输出景点名字 
	printf("(简略版)%s\n", Map->Data[num].information);  // 输出景点简介 
	printf("--------------------------------------------------------------------------------------\t\n");
}
void New_CreateGraph(MGraph* Map) //重新建立图 
{
	int NV, NE;
	int V1, V2, W;
	int i, j, k;
	for (j = 1; j <= Map->Nv; j++)
		for (k = 1; k <= Map->Nv; k++)
		{
			Map->G[j][k] = INFINITY;  // 初始化每两个点间的距离为极大值 
		}
	printf("\n输入新地图的景点个数以及路径条数:\n");
	scanf("%d %d", &NV, &NE);
	Map->Nv = NV + 1;
	Map->Ne = NE;
	printf("\n输入新地图的%d个景点名称以及相关信息: \n", Map->Nv - 1);
	for (i = 1; i < Map->Nv; i++)
	{
		Map->Data[i].num = i;
		scanf("%s", &Map->Data[i].name);
		scanf("%s", &Map->Data[i].information);
	}
	system("pause");
	system("cls");
	printf("\n正在构建新地图的路径:\n");
	printf("\n目前广东东软学院共有以下%d处景点:\n\n", Map->Nv - 1);
	for (i = 1; i < Map->Nv; i++)
	{
		printf("%d.", Map->Data[i].num);   //输出景点编号 
		printf("%s: ", Map->Data[i].name);   //输出景点名字 
		printf("%s\n\n", Map->Data[i].information);  // 输出景点简介 
	}
	for (i = 0; i < Map->Ne; i++) {
		printf("\n\n输入相连接的景点:");
		scanf("%d %d", &V1, &V2);
		while (V1 < 1 || V1>Map->Nv - 1 || V2 < 1 || V2>Map->Nv - 1)  //非法输入 
		{
			printf("\n输入错误,请重新输入:");
			scanf("%d %d", &V1, &V2);
		}
		if (V1 == V2)  //非法输入 
		{
			printf("\n输入错误,请重新输入:");
			scanf("%d %d", &V1, &V2);
		}
		printf("\n\n输入景点间距离:");
		scanf("%d", &W);
		Map->G[V1][V2] = Map->G[V2][V1] = W;
	}
	ShortFloyd(Map);
}
 
void UpDate(MGraph* Map) //更新景点信息 
{
	int num;
	int i;
	printf("\n输入需要更改的景点编号:\n\n");
	for (i = 1; i < Map->Nv; i++)
		printf("%d.%s: %s\n\n", i, Map->Data[i].name, Map->Data[i].information);
	scanf("%d", &num);
	while (num < 1 || num>Map->Nv - 1)  //非法输入 
	{
		printf("\n输入错误,请重新输入:");
		scanf("%d", &num);
	}
	system("cls");
 
	printf("将%s修改为:\n", Map->Data[num].name);
	scanf("%s", &Map->Data[num].name);
	printf("将%s修改为:\n", Map->Data[num].information);
	scanf("%s", &Map->Data[num].information);
	system("cls");
 
}
 
void Add_Node(MGraph* Map) //增加景点 
{
	int num;
	int i;
	printf("已有景点如下\n");
	for (i = 1; i < Map->Nv; i++)
		printf("%d.%s: %s\n\n", i, Map->Data[i].name, Map->Data[i].information);
	printf("请按照顺序添加新景点\n\n");
	printf("\n请输入序号:");
	scanf("%d", &num);
	printf("\n请输入景点名称:");
	scanf("%s", &Map->Data[num].name);
	printf("\n请输入景点简介:");
	scanf("%s", &Map->Data[num].information);
	Map->Nv++;
	printf("\n\n修改成功\n\n");
}
 
void Add_Edge(MGraph* Map) //增加路径 
{
	int i;
	int V1, V2, W;
	printf("已有景点如下\n");
	for (i = 1; i < Map->Nv; i++)
		printf("%d.%s: %s\n\n", i, Map->Data[i].name, Map->Data[i].information);
	printf("\n请输入需要添加路径的两个景点:");
	scanf("%d %d", &V1, &V2);
	while (V1 < 1 || V1>Map->Nv - 1 || V2 < 1 || V2>Map->Nv - 1)  //非法输入 
	{
		printf("\n输入错误,请重新输入:");
		scanf("%d %d", &V1, &V2);
	}
	if (V1 == V2)  //非法输入 
	{
		printf("\n输入错误,请重新输入:");
		scanf("%d %d", &V1, &V2);
	}
	printf("\n请输入景点相隔距离:");
	scanf("%d", &W);
	Map->G[V1][V2] = Map->G[V2][V1] = W;
	Map->Ne++;
	ShortFloyd(Map);
 
}
 
void Delete_Node(MGraph* Map) //删除景点 
{
	int num;
	int i, j;
	printf("已有景点如下\n");
	for (i = 1; i < Map->Nv; i++)
		printf("%d.%s: %s\n\n", i, Map->Data[i].name, Map->Data[i].information);
	printf("\n请输入需删除景点的序号:");
	scanf("%d", &num);
	while (num < 1 || num>Map->Nv - 1)  //非法输入 
	{
		printf("\n输入错误,请重新输入:");
		scanf("%d", &num);
	}
	for (i = num; i < Map->Nv; i++) {
		strcpy(Map->Data[i].name, Map->Data[i + 1].name);
		strcpy(Map->Data[i].information, Map->Data[i + 1].information);
	}
	Map->Nv--;
	for (j = num; j < Map->Nv; j++) {
		for (i = 1; i < Map->Nv; i++) {
			Map->G[j][i] = Map->G[j + 1][i];
			Map->G[i][j] = Map->G[i][j + 1];
		}
	}
	for (i = 1; i < Map->Nv; i++) {
		if (Map->G[num][i] != INFINITY || Map->G[i][num] != INFINITY);
		Map->Ne--;
	}
	ShortFloyd(Map);
}
 
void Delete_Edge(MGraph* Map) //删除路径 
{
	int num;
	int V1, V2;
	printf("请输入需删除路径的两个景点:");
	scanf("%d %d", &V1, &V2);
	if (Map->Nv - 1 == 1) {
		printf("\n当前只有一个景点,无路径删除");
		goto b;
	}
	while (V1 < 1 || V1>Map->Nv - 1 || V2 < 1 || V2>Map->Nv - 1)  //非法输入 
	{
		printf("\n输入错误,请重新输入:");
		scanf("%d %d", &V1, &V2);
	}
	if (V1 == V2)  //非法输入 
	{
		printf("\n输入错误,请重新输入:");
		scanf("%d %d", &V1, &V2);
	}
	Map->G[V1][V2] = Map->G[V2][V1] = INFINITY;
	Map->Ne--;
b:	ShortFloyd(Map);
}

 总结

大一生活马上要结束了,过得好快啊。其实当初填志愿的时候,专业都是随便填的,当时对计算机一无所知。抱着试一试的心态学习编程,发现编程确实有趣好玩,总比天天打游戏好玩。通过这个程序设计认识到底层代码一定要写好,不然一加一个功能就出bug,脑袋都给你挠爆。估计学校课设几年都不变的,希望马上要来东软的学弟能看到这代码。

  • 23
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值