【C++案例】一个项目掌握C++基础-通讯录管理系统
文章目录
- 1、系统需求
- 2、菜单功能
- 3、退出功能
- 4、添加联系人
- 4.1 设计联系人结构体
- 4.2 设计通讯录结构体
- 4.3 main函数中创建通讯录
- 4.4 封装添加联系人函数
- 4.5 测试添加联系人功能
- 5、显示联系人
- 5.1 封装显示联系人函数
- 5.2 测试显示联系人功能
- 6、删除联系人
- 6.1 封装检测联系人是否存在
- 6.2 封装删除联系人函数
- 6.3 测试删除联系人功能
- 7、查找联系人
- 7.1 封装查找联系人函数
- 7.2 测试查找指定联系人
- 8、修改联系人
- 8.1 封装修改联系人函数
- 8.2 测试修改联系人功能
- 9、清空联系人
- 9.1 封装清空联系人函数
- 9.2 测试清空联系人
- 10、总的代码
1、系统需求
用C++来实现一个通讯录管理系统,实现的功能如下:
添加联系人
:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人
:显示通讯录中所有联系人信息删除联系人
:按照姓名进行删除指定联系人查找联系人
:按照姓名查看指定联系人信息修改联系人
:按照姓名重新修改指定联系人清空联系人
:清空通讯录中所有信息退出通讯录
:退出当前使用的通讯录
2、菜单功能
功能描述: 用户选择功能的界面
#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();return 0;
}
3、退出功能
功能描述:退出通讯录系统
思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建
当用户选择0时候,执行退出,选择其他先不做操作,也不会退出程序
代码:
int main() {int select = 0;while (true){showMenu();cin >> select;switch (select){case 1: //添加联系人break;case 2: //显示联系人break;case 3: //删除联系人break;case 4: //查找联系人break;case 5: //修改联系人break;case 6: //清空联系人break;case 0: //退出通讯录cout << "欢迎下次使用" << endl;return 0;break;default:break;}}return 0;
}
4、添加联系人
功能描述:实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)
添加联系人实现步骤:
- 设计联系人结构体
- 设计通讯录结构体
- main函数中创建通讯录
- 封装添加联系人函数
- 测试添加联系人功能
4.1 设计联系人结构体
联系人信息包括:姓名、性别、年龄、联系电话、家庭住址,设计如下:
#include <string> //string头文件
//联系人结构体
struct Person
{string m_Name; //姓名int m_Sex; //性别:1男 2女int m_Age; //年龄string m_Phone; //电话string m_Addr; //住址
};
4.2 设计通讯录结构体
设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量,设计如下
#define MAX 1000 //最大人数//通讯录结构体
struct Addressbooks
{struct Person personArray[MAX]; //通讯录中保存的联系人数组int m_Size; //通讯录中人员个数
};
4.3 main函数中创建通讯录
添加联系人函数封装好后,在main函数中创建一个通讯录变量,这个就是我们需要一直维护的通讯录
mian函数起始位置添加://创建通讯录Addressbooks abs;//初始化通讯录中人数abs.m_Size = 0;
4.4 封装添加联系人函数
思路:添加联系人前先判断通讯录是否已满,如果满了就不再添加,未满情况将新联系人信息逐个加入到通讯录,添加联系人代码:
//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 << "输入有误,请重新输入";}//年龄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;}
}
4.5 测试添加联系人功能
选择界面中,如果玩家选择了1,代表添加联系人,我们可以测试下该功能
在switch case 语句中,case1里添加:
case 1: //添加联系人addPerson(&abs);break;
5、显示联系人
功能描述:显示通讯录中已有的联系人信息,显示联系人实现步骤:
- 封装显示联系人函数
- 测试显示联系人功能
5.1 封装显示联系人函数
思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息
显示联系人代码:
//2、显示所有联系人信息
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;}}
}
5.2 测试显示联系人功能
在switch case语句中,case 2 里添加
case 2: //显示联系人showPerson(&abs);break;
6、删除联系人
功能描述:按照姓名进行删除指定联系人,删除联系人实现步骤:
- 封装检测联系人是否存在
- 封装删除联系人函数
- 测试删除联系人功能
6.1 封装检测联系人是否存在
设计思路:删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人
因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-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;
}
6.2 封装删除联系人函数
根据用户输入的联系人判断该通讯录中是否有此人,查找到进行删除,并提示删除成功,查不到提示查无此人。
//3、删除指定联系人信息
void deletePerson(Addressbooks * abs)
{cout << "请输入您要删除的联系人" << endl;string name;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;}
}
6.3 测试删除联系人功能
在switch case 语句中,case3里添加:
case 3: //删除联系人deletePerson(&abs);break;
7、查找联系人
功能描述:按照姓名查看指定联系人信息,查找联系人实现步骤
- 封装查找联系人函数
- 测试查找指定联系人
7.1 封装查找联系人函数
实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人。查找联系人代码:
//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;}
}
7.2 测试查找指定联系人
在switch case 语句中,case4里添加:
case 4: //查找联系人findPerson(&abs);break;
8、修改联系人
功能描述:按照姓名重新修改指定联系人,修改联系人实现步骤
- 封装修改联系人函数
- 测试修改联系人功能
8.1 封装修改联系人函数
实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人,修改联系人代码:
//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;cout << "请输入性别:" << endl;cout << "1 -- 男" << endl;cout << "2 -- 女" << endl;//性别int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[ret].m_Sex = sex;break;}cout << "输入有误,请重新输入";}//年龄cout << "请输入年龄:" << endl;int age = 0;cin >> age;abs->personArray[ret].m_Age = age;//联系电话cout << "请输入联系电话:" << endl;string phone = "";cin >> phone;abs->personArray[ret].m_Phone = phone;//家庭住址cout << "请输入家庭住址:" << endl;string address;cin >> address;abs->personArray[ret].m_Addr = address;cout << "修改成功" << endl;}else{cout << "查无此人" << endl;}
}
8.2 测试修改联系人功能
在switch case 语句中,case 5里添加:
case 5: //修改联系人modifyPerson(&abs);break;
9、清空联系人
功能描述:清空通讯录中所有信息,清空联系人实现步骤
- 封装清空联系人函数
- 测试清空联系人
9.1 封装清空联系人函数
实现思路: 将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可。清空联系人代码:
//6、清空所有联系人
void cleanPerson(Addressbooks * abs)
{abs->m_Size = 0;cout << "通讯录已清空" << endl;
}
9.2 测试清空联系人
在switch case 语句中,case 6 里添加:
case 6: //清空联系人cleanPerson(&abs);break;
至此,通讯录管理系统完成!
10、总的代码
#include<iostream>
#include<string>
using namespace std;
const int MAX = 1000;// #define MAX 1000// 菜单界面,封装函数显示该界面 如 `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;
}// 设计联系人结构体
// 包括姓名、性别、年龄、联系电话、家庭住址
struct Person
{string m_Name;// 姓名int m_Sex;// 性别 1 男 2 女int m_Age;// 年龄string m_Phone; // 电话string m_Addr; // 住址
};// 设计通讯录的结构体
// 维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量
struct Addressbooks
{struct Person personArray[MAX];// 通讯录中保存的联系人数组,结构体嵌套int m_Size;// 通讯录中当前记录联系人个数
};// 1. 添加联系人
void addPerson(Addressbooks* abs)// 使用结构体指针,addressbooks是结构体嵌套结构体
{// 首先判断通讯录是否已满,如果满了就不再添加if (abs->m_Size == MAX){cout << "通讯录已满,无法添加!" << endl;}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) // 死循环,直到输入的是对的才停止{// 如果输入的是1或者2可以退出循环,因为输入的是正确值// 如果输入的有误,重新输入cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->m_Size].m_Sex = sex;// abs->m_Size表示第几个联系人,从0开始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;}
}// 2.显示联系人
void showPerson(Addressbooks* abs)
{// 判断通讯录中人数abs->m_Size是否为0,如果为0,提示记录为空// 如果不为0,显示记录的联系人信息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;}}
}// 3.删除联系人
// 3.1 检测联系人是否存在,如果存在返回联系人所在数组中的具体位置,不存在返回-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; // 如果遍历结束都没有找到,返回-1
}// 3.2 删除指定的联系人
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++)// ret不为零的情况下,返回的是需要删除的联系人所在的下标{// 数据前移,一个一个往前移动abs->personArray[i] = abs->personArray[i + 1];}abs->m_Size--; // 更新通讯录中的人员数cout << "删除成功" << endl;}else{cout << "查无此人" << endl;}
}// 4.查找指定联系人信息
void findPerson(Addressbooks* abs)
{cout << "请输入您要查找的联系人" << endl;string name;cin >> name;// 判断指定的联系人是否存在通讯录中int ret = isExist(abs, name);if (ret != -1) // 找到联系人(类似2.显示联系人信息){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;}
}// 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;cout << "请输入性别:" << endl;// 性别cout << "1 -- 男" << endl;cout << "2 -- 女" << endl;int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){// 输入正确 退出循环输入abs->personArray[ret].m_Sex = sex;break;}cout << "输入有误,请重新输入";}cout << "请输入年龄:" << endl;// 年龄int age = 0;cin >> age;abs->personArray[ret].m_Age = age;cout << "请输入联系电话:" << endl;// 联系电话string phone;cin >> phone;abs->personArray[ret].m_Phone = phone;cout << "请输入家庭住址:" << endl;// 家庭住址string address;cin >> address;abs->personArray[ret].m_Addr = address;cout << "修改成功" << endl;}else{cout << "查无此人" << endl;}
}// 6.清空联系人
void cleanPerson(Addressbooks* abs)
{abs->m_Size = 0; // 将当前记录联系人数量置为0,做逻辑清空操作cout << "通讯录已清空" << endl;
}int main()
{Addressbooks abs;// 创建通讯录结构体变量abs.m_Size = 0;// 初始化通讯录中当前人员个数int select = 0; // 创建用户选择输入的变量while (true)// 只有0是真正意义上的退出,选择其他的值都不会退出,而是进行循环{showMenu();// 菜单的调用cin >> select;switch (select){case 1: // 1.添加联系人addPerson(&abs); // 利用地址传递可以修改形参break;case 2: // 2.显示联系人showPerson(&abs);break;case 3: // 3.删除联系人,case中如果后面有打断代码,用{}括起来,不会报错/*{cout << "请输入删除联系人姓名:" << endl;string name;cin >> name;if (isExist(&abs, name) == -1){cout << "查无此人" << endl;}else{cout << "找到此人" << endl;}}*/deletePerson(&abs);break;// break前面的程序比较长时加大括号case 4: // 4.查找联系人findPerson(&abs);break; case 5: // 5.修改联系人modifyPerson(&abs);break;case 6: // 6.清空联系人cleanPerson(&abs);break;case 0: // 0.退出通讯录cout << "欢迎下次使用" << endl;return 0;break;default:break;}}return 0;
}
相关文章:
【C++案例】一个项目掌握C++基础-通讯录管理系统
文章目录 1、系统需求2、菜单功能3、退出功能4、添加联系人4.1 设计联系人结构体4.2 设计通讯录结构体4.3 main函数中创建通讯录4.4 封装添加联系人函数4.5 测试添加联系人功能 5、显示联系人5.1 封装显示联系人函数5.2 测试显示联系人功能 6、删除联系人6.1 封装检测联系人是否…...

