数据结构课程设计:C++实现集美大学校园导游系统_游览所有景点c++-程序员宅基地

技术标签: 算法  c++  课程设计  数据结构  

概述:

校园导游系统是一种应用于大学校园的信息化系统,它主要是为了方便师生和游客在校园内进行游览或寻找各个地点。该系统实现了校园导游的自助化,用户可以通过电脑进行导游,同时系统也提供了景点介绍、浏览路线、更新信息等多种功能。

需求分析:

1. 景点介绍:用户可以浏览各个景点的详细介绍。

2. 浏览路线:为满足不同情况下的用户需求此功能,应满足多种查询方法。

3. 更新信息:用户可根据实际情况主动更新校园内的各种变化,用户可以通过该功能增加、删除景点或增加新的路径等,以保证系统的有效性。

概要设计:

该系统运用数据结构中图的相关知识进行设计,并采用C++进行编写。主要功能模块包括景点介绍、浏览路线、更新信息等。

详细设计:

  1. 景点介绍:用户可以点击相关景点获取详细信息,并借此了解学校的各种相关信息。
  2. 浏览路线:(1)查看游览路线:输入起点,得到所有的浏览路线。(2)查询景点间最短路径:输入起点及终点,得到最短路径。(3)查询景点间所有路径:输入起点及终点,得到所有两点间的路径。
  3. 更新信息:需要输入密码来解锁以下功能(1)删除结点:将指定景点删除。 (2)删除边:将景点之间的道路删除。 (3)增加结点:添加一个新的景点。 (4)增加边:为景点间添加一条新的路线。 (5)输出邻接矩阵:查看各个节点及节点间权值。 6)重新建图: 删除全部内容,并重新构建。 (7)更新信息:修改部分节点及边 (8)返回主页。

总结与心得:

通过本次数据结构的课程设计,我学习到了如何使用数据结构和算法来实现复杂的功能,并深入理解了软件开发过程中的需求分析、概要设计、详细设计、运行与测试等环节。同时,我也意识到在实际开发中需要注重用户体验、安全性和可扩展性等方面,不断优化和改进系统,以满足用户和市场的需求。

参考文献:

  1. 《数据结构:用C语言描述》(第2版),耿国华
  2. 《面向对象程序设计与Visual C++ 6.0教程》(第2版),陈天华 

全代码: 

//集美大学校园管理系统

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Infinity 65535	//表示无穷大
#define MaxNumber 23	//用于邻接矩阵
#define vertex 	15//顶点个数

typedef struct side//边的权值
{
	int wet;//权值
}side, wetmatrix[MaxNumber][MaxNumber];//边的邻接矩阵类型
typedef struct vetinf//顶点信息
{
	int number;//顶点编号
	char name[64];//顶点名称
	char intro[256];//顶点介绍
}vetinf;
typedef struct mapstr//图结构信息
{
	vetinf vets[MaxNumber];//顶点数组
	wetmatrix mat;//邻接矩阵
	int vetnum, sidenum;
}mapstr;

//全局变量
mapstr campus;//图结构变量(学校校园)
int d[30];
int visited[50];
int shortest[MaxNumber][MaxNumber];//定义全局变量存储最小路径 
int pathh[MaxNumber][MaxNumber];//定义存储路径

