C++实现通讯录管理系统

news2024/9/23 21:24:31

目录

1、系统需求

2、创建项目

2.1 创建项目

3、菜单功能

4、退出功能

5、添加联系人

5.1 设计联系人结构体

5.2 设计通讯录结构体

5.3 main函数中创建通讯录

5.4 封装联系人函数

5.5 测试添加联系人功能

6、显示联系人

6.1 封装显示联系人函数

7、删除联系人

7.1 封装检测联系人是否存在

7.2 封装删除联系人函数

8、查找联系人

8.1 封装查找联系人函数

9、修改联系人

9.1 封装修改联系人函数

10、清空联系人

10.1 封装清空联系人函数


1、系统需求

通讯录是一个可以记录亲人,好友信息的工具。

本教程主要利用C++来实现一个通讯录管理系统

系统中需要实现的功能如下:

  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人

  • 显示联系人:显示通讯录所有联系人信息

  • 删除联系人:按照姓名进行删除指定联系人

  • 查找联系人:按照姓名查看指定联系人信息

  • 修改联系人:按照姓名重新修改指定联系人

  • 清空联系人:清空通讯录中所有信息

  • 退出通讯录:退出当前使用的通讯录

2、创建项目

创建项目步骤如下:

  • 创建新项目

  • 添加文件

2.1 创建项目

打开vs2012,点击编辑新项目,创建新的C++项目

3、菜单功能

功能描述:用户选择功能的界面

菜单界面效果如下图:

 

步骤:

  • 封装函数显示该界面void showMenu ()

  • 在main函数中调用封装好的函数

代码:

//- 封装函数显示该界面void showMenu ()
//- 在main函数中调用封装好的函数
#include <iostream>
using namespace std;

//显示菜单页面
void showMenu()
{
	cout << "*************************" << endl;
	cout << "***** 1、添加联系人 *****" << endl;
	cout << "***** 2、显示联系人 *****" << endl;
	cout << "***** 3、删除联系人 *****" << endl;
	cout << "***** 4、查找联系人 *****" << endl;
	cout << "***** 5、修改联系人 *****" << endl;
	cout << "***** 6、清空联系人 *****" << endl;
	cout << "***** 0、退出通讯录 *****" << endl;
	cout << "*************************" << endl;
}


int main()
{
	//菜单调用
	showMenu();
	system("pause");
	return 0;
}

4、退出功能

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择0时候,执行退出,选择其他先不操作,也不退出程序。

