【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、主机一般被划分为两类:客…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