//1.图的初始化
mapstr initmap()
{
	mapstr m;//构件图m
	int i = 0, j = 0;
	m.vetnum = 15;//定义顶点个数
	m.sidenum = 23;//定义边的条数
	for (i = 1; i <= vertex; i++)//依次设置顶点信息
		m.vets[i].number = i;
	//输入顶点信息
	strcpy_s(m.vets[1].name, "端景楼"); strcpy_s(m.vets[1].intro, "学生住宿场所");
	strcpy_s(m.vets[2].name, "万人餐厅"); strcpy_s(m.vets[2].intro, "为学生提供就餐场所");
	strcpy_s(m.vets[3].name, "西苑餐厅"); strcpy_s(m.vets[3].intro, "为学生提供就餐场所");
	strcpy_s(m.vets[4].name, "光前体育馆"); strcpy_s(m.vets[4].intro, "体育活动的场所");
	strcpy_s(m.vets[5].name, "庄重文夫人体育中心"); strcpy_s(m.vets[5].intro, "体育场");
	strcpy_s(m.vets[6].name, "引桐楼"); strcpy_s(m.vets[6].intro, "学生住宿场所");
	strcpy_s(m.vets[7].name, "嘉庚图书馆"); strcpy_s(m.vets[7].intro, "图书馆");
	strcpy_s(m.vets[8].name, "中山纪念楼"); strcpy_s(m.vets[8].intro, "纪念馆");
	strcpy_s(m.vets[9].name, "勿忘亭"); strcpy_s(m.vets[9].intro, "可以看到学校的湖,景色优美");
	strcpy_s(m.vets[10].name, "建发楼,美玲楼,禹洲楼,庄汉水楼"); strcpy_s(m.vets[10].intro, "教学楼");
	strcpy_s(m.vets[11].name, "尚大楼"); strcpy_s(m.vets[11].intro, "学校的办公楼,也是最高的楼");
	strcpy_s(m.vets[12].name, "陈延奎图书馆"); strcpy_s(m.vets[12].intro, "学校里最大的图书馆");
	strcpy_s(m.vets[13].name, "陈嘉庚先生雕像"); strcpy_s(m.vets[13].intro, "位于学校东门");
	strcpy_s(m.vets[14].name, "章辉楼"); strcpy_s(m.vets[14].intro, "学校的教学楼,也是理学院的办公楼");
	strcpy_s(m.vets[15].name, "南大门"); strcpy_s(m.vets[15].intro, "学校最大的门,对面是万达广场");
	for (i = 1; i <= vertex; i++)
		for (j = 1; j <= vertex; j++)
			m.mat[i][j].wet = Infinity;//初始化图的邻接矩阵
	m.mat[1][2].wet = 80; m.mat[1][3].wet = 80; m.mat[3][4].wet = 60; m.mat[1][5].wet = 150; m.mat[2][5].wet = 70;
	m.mat[3][6].wet = 180; m.mat[6][7].wet = 60; m.mat[6][8].wet = 60; m.mat[4][8].wet = 40; m.mat[7][13].wet = 200;
	m.mat[7][9].wet = 50; m.mat[9][13].wet = 180; m.mat[9][10].wet = 140; m.mat[8][10].wet = 190; m.mat[10][11].wet = 40;
	m.mat[10][12].wet = 45; m.mat[11][12].wet = 25; m.mat[11][14].wet = 60; m.mat[12][14].wet = 40; m.mat[14][15].wet = 150;
	m.mat[11][15].wet = 205; m.mat[13][15].wet = 210;
	for (i = 1; i <= vertex; i++)//无向带权图是对称矩阵,给其另一半赋值
		for (j = 1; j <= vertex; j++)
			m.mat[j][i].wet = m.mat[i][j].wet;
	return m;
}

//2.查询景点在图中的序号
int locatevet(mapstr m, int v)
{
	int i;
	for (i = 0; i <= m.vetnum; i++)
		if (v == m.vets[i].number) return i;//找到返回顶点i
	return -1;//未找到
}

//3.查询输入序号l,n间的长度不超过10个景点的路径
void path(mapstr m, int l, int n, int k)
{
	int s, t = k + 1; int length = 0;//t用于存储路径上下一顶点对应的d[]数组元素的下标
	if (d[k] == n && k < 8)//若d[k]是终点且景点个数<8,则输出该路径
	{
		for (s = 0; s < k; s++)
		{
			length = length + m.mat[d[s]][d[s + 1]].wet;
		}
		if (length < 4000)//打印路径小于200(定长)的路径
		{
			for (s = 0; s < k; s++)//输出该路径,s=0时为起点m
			{
				printf("%d%s--->", d[s], m.vets[d[s]].name);
			}
			printf("%d%s  ", d[s], m.vets[d[s]].name);//输出最后一个顶点
			printf("总路线长为%d米\n\n", length);
		}
	}
	else
	{
		s = 1;
		while (s <= m.vetnum)//从第m个顶点,访问所有顶点是否有路径
		{
			if ((m.mat[d[k]][s].wet < Infinity) && (visited[s] == 0))//顶点有边且未被访问
			{
				visited[s] = 1;
				d[k + 1] = s;//存储顶点编号
				path(m, l, n, t);
				visited[s] = 0;//将找到的路径上的顶点的访问标志重新设置为,便于探究新的路径
			}
			s++;//试验下一顶点s开始是否有到终点的路径;
		}
	}
}

