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

通讯录管理系统(个人学习笔记黑马学习)

1、系统需求


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

本教程主要利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:

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

2、菜单功能

#include <iostream>
using namespace std;//菜单界面
void showMenu() {cout << "***** 1、添加联系人 *****" << endl;cout << "***** 2、显示联系人 *****" << endl;cout << "***** 3、删除联系人 *****" << endl;cout << "***** 4、查找联系人 *****" << endl;cout << "***** 5、修改联系人 *****" << endl;cout << "***** 6、清空联系人 *****" << endl;cout << "***** 0、退出通讯录 *****" << endl;}int main() {//菜单的调用 showMenu();system("pause");return 0;
}


3、退出功能

#include <iostream>
using namespace std;//菜单界面
void showMenu() {cout << "***** 1、添加联系人 *****" << endl;cout << "***** 2、显示联系人 *****" << endl;cout << "***** 3、删除联系人 *****" << endl;cout << "***** 4、查找联系人 *****" << endl;cout << "***** 5、修改联系人 *****" << endl;cout << "***** 6、清空联系人 *****" << endl;cout << "***** 0、退出通讯录 *****" << endl;}int main() {int select = 0;//创建用户选择输入的变量while (true) {//菜单的调用 showMenu();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;
}

4、添加联系人

#include <iostream>
using namespace std;
#include <string>
#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;
};//添加联系人
void addPerson(Addressbooks * abs) {//判断通讯录是否已满,满了不在添加if (abs->m_Size == MAX) {cout << "通讯录已满,无法添加" << endl;return;}else {//添加具体联系人//姓名string name;cout << "请输入姓名:" << endl;cin >> name;abs->personArray[abs->m_Size].m_Name = name;//性别cout << "请输入性别:" << endl;cout << "1 --- 男" << endl;cout << "2 --- 女" << endl;int sex = 0;while (true) {cin >> sex;if (sex == 1 || sex == 2) {abs->personArray[abs->m_Size].m_Sex = sex;break;}cout << "输入有误,请重新输入" << endl;}//年龄cout << "请输入年龄:" << endl;int age = 0;cin >> age;abs->personArray[abs->m_Size].m_Age = age;//电话cout << "请输入电话:" << endl;string Phone;cin >> Phone;abs->personArray[abs->m_Size].m_Phone = Phone;//地址cout << "请输入地址:" << endl;string address;cin >> address;abs->personArray[abs->m_Size].m_Addr = address;//更新通讯录人数abs->m_Size++;cout << "添加成功" << endl;system("pause");//按任意键继续system("cls");//清屏}
}//菜单界面
void showMenu() {cout << "***** 1、添加联系人 *****" << endl;cout << "***** 2、显示联系人 *****" << endl;cout << "***** 3、删除联系人 *****" << endl;cout << "***** 4、查找联系人 *****" << endl;cout << "***** 5、修改联系人 *****" << endl;cout << "***** 6、清空联系人 *****" << endl;cout << "***** 0、退出通讯录 *****" << endl;}int main() {Addressbooks abs;//初始化通讯录中当前人员个数abs.m_Size = 0;int select = 0;//创建用户选择输入的变量while (true) {//菜单的调用 showMenu();cin >> select;switch (select) {case 1://1、添加联系人addPerson(&abs);//利用地址传递可以修饰实参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;
}

5、显示联系人

//2、显示联系人
void showPerson(Addressbooks * abs) {//判断通讯录中人数是否为0if (abs->m_Size == 0) { cout << "当前记录为空" << endl;}else {for (int i = 0; i < abs->m_Size; i++) {cout << "姓名:" << abs->personArray[i].m_Name << " 性别:" << (abs->personArray[i].m_Sex == 1?"男":"女")<< " 年龄:" << abs->personArray[i].m_Age << " 电话:" << abs->personArray[i].m_Phone<< " 地址:" << abs->personArray[i].m_Addr << endl;}}system("pause");//按任意键继续system("cls");//清屏
}

6、删除联系人

