当前位置: 首页 > article >正文

校园导航系统

关于数据结构的一个整理:

1、链式有序表的合并

2、栈

3、队列

4、二叉树、哈夫曼报文

5、图论

6、十大排序

7、校园导航系统

文章目录

  • 校园导航系统
    • 演示示例
    • 代码示例
      • 1、弧结点和顶点节点
      • 2、Map节点
      • 3、用户

校园导航系统

采用C++语言涉及了数据库相关的操作,多使用面向对象语法。
使用最短路径等算法实现。

演示示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码示例

1、弧结点和顶点节点

ArcNode.h

#pragma once
class ArcNode
{
private:
	int weight;
	int mark;					//访问标记   0 代表未访问
	int ivex, jvex;				//该边依附两个顶点的的位置
	ArcNode* ilink, * jlink;	//分别指向依附这2个顶点的下一条边
public:
	ArcNode() :ivex(0), jvex(0), ilink(nullptr), jlink(nullptr), mark(0), weight(0) {}
	void set_weight(int w) {
		this->weight = w;
	}
	int get_weight() {
		return weight;
	}
	void set_mark(int i) {
		this->mark = i;
	}
	int get_mark() {
		return mark;
	}
	void set_ivex(int i1) {
		this->ivex = i1;
	}
	int get_ivex() {
		return ivex;
	}
	void set_jvex(int i2) {
		this->jvex = i2;
	}
	int get_jvex() {
		return jvex;
	}
	void set_ilink(ArcNode* it) {
		this->ilink = it;
	}
	ArcNode* get_ilink() {
		return ilink;
	}
	void set_jlink(ArcNode* ik) {
		this->jlink = ik;
	}
	ArcNode* get_jlink() {
		return jlink;
	}
};

VertexNode.h

#pragma once
#include"ArcNode.h"
#include<string>
using std::string;
class VertexNode
{
private:
	int id;
	string data;
	string content;
public:
	VertexNode():id(0),data(""),content("") {}
	void set_data(string ata) {
		this->data = ata;
	}
	string get_data() {
		return data;
	}
	void set_content(string ta) {
		this->content = ta;
	}
	string get_content() {
		return content;
	}
	void set_id(int ik) {
		this->id = ik;
	}
	int get_id() {
		return id;
	}
};

2、Map节点

Map.h

#pragma once
#include"ArcNode.h"//边类
#include"VertexNode.h"//顶点类
#include"Databases.h"//数据库类
#include"User.h"
class Map
{
private:
	Databases database;//定义数据库的对象,连接数据库
public:
	int ArcArrary[99][99] = { 0 };//邻接矩阵
	VertexNode* arrary;//地图的顶点数组
	int vernum;//地点个数
	int arcnum;//边个数

	bool visited[999] = { false };//标记每个顶点是否被访问过
	int dist[999] = { 0 };//存储源点到各点的最短距离
	int path[999] = { 0 };//存储最短路径上当前节点的前一个节点

	int pathaway[99][99] = { 0 };//最短路径上的前驱节点
	int dist_f[99][99] = { 0 };//两个顶点之间的最短距离
public:
	void Read();//读取数据函数
	void Clear();//销毁函数
	int GetDataIndex(string data);//找到此建筑的下标
	bool RepatGetData(string data);//查重
	void Display_schoolmap();//打印平面地图
	void Search_route();//显示所有地点的编号以及地点间的路径距离
	void Dijkstra(int v);//迪杰斯特拉算法,找最短路径
	void Floyed();//弗洛伊德算法
	void Print_Floyed(int start, int end);//调用佛洛依德
	bool Print_Choice_place(int start, int end, int& sum, string& str);//打印必经点的路径
	void DFS(int i, int j, int path[], int& len, int& sum, bool& f);//深度优先遍历
	void Print_DFS(int i, int j);//打印两点间所有可能存在的路径
	void BFS(int start, int limit);//广度优先遍历
public://管理员操作
	void Add_newVertex();//添加新的顶点
	void Add_newArc();//添加新边
	void Delete_oldVertex(string data);//删除旧的顶点
	bool Delete_oldArc(int i, int j);//删除旧的边
	bool Alter_ver(int i);//修改顶点
	bool Alter_arc(int i, int j);//修改边
	void Writing_information(int i);//描绘信息
public://登录功能
	void registered();//注册
	bool login(string& aCC);//登录
	void modify(string acc);//修改
	void logout(string acc);//注销
};

Map.cpp

