【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码

文章目录

  • 通讯录管理系统
    • 一、系统需求以及成品演示
    • 二、代码实现
    • 三、完整代码

通讯录管理系统

一、系统需求以及成品演示

1.1 系统需求

通讯录是一个可以记录亲人、好友信息的工具。这里利用C++来实现一个通讯录管理系统

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

  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人信息
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有信息
  • 退出通讯录:退出当前使用的通讯录

1.2 成品演示

通讯录管理系统

二、代码实现

2.1 菜单功能

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

  • 封装函数显示该界面 void showMenu()
  • 在main函数中调用封装好的函数
// 菜单函数
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;
	cout << "请选择:  ";
}

在这里插入图片描述

2.2 退出功能

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

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

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

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

在这里插入图片描述

2.3 添加联系人

功能描述:

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

添加联系人实现步骤:

  • 设计联系人结构体
  • 设计通讯录结构体
  • main函数中创建通讯录
  • 封装添加联系人函数
  • 测试添加联系人功能

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

// 联系人结构体
struct Person
{
	// 姓名
	string m_Name;
	// 性别     1、男    2、女
	int m_Set;
	// 年龄
	int m_Age;
	// 电话
	string m_Phone;
	// 地址
	string m_Addr;
};

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

#define MAX 1000  // 最大人数
// 设计通讯录结构体
struct Addressbooks
{
	// 通讯录中保存的联系人数组
	struct Person personArray[MAX];
	// 通讯录中人员个数
	int m_Size;
};

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

mian函数起始位置添加:
// 创建通讯录
Addressbooks abs;
//初始化通讯录中人数
abs.m_Size = 0;

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