//4.查询两景点的所有路径
int allpath(mapstr m)
{
	int k, i, j, l, n;
	printf("\n\n请输入您想要查询的两个景点的编号:\n\n");
	scanf_s("%d%d", &i, &j); printf("\n\n");
	l = locatevet(m, i);//locatevet 确定该顶点是否存在。若存在,返回该顶点编号。 
	n = locatevet(m, j);
	d[0] = l;//路径起点l(字母).(d[]数组为全局变量)
	for (k = 0; k < vertex; k++)
		visited[k] = 0;
	visited[l] = 1;
	path(m, l, n, 0);
	return 1;
}

//5.迪杰斯特拉算法求单源最短路径
void shortestpath(mapstr m)
{
	int v0, v, w, k = 1, min, t, p;
	int final[MaxNumber];//final[w]=1表示已经求得顶点V0到Vw的的最短路径
	int Pathside[MaxNumber];//用于存储最短路径下标的数组
	int ShortPathwet[MaxNumber];//用于存储到各点最短路径的权值和
	printf("\n请输入起始景点的编号:");
	scanf_s("%d", &v0);
	printf("\n\n");
	while (v0<0 || v0>vertex)//判断是否输入正确
	{
		printf("\n您输入的景点编号不存在\n");
		printf("请重新输入:");
		scanf_s("%d", &v0);
	}
	for (v = 1; v <= m.vetnum; v++)//数组初始化
	{
		final[v] = 0;//全部顶点初始化为未找到路径
		ShortPathwet[v] = m.mat[v0][v].wet;//将与v0有连线的路径加上权值
		Pathside[v] = 0;//初始化路径数组为0
	}
	ShortPathwet[v0] = 0;
	final[v0] = 1;
	//Dijkstr算法主体
	for (v = 1; v <= m.vetnum; v++)
	{
		min = Infinity;
		for (w = 1; w <= m.vetnum; w++)//找出离当前指向顶点最近的点
		{
			if (!final[w] && ShortPathwet[w] < min)//未被访问且存在边
			{
				k = w;
				min = ShortPathwet[w];
			}
		}
		final[k] = 1;//将找到的离当前顶点最近的置1
		//修正
		for (w = 1; w <= m.vetnum; w++)
		{
			if (!final[w] && (min + m.mat[k][w].wet < ShortPathwet[w]))
			{
				ShortPathwet[w] = min + m.mat[k][w].wet;//修改当前最优路径长度
				Pathside[w] = k;//存放前驱结点
			}
		}
	}
	printf("打印P数组:");	 //打印p数组
	for (t = 1; t <= m.vetnum; t++)
	{
		printf("%d ", Pathside[t]);
	}
	printf("\n\n");
	printf("打印S数组:");	 //打印s数组
	for (t = 1; t <= m.vetnum; t++)
	{
		printf("%d ", ShortPathwet[t]);
	}
	printf("\n\n");
	//打印最短路径
	for (t = 1; t <= m.vetnum; t++)
	{
		p = t;
		if (t != v0)
		{
			printf("%d%s", t, m.vets[t].name);
			for (w = 1; w <= m.vetnum; w++)
			{
				if (Pathside[p] != 0)
				{
					printf("<--%d%s", Pathside[p], m.vets[Pathside[p]].name);
					p = Pathside[p];
				}
			}
			printf("<--%d%s", v0, m.vets[v0].name);
			printf("\n总路线长为%d米\n\n", ShortPathwet[t]);
		}
	}
}