#define _CRT_SECURE_NO_WARNINGS
#define MAXINFNUM 99999
#include"VertexNode.h"
#include"Map.h"
#include<iostream>
#include<iomanip>//setw对齐
#include<queue>
#include<vector>
#include<cstring>
#include<stack>
#include<string>
#include <random>//C++更加标准的随机数生成
#include<ctime>//获取当地时间
#include<conio.h>
#include<Windows.h>
using namespace std;
const int MAXNUM = 999;
void Map::Read()
{
	vernum = 0;
	arcnum = 0;
	arrary = new VertexNode[MAXNUM];
	for (int i = 0; i < 99; i++) {
		for (int j = 0; j < 99; j++) {
			ArcArrary[i][j] = MAXINFNUM;
		}
	}
	database.Read_databases_place(arrary, vernum);
	database.Read_databases_pathway(arcnum,vernum,arrary,ArcArrary);
}

void Map::Clear()
{
	vernum = 0;
	arcnum = 0;
	for (int i = 0; i < 99; i++) {
		for (int j = 0; j < 99; j++) {
			ArcArrary[i][j] = MAXINFNUM;
		}
	}
}

int Map::GetDataIndex(string data)
{
	//根据名字查找
	for (int i = 0; i < vernum; i++) {
		if (arrary[i].get_data() == data) {
			return i;
		}
	}
	bool isDigit = true;
	bool isHan = true;
	//判断输入是否是汉字
	for (char ch : data) {
		if (ch >= 0x4e00 && ch <= 0x9fff) {
			isHan = false;
			break;
		}
	}
	if (isHan) {
		//判断输入是否全部是数字
		for (char c : data) {
			if (!isdigit(c)) {
				isDigit = false;
				break;
			}
		}
		//如果输入全部是数字,则将其转化为整型
		int num = 0;
		if (isDigit) {
			num = stoi(data);
			//根据id查找
			for (int i = 0; i < vernum; i++) {
				if (arrary[i].get_id() == stoi(data)) {
					return i;
				}
			}
		}
	}
	return -1;
}

bool Map::RepatGetData(string data)
{
	for (int i = 0; i < vernum; i++) {
		if (data == arrary[i].get_data()) {
			return true;
		}
	}
	return false;
}

bool check(string str) {//检查权值是否为正整数
	int i;
	bool f = true;
	for (i = 0; i < str.size(); i++) {
		//如果不是数字
		if (str[i] >= '0' && str[i] <= '9' && str[0] != '0') {
			f = true;
		}
		else {
			f = false;
			break;
		}
	}
	return f;
}

void school_map() {
	cout << "————————————南阳理工学院(西北校区)平面图—————————-"<< endl;
	cout << "              《北门》                                                   |" << endl;
	cout << "                 |                   |------《4教》                      |"<< endl;
	cout << "                 |--------------------                                   |"<< endl;
	cout << "                 |              《生化学院》                             |"<< endl;
	cout << " --------《1教》--                   / |                                 |"<< endl;
	cout << " |               |                  /  |                                 |"<< endl;
	cout << "《3教》          |                 /   |                                 |"<< endl;
	cout << " |               |                /    |                                 |"<< endl;
	cout << " |               ----------------/     |                                 |"<< endl;
	cout << " |               |                     |                                 |"<< endl;
	cout << " |           《中关村》                |                                 |"<< endl;
	cout << " |                |                    |                                 |"<< endl;
	cout << "  \\               |                《西北操场》                          |"<< endl;
	cout << "   \\              \\                  |                                   |"<< endl;
	cout << "     \\             |                 /                                   |"<< endl;
	cout << "       ---------《小礼堂》------------                                   |"<< endl;
	cout << "       |             |                                                   |"<< endl;
	cout << "      /               \\                                                  |"<< endl;
	cout << "     /                 \\                                                 |"<< endl;
	cout << "《西北餐厅》            \\                                                |"<< endl;
	cout << "     |     \\             \\                                               |"<< endl;
	cout << "     |   《下沉广场》---《校医务室》                                     |"<< endl;
	cout << "     |        /             |                                            |"<< endl;
	cout << "《女生公寓》-               |                                            |"<< endl;
	cout << "     \\                      |                                            |"<< endl;
	cout << "      |                     |                                            |"<< endl;
	cout << " 《土木工程学院》           |                                            |"<< endl;
	cout << "      | \\                   |                                            | "<< endl;
	cout << "      |   \\                 /                                            |"<< endl;
	cout << "      |     \\--《画室》----                                              |"<< endl;
	cout << "      |           |                                                      |"<< endl;
	cout << "      |      《建筑学院》                                                |"<< endl;
	cout << "      |          /                                                       |"<< endl;
	cout << " 《智能制造学院》                                                        |"<< endl;
	cout << "-------------------------------------------------------------------------" << endl;
	cout << endl;
	cout << "————————————南阳理工学院(东南校区)平面图—————————-—" << endl;
	cout << "|齐贤广场*-----                                                            |" << endl;
	cout << "|              \\                                                           |" << endl;
	cout << "|               *信息工程学院-*计算机与软件学院---*菜鸟驿站       *教师公寓|" << endl;
	cout << "|               |             |                                   |        |" << endl;
	cout << "|               *数理学院-----|                                   |        |" << endl;
	cout << "|               |             |                                   |        |" << endl;
	cout << "|                --           |                                   |        |" << endl;
	cout << "|                  |          |                                   |        |" << endl;
	cout << "|张仲景国医国药学院*----------|-----------------------------------*学生公寓|" << endl;
	cout << "|                  | |   梦  ||               |                            |" << endl;
	cout << "|              ----\\ |       ||               |                            |" << endl;
	cout << "|             /   --*|   溪  |*               *东南操场                    |" << endl;
	cout << "|            /      ||       ||               \\                            |" << endl;
	cout << "|           /       ||   湖                   \\                            |" << endl;
	cout << "|          /       /  -------------------------------*东南餐厅             |" << endl;
	cout << "|         /       /                                  |                     |" << endl;
	cout << "|汇森楼*------   /        ---------------------------|                     |" << endl;
	cout << "|             \\ /         |                                                |" << endl;
	cout << "|              *图书馆 ---*体育馆                                          |" << endl;
	cout << "---------------------------------------------------------------------------" << endl;
}