Triton教程 --- 动态批处理
Triton教程 — 动态批处理 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理 Triton 提供了动态批处理功能,将多个请求组合在一起执行同一模型以提供更大的吞吐量。 默认情况下,只有当每个输入在…...
Python的并行(持续更新)
0. 参考: 《Python并行编程 中文版》https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/index.html 1. 线程和进程: 进程可以包含多个并行运行的线程;通常,操作系统创建和管理线程比进程更省CPU资源&am…...

chatgpt赋能python:Python实现Fibonacci数列
Python实现Fibonacci数列 Fibonacci数列是一个非常经典的数列,定义如下: F ( 0 ) 0 , F ( 1 ) 1 F(0)0, F(1)1 F(0)0,F(1)1 F ( n ) F ( n − 1 ) F ( n − 2 ) F(n)F(n-1)F(n-2) F(n)F(n−1)F(n−2) 也就是说,第n个数等于前两个数之和…...

开环模块化多电平换流器仿真(MMC)N=6
模型简介: 运行环境MATLAB2021a 开环模块化多电平换流器仿真(MMC)N=6,连接负载,采用载波移相调制。 可以得到换流器输出N+1=7电平的相电压波形。可考虑线路阻抗。 子模块采用半桥结…...

java springboot整合MyBatis联合查询
前面文章 java springboot整合MyBatis做数据库查询操作写了springboot整合MyBatis的方法 并演示了基础查询的语法 根据id查 那么 我们这次来演示联合查询 我们staff 表 内容如下 每条数据 对应的都有一个departmentid 这是 department部门表的外键id department表内容如下 如…...