//检测联系人是否存在,如果存在,返回联系人所在数组中的具体位置,不存在返回-1
//参数1 通讯录       参数2 对比姓名
int isExist(Addressbooks* abs,string name) {for (int i = 0; i < abs->m_Size; i++) {//找到用户输入的姓名if (abs->personArray[i].m_Name == name) {return 1;}}return -1;
}//3、删除指定联系人
void deletePerson(Addressbooks* 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->m_Size; i++) {//数据前移abs->personArray[i] = abs->personArray[i + 1];}abs->m_Size--;//更新通讯录中的人员数cout << "删除成功" << endl;}else {cout << "查无此人" << endl;}system("pause");//按任意键继续system("cls");//清屏
}

7、查找联系人

void findPerson(Addressbooks* abs) {cout << "请输入您要查找的联系人" << endl;string name;cin >> name;//判断指定的联系人是否存在int ret=isExist(abs, name);if (ret != -1) {cout << "姓名:" << abs->personArray[ret].m_Name << "\t";cout << "性别:" << abs->personArray[ret].m_Sex << "\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");//清屏
}

8、修改联系人

//5、修改指定联系人信息
void modifyPerson(Addressbooks* abs) {cout << "请输入您要修改的联系人" << endl;string name;cin >> name;//判断指定的联系人是否存在int ret = isExist(abs, name);if (ret != -1) {//姓名string name;cout << "请输入姓名:" << endl;cin >> name;abs->personArray[ret].m_Name = name;//性别int sex=0;cout << "请输入性别:" << endl;cout << "1 --- 男" << endl;cout << "2 --- 女" << endl;while (true) {cin >> sex;if (sex == 1 || sex == 2) {abs->personArray[ret].m_Sex = sex;break;}cout << "输入有误,重新输入" << endl;}//年龄int age;cout << "请输入年龄:" << endl;cin >> age;abs->personArray[ret].m_Age = age;//电话string Phone;cout << "请输入联系电话:" << endl;cin >> Phone;abs->personArray[ret].m_Phone = Phone;//地址string address;cout << "请输入地址:" << endl;cin >> address;abs->personArray[ret].m_Addr = address;cout << "修改成功" << endl;}else {cout << "查无此人" << endl;}system("pause");//按任意键继续system("cls");//清屏
}

9、清空通讯录

//6、清空所有联系人
void cleanPerson(Addressbooks* abs) {abs->m_Size = 0;cout << "清空成功" << endl;system("pause");//按任意键继续system("cls");//清屏
}

10、总结

 

#include <iostream>
using namespace std;
#include <string>
#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 << "请输入姓名:" << endl;cin >> name;abs->personArray[abs->m_Size].m_Name = name;//性别cout << "请输入性别:" << endl;cout << "1 --- 男" << endl;cout << "2 --- 女" << endl;int sex = 0;while (true) {cin >> sex;if (sex == 1 || sex == 2) {abs->personArray[abs->m_Size].m_Sex = sex;break;}cout << "输入有误,请重新输入" << endl;}//年龄cout << "请输入年龄:" << endl;int age = 0;cin >> age;abs->personArray[abs->m_Size].m_Age = age;//电话cout << "请输入电话:" << endl;string Phone;cin >> Phone;abs->personArray[abs->m_Size].m_Phone = Phone;//地址cout << "请输入地址:" << endl;string address;cin >> address;abs->personArray[abs->m_Size].m_Addr = address;//更新通讯录人数abs->m_Size++;cout << "添加成功" << endl;system("pause");//按任意键继续system("cls");//清屏}
}//2、显示联系人
void showPerson(Addressbooks * abs) {//判断通讯录中人数是否为0if (abs->m_Size == 0) { cout << "当前记录为空" << endl;}else {for (int i = 0; i < abs->m_Size; i++) {cout << "姓名:" << abs->personArray[i].m_Name << " 性别:" << (abs->personArray[i].m_Sex == 1?"男":"女")<< " 年龄:" << abs->personArray[i].m_Age << " 电话:" << abs->personArray[i].m_Phone<< " 地址:" << abs->personArray[i].m_Addr << endl;}}system("pause");//按任意键继续system("cls");//清屏
}//检测联系人是否存在,如果存在,返回联系人所在数组中的具体位置,不存在返回-1
//参数1 通讯录       参数2 对比姓名
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) {cout << "请输入您要删除的联系人" << endl;string name;cin >> name;//ret==-1 未查到   //ret!=-1 查到了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) {cout << "请输入您要查找的联系人" << endl;string name;cin >> name;//判断指定的联系人是否存在int ret=isExist(abs, name);if (ret != -1) {cout << "姓名:" << abs->personArray[ret].m_Name << "\t";cout << "性别:" << abs->personArray[ret].m_Sex << "\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) {cout << "请输入您要修改的联系人" << endl;string name;cin >> name;//判断指定的联系人是否存在int ret = isExist(abs, name);if (ret != -1) {//姓名string name;cout << "请输入姓名:" << endl;cin >> name;abs->personArray[ret].m_Name = name;//性别int sex=0;cout << "请输入性别:" << endl;cout << "1 --- 男" << endl;cout << "2 --- 女" << endl;while (true) {cin >> sex;if (sex == 1 || sex == 2) {abs->personArray[ret].m_Sex = sex;break;}cout << "输入有误,重新输入" << endl;}//年龄int age;cout << "请输入年龄:" << endl;cin >> age;abs->personArray[ret].m_Age = age;//电话string Phone;cout << "请输入联系电话:" << endl;cin >> Phone;abs->personArray[ret].m_Phone = Phone;//地址string address;cout << "请输入地址:" << endl;cin >> address;abs->personArray[ret].m_Addr = address;cout << "修改成功" << endl;}else {cout << "查无此人" << endl;}system("pause");//按任意键继续system("cls");//清屏
}//6、清空所有联系人
void cleanPerson(Addressbooks* abs) {abs->m_Size = 0;cout << "清空成功" << endl;system("pause");//按任意键继续system("cls");//清屏
}//菜单界面
void showMenu() {cout << "***** 1、添加联系人 *****" << endl;cout << "***** 2、显示联系人 *****" << endl;cout << "***** 3、删除联系人 *****" << endl;cout << "***** 4、查找联系人 *****" << endl;cout << "***** 5、修改联系人 *****" << endl;cout << "***** 6、清空联系人 *****" << endl;cout << "***** 0、退出通讯录 *****" << endl;}int main() {Addressbooks abs;//初始化通讯录中当前人员个数abs.m_Size = 0;int select = 0;//创建用户选择输入的变量while (true) {//菜单的调用 showMenu();cin >> select;switch (select) {case 1://1、添加联系人addPerson(&abs);//利用地址传递可以修饰实参break;case 2://2、显示联系人showPerson(&abs);break;case 3://3、删除联系人 //测试代码//	//switch中case里语句过多需要将case中用{}括起来,否则会报错//{//	cout << "请输入删除联系人姓名:" << endl;//	string name;//	cin >> name;//	if (isExist(&abs, name) == -1) {//		cout << "查无此人" << endl;//	}//	else {//		cout << "找到此人" << endl;//	}//}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;
}