void Map::Display_schoolmap()//要修改为学校平面地图
{
	system("cls");
	school_map();
	string cs = "";
	bool f = false;
	cout << "是否查看地点介绍(y/n):";
	while (1) {
		cin >> cs;
		if (cs == "y") {
			cout << "请输入你要查看的地点名字:";
			string name = "";
			cin >> name;
			for (int j = 0; j < vernum; j++) {
				if (arrary[j].get_data() == name) {
					cout << "地点:" << name << endl;
					cout << "简介:" << arrary[j].get_content() << endl;
					f = true;
					break;
				}
			}
		}
		else {
			f = false;
			cout << "退出此界面。" << endl;
			Sleep(400);
			break;
		}
		if (f) {
			cout << "是否继续查看地点(y/n):";
		}
	}
}

void Map::Search_route()
{
	int fake_arr[99][99] = { 0 };
	for (int i = 0; i < vernum; i++) {
		for (int j = 0; j < vernum; j++) {
			fake_arr[i][j] = ArcArrary[i][j];
		}
	}
	int lj = 1;
	cout << "校园地图现有的建筑物" << vernum << "个,路径数 " << arcnum << "个" << endl;
	cout << "+-------------------------------------------------------------+" << endl;
	cout << left <<setw(10)<<"| 编号 |         建筑物    <---->    建筑物          |  距离  |" << endl;
	cout << "+-------------------------------------------------------------+" << endl;
	for (int i = 0; i < vernum; i++) {
		for (int j = 0; j < vernum; j++) {
			if (fake_arr[i][j] != MAXINFNUM) {
				cout << left <<"| " <<setw(4)<<lj++ << " | " << setw(20) << arrary[i].get_data() << " | " <<setw(20)<< arrary[j].get_data() << " |   " <<setw(3)<< ArcArrary[i][j] << "  |" << endl;
				cout << "+-------------------------------------------------------------+" << endl;
				fake_arr[j][i] = fake_arr[i][j] = MAXINFNUM;
			}
		}
	}
	system("pause");
}

void Map::Dijkstra(int v)//求某个顶点到其他顶点的最短路径,并将所有的最短路径全部打印
{
	for (int i = 0; i < vernum; i++) {//初始化3个辅助数组
		visited[i] = false;
		dist[i] = MAXINFNUM;
		path[i] = -1;
	}
	dist[v] = 0;//源点到自身为0
	for (int i = 0; i < vernum; i++) {//访问源点的第一条边
		if (i == v) continue;
		if (ArcArrary[v][i] != MAXINFNUM) {
			dist[i] = ArcArrary[v][i];
			path[i] = v;
		}
	}
	//将源点加入已访问集合
	for (int i = 1; i < vernum; i++) {
		int minDist = MAXINFNUM;
		int u = v;
		for (int j = 0; j < vernum; j++) {//找到未访问集合中距离源点最近的节点
			if (!visited[j] && dist[j] < minDist) {
				minDist = dist[j];//找到最小的权值
				u = j;//记录最小权值的父节点
			}
		}
		visited[u] = true;//将该节点加入已访问集合
		for (int w = 0; w < vernum; w++) {//更新剩余未访问集合中节点的最短距离和前一个节点
			//因为u已经更新了父节点为j,所以要看uw的路径是否存在
			if (!visited[w] && ArcArrary[u][w] != MAXINFNUM && dist[u] + ArcArrary[u][w] < dist[w]) {
				dist[w] = dist[u] + ArcArrary[u][w];//每个能到达的顶点的下标为w,dist[w]为起点v到终点w的权值和
				path[w] = u;//path记录了每个顶点距离最近的父节点的下标
			}
		}
	}
	//输出源点到各个顶点的最短路径
	cout << "起点:<" << arrary[v].get_data() << ">" << endl;
	cout << "终点:" << endl;
	for (int i = 0; i < vernum; i++) {
		if (i != v) {
			cout << i+1 << " :  " << arrary[i].get_data() << endl;
			if (dist[i] == MAXINFNUM) {
				cout << "No Path." << endl;
			}
			else {
				cout << arrary[v].get_data();
				stack<int> p; // 使用栈来存储路径
				int k = i;
				while (path[k] != -1) {
					p.push(k);
					k = path[k];
				}
				while (!p.empty()) {
					cout << right << "->" << arrary[p.top()].get_data();
					p.pop();
				}
				cout << "(" << dist[i] << ")" << endl;
			}
		}
	}
	cout << endl;
}