windows2022证书配置.docx
Windows证书的配置 要求两台主机,一台作为域,一台进入域 按要求来选择角色服务 确认之后安装 安装完以后配置证书服务 选择服务 按要求配置 注:此处不用域用户登陆无法使用企业CA 按要求来 创建新的私钥 这几处检查无误后默认即可 有效期…...

HCIP网络笔记分享——IA回顾及OSPF协议
第一部分 HCIA回顾1、网络基础2、动态路由协议3、路由认证4、路由控制(AD metric ) 一、知识巩固二、场景模拟1、获取IP地址1.1 DHCP --- 动态主机配置协议1.1.1 DHCP客户端1.1.2 DHCP服务器1.1.3 DHCP客户端1.1.4 DHCP服务器 2、打开浏览器3、路由器进行…...

网络:IP地址、子网掩码、网络地址、广播地址、网段、网关
目录 一、IP地址 二、子网掩码 三、网络地址 四、广播地址 五、网段 六、网关 七、IP地址、子网掩码、网络地址、广指地址、网殷、网关的关系 参考链接 一、IP地址 IP地址是因特网协议(IP)中使用的一种数字标识符,用于唯一地标识网络…...

编程的未来 - 还有未来么?
缘起 唐门教主上个月某天深夜写了一篇博客 --《编程的未来》,要我谈谈感想。 这也是最近软件工程师们聊得比较多的问题,上周,在上海的 “关东小磨” 和十多位 CSDN 博主聚会的时候,大家也稍微谈了一下这个话题,但是谈…...
从零开始搭建群众权益平台(二)
这篇文章我们要建立的群众权益维护平台需要提供用户注册、登录、提交和查看问题或建议的功能,并且支持电话短信登录。在这个过程中,我们需要存储用户的登录信息。 我们将使用Node.js和Express.js作为后端框架,MongoDB作为数据库,并且使用Twilio服务发送短信验证码来实现手…...
Mysql之数据备份
一.日志 1.MySQL 的日志默认保存位置为 /usr/local/mysql/data2.修改日志配置文件 vim /etc/my.cnf [mysqld] ##错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启 log-error/usr/local/mysql/data/mysql_error.log #指定日志的…...