// 1、添加联系人信息
void addPerson(Addressbooks* abs)
{
	// 判断通讯录是否已满
	if (abs->m_Size == MAX){
		cout << "通讯录已满,无法继续添加新联系人!!!" << endl;
		return;
	}
	else {
		// 姓名
		string name;  
		cout << "请输入姓名: ";
		cin >> name;
		abs->personArray[abs->m_Size].m_Name = name;
		// 性别
		int sex;
		while (true)
		{
			cout << "请输入性别(1、男 or 2、女):  ";
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		// 年龄
		int age;
		cout << "请输入年龄:  ";
		cin >> age;
		abs->personArray[abs->m_Size].m_Age = age;
		// 联系电话
		string phone;
		cout << "请输入联系电话:  ";
		cin >> phone;
		abs->personArray[abs->m_Size].m_Phone = phone;
		// 家庭地址
		string address;
		cout << "请输入家庭地址:  ";
		cin >> address;
		abs->personArray[abs->m_Size].m_Addr = address;
		// 更新通讯录人数
		abs->m_Size++;
		cout << "添加成功" << endl;
		system("pause");
		system("cls");
	}
}

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

case 1:  //添加联系人
	addPerson(&abs);
	break;

在这里插入图片描述

2.4 显示联系人

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

显示联系人实现步骤:

  • 封装显示联系人函数
  • 测试显示联系人功能

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

// 显示所有联系人信息
void showPerson(Addressbooks* abs)
{
	if (abs->m_Size == 0) {
		cout << "当前记录为空" << endl;
	}
	else{
		for (int i = 0; i < abs->m_Size; i++) {
			cout << "姓名: " << abs->personArray[i].m_Name << "\t";
			cout << "性别: " << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
			cout << "年龄: " << abs->personArray[i].m_Age << "\t";
			cout << "联系电话: " << abs->personArray[i].m_Phone << "\t";
			cout << "家庭地址: " << abs->personArray[i].m_Addr << endl;
		}
	}
	system("pause");
	system("cls");
}

测试显示联系人功能
在switch case语句中,case 2 里添加

case 2:  //显示联系人
	showPerson(&abs);
	break;

在这里插入图片描述

2.5 删除联系人

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

删除联系人实现步骤:

  • 封装检测联系人是否存在
  • 封装删除联系人函数
  • 测试删除联系人功能

封装检测联系人是否存在

设计思路:

删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人
因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1。

// 判断是否存在查询的人员,存在返回在数组中索引位置,不存在返回-1
int isExist(Addressbooks* abs, string name)
{
	for (int i = 0; i < abs->m_Size; i++) {
		if (abs->personArray[i].m_Name == name)
			return i;  // 找到了
	}
	return -1;  // 没找到
}

封装删除联系人函数

根据用户输入的联系人判断该通讯录中是否有此人,查找到进行删除,并提示删除成功,查不到提示查无此人。

// 3、删除指定联系人信息
void deletePerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要删除的联系人:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		for (int i = ret; i < abs->m_Size; i++) {
			abs->personArray[i] = abs->personArray[i + 1];
		}
		abs->m_Size--;
		cout << "删除成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

测试删除联系人功能

case 3:  //删除联系人
	deletePerson(&abs);
	break;

在这里插入图片描述

2.6 查找联系人

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

查找联系人实现步骤

  • 封装查找联系人函数
  • 测试查找指定联系人

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

// 4、查找指定联系人信息
void findPerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要查找的联系人姓名:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		cout << "姓名: " << abs->personArray[ret].m_Name << "\t";
		cout << "性别: " << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
		cout << "年龄: " << abs->personArray[ret].m_Age << "\t";
		cout << "联系电话: " << abs->personArray[ret].m_Phone << "\t";
		cout << "家庭地址: " << abs->personArray[ret].m_Addr << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

测试查找指定联系人
在switch case 语句中,case4里添加:

case 4:  //查找联系人
	findPerson(&abs);
	break;

在这里插入图片描述

2.7 修改联系人

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

修改联系人实现步骤

  • 封装修改联系人函数
  • 测试修改联系人功能

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

// 5、修改指定联系人信息
void modifyPerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要修改的联系人姓名:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1){
		// 姓名
		string name;
		cout << "请输入姓名: ";
		cin >> name;
		abs->personArray[ret].m_Name = name;
		// 性别
		int sex;
		while (true)
		{
			cout << "请输入性别(1、男 or 2、女):  ";
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		// 年龄
		int age;
		cout << "请输入年龄:  ";
		cin >> age;
		abs->personArray[ret].m_Age = age;
		// 联系电话
		string phone;
		cout << "请输入联系电话:  ";
		cin >> phone;
		abs->personArray[ret].m_Phone = phone;
		// 家庭地址
		string address;
		cout << "请输入家庭地址:  ";
		cin >> address;
		abs->personArray[ret].m_Addr = address;
		cout << "联系人信息修改成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

测试修改联系人功能
在switch case 语句中,case 5里添加:

case 5:  //修改联系人
	modifyPerson(&abs);
	break;

在这里插入图片描述

2.8 清空联系人

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

清空联系人实现步骤

  • 封装清空联系人函数
  • 测试清空联系人

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

// 6、清空所有联系人
void cleanPerson(Addressbooks* abs)
{
	char chiose;
	cout << "确认清空通讯录吗(y/n): ";
	while (true)
	{
		cin >> chiose;
		if (chiose == 'y') {
			abs->m_Size = 0;
			cout << "通讯录已清空" << endl;
			break;
		}
		else if (chiose == 'n') {
			cout << "已取消清空" << endl;
			break;
		}
		else {
			cout << "输入错误,请重新输入" << endl;
		}
	}
	system("pause");
	system("cls");
}

测试清空联系人
在switch case 语句中,case 6 里添加:

case 6:  //清空联系人
	cleanPerson(&abs);
	break;

在这里插入图片描述

三、完整代码

#include<iostream>
#include<string>
using namespace std;
#define MAX 1000  // 最大人数

// 联系人结构体
struct Person
{
	// 姓名
	string m_Name;
	// 性别     1、男    2、女
	int m_Sex;
	// 年龄
	int m_Age;
	// 电话
	string m_Phone;
	// 地址
	string m_Addr;
};

// 设计通讯录结构体
struct Addressbooks
{
	// 通讯录中保存的联系人数组
	struct Person personArray[MAX];
	// 通讯录中人员个数
	int m_Size;
};

// 1、添加联系人信息
void addPerson(Addressbooks* abs)
{
	// 判断通讯录是否已满
	if (abs->m_Size == MAX){
		cout << "通讯录已满,无法继续添加新联系人!!!" << endl;
		return;
	}
	else {
		// 姓名
		string name;  
		cout << "请输入姓名: ";
		cin >> name;
		abs->personArray[abs->m_Size].m_Name = name;
		// 性别
		int sex;
		while (true)
		{
			cout << "请输入性别(1、男 or 2、女):  ";
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		// 年龄
		int age;
		cout << "请输入年龄:  ";
		cin >> age;
		abs->personArray[abs->m_Size].m_Age = age;
		// 联系电话
		string phone;
		cout << "请输入联系电话:  ";
		cin >> phone;
		abs->personArray[abs->m_Size].m_Phone = phone;
		// 家庭地址
		string address;
		cout << "请输入家庭地址:  ";
		cin >> address;
		abs->personArray[abs->m_Size].m_Addr = address;
		// 更新通讯录人数
		abs->m_Size++;
		cout << "添加成功" << endl;
		system("pause");
		system("cls");
	}
}

// 显示所有联系人信息
void showPerson(Addressbooks* abs)
{
	if (abs->m_Size == 0) {
		cout << "当前记录为空" << endl;
	}
	else{
		for (int i = 0; i < abs->m_Size; i++) {
			cout << "姓名: " << abs->personArray[i].m_Name << "\t";
			cout << "性别: " << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
			cout << "年龄: " << abs->personArray[i].m_Age << "\t";
			cout << "联系电话: " << abs->personArray[i].m_Phone << "\t";
			cout << "家庭地址: " << abs->personArray[i].m_Addr << endl;
		}
	}
	system("pause");
	system("cls");
}

// 判断是否存在查询的人员,存在返回在数组中索引位置,不存在返回-1
int isExist(Addressbooks* abs, string name)
{
	for (int i = 0; i < abs->m_Size; i++) {
		if (abs->personArray[i].m_Name == name)
			return i;  // 找到了
	}
	return -1;  // 没找到
}

// 3、删除指定联系人信息
void deletePerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要删除的联系人:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		for (int i = ret; i < abs->m_Size; i++) {
			abs->personArray[i] = abs->personArray[i + 1];
		}
		abs->m_Size--;
		cout << "删除成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

// 4、查找指定联系人信息
void findPerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要查找的联系人姓名:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		cout << "姓名: " << abs->personArray[ret].m_Name << "\t";
		cout << "性别: " << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
		cout << "年龄: " << abs->personArray[ret].m_Age << "\t";
		cout << "联系电话: " << abs->personArray[ret].m_Phone << "\t";
		cout << "家庭地址: " << abs->personArray[ret].m_Addr << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

// 5、修改指定联系人信息
void modifyPerson(Addressbooks* abs)
{
	string name;
	cout << "请输入你要修改的联系人姓名:  ";
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1){
		// 姓名
		string name;
		cout << "请输入姓名: ";
		cin >> name;
		abs->personArray[ret].m_Name = name;
		// 性别
		int sex;
		while (true)
		{
			cout << "请输入性别(1、男 or 2、女):  ";
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		// 年龄
		int age;
		cout << "请输入年龄:  ";
		cin >> age;
		abs->personArray[ret].m_Age = age;
		// 联系电话
		string phone;
		cout << "请输入联系电话:  ";
		cin >> phone;
		abs->personArray[ret].m_Phone = phone;
		// 家庭地址
		string address;
		cout << "请输入家庭地址:  ";
		cin >> address;
		abs->personArray[ret].m_Addr = address;
		cout << "联系人信息修改成功" << endl;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

// 6、清空所有联系人
void cleanPerson(Addressbooks* abs)
{
	char chiose;
	cout << "确认清空通讯录吗(y/n): ";
	while (true)
	{
		cin >> chiose;
		if (chiose == 'y') {
			abs->m_Size = 0;
			cout << "通讯录已清空" << endl;
			break;
		}
		else if (chiose == 'n') {
			cout << "已取消清空" << endl;
			break;
		}
		else {
			cout << "输入错误,请重新输入" << endl;
		}
	}
	system("pause");
	system("cls");
}

// 菜单函数
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;
	cout << "请选择:  ";
}

int main()
{
	// 创建通讯录
	Addressbooks abs;
	//初始化通讯录中人数
	abs.m_Size = 0;
	while (true)
	{
		showMenu();  // 调用菜单函数
		int select = 0;  // 用户选择变量
		cin >> select;
		switch (select)
		{
		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;
		case 0:  // 0、退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

至此,通讯录管理系统完成!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《HCIP-openEuler实验指导手册》2.1安装和测试Nginx

知识点 Nginx (发音为 “engine x”) 是一个开源的高性能 HTTP 和反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。由 Igor Sysoev 创建并维护&#xff0c;其设计用于处理高并发连接&#xff0c;具有高度的可扩展性和灵活性。 安装步骤 yum方式安装 dn…

Kubernetes - Dashboard 配置用户名密码方式登录

Kubernetes - Dashboard 配置用户名密码方式登录 前言&#xff1a; 为了 K8s 集群安全&#xff0c;默认情况下 Dashboard 以 Token的形式登录的&#xff0c;那如果我们想以用户名/密码的方式登录该怎么操作呢&#xff1f;其实只需要我们创建用户并进行 ClusterRoleBinding绑定即…

挑战一周完成Vue3项目Day4: 用户管理+角色管理+菜单管理+首页+暗黑模式/主题切换

一、用户管理 1.静态搭建 src/views/acl/user/index.vue <template><el-card style"height:80px;"><el-form :inline"true" class"form"><el-form-item label"用户名&#xff1a;"><el-input placehold…

JAVA面试专题-微服务篇

Spring cloud Spring Cloud 5大组件有哪些 注册中心/配置中心&#xff1a;nacos 负载均衡&#xff1a;Ribbon 服务远程调用&#xff1a;Feign 服务保护&#xff1a;sentinel 服务网关&#xff1a;Gateway 微服务注册和发现 nacos和eureka的区别 负载均衡 微服务向Ribbon发送…

Vue 之 在当前页面的实现分页效果

目录 场景实现 场景 假设&#xff0c;我们现在有这么一个需求&#xff1a; 上述图片的空白内容是活动的&#xff0c;由下面的两个按钮控制上一页、下一页&#xff1b;我们应该可以怎么去实现&#xff1f; 实现 思路&#xff1a; 其实这个问题&#xff0c;我们仿照其他的UI框…

数字旅游以科技创新为动力:推动旅游服务的智能化、网络化和个性化发展,满足游客日益增长的多元化、个性化需求

目录 一、引言 二、科技创新推动旅游服务智能化发展 1、智能化技术的引入与应用 2、智能化提升旅游服务效率与质量 三、科技创新推动旅游服务网络化发展 1、网络化平台的构建与运营 2、网络化拓宽旅游服务渠道与范围 四、科技创新推动旅游服务个性化发展 1、个性化需求…

Sortable 拖拽行实现el-table表格顺序号完整例子,vue 实现表格拖拽行顺序号完整例子

npm install sortable<template><vxe-modalref"modalRef"v-model"showModal"title"详情"width"70vw"height"60vh"class"his"transfer><el-table ref"tableRef" :data"tableData&q…

mysql从入门到起飞+面试基础题

mysql基础 MySQL基础 企业面试题1 代码 select m.id,m.num from ( select t.id as id,count(1) num from ( select ra.requester_id as id from RequestAccepted raunion all select ra.accepter_id as id from RequestAccepted ra ) t group by t.id ) m group by id ord…

鸿蒙原生应用元服务开发-Web加载本地页面

将本地页面文件放在应用的rawfile目录下&#xff0c;开发者可以在Web组件创建的时候指定默认加载的本地页面 &#xff0c;并且加载完成后可通过调用loadUrl()接口变更当前Web组件的页面。 在下面的示例中展示加载本地页面文件的方法&#xff1a; 将资源文件放置在应用的resou…

HarmaonyOS鸿蒙应用科普课

一、什么是鸿蒙OS&#xff1f; 1.概念&#xff1a; 先给大家讲讲今天讲课的主题&#xff0c;鸿蒙OS是什么&#xff1f;鸿蒙系统大家都知道&#xff0c;就是一个操作系统&#xff0c;我们未来是为的成为鸿蒙程序员。所以我们不要将鸿蒙os完全等同于手机操作系统&#xff0c;太…

C#技巧之同步与异步

区别 首先&#xff0c;同步就是程序从上往下顺序执行&#xff0c;要执行完当前流程&#xff0c;才能往下个流程去。 而异步&#xff0c;则是启动当前流程以后&#xff0c;不需要等待流程完成&#xff0c;立刻就去执行下一个流程。 同步示例 创建一个窗体&#xff0c;往窗体里…

Python_GUI框架 Pyside6的信号与槽应用

Python_GUI框架 Pyside6的信号与槽应用 在Pyside6框架中&#xff0c;信号与槽&#xff08;Signals and Slots&#xff09;机制是连接用户界面元素与响应功能的核心机制。我们可以把信号想象成一根电线&#xff0c;而槽就是电线的另一端连接的灯泡。当电线&#xff08;信号&…

贪心算法 Greedy Algorithm

1) 贪心例子 称之为贪心算法或贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤 每一步骤都采用贪心原则&#xff0c;选取当前最优解 因为没有考虑所有可能&#xff0c;局部最优的堆叠不一定让最终解最优 v2已经不会更新v3因为v3更新过了 贪心算法是一种在…

第八篇:隔离即力量:Python虚拟环境的终极指南

隔离即力量&#xff1a;Python虚拟环境的终极指南 1 引言 在编程的多元宇宙中&#xff0c;Python语言犹如一颗闪耀的星辰&#xff0c;其魅力不仅仅在于简洁的语法&#xff0c;更在于其庞大而繁荣的生态系统。然而&#xff0c;随着应用的增长和复杂性的提升&#xff0c;开发者们…

WinRAR经典压缩神器,高效管理您的文件烈火汉化版 v7.0.

01 软件介绍 WinRAR&#xff0c;作为一款历史悠久且广为人知的压缩文件管理工具&#xff0c;已经成为压缩软件行业的标杆产品。其提供的完整支持覆盖了RAR和ZIP文件格式&#xff0c;同时&#xff0c;该软件还拥有诸多强大的解压缩功能&#xff0c;包括但不限于固体压缩、分卷压…

链表面试题2

1&#xff0c;合并两个有序链表 我们先定义一个虚拟节点newH&#xff0c; 然后按照上图所走&#xff0c;但是当其中一个链表走空时&#xff0c;我们只需返回另一个链表即可 class Solution {public ListNode mergeTwoLists(ListNode headA, ListNode headB) {ListNode newhead…

【C++】滑动窗口:长度最小的子数组

1.题目 2.算法分析 这种题目&#xff0c;首先想到的是暴力穷举法&#xff1a; 用两层循环取遍该数组的所有子数组&#xff0c;然后找到那个最短的就可以了。 我们的滑动窗口就是对这种暴力穷举法进行优化&#xff1a; 主要是舍弃的思想&#xff0c;舍弃那些一定不可能是最终…

03_电子设计教程基础篇(软件推荐)

文章目录 前言一、通用工具软件1.输入法2.截图3.录屏4.桌面管理5.文件检索6.笔记整理7.翻译软件8.AI软件9.文件对比10.思维导图、流程框图、表格软件11.项目托管平台12.解压缩软件13.休闲娱乐软件 二、专业工具软件1.硬件工程师1.原理图、PCB设计2.原理图、PCB仿真3.PCB下单软件…

DNS、ICMP、NAT以及代理服务器

目录 1. DNS 1.1. DNS 背景 1.2. 域名简介 1.3. 域名解析过程 2. ICMP 2.1. ICMP 的功能 2.2. ICMP 的报文格式 2.3. ping 命令 2.4. traceroute 命令 3. NAT和代理服务器 3.1. NAT 技术 3.2. NAT IP转换过程 3.3. NAT 技术的缺陷 3.4. 代理服务器 3.4.1. 正向…

界面组件DevExpress Blazor UI v23.2 - 网格、工具栏功能全新升级

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验&#xff0c;这个UI自建库提供了一套全面的原生Blazor UI组件&#xff08;包括Pivot Grid、调度程序、图表、数据编辑器和报表等&#xff09;。 DevExpress Blazor控件目前已经升级…