void Map::Floyed()
{
	for (int i = 0; i < vernum; ++i) {
		//初始化
		for (int j = 0; j < vernum; ++j) {
			dist_f[i][j] = MAXINFNUM;
			pathaway[i][j] = -1;
		}
		for (int k = 0; k < vernum; k++) {
			if (ArcArrary[i][k] != MAXINFNUM && dist_f[i][k] > ArcArrary[i][k]) {
				dist_f[i][k] = dist_f[k][i] = ArcArrary[i][k];
				pathaway[i][k] = k;
			}
		}
		dist_f[i][i] = 0;
	}
	//k为中转点,i为起点,j为终点,循环比较dist_f[i][j]和dist_f[i][k] + dist_f[k][j],
	//如果dist_f[i][k] + dist_f[k][j]为更小值,则把dist_f[i][k] + dist_f[k][j]覆盖保存在dist_f[i][j]中。
	for (int k = 0; k < vernum; ++k) {
		for (int i = 0; i < vernum; ++i) {
			for (int j = 0; j < vernum; ++j) {
				if (dist_f[i][j] > dist_f[i][k] + dist_f[k][j]) {
					dist_f[i][j] = dist_f[i][k] + dist_f[k][j];
					pathaway[i][j] = pathaway[i][k];
				}
			}
		}
	}
}

void Map::Print_Floyed(int start, int end)
{
	Floyed();//调用弗洛伊德算法,求最短路径
	if (dist_f[start][end] == MAXINFNUM) {
		cout << "没有此路径。" << endl;
	}
	else {
		cout << "\n最优出行路线 : " << arrary[start].get_data() << "->" << arrary[end].get_data() << endl;
		cout << arrary[start].get_data() << "->";
		int cur = start;
		while (pathaway[cur][end] != end) {
			cur = pathaway[cur][end];
			//上次报错信息是因为未判断cur是否为-1了
			cout << arrary[cur].get_data() << "->";
		}
		cout << arrary[end].get_data() << " (" << dist_f[start][end] << ")" << endl;
	}
}

bool Map::Print_Choice_place(int start, int end, int& sum, string& str)//必经点路径
{
	Floyed();//调用弗洛伊德算法,求最短路径
	if (dist_f[start][end] == MAXINFNUM) {
		return false;
	}
	else {
		cout << arrary[start].get_data() << "->";
		int cur = start;
		while (pathaway[cur][end] != end) {
			cur = pathaway[cur][end];
			//上次报错信息是因为未判断cur是否为-1了
			cout << arrary[cur].get_data() << "->";
			str += arrary[cur].get_data() + "->";
		}
		cout << arrary[end].get_data() << "  (" << dist_f[start][end] << ")" << endl;
		str += arrary[end].get_data() + "->";
		sum += dist_f[start][end];//就算此路径
		return true;
	}
}

void Map::DFS(int i, int j, int path[], int& len, int& sum, bool& f)
{
	//深度优先搜索,先读取i到j的最深路径,然后回溯
	visited[i] = true;
	path[len++] = i;//前驱数组,存放前一个顶点的下标
	if (i == j) {//递归实现找到全部的路径
		f = true;
		for (int k = 0; k < len - 1; k++) {
			cout << arrary[path[k]].get_data() << " -> ";
		}
		cout << arrary[path[len - 1]].get_data() << "  (" << sum << ")" << endl;
	}
	for (int k = 0; k < vernum; k++) {
		if (ArcArrary[i][k] != MAXINFNUM && !visited[k]) {
			sum += ArcArrary[i][k];//向深处遍历则增加权值
			DFS(k, j, path, len, sum, f);
			sum -= ArcArrary[i][k];//回溯就要减去加上的权值
		}
	}
	len--;//每次回溯,当len=0时也意味着着递归结束
	visited[i] = false;
}