int main()
{
	int select_num = 0;
	while (true)
	{
		//菜单调用
		showMenu();
		cin >> select_num;
		switch (select_num)
		{
		case 0:
			//0、退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		case 1:
			//1、添加联系人
			break;
		case 2:
			//2、显示联系人
			break;
		case 3:
			//3、删除联系人
			break;
		case 4:
			//4、查找联系人
			break;
		case 5:
			//5、修改联系人
			break;
		case 6:
			//6、清空联系人
			break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

效果图:

 

 

5、添加联系人

功能描述:

实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)

添加联系人实现步骤:

  • 设计联系人结构体

  • 设计通讯录结构体

  • main函数中创建通讯录

  • 封装添加联系人函数

  • 测试添加联系人功能

5.1 设计联系人结构体

联系人信息包括:姓名、性别、年龄、联系电话、家庭住址

代码:

//联系人结构体
struct Contacts
{
	string name;//姓名
	int sex;//性别1-男  2-女
	int age;//年龄
	string phone_num;//电话号
	string home_place;//家庭住址
};

5.2 设计通讯录结构体

设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量。

代码:

//通讯录结构体
struct Addrssbooks
{
	struct Contacts personArray[Max_size];//通讯录中保存的联系人数组
	int now_num; //现在的联系人个数
};

5.3 main函数中创建通讯录

添加联系人函数封装好后,在main函数中创建一个通讯录变量,这个就是我们需要一直维护的通讯录

//创建通讯录结构体变量
	Addrssbooks abs;
	//初识化通讯录中当前人员
	abs.now_num = 0;

5.4 封装联系人函数

思路:添加联系人前先判断通讯录是否已满,如果满了就不再添加,未满情况将新联系人信息逐个加入到通讯录

添加联系人代码:

//添加联系人
void addPerson (Addrssbooks * abs)
{
	//判断通讯录是否已满
	if (abs ->now_num >= Max_size)
	{
		cout << "通讯录已满,无法添加。" << endl;
		return;
	}
	else
	{
		//添加具体联系人
		//姓名
		string name;//姓名
		cout << "请输入姓名:" << endl;
		cin >> name;
		//将用户输入姓名加入到personArray数组中
		abs -> personArray[abs -> now_num].name = name;
		//性别
		int sex;
		while (true)
		{
			cout << "请输入性别:1-男 2-女 " << endl;
			//如果输入的是1或者2可以退出循环,因为输入的是正确数字
			//如果输入错误,继续输入
			cin >> sex;
			//将用户输入的性别加入到persongArray数组
			if(sex == 1 || sex == 2)
			{
				abs -> personArray[abs -> now_num].sex = sex;
				break;
			}
			else
			{
				cout << "您输入的是非法数字,请从新输入!" << endl;
			}
		}
		
		//年龄
		int age = 0;
		while (true)
		{
			cout << "请输入年龄:" << endl;
			cin >> age;
			if (age > 0)
			{
				abs -> personArray[abs -> now_num].age = age;
				break;
			}
			else
			{
				cout << "您输入正确的年龄!" << endl;
			}
		}
		//电话号
		cout << "请输入联系电话:" << endl;
		string phone;
		cin >> phone;
		abs -> personArray[abs -> now_num].phone_num = phone;
		//地址
		cout << "请输入家庭地址:" << endl;
		string addsplace;
		cin >> addsplace;
		abs -> personArray[abs -> now_num].home_place = addsplace;
		//更新通讯录人数
		abs -> now_num ++;
		cout << "添加成功!" << endl;

		system("pause");//任意键继续
		system ("cls");//任意键清屏
	}
}

5.5 测试添加联系人功能

选择界面中,如果玩家选择了1,代表添加联系人。我们可以测试下该功能

在switch case语句中,case1里添加:

case 1:
			//1、添加联系人
			addPerson(&abs);//利用地址传递可以修饰实参
			break;

效果图:

6、显示联系人

功能描述:显示通讯录通讯录中已有的联系人信息

显示联系人实现步骤:

  • 封装显示联系人函数

  • 测试显示联系人功能

6.1 封装显示联系人函数

思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息

显示联系人代码:

//显示所有联系人
void showPerson(Addrssbooks * abs)
{
	//判断通讯录人数是否为空如果人数为空,提示记录为空
	//如果不为0,显示记录的联系人信息
	if(abs -> now_num == 0)
	{
		cout << "联系人为空。" << endl;
	}
	else
	{
		for (int i = 0; i < abs -> now_num; i++)
		{
			cout << "姓名:" << abs -> personArray[i].name << "\t";
			cout << "年龄:" << abs -> personArray[i].age << "\t";
			cout << "性别:" << (abs -> personArray[i].sex == 1 ? "男" : "女")<< "\t";
			cout << "电话号码;" << abs -> personArray[i].phone_num << "\t";
			cout << "家庭住址:" << abs -> personArray[i].home_place << endl;
		}
	}
	system("pause");//按任健继续
	system("cls");//清屏
}

效果图:

7、删除联系人

功能描述:按照姓名进行删除指定联系人

删除联系人实现步骤:

  • 封装检测联系人是否存在

  • 封装删除联系人函数

  • 测试删除联系人功能

7.1 封装检测联系人是否存在

设计思路:

删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人

因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1

//检测联系人是否存在,如果存在返回下标编号,不存在返回-1
//参数1 通讯录 参数2 对比姓名
int isExist(Addrssbooks * abs,string name)
{
	for (int i = 0; i < abs -> now_num; i++)
	{
		//找到用户输入姓名了
		if (abs -> personArray[i].name == name)
		{
			return i;
		}
		
	}
    return -1;//遍历结束都没有找到就返回-1
}

7.2 封装删除联系人函数

根据用户输入的联系人判断该通讯录中是否有此人

能找到进行删除,并提示删除成功

查不到提示查无此人

//删除指定联系人
void deletePerson(Addrssbooks * abs)
{
	cout << "请输入您要删除的联系人:" << endl;
	string name;
	cin >> name;
	//ret == -1 表示未查到
	//ret != -1 表示查到
	int ret = isExist(abs,name);
	if (ret != -1)
	{
		//查到此人,进行删除操作
		for (int i = ret; i < abs ->now_num; i++)
		{
			abs -> personArray[i] = abs -> personArray[i+1];
			
		}
		abs -> now_num --;
		cout << "删除成功!" << endl;
	}
	else
	{
		cout << "查无此人无法删除!" << endl;
	}
	system("pause");
	system("cls");
}

效果图:

 

8、查找联系人

功能描述:按照姓名查看指定联系人信息

查找联系人实现步骤

  • 封装查找联系人函数

  • 测试查找指定联系人

8.1 封装查找联系人函数

实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人

查找联系人代码:

//查找联系人
void findPerson(Addrssbooks * abs)
{
	cout << "请输入您要查找的联系人" << endl;
	string name;
	cin >> name;

	//判断联系人是否存在通讯录中
	int ret = isExist(abs,name);
	if (ret != -1)//找到联系人
	{
		cout << "姓名:" << abs -> personArray[ret].name << "\t";
		cout << "性别:" << abs -> personArray[ret].sex << "\t";
		cout << "年龄:" << abs -> personArray[ret].age << "\t";
		cout <<"电话号码:" << abs -> personArray[ret].phone_num << "\t";
		cout << "家庭地址:" << abs -> personArray[ret].home_place << endl;
	}
	else
	{
		cout << "查无此人!" << endl;
	}
}

效果图:

 

9、修改联系人

功能描述:按照姓名重新修改指定联系人

修改联系人实现步骤:

  • 封装修改联系人函数

  • 测试修改联系人功能

9.1 封装修改联系人函数

实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人

修改联系人代码:

//修改联系人
void modifyPerson(Addrssbooks * abs)
{
	cout << "请输入要修改的联系人姓名:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs,name);

	if (ret != -1)//找到指定联系人
	{
		//姓名
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs -> personArray[ret].name = name;
		//性别
		
		int sex;
		while (true)
		{
			cout << "请输入要修改的性别:1-男  2-女" << endl;
			cin >> sex;
			if(sex == 1 || sex == 2)
			{
				abs -> personArray[ret].sex = sex;
				break;
			}
			else
			{
				cout << "输入错误,请重新输入。" << endl;
			}
		}
		//年龄
		cout << "请输入年龄:" << endl;
		int age;
		cin >> age;
		abs -> personArray[ret].age = age;
		
		//手机号
		string phone;
		cout << "请输入手机号:" << endl;
		cin >> phone;
		abs -> personArray[ret].phone_num = phone;

		//地址
		string address;
		cout << "请输入家庭住址:" << endl;
		cin >> address;
		abs -> personArray[ret].home_place = address;
		cout << "修改成功!" << endl;
	}
	else
	{
		cout << "查无此人!" << endl;
	}
	system ("pause");
	system ("cls");
}

效果图:

10、清空联系人

功能描述:清空通讯录中所有信息

清空联系人实现步骤:

  • 封装清空联系人函数

  • 测试清空联系人

10.1 封装清空联系人函数

实现思路:将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,作逻辑清空即可。

清空联系人代码:

//清空联系人
void cleanPerson(Addrssbooks * abs)
{
	int confirm_num;
	while (true)
	{
		cout << "请再次确认您是否要清空通讯录?" << endl;
		cout << "1--确认     2--取消" << endl;
	
		cin >> confirm_num;
		if (confirm_num == 1)
		{
			abs -> now_num = 0;
			cout << "已将通讯录清空!" << endl;
			break;
		}
		else if(confirm_num == 2)
		{
			cout << "已取消清空通讯录操作!" << endl;
			break;
		}
		else
		{
			cout << "您输入的是非法操作!" << endl;
		}
	}
    system("pause");
	system("cls");
}

效果图:

所有程序代码:

//- 封装函数显示该界面void showMenu ()
//- 在main函数中调用封装好的函数
#include <iostream>
using namespace std;
#include <string>
#define Max_size 1000 //最大人数
//联系人结构体
struct Contacts
{
	string name;//姓名
	int sex;//性别1-男  2-女
	int age;//年龄
	string phone_num;//电话号
	string home_place;//家庭住址
};

//通讯录结构体
struct Addrssbooks
{
	struct Contacts personArray[Max_size];//通讯录中保存的联系人数组
	int now_num; //现在的联系人个数
};

//显示菜单页面
void showMenu()
{
	cout << "*************************" << endl;
	cout << "***** 1、添加联系人 *****" << endl;
	cout << "***** 2、显示联系人 *****" << endl;
	cout << "***** 3、删除联系人 *****" << endl;
	cout << "***** 4、查找联系人 *****" << endl;
	cout << "***** 5、修改联系人 *****" << endl;
	cout << "***** 6、清空联系人 *****" << endl;
	cout << "***** 0、退出通讯录 *****" << endl;
	cout << "*************************" << endl;
}

//添加联系人
void addPerson (Addrssbooks * abs)
{
	//判断通讯录是否已满
	if (abs ->now_num >= Max_size)
	{
		cout << "通讯录已满,无法添加。" << endl;
		return;
	}
	else
	{
		//添加具体联系人
		//姓名
		string name;//姓名
		cout << "请输入姓名:" << endl;
		cin >> name;
		//将用户输入姓名加入到personArray数组中
		abs -> personArray[abs -> now_num].name = name;
		//性别
		int sex;
		while (true)
		{
			cout << "请输入性别:1-男 2-女 " << endl;
			//如果输入的是1或者2可以退出循环,因为输入的是正确数字
			//如果输入错误,继续输入
			cin >> sex;
			//将用户输入的性别加入到persongArray数组
			if(sex == 1 || sex == 2)
			{
				abs -> personArray[abs -> now_num].sex = sex;
				break;
			}
			else
			{
				cout << "您输入的是非法数字,请从新输入!" << endl;
			}
		}
		
		//年龄
		int age = 0;
		while (true)
		{
			cout << "请输入年龄:" << endl;
			cin >> age;
			if (age > 0)
			{
				abs -> personArray[abs -> now_num].age = age;
				break;
			}
			else
			{
				cout << "您输入正确的年龄!" << endl;
			}
		}
		//电话号
		cout << "请输入联系电话:" << endl;
		string phone;
		cin >> phone;
		abs -> personArray[abs -> now_num].phone_num = phone;
		//地址
		cout << "请输入家庭地址:" << endl;
		string addsplace;
		cin >> addsplace;
		abs -> personArray[abs -> now_num].home_place = addsplace;
		//更新通讯录人数
		abs -> now_num ++;
		cout << "添加成功!" << endl;

		system("pause");//任意键继续
		system ("cls");//任意键清屏
	}
}

//显示所有联系人
void showPerson(Addrssbooks * abs)
{
	//判断通讯录人数是否为空如果人数为空,提示记录为空
	//如果不为0,显示记录的联系人信息
	if(abs -> now_num == 0)
	{
		cout << "联系人为空。" << endl;
	}
	else
	{
		for (int i = 0; i < abs -> now_num; i++)
		{
			cout << "姓名:" << abs -> personArray[i].name << "\t";
			cout << "年龄:" << abs -> personArray[i].age << "\t";
			cout << "性别:" << (abs -> personArray[i].sex == 1 ? "男" : "女")<< "\t";
			cout << "电话号码;" << abs -> personArray[i].phone_num << "\t";
			cout << "家庭住址:" << abs -> personArray[i].home_place << endl;
		}
	}
	system("pause");//按任健继续
	system("cls");//清屏
}

//检测联系人是否存在,如果存在返回下标编号,不存在返回-1
//参数1 通讯录 参数2 对比姓名
int isExist(Addrssbooks * abs,string name)
{
	for (int i = 0; i < abs -> now_num; i++)
	{
		//找到用户输入姓名了
		if (abs -> personArray[i].name == name)
		{
			return i;
			
		}
				
	}
	return -1;//遍历结束都没有找到就返回-1
	
}

//删除指定联系人
void deletePerson(Addrssbooks * abs)
{
	cout << "请输入您要删除的联系人:" << endl;
	string name;
	cin >> name;
	//ret == -1 表示未查到
	//ret != -1 表示查到
	int ret = isExist(abs,name);

	if (ret != -1)
	{
		//查到此人,进行删除操作
		for (int i = ret; i < abs -> now_num; i++)
		{
			abs -> personArray[i] = abs -> personArray[i+1];
			
		}
		abs -> now_num --;
		cout << "删除成功!" << endl;
	}
	else
	{
		cout << "查无此人无法删除!" << endl;
	}
	system("pause");
	system("cls");
}

//查找联系人
void findPerson(Addrssbooks * abs)
{
	cout << "请输入您要查找的联系人" << endl;
	string name;
	cin >> name;

	//判断联系人是否存在通讯录中
	int ret = isExist(abs,name);
	if (ret != -1)//找到联系人
	{
		cout << "姓名:" << abs -> personArray[ret].name << "\t";
		cout << "性别:" << abs -> personArray[ret].sex << "\t";
		cout << "年龄:" << abs -> personArray[ret].age << "\t";
		cout <<"电话号码:" << abs -> personArray[ret].phone_num << "\t";
		cout << "家庭地址:" << abs -> personArray[ret].home_place << endl;
	}
	else
	{
		cout << "查无此人!" << endl;
	}
}

//修改联系人
void modifyPerson(Addrssbooks * abs)
{
	cout << "请输入要修改的联系人姓名:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs,name);

	if (ret != -1)//找到指定联系人
	{
		//姓名
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs -> personArray[ret].name = name;
		//性别
		
		int sex;
		while (true)
		{
			cout << "请输入要修改的性别:1-男  2-女" << endl;
			cin >> sex;
			if(sex == 1 || sex == 2)
			{
				abs -> personArray[ret].sex = sex;
				break;
			}
			else
			{
				cout << "输入错误,请重新输入。" << endl;
			}
		}
		//年龄
		cout << "请输入年龄:" << endl;
		int age;
		cin >> age;
		abs -> personArray[ret].age = age;
		
		//手机号
		string phone;
		cout << "请输入手机号:" << endl;
		cin >> phone;
		abs -> personArray[ret].phone_num = phone;

		//地址
		string address;
		cout << "请输入家庭住址:" << endl;
		cin >> address;
		abs -> personArray[ret].home_place = address;
		cout << "修改成功!" << endl;
	}
	else
	{
		cout << "查无此人!" << endl;
	}
	system ("pause");
	system ("cls");
}

//清空联系人
void cleanPerson(Addrssbooks * abs)
{
	int confirm_num;
	while (true)
	{
		cout << "请再次确认您是否要清空通讯录?" << endl;
		cout << "1--确认     2--取消" << endl;
	
		cin >> confirm_num;
		if (confirm_num == 1)
		{
			abs -> now_num = 0;
			cout << "已将通讯录清空!" << endl;
			break;
		}
		else if(confirm_num == 2)
		{
			cout << "已取消清空通讯录操作!" << endl;
			break;
		}
		else
		{
			cout << "您输入的是非法操作!" << endl;
		}
	}
	system("pause");
	system("cls");
}
int main()
{
	//创建通讯录结构体变量
	Addrssbooks abs;
	//初识化通讯录中当前人员
	abs.now_num = 0;
	int select_num = 0;
	while (true)
	{
		//菜单调用
		showMenu();
		cin >> select_num;
		switch (select_num)
		{
		case 0:
			//0、退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		case 1:
			//1、添加联系人
			addPerson(&abs);//利用地址传递可以修饰实参
			break;
		case 2:
			//2、显示联系人
			showPerson(&abs);
			break;
		case 3:
			{
				//3、删除联系人
				deletePerson(&abs);
				break;
			}
			
		case 4:
			//4、查找联系人
			findPerson(&abs);
			break;
		case 5:
			//5、修改联系人
			modifyPerson(&abs);
			break;
		case 6:
			//6、清空联系人
			cleanPerson(&abs);
			break;
		default:
			cout << "您选择的数字错误,请重新选择。" << endl;
			break;
		}
	}
	system("pause");
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

获取依赖aar包的两种方式-在android studio里引入 如:glide

背景&#xff1a;我需要获取aar依赖到内网开发&#xff0c;内网几乎代表没网。 一、 如何需要获取依赖aar包 方式一&#xff1a;在官方的github中下载,耗时不建议 要从开发者网站、GitHub 存储库或其他来源获取 ‘com.github.bumptech.glide:glide:4.12.0’ AAR 包&#xff…

MySQL:MVCC原理详解

MySQL是允许多用户同时操作数据库的&#xff0c;那么就会出现多个事务的并发场景。那么再并发场景会出现很多问题&#xff1a;脏读、不可重复读、幻读的问题。 而解决这些问题所用到的方法就是&#xff1a;MVCC 多版本并发控制。而这个MVCC的实现是基于read_view、undoLog 如…

大规模机器学习(Large Scale Machine Learning)

1.大型数据集的学习 案例&#xff1a; 如果我们有一个低方差的模型&#xff0c;增加数据集的规模可以帮助你获得更好的结果。我们应该怎样应对一个有 100 万条记录的训练集&#xff1f; 以线性回归模型为例&#xff0c;每一次梯度下降迭代&#xff0c;我们都需要计算训练集的误…

古建筑电气火灾的防控与管理

摘要:我国古建筑多为砖木结构&#xff0c;当发生火灾事故时具有蔓延快、扑救难的特点&#xff0c;而火灾对古建筑的损害性很大&#xff0c;电气火灾事故在我国火灾事故中比重居高不下。本文通过对古建筑电气火灾成因进行分析&#xff0c;有针对性地提出了古建筑电气火灾防控对策…

日志之Loki详细讲解

文章目录 1 Loki1.1 引言1.2 Loki工作方式1.2.1 日志解析格式1.2.2 日志搜集架构模式1.2.3 Loki部署模式 1.3 服务端部署1.3.1 AllInOne部署模式1.3.1.1 k8s部署1.3.1.2 创建configmap1.3.1.3 创建持久化存储1.3.1.4 创建应用1.3.1.5 验证部署结果 1.3.2 裸机部署 1.4 Promtail…

炒黄金 vs 炒股:探寻投资路线的差异和各自的优势

在当前不景气的股市&#xff0c;人们越来越关注分散投资的方式&#xff0c;以期降低风险并稳定资产。炒黄金成为了一个备受关注的投资选择&#xff0c;与传统炒股相比&#xff0c;它到底有什么区别呢&#xff1f;本文将从多个维度深入分析这两种投资方式的差异以及各自的优势。…

微信开发者工具 git 拉取 failed invalid authentication scheme

微信开发者工具 git 拉取 failed invalid authentication scheme 拉取代码时报错,无效身份认证 解决方案: 1.检查git地址是否正常 2.检查git用户名密码是否正确

ElementUI组件:Button 按钮

button按钮 点击下载learnelementuispringboot项目源码 效果图 el-button.vue页面效果图 项目里el-button.vue代码 <script> export default {name: "el_button",// 注意这里的名称不能和 router inex.js里的name一样methods: {sendMsg() {// alert(1)xthi…

(2024,双流编码器,文本引导的风格迁移,调制,FFT 和低频滤波)FreeStyle:使用扩散模型进行文本引导风格迁移

FreeStyle: Free Lunch for Text-guided Style Transfer using Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 LDM 3.2 FreeStyle 的模型结构…

数据结构——并查集

1.并查集的定义 并查集其实也是一种树形结构&#xff0c;在使用中通常用森林的方式来表示 并查集的逻辑结构其实就是集合 并查集一般可以通过双亲写法&#xff08;顺序结构&#xff09;来完成&#xff0c;即通过一个数组存储父亲结点的下标 int s[10005]; int main() {for(…

共享的IP隔一段时间就变?用这种方法可以不需要知道电脑IP

前言 一般来说,电脑接入路由器之后,IP是由路由器自动分配的(DHCP),但如果隔一段时间不开机连接路由器,或者更换了别的网卡进行连接,自动分配的IP就会更改。 比如你手机连接着电脑的共享IP:192.168.1.10,但过段时间之后,电脑的IP突然变成了192.168.1.11,那么你的所有…

UDP/TCP协议特点

1.前置知识 定义应用层协议 1.确定客户端和服务端要传递哪些信息 2.约定传输格式 网络上传输的一般是二进制数据/字符串 结构化数据转二进制/字符串 称为序列化 反之称之为反序列化 下面就是传输层了 在TCP/IP协议中,我们以 目的端口,目的IP 源端口 源IP 协议号这样一个五…

20240129收获

今天终于发现《八部金刚功》第五部我一直做的是错的&#xff0c;嗨。这里这个写法非常聪明&#xff0c;创立的数组&#xff0c;以及用obj[key] item[key]这样的写法&#xff0c;这个写法充分展示了js常规写法中只有等号右边会去参与运算&#xff0c;等号左边就是普通的键的写法…

【c++】类和对象3

拷贝构造函数 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。 拷贝构造函数是构造函数的一个重载形式。 函数名相同&#xff0c;参数不同 先定义一个类…

【pytest系列】- parametrize参数化

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Springboot校验注解

Spring Boot 提供了一组基于 Hibernate Validator 的校验注解&#xff0c;用于验证请求参数、实体对象等数据的合法性。下面是一些常用的 Spring Boot 校验注解及其功能&#xff1a; 导入依赖 <dependency><groupId>org.springframework.boot</groupId><…

正则表达式补充以及sed awk

正则表达式&#xff1a; 下划线算 在单词里面 解释一下过程&#xff1a; 在第二行hello world当中&#xff0c;hello中的h 与后面第一个h相匹配&#xff0c;所以hello中的ello可以和abcde匹配 在world中&#xff0c;w先匹配h匹配不上&#xff0c;则在看0&#xff0c;r&#…

代码随想录算法训练营第二十一天 |530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236.二叉树的最近公共祖先(待补充)

530.二叉搜索树的最小绝对差 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 3、题目&#xff1a; 给你一棵所有节点为非…

Docker基于Dockerfile多级构建LNMP,实现缩小镜像体积

目录 实验准备&#xff1a; 1.创建nginx镜像 2.创建mysql镜像 3.创建php镜像 4.完成对接 创建网络 创建nginx容器 创建mysql容器 创建WordPress库 创建php容器 5.登录验证 6.镜像体积是不是越小越好&#xff1f;为什么要缩减镜像体积&#xff1f; 7.缩小镜像体积的…

防御保护 笔记整理

一、ASPF--- 针对应用层的包过滤 ASPF --- 针对应用层的包过滤 --- 用来抓取多通道协议中协商端口的关键数据包&#xff0c;之后&#xff0c;将端 口算出&#xff0c;将结果记录在sever-map表中&#xff0c;相当于开辟了一条隐形的通道。 FTP --- 文件传输协议 FTP协议是一个典…