//6.主页
void menu()
{
	printf(" ┌──────────────────────────────────────────────────────┐\n");
	printf(" │ ╭ ═══════════════════════════════════════════════ ╮  │\n");
	printf(" │ ││        欢 迎 使 用 校 园 导 游 系 统          ││  │\n");
	printf(" │ ╰ ═══════════════════════════════════════════════ ╯  │\n");
	printf(" │                      欢迎来到                        │\n");
	printf(" │                      集美大学                        │\n");
	printf(" │                     菜 单 选 择                      │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *  1.主页                **   2.查看游览路线      * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *  3.查询景点间最短路径  **   4.查询景点间所有路径* │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *  5.学校景点介绍        **   6.更改图信息        * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *  0.退出                                         * │\n");
	printf(" │  *************************************************** │\n");
	printf(" └──────────────────────────────────────────────────────┘\n");
}

//以下是修改图的相关信息。

//7.增加一条边
int incside(mapstr* m)
{
	int l, n, distance;
	printf("\n请输入边的起点和终点编号,权值:");
	scanf_s("%d%d%d", &l, &n, &distance);
	while (l<0 || l>m->vetnum || n<0 || n>m->vetnum)
	{
		printf("输入错误,请重新输入");
		scanf_s("%d %d", &l, &n);
	}
	if (locatevet(campus, l) < 0)
	{
		printf("此节点%d已删除", l);
		return 1;
	}
	if (locatevet(campus, n) < 0)
	{
		printf("此节点%d已被删除", n);
		return 1;
	}
	m->mat[l][n].wet = distance;
	m->mat[n][l].wet = m->mat[l][n].wet;
	m->sidenum++;
	return 1;
}

//8.增加一个结点
int incvet(mapstr* m)
{
	int i;
	m->vetnum++;//顶点数加一
	printf("请输入您要增加结点的信息:");
	printf("\n编号:");
	scanf_s("%d", &m->vets[m->vetnum].number);
	printf("名称:");
	scanf_s("%s", m->vets[m->vetnum].name,10);
	printf("简介:");
	scanf_s("%s", m->vets[m->vetnum].intro,20);
	for (i = 1; i <= m->vetnum; i++)
	{
		m->mat[m->vetnum][i].wet = Infinity;
		m->mat[i][m->vetnum].wet = Infinity;
	}
	return 1;
}

//9.删除一个结点
int delvet(mapstr* m)
{
	int i = 0, j, l, v;
	if (m->vetnum <= 0)
	{
		printf("图中已无顶点");
		return 1;
	}
	printf("\n下面请输入您要删除的景点编号:");
	scanf_s("%d", &v);
	while (v<0 || v>m->vetnum)
	{
		printf("\n输入错误!请重新输入:");
		scanf_s("%d", &v);
	}
	l = locatevet(campus, v);
	if (l < 0)
	{
		printf("顶点%d已删除\n", v);
		return 1;
	}
	for (i = l; i <= m->vetnum - 1; i++)
		for (j = 1; j <= m->vetnum; j++)//将二维数组中的第m+1行依次向前移动一行(删除第m行) 
			m->mat[i][j] = m->mat[i + 1][j];
	for (i = l; i <= m->vetnum - 1; i++)
		for (j = 1; j <= m->vetnum; j++)//将二维数组中的第m+1列依次向前移动一列(删除第m列)
			m->mat[j][i] = m->mat[j][i + 1];
	m->vets[v].number = -1;//表示此点已删除,后期打印也不会显示该点 
	m->vetnum--;//顶点个数-1 
	return 1;
}

//10.删除一条边
int delside(mapstr* m)
{
	int l, n, v0, v1;
	if (m->vetnum <= 0)
	{
		printf("图中没有边了,无法删除");
		return 1;
	}
	printf("\n下面请输入您要删除的边的起点和终点编号:");
	scanf_s("%d %d", &v0, &v1);
	l = locatevet(campus, v0);
	if (m->vetnum < 0)
	{
		printf("此%d顶点已删除", v0);
		return 1;
	}
	n = locatevet(campus, v1);
	if (n < 0)
	{
		printf("此%d顶点已删除", v1);
		return 1;
	}
	m->mat[l][n].wet = Infinity;//将删掉的边的权值改为无穷
	m->mat[n][l].wet = Infinity;
	m->sidenum--;//图的边数减一
	return 1;
}