void Map::Print_DFS(int i, int j)//输出两顶点间的所有路径和权值
{
	for (int i = 0; i < 999; i++) {
		path[i] = MAXINFNUM;
		visited[i] = false;
	}
	int len = 0;
	int sum = 0;
	bool f = false;
	DFS(i, j, path, len, sum, f);
	if (!f) {
		cout << "此路径在地图中不存在。" << endl;
	}
}

void Map::BFS(int start, int limit)//实现附近位置路线
{	
	cout << endl;
	for (int i = 0; i < 999; i++) {
		visited[i] = false;
		path[i] = -1; //存储当前顶点的上一个顶点
		dist[i] = MAXINFNUM;
	}
	queue<int> q; // 存储顶点的队列
	q.push(start); // 将起始顶点加入队列
	visited[start] = true; // 标记起始顶点已访问过
	//int distance[N]; // 存储每个顶点到起始顶点的距离
	//int prev[N]; // 存储当前顶点的上一个顶点
	dist[start] = 0; // 起始顶点到自身的距离为0

	while (!q.empty()) {
		int curr = q.front(); // 取出队头顶点
		q.pop();
		for (int i = 0; i < vernum; i++) {
			if (ArcArrary[curr][i] !=MAXINFNUM && !visited[i]) { // 当前顶点的相邻顶点未访问过且有边相连
				dist[i] = dist[curr] + 1; // 更新相邻顶点到起始顶点的距离
				path[i] = curr; // 记录上一个顶点
				if (dist[i] <= limit) { // 如果距离限制内,则将该顶点加入队列并标记为访问过
					q.push(i);
					visited[i] = true;
				}
			}
		}
	}

	// 输出所有符合条件的路径和距离
	for (int i = 0; i < vernum; i++) {
		if (visited[i] && dist[i] != 0 && dist[i] != MAXINFNUM) {
			cout << ">路径: " << arrary[start].get_data() << " -> " << arrary[i].get_data() << "    距离: " << dist[i] << endl;
			int curr = i;
			stack<int> s; // 存储路径的栈
			s.push(curr);
			while (curr != start) { // 从终点回溯到起点
				curr = path[curr]; // 获取上一个顶点
				s.push(curr);
			}
			string str = "";
			while (!s.empty()) { // 弹出栈中所有顶点,按正序输出路径
				str = str + arrary[s.top()].get_data() + "->";
				s.pop();
			}
			cout << str.substr(0, str.length() - 2);
			cout << endl;
		}
	}
}

void Map::Add_newVertex()//添加新的建筑物
{
	while (1)
	{
		cout << "输入新顶点:";
		string jianzhu = "", intr = "1";
		cin >> jianzhu;
		bool f = RepatGetData(jianzhu);//查看输入新顶点是否重复
		if (f) {
			cout << "目标已存在,请重新" << endl;
		}
		else {
			cout << "是否添加介绍信息? y :";//添加地点简介
			char c;
			cin >> c;
			if (c == 'y') {
				cout << "输入";
				cin >> intr;
			}	
			int eit = 0;
			database.Add_databases_place(eit,jianzhu.c_str(), intr.c_str());//存入数据库

			arrary[vernum].set_content(intr);//存入顶点数组
			arrary[vernum].set_data(jianzhu);
			arrary[vernum].set_id(eit);
			vernum++;
		}
		cout << "是否继续进行操作(y/n):";
		char ch;
		cin >> ch;
		if (ch == 'n')break;
	}
}

void Map::Add_newArc()//单独添加新边
{
	cout << "请输入由两个顶点构成的边" << endl;
	int m = 0, n = 0;
	string one = "", two = "";
	while (1) {
		cout << "顶点one:";
		cin >> one;
		m = GetDataIndex(one);//查找顶点在数组里面的下标
		cout << "顶点two:";
		cin >> two;
		n = GetDataIndex(two);
		if (m == -1 || n == -1) {
			cout << "目标顶点不存在" << endl;
		}
		else {
			//顶点下标,弧节点连接
			cout << "输入路径:";
			string wei = "";
			cin >> wei;
			while (!check(wei)) {//检查
				cout << "请输入正整数,不要输入负数或者小数或字母:";
				cin >> wei;
			}
			int we = atoi(wei.c_str());//强制转化
			ArcArrary[m][n] = ArcArrary[n][m] = we;//权值
			database.Add_databases_pathway(arrary[m].get_data(), arrary[n].get_data(), we);
		}
		char c = getchar();
		cout << "是否继续添加? y :";
		if (getchar() != 'y') break;
	}

}