相关文章:

通讯录管理系统(个人学习笔记黑马学习)

1、系统需求 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人&#xff0c;信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录中所有联系人信…...

[SpringBoot3]远程访问@HttpExchange

六、远程访问HttpExchange[SpringBoot3] 远程访问是开发的常用技术&#xff0c;一个应用能够访问其他应用的功能。SpringBoot提供了多种远程访问的技术。基于HTTP协议的远程访问是最广泛的。SpringBoot中定义接口提供HTTP服务。生成的代理对象实现此接口&#xff0c;代理对象实…...

Linux安装ntp并使用阿里云配置ntp服务器

安装 NTP 客户端&#xff1a; 打开终端&#xff0c;以 root 权限执行以下命令来安装 NTP 客户端&#xff1a; sudo zypper install ntp 编辑 NTP 配置文件&#xff1a; 使用文本编辑器打开 NTP 的配置文件 /etc/ntp.conf&#xff0c;例如使用 nano 编辑器&#xff1a; sudo v…...

js常用方法总结

1、slice 和 splice slice表示截取&#xff0c;slice(start,end)&#xff0c;不改变原数组&#xff0c;返回新数组。 splice表示删除&#xff0c;splice(start,length,item)&#xff0c;会改变原数组&#xff0c;从某个位置开始删除多个元素&#xff0c;并可以插入新的元素。…...

在PHP中安装Composer并管理Vue前端依赖包

系列文章目录 文章目录 系列文章目录前言一、安装Composer二、使用Composer管理PHP依赖包三、使用npm管理Vue前端依赖包总结 前言 在开发Web应用程序时&#xff0c;使用Composer来管理PHP的依赖包和Vue前端的依赖包是一种很常见的做法。Composer是PHP的包管理工具&#xff0c;…...

03-前端基础CSS-第一天

01-CSS层叠样式表导读 目标&#xff1a; 能够说出什么是CSS能够使用CSS基础选择器能够设置字体样式能够设置文本样式能够说出CSS的三种引入方式能够使用Chrome调试工具调试样式 目录&#xff1a; 1.CSS简介2.CSS基础选择器3.CSS字体属性4.CSS文本属性5.CSS引入方式6.综合案…...

多张图片转为pdf怎么弄?