//11.重新构造图
int creatmap(mapstr* m)
{
	int i, j, l, n, v0, v1, distance;
	printf("请输入图的顶点数和边数:\n");
	scanf_s("%d %d", &m->vetnum, &m->sidenum);
	printf("请输入顶点信息: \n");
	for (i = 1; i <= m->vetnum; i++)//输入各顶点对应的景点信息
	{
		printf("请输入景点编号:");
		scanf_s("%d", &m->vets[i].number);
		printf("请输入景点名称:");
		scanf_s("%s", &m->vets[i].name,10);
		printf("请输入景点简介:");
		scanf_s("%s", &m->vets[i].intro,20);
	}
	for (i = 0; i <= m->vetnum; i++)//权值初始化为无穷
		for (j = 0; j <= m->vetnum; j++)
			m->mat[i][j].wet = Infinity;
	printf("请输入图中各景点边的信息 \n");
	for (i = 1; i <= m->sidenum; i++)
	{
		printf("\n请输入第%d条边的起点,终点,长度为:", i);
		scanf_s("%d %d %d", &v0, &v1, &distance);
		l = locatevet(campus, v0);
		n = locatevet(campus, v1);
		if (l > 0 && n > 0)
		{
			m->mat[l][n].wet = distance;
			m->mat[n][l].wet = m->mat[l][n].wet;
		}
	}
	return 1;
}
//12.更改图部分信息
int newmap(mapstr* m)
{
	int changenum, i, l, n, t, distance, v0, v1;
	printf("\n下面请输入你要修改的景点的个数:\n");//修改定点对应的景点
	scanf_s("%d", &changenum);
	while (changenum<0 || changenum>vertex)
	{
		printf("\n你的输入有误,请重新输入");
		scanf_s("%d", &changenum);
	}
	for (i = 0; i < changenum; i++)
	{
		printf("\n请输入景点编号:");
		scanf_s("&d", &l);
		t = locatevet(campus, l);
		printf("\n请输入修改后景点的名称:");
		scanf_s("%s", &m->vets[t].name,10);
		printf("\n请输入修改后景点的简介:");
		scanf_s("%s", &m->vets[t].intro,20);
	}
	printf("\n下面请输入你要修改的边的个数");
	scanf_s("%d", &changenum);
	while (changenum<0 || changenum>vertex);
	{
		printf("\n你的输入有误,请重新输入");
		scanf_s("%d", &changenum);
	}
	if (changenum != 0)
		printf("\n下面请输入更新边的信息:\n");
	for (i = 1; i <= changenum; i++)
	{
		printf("\n修改的第%d条边的起点 终点 长度为:", i);
		scanf_s("%d %d %d", &v0, &v1, &distance);
		l = locatevet(campus, v0);
		n = locatevet(campus, v1);
		if (l >= 0 && n >= 0)
		{
			m->mat[l][n].wet = distance;
			m->mat[n][l].wet = m->mat[l][n].wet;
		}
	}
	return 1;
}

//13.输出图的邻接矩阵的值
void printmapstr(mapstr m)
{
	int i, j, k = 0;
	for (i = 1; i <= vertex; i++)
	{
		if (m.vets[i].number != -1)
			printf("%6d", i);
	}
	printf("\n");
	for (i = 1; i <= m.vetnum; i++)
	{
		for (j = 1; j <= m.vetnum; j++)
		{
			if (m.mat[i][j].wet == Infinity)
				printf(" **** ");
			else
				printf("%6d", m.mat[i][j].wet);
			k++;
			if (k % m.vetnum == 0)
				printf("\n");
		}
	}
}