void Map::Delete_oldVertex(string data)
{
	int i = GetDataIndex(data);//i为待删除顶点的序号
	if (i == -1) {
		cout << "未找到此数据。" << endl;
		return;
	}
	database.Delete_databases_place(arrary[i].get_data());//数据库删除
	cout << "相关 "<< arrary[i].get_data() <<" 的信息,全部删除成功。" << endl;
	for (int j = 0; j < vernum; j++)//删除与顶点i相连的边(如果有的话)
	{
		if (i != j) {
			Delete_oldArc(i, j);//如果存在此弧,则删除
		}
	}
	//排在顶点v后面的顶点的序号减1
	for (int j = i + 1; j < vernum; j++)
	{
		arrary[j - 1] = arrary[j];
	}
	vernum--; //顶点数减1
	
}

bool Map::Delete_oldArc(int i, int j)//删除原来的边
{
	ArcArrary[i][j] = ArcArrary[j][i] = MAXINFNUM;//邻接矩阵赋值无限大,代表是不可到达
	bool f = database.Delete_databases_patheay(arrary[i].get_data(), arrary[j].get_data());//数据库导入信息删除
	return f;
}

bool Map::Alter_ver(int i)
{
	bool f = false;
	string new_p = "";
	while (1) {
		if (vernum > 0) {
			cout << "地名为:" << arrary[i].get_data() << endl;
			cout << "请输入新的地名:";
			cin >> new_p;
			int p = GetDataIndex(new_p);
			if (p == -1 || i == p) {
				f = database.Alter_daatabases_ver(arrary[i].get_data(), new_p);
				//修改顶点数组
				arrary[i].set_data(new_p);
			}
			else {
				cout << "名字重复了。" << endl;
			}
		}
		else {
			cout << "表中无数据。" << endl;
		}
		char c = getchar();
		cout << "是否继续? y :";
		if (getchar() != 'y') break;
	}
	return f;
}

bool Map::Alter_arc(int i, int j)
{
	cout << "路径信息是:" << arrary[i].get_data() << " <--> " << arrary[j].get_data() << endl;
	cout << "(单路径)输入你要修改权值为:";
	string w = "";
	cin >> w;
	while (!check(w)) {//检查
		cout << "请输入正整数,不要输入负数或者小数或字母:";
		cin >> w;
	}
	int we = atoi(w.c_str());
	ArcArrary[i][j] = ArcArrary[j][i] = we;
	bool f2 = database.Alter_daatabases_arc(arrary[j].get_data(), arrary[i].get_data(), we);
	return f2;
}

void Map::Writing_information(int i)//描绘信息
{
	cout <<"地点:"<< arrary[i].get_data() << endl;
	if (arrary[i].get_content() == "1") {
		cout << "暂无介绍。" << endl;
	}
	else {
		cout << "内容:" << arrary[i].get_content() << endl;
	}
	string hau = "";
	cout << "请输入你要描绘的内容:";
	cin >> hau;
	char c = getchar();
	cout << "是否确定? y :";
	if (getchar() == 'y')
	{
		arrary[i].set_content(hau);
		database.Writing_inf(hau,arrary[i].get_id());
	}
	else {
		cout << "取消输入。" << endl;
	}
}

void Map::registered()
{
	system("cls");
	cout << "***注册  账号***" << endl;
	cout << "  1.管理员注册 2.退出" << endl;
	int c = 0;
	string ac = "", pa = "", ti = "";
	//随机数生成六位账号
	for (int i = 0; i < 6; ) {
		random_device seed;//硬件生成随机数种子
		ranlux48 engine(seed());//利用种子生成随机数引擎
		uniform_int_distribution<> distrib(0, 9);//设置随机数范围,并为均匀分布
		int random = distrib(engine);//随机数
		if (random == 0 && ac.length() == 0) {//确保第一位不是0
			continue;
		}
		ac += to_string(random);//生成的账号
		i++;
	}
	cout << "choice:";
	while (1) {
		cin >> c;
		if (c == 1)break;
		if (c == 2)return;
		else {
			cout << "格式错误。\nchoice:";
		}
	}
	while (1)
	{
		cout << "请输入超级权限口令:";//超及权限管理员拥有,密码 1
		string kl = "";
		cin >> kl;
		if (kl == "1") {
			cout << "*进入超级权限界面*" << endl;
			cout << "为你随机生成6位数字账号:" << ac << endl;
			time_t nowtime;
			while (1) {
				cout << "*设置密码:";
				cin >> pa;
				if (pa.length() > 8) {
					cout << "密码超出八位!请再次设置" << endl;//确保密码只能设置8位
					continue;
				}
				break;
			}
			//生成当地时间
			struct tm* p;;
			time(&nowtime);
			p = localtime(&nowtime);
			ti = "2023/" + to_string(p->tm_mon + 1) + "/" + to_string(p->tm_mday) + " " + to_string(p->tm_hour) + ":" + to_string(p->tm_min);
			cout << "*当前注册时间:" << ti << endl;
			database.Regisitered_database_manger(ti, ac, pa);
			system("pause");
			break;
		}
		else {
			cout << "格式错误。是否继续注册(y/n):";
			string ch = "";
			cin >> ch;
			if (ch == "n")break;
		}
	}
}