【数据库数据恢复】SQL Server数据表结构损坏的数据恢复案例
数据库故障&分析: SQL server数据库数据无法读取。 经过初检,发现SQL server数据库文件无法被读取的原因是因为底层File Record被截断为0,无法找到文件开头,数据表结构损坏。镜像文件的前面几十M空间和中间一部分空间被覆盖掉…...

C语言/C++ 之 打飞机游戏
【项目简介】 1、设计思想:本项目主要是为了实现打飞机游戏,主要包括5个函数模块,和1个主函数框架。分别是chu_shi_hua();、you_cao_zuo;、wu_cao_zuo();、show();、main();等。项目完成过程中主要运用了C/C中的输入输…...
在 Docker 中部署 Mino 并挂载配置文件
创建本地目录 首先,在主机上创建一个目录,用于存放 Mino 的配置文件。例如,创建一个名为 mino 的目录,用于存放 Mino 的配置文件。 mkdir mino拉取 Mino 镜像 使用以下命令从 Docker Hub 上拉取 Mino 的最新镜像: …...

无限脉动:释放音乐和区块链在音乐领域的力量
音乐是一种永恒的通用语言,它将人们聚集在一起,超越了边界,在我们灵魂深处产生共鸣,创造联系。在当今数字时代,随着区块链技术和去中心化网络的出现,音乐世界正在经历一场深刻的变革。 我们在与艺术家合作&…...

读发布!设计与部署稳定的分布式系统(第2版)笔记09_一窝蜂和容量
1. 停电事故后电力恢复的方式 1.1. 停电后常见的情形是,送电几秒钟后又再次断电 1.2. 数百万台空调和冰箱的用电需求,使刚刚恢复的电力供应发生过载 1.3. 当电力供应不足时,增加的电流很快就到达满负荷,导致过载,触…...
详解java定时任务
在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例以及Timer缺陷三个方面来解析java Timer定时器。 一、简介 在java中一个完整定时任务需要由Timer、TimerTask两个…...

PCIe卡设计方案:单路12Gsps 3G 带宽模拟信号源PCIe卡
一、板卡概述 单路3G带宽模拟信号源卡由DA子卡和PCIe底板组成,二者通过标准FMC连接器互联,可以实现将PCIe总线数据转换为一路高速的模拟量输出。北京太速科技板可广泛用于雷达、通信、光电领域的噪声信号、毛刺、脉冲信号模拟产生等领域。 二、 …...
第1章 计算机网络和因特网
1、主机或端系统通过( )接入因特网。 A. ISPB. 调制解调器C. 交换机D. 路由器 P21:端系统(PC、智能手机、Web 服务器、电子邮件服务器等)经过一个接入 ISP 与因特网相连。 2、主机一般被划分为两类:客…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...