//14.图的操作主函数
int changemap(mapstr* m)
{
	int choice;
	printf("(1)增加结点     (2)删除结点  \n");
	printf("(3)删除边       (4) 增加边   \n");
	printf("(5)输出邻接矩阵 (6)重新建图	\n");
	printf("(7)更新信息     (8)返回主页	\n");
	do
	{
		printf("\n请输入你的选择:");
		scanf_s("%d", &choice);
		switch (choice)
		{
		case 1:incvet(m); break;
		case 2:delvet(m); break;
		case 3:delside(m); break;
		case 4:incside(m); break;
		case 5:printmapstr(campus); break;
		case 6:creatmap(m); break;
		case 7:newmap(m); break;
		case 8:system("cls"); menu(); return 1;
		default:printf("未找到该功能,请输入有效选项!\n"); break;
		}
	} while (choice);
}

//15.用户登录
int userlog()
{
	int i;
	int a[6] = { 1,2,3,4,5,6 }, b[6];
	printf("\n请输入六位密码(用空格隔开):\n");
	for (i = 0; i < 6; i++)
		scanf_s("%d", &b[i]);
	for (i = 0; i < 6; i++)
	{
		if (a[i] != b[i])
		{
			printf("密码错误!自动返回主页面\n");
			menu();
			return 0;
		}
	}
	printf("密码正确,登陆成功!\n\n");
	changemap(&campus);
}

//16.弗洛伊德算法
void floyd(mapstr m)
{
	int i, j, k;
	for (i = 1; i <= vertex; i++)//将图的邻接矩阵赋值给 shortest二维数组,将矩阵pathh全部初始化为-1 
	{
		for (j = 1; j <= vertex; j++)
		{
			shortest[i][j] = m.mat[i][j].wet;
			pathh[i][j] = j;
		}
	}
	int ii, jj, k1 = 0;
	for (ii = 1; ii <= vertex; ii++)
		printf("%6d", ii);//横着标号1到11
	printf("\n");
	for (ii = 1; ii <= vertex; ii++)
	{
		printf("%d", ii);
		for (jj = 1; jj <= vertex; jj++)
		{
			printf("%6d", pathh[ii][jj]);
			k1++;
			if (k1 % vertex == 0)
				printf("\n");
		}
	}
	printf("\n\n\n");
	for (k = 1; k <= vertex; k++)//核心操作,完成了以k为中间点对所有的顶点对(i,j)进行检测和修改 
	{
		for (i = 1; i <= vertex; i++)
		{
			for (j = 1; j <= vertex; j++)
			{
				if (shortest[i][j] > shortest[i][k] + shortest[k][j])
				{
					shortest[i][j] = shortest[i][k] + shortest[k][j];
					pathh[i][j] = pathh[i][k];//记录一下所走的路 //P数组用来存放前驱顶点  
				}
			}
		}
	}
}

//17.输出数组
void printarray()
{
	int i, j, k = 0;
	for (i = 1; i <= vertex; i++)
		printf("%6d", i);//横着标号0-11
	printf("\n");
	for (i = 0; i <= vertex; i++)
	{
		printf("%d", i);//竖着标号0-11
		for (j = 1; j <= vertex; j++)
		{
			printf("%6d", pathh[i][j]);
			k++;
			if (k % vertex == 0)
				printf("\n");
		}
	}
	printf("\n\n\n");
}

//18.输出最短路径
void display(mapstr m, int i, int j)
{
	int a, b;
	a = i, b = j;
	printf("您要查询的两景点间最短路径:\n\n");
	printf("%d%s", a, m.vets[a].name);
	while (pathh[i][j] != b)
	{
		printf("-->%d%s", pathh[i][j], m.vets[pathh[i][j]].name);
		i = pathh[i][j];
	}
	printf("-->%d%s\n\n", b, m.vets[b].name);
	printf("%s-->%s的最短路径是:%d米\n\n", m.vets[a].name, m.vets[b].name, shortest[a][b]);
}