bool Map::login(string& aCC)
{
	system("cls");
	cout << "***管理员  登录***" << endl;
	int i = 1;
	while (1) {
		char s;
		char ac[25], pa[25];
		int j = 0;//确保数组从0开始 
		cout << "*请输入账号:";
		cin >> ac;
		cout << "*请输入密码:";
		while ((s = _getch()) != '\r')
		{
			if (s == '\b')
			{
				if (j > 0) {
					j--;//回删一位 
					cout << "\b \b";
				}
			}
			else
			{
				pa[j] = s;  //存入数组 
				j++;
				cout << "*"; //用* 代替密码 
			}
		}
		pa[j] = '\0';//退出

		if (database.Login_database(ac,pa))//如果返回1,则表示查询到账号和密码,账号标注唯一建不可重复
		{
			cout << endl << "验证正确" << endl;
			for (int ij = 0; ij < 20; ij++)
			{
				cout << ".";
				Sleep(50);
			}
			aCC = ac;//记录账号,以便修改密码和注销操作
			return true;//登陆成功并选择进入什么操作界面
		}
		else
		{
			cout << endl << "*账号及密码错误!" << endl;
		}
		i++;
		if (i == 4)
		{
			cout << endl << ">已输入3次,退出登录" << endl;
			system("pause");
			return false;
		}
	}
}

void Map::modify(string acc)
{
	char a[25], pass[25];
	strcpy(a, acc.c_str());
	cout << "请输入旧密码:";
	string x = "";
	cin >> x;
	strcpy(pass, x.c_str());

	if (database.Login_database(a, pass)) {
		cout << "请输入新密码:";
		string pppa = "";
		cin >> pppa;
		database.Modify_database(acc, pppa);
		cout << "你已经将账号为 " << acc << " 用户密码修改为了 " << pppa << endl;
	}
	else {
		cout << "旧密码输入错误,请认真思考。" << endl;
	}
	system("pause");
}

void Map::logout(string acc)
{
	char a[25], pass[25];
	strcpy(a, acc.c_str());
	cout << "请输入旧密码:";
	string x = "";
	cin >> x;
	strcpy(pass, x.c_str());

	if (database.Login_database(a, pass)) {
		database.Logout_database(acc);
		cout << "账号 " << acc << " 已成功注销。" << endl;
	}
	else {
		cout << "旧密码输入错误,暂不可注销。" << endl;
	}
	system("pause");
}

3、用户

User.h

#pragma once
#include<string>
#include"Databases.h"
using std::string;
class User
{
private:
	Databases user;//用户类调用数据库
private:
	string name = "";	//用户名
	string account = "";
	string password = "";
	string phone = "";//电话
	string email = "";//邮箱
	string r_time = "";//注册时间
public:
	void registered();//注册
	void login(string& ch, string& aCC);//登录
	void modify(string acc,string ch);//修改
	void logout(string acc,string ch);//注销
private:
	string get_name() {
		return name;
	}
	string get_account() {
		return account;
	}
	string get_password() {
		return password;
	}
	string get_phone() {
		return phone;
	}
	string get_email() {
		return email;
	}
	string get_time() {
		return r_time;
	}
	void set_name(string str) {
		this->name = str;
	}
	void set_account(string str) {
		this->account = str;
	}
	void set_password(string str) {
		this->password = str;
	}
	void set_phone(string str) {
		this->phone = str;
	}
	void set_email(string str) {
		this->email = str;
	}
	void set_time(string str) {
		this->r_time = str;
	}
};

User.cpp