多张图片转为pdf怎么弄&#xff1f;在网络传输过程中&#xff0c;为了避免图片格式文件出现差错&#xff0c;并确保图片的清晰度和色彩不因不同设备而有所改变&#xff0c;常见的做法是将图片转换为PDF格式。然而&#xff0c;当涉及到多张图片时&#xff0c;逐一转换将会变得相…...

jdk新版本特性

JDK8,JDK11,JDK17,JDK21及中间版本主要更新特性_jdk重要版本_ycsdn10的博客-CSDN博客 Java 20 新特性概览 | JavaGuide(Java面试 学习指南)...

进程Start

Linux中的命令解释器和Windows的程序管理器explorer.exe一样地位,都是在用户态下运行的进程 共享变量发生不同进程间的指令交错&#xff0c;就可能会数据出错 进程只作为除CPU之外系统资源的分配单位 CPU的分配单位是线程 每个进程都有自己的独立用户空间 内核空间是OS内核的…...

SpringCloud学习笔记(六)_Ribbon服务调用

Ribbon介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具 Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说&#xff0c;就是…...

系统架构设计师考试论文:论无服务器架构及其应用

近年来&#xff0c;随着信息技术的迅猛发展和应用需求的快速更迭&#xff0c;传统的多层企业应用系统架构面临越来越多的挑战&#xff0c;已经难以适应这种变化。在这一背景下&#xff0c;无服务器架构(ServliessArchitecture)逐渐流行&#xff0c;它强调业务逻辑由事件触发&am…...

linux下安装Mycat

1 官网下载mycat 官方网站&#xff1a; 上海云业网络科技有限公司http://www.mycat.org.cn/ github地址&#xff1a; MyCATApache GitHubMyCATApache has 34 repositories available. Follow their code on GitHub.https://github.com/MyCATApache 2 Mycat安装 1 把MyCat…...

OpenCV(八):图像二值化

目录 1.固定值二值化 2.自适应阈值二值化 3.Android JNI完整代码 1.固定值二值化 固定阈值二值化是OpenCV中一种简单而常用的图像处理技术&#xff0c;用于将图像转换为二值图像。在固定阈值二值化中&#xff0c;像素值根据一个预定义的阈值进行分类&#xff0c;大于阈值的…...

《Flink学习笔记》——第十一章 Flink Table API和 Flink SQL

Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理框架&#xff0c;无论是批处理&#xff08;DataSet API&a…...

电脑提示缺少d3dx9_43.dll的问题及5个解决方法

大家好&#xff01;今天&#xff0c;我将和大家分享一个电脑提示缺少d3dx9_43.dll的问题及其解决方法。这个问题可能会影响到我们在使用电脑时的一些功能&#xff0c;所以掌握这个解决方法对我们来说是非常有帮助的。 首先&#xff0c;我们来了解一下什么是d3dx9_43.dll。d3dx9…...

Linux stat 命令及示例

介绍 该stat命令打印有关文件和文件系统的详细信息。该工具提供有关所有者是谁、修改日期、访问权限、大小、类型等信息。 该实用程序对于故障排除、在更改文件之前获取有关文件的信息以及例行文件和系统管理任务至关重要。 本文stat通过实际示例解释了有关 Linux 命令的所有…...

06-基础例程6

基础例程6 01、WIFI实验—WebServer 实验介绍 ​ 连接路由器上网是我们每天都做的事情&#xff0c;日常生活中只需要知道路由器的账号和密码&#xff0c;就可以使用手机或电脑连接到路由器&#xff0c;然后上网。 ​ 连接路由器&#xff0c;将ESP32的IP地址等信息通过shell…...

【附安装包】Eplan2022安装教程

软件下载 软件&#xff1a;Eplan版本&#xff1a;2022语言&#xff1a;简体中文大小&#xff1a;1.52G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu.co…...

大数据-玩转数据-Flink窗口

一、Flink 窗口 理解 在流处理应用中&#xff0c;数据是连续不断的&#xff0c;因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次&#xff0c;但是有时我们需要做一些聚合类的处理&#xff0c;例如&#xff1a;在过去的1分钟内有多少用户点击…...

【python爬虫】—豆瓣电影Top250

豆瓣电影Top250 豆瓣榜单简介需求描述Python实现 豆瓣榜单简介 豆瓣电影 Top 250 榜单是豆瓣网站上列出的评分最高、受观众喜爱的电影作品。这个榜单包含了一系列优秀的影片&#xff0c;涵盖了各种类型、不同国家和时期的电影。 需求描述 使用python爬取top250电影&#xff…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...