//19.任意两点间距离(16-19)
int shortdistance(mapstr m)
{
	int i, j;
	printf("请输入要查询的两个景点的数字编号(用空格隔开)\n");
	scanf_s("%d %d", &i, &j);
	if (i<0 || i>vertex || j<0 || j>vertex)
	{
		printf("输入信息有误!\n\n");
		printf("请输入要查询的两个景点的数字编号(用空格隔开)\n");
		scanf_s("%d %d", &i, &j);
	}
	else
	{
		floyd(m);
		printarray();
		display(m, i, j);
	}
	return 1;
}

//20.显示所有景点信息
void compusinfor(mapstr m)
{
	int i;
	printf(" \n\n编号     景点名称                        简介\n");
	printf("****************************************************************************\n");
	for (i = 1; i <= m.vetnum; i++)
	{
		if (m.vets[i].number != -1)
			printf("%-10d%-40s%-70s\n", m.vets[i].number, m.vets[i].name, m.vets[i].intro);
	}
	printf("****************************************************************************\n");
}

//21.用户界面
void mainwork()
{
	menu();
	int choice;
	campus = initmap();
	do
	{
		printf("请输入你的选择:");
		scanf_s("%d", &choice);
		switch (choice)
		{
		case 1:system("cls"); menu(); break;
		case 2:system("cls"); shortestpath(campus); break;
		case 3:system("cls"); shortdistance(campus); break;
		case 4:system("cls"); allpath(campus); break;
		case 5:system("cls"); compusinfor(campus); break;
		case 6:system("cls"); userlog(); break;
		case 0:system("cls"); printf("谢谢使用\n"); break;
		default:printf("未找到该功能,请输入有效选项!\n"); break;
		}
	} while (choice);
}