#define _CRT_SECURE_NO_WARNINGS
#include"User.h"
#include<iostream>
#include<string>
#include <random>//C++更加标准的随机数生成
#include<ctime>//获取当地时间
#include<conio.h>
#include<Windows.h>
using namespace std;
void User::registered()
{
	system("cls");
	cout << "***注册  账号***" << endl;
	cout << "  1.管理员注册 2.退出" << endl;
	int c = 0;
	string ac = "", pa = "",ti = "";
	//随机数生成六位账号
	for (int i = 0; i < 6; ) {
		random_device seed;//硬件生成随机数种子
		ranlux48 engine(seed());//利用种子生成随机数引擎
		uniform_int_distribution<> distrib(0, 9);//设置随机数范围,并为均匀分布
		int random = distrib(engine);//随机数
		if (random == 0 && ac.length() == 0) {//确保第一位不是0
			continue;
		}
		ac += to_string(random);//生成的账号
		i++;
	}
	while (1)
	{
		cin >> c;
		if (c == 2)
		{
			break;
		}
		else if (c == 1) 
		{
			cout << "请输入超级权限口令:";//超及权限管理员拥有,密码 1
			string kl = "";
			cin >> kl;
			if (kl == "1") {
				cout << "*进入超级权限界面*" << endl;
				cout << "为你随机生成6位数字账号:" << ac << endl;
				time_t nowtime;
				while (1) {
					cout << "*设置密码:";
					cin >> pa;
					if (pa.length() > 8) {
						cout << "密码超出八位!请再次设置" << endl;//确保密码只能设置8位
						continue;
					}
					break;
				}
				//生成当地时间
				struct tm* p;;
				time(&nowtime);
				p = localtime(&nowtime);
				ti = "2023/" + to_string(p->tm_mon + 1) + "/" + to_string(p->tm_mday) + " " + to_string(p->tm_hour) + ":" + to_string(p->tm_min);
				cout << "*当前注册时间:" << ti << endl;
				user.Regisitered_database_manger(ti, ac, pa);
				system("pause");
				break;
			}
		}
		else {
			cout << "格式错误。重新输入:";
		}
	}
}

void User::login(string &ch,string &aCC)//ch用来选择登录那种系统
{
	system("cls");
	if (ch == "1") {
		cout << "***管理员  登录***" << endl;
	}
	else {
		cout << "***用户  登录***" << endl;
	}
	int i = 1;
	while (1) {
		char s;
		char ac[25], pa[25];
		int j = 0;//确保数组从0开始 
		cout << "*请输入账号:";
		cin >> ac;
		cout << "*请输入密码:";
		while ((s = _getch()) != '\r')
		{
			if (s == '\b')
			{
				if (j > 0) {
					j--;//回删一位 
					cout << "\b \b";
				}
			}
			else 
			{  
				pa[j] = s;  //存入数组 
				j++;
				putchar('*'); //用* 代替密码 
			}
		}
		pa[j] = '\0';//退出
		int sign = 0;
		user.Login_database(ac, pa, sign, ch);
		if (sign == 1)//如果返回1,则表示查询到账号和密码,账号标注唯一建不可重复
		{
			aCC = ac;//记录账号,以便修改密码和注销操作
			cout << endl << "验证正确" << endl;
			for (int ij = 0; ij < 20; ij++)
			{
				cout << ".";
				Sleep(50);
			}
			//登陆成功并选择进入什么操作界面
			ch = "pass";
			return;
		}
		else
		{
			cout << endl << "*账号及密码错误!" << endl;
		}
		i++;
		if (i == 4)
		{
			cout << endl << ">已输入3次,退出登录" << endl;
			system("pause");
			break;
		}
	}
}

void User::modify(string acc,string ch)
{
	cout << "密码修改为:";
	string pppa = "";
	cin >> pppa;
	user.Modify_database(acc, pppa,ch);
}

void User::logout(string acc,string ch)
{
	cout << ch << endl;
	user.Logout_database(acc,ch);
}

我也提供了在线下载压缩包代码的连接,可以直接下载代码运行。

下载代码链接:点解链接下载代码http://dahua.bloggo.chat/wp-content/uploads/2024/11/7校园导航系统.zip


http://www.kler.cn/a/397987.html

相关文章:

  • Web导出Excel表格
  • 论文解析:计算能力资源的可信共享:利益驱动的异构网络服务提供机制
  • 群控系统服务端开发模式-应用开发-前端图片格式功能开发
  • Go语言中的类型
  • transformers 操作篇
  • nginx源码安装配置ssl域名
  • Ubuntu问题 -- 当安装使用dpkg命令安装deb包时, 安装失败, 提示缺少依赖 (一行命令搞定)
  • JMeter项目实战
  • 2024山西省网络建设运维第十八届职业院校技能大赛解析答案(7. mariadb 服务)
  • Mysql每日一题(if函数)
  • UE5材质篇 4 材质表面雨滴打落
  • 基于机器学习的虚拟传感器用于门开启检测和异常检测
  • Java基础夯实——1.7 序列化
  • Py之pymupdf:基于langchain框架结合pymupdf库实现输出每个PDF页面的文本内容、元数据等
  • 快速上手STL中list的使用
  • 新日撸java三百行` 新手小白java学习记录 `Day1
  • thinkphp 连表查询
  • 【大数据学习 | flume】flume之常见的sink组件
  • 解析 Android WebChromeClient:提升 WebView 用户体验的关键组件
  • RabbitMQ入门:“Hello World!“ 教程(一)
  • Uniapp踩坑input自动获取焦点ref动态获取实例不可用
  • docker启动训练容器教程
  • html数据类型
  • 【项目设计技巧】客户端SDK的开发
  • Linux驱动开发——pinctrl 和 和 gpio 子系统实验
  • 前缀和算法习题篇(上)