int main()
{
	mainwork();
	return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Ember_886/article/details/131614304

智能推荐

元素选择器之排除特定元素_input排他选择器-程序员宅基地

文章浏览阅读2.1k次。 需求如下:该搜索框是对整个页面的input检索 ,但与弹出层中的input冲突 博主几经辗转 简单处理 解决问题,思路如下:排除掉特定class的input。代码如下:$('input:not(.pop)', this.footer()).on('keyup change', function () { if (that.search() !== th..._input排他选择器

使用JAXB进行XML与JavaBean的转换(支持泛型)_jaxb 泛型-程序员宅基地

文章浏览阅读5.6k次,点赞6次,收藏20次。看到别人有个1024的勋章,特意留了一篇在今年的10.24日,看看会不会获得。在日常开发中可能涉及接口之间的相互调用,虽然在现在微服务的理念推广下,很多公司都采用轻量级的JSON格式做为序列化的格式,但是不乏有些公司还是有一些XML格式的报文,最近就在对接某个合作方的时候遇到了XML报文。在JSON报文爽快的转换下很难试用一个一个的拿报文参数,还是希望能直接将报文转换成Bean。接下来就了解到..._jaxb 泛型

python numpy学习笔记_ndarray的位置-程序员宅基地

文章浏览阅读1.2k次。numpy的主要数据对象是多维数组,其中包含相同类型的元素,通常是数字类型,每个元素都有一个索引。使用numpy前通常要导入包。import numpy as np目录类型维度创建运算索引和切片类型numpy的数组被称为ndarray。numpy.array只处理一维数组,而ndarray对象才提供更多功能。a = np.array([[1, 2, 3], [4, 5, 6]])type(a) # <class 'numpy.ndarray'>dtype属性可以获得元素的数_ndarray的位置

我的世界java版gamemode指令_《我的世界》Java版常用指令代码大全!你想要的都在这里了!...-程序员宅基地

文章浏览阅读1.6w次。还在苦于网上找到的一些指令已经不适用了吗?还在苦于有些地方的指令有误吗?还在苦于有些地方整理的指令不够全面吗?那么你来对地方了!小编为大家整理了《我的世界》原版游戏常用的指令,这些基本足以满足各位的基本需求了!大家来一起看看吧!注:表示的是必须输入的部分,[方括号]表示的是可选择性输入的部分基本命令列表命令描述/?/help的替代命令,提供命令使用帮助。/ban + 玩家名字将玩家加入封禁列表。/..._gamemode指令java

Spring Boot 结合shiro做第三方登录验证_shiro 第三方token登录-程序员宅基地

文章浏览阅读1.5w次,点赞3次,收藏3次。Spring Boot 结合shiro做第三方登录验证1、首先,说一下我的具体实现思路。在做spring boot拦截器的过程中,开始我准备用spring security来实现,但是研究了一段时间之后发现spring security的集成度太高,需要修改的东西比较多,而且对它本身的使用方法不是很了解,后来转而使用Apache shiro。由于是第三方登录,是不需要我来验证密码的。最开始,我陷入了_shiro 第三方token登录

labelme UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaf in position 227: illegal mult_file "c:\rgzn\labelme-main\setup.py", line 91, in -程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏4次。[INFO ] __init__:get_config:71 - Loading config file from:C:\Users\xxx\.labelmercTraceback (most recent call last): File .... line 191, in <module> main() File ...., line 145, in main config = get_config(config_file_or_yaml, config_fro_file "c:\rgzn\labelme-main\setup.py", line 91, in main if sys.argv[1] == "re

随便推点

代码报错原因和处理方法-程序员宅基地

文章浏览阅读8.7k次。代码错误的原因和调试方法_代码报错

深度解析Java游戏服务器开发-程序员宅基地

文章浏览阅读5.2k次,点赞9次,收藏40次。---恢复内容开始---1.认识游戏  1.1什么是游戏    1.1.1游戏的定义              任何人类正常生理需求之外的活动均可称为游戏    1.1.2游戏的分类      RPG角色扮演游戏、ACT动作游戏、AVG冒险游戏、FPS第一人称视角射击游戏、TPS第三人称视角射击游戏、FTG格斗游戏、SPT体育游戏、RAC竞速游戏、RTS即时战略游戏、STG..._深度解析java游戏服务器开发

【ThinkPHP5初体验(二)1】CSRF防范原理(thinkphp5 CSRF ajax令牌)_tp5 开启csrf令牌-程序员宅基地

文章浏览阅读4k次。CSRF是什么我就不解释了,百度一搜全是,比波姐的片源还要多,千篇一律都他么是复制粘贴。那为什么这个令牌(token)操作可以防范CSRF呢?下面我就随便说说说错了大家不要介意。首先我们要知道令牌是存储在session里面的,这个很重要 php代码如下&lt;?php namespace app\index\controller; //我直接允许跨域,因为伪装..._tp5 开启csrf令牌

市盈率、市净率、净资产收益率股息率介绍-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏6次。市盈率PE市盈率 = 市值/净利润概念解析:买入一家公司,几年回本,年化收益率:净利润/市值(市盈率的倒数)举例:砖头10万买个砖头,每年拍人带来1万利润,需要10年回本市盈率:10/1 = 10年化收益率:1/10 = 10%市净率PB市净率 = 市值/净资产净资产 = 总资产 - 负债举例:张三便利店,净资产:120万市值:1..._净资产收益率和股息率

墨器杯垫 文创商品设计特优_杯垫文创设计说明-程序员宅基地

文章浏览阅读737次。教育部昨举行「102年国立馆所文创商品设计比赛」颁奖典礼,台北科技大学创新设计研究所硕士生谢镇宇,为TW艺术教育馆设计「墨器」杯垫,取「默契」谐音,用5片压克力板,展现水墨画层层渲染效果,增加立体视觉感受,并在杯架后方加入LED光源,获评审肯定夺特优奖和奖金10万元。台南应用科技大学商品设计系学生高郁翔,为国立自然科学博物馆设计「恐龙化石钉书机」,他认为小朋友把钉书机钉下去的那一刻,会觉得像暴龙準_杯垫文创设计说明

C#中关于XML与对象,集合的相互转换-程序员宅基地

文章浏览阅读404次。XML与对象,集合的相互转化  今天小伙伴在群里问了一下关于XML与对象之间的相互转换,作为菜鸟的我正好趁着闲着的时间学习了一波,直接上代码了,有疑问或者有错误的地方还请大家指正,谢谢。。。。 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System...._c# xml转集合