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

目录

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.mzph.cn/news/656753.shtml

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

相关文章

GPT栏目:yarn 安装

GPT栏目&#xff1a;yarn 安装 一、前言 在跟GPT交互的时候&#xff0c;发现最近gpt4给出的答案率有了比较明显的提高&#xff0c;简单记录一下&#xff0c;我用gpt4拿到的答案吧。 本人已按照这个步骤成功 二、具体步骤 要安装 yarn&#xff0c;你可以按照以下步骤进行操作…

MyBatis常见面试题汇总

说一下MyBatis执行流程&#xff1f; MyBatis是一款优秀的基于Java的持久层框架&#xff0c;它内部封装了JDBC&#xff0c;使开发者只需要关注SQL语句本身&#xff0c;而不需要花费精力去处理加载驱动、创建连接等的过程&#xff0c;MyBatis的执行流程如下&#xff1a; 加载配…

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新&#xff0c;因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…

【计算机网络】【练习题及解答】【新加坡南洋理工大学】【Computer Control Network】

说明&#xff1a; 仅供学习使用。 一、题目描述 题目共4问&#xff0c;描述网络通信中的 帧传输时延&#xff08;Frame Delay&#xff09;、传播时延&#xff08;Propagation Delay&#xff09;&#xff0c;以及 链接利用率&#xff08;Link Utilization&#xff09; 的相关…

Vue2:通过代理服务器解决跨域问题

一、场景描述 现在的项目大多数是前后端分离的。Vue前端项目通过ajax去请求后端接口的时候&#xff0c;会有同源策略的限制。从而产生跨域问题。 二、基本概念 1、什么是同源策略&#xff1f; 就是前端服务和后端服务的协议名&#xff0c;IP或主机名&#xff0c;端口号不完…

0x02递推与递归

0x02递推与递归 递推者&#xff0c;自小而大&#xff0c;循序渐进&#xff1b;递归者&#xff0c;由上而下&#xff0c;分而治之 文章目录 0x02递推与递归例题T1&#xff1a;T2&#xff1a;T3&#xff1a;T4:T5T6 例题 T1&#xff1a; 92. 递归实现指数型枚举 - AcWing题库 …

Mysql 插入数据

1 为表的所有字段插入数据 使用基本的INSERT语句插入数据要求指定表名称和插入到新记录中的值。基本语法格式为&#xff1a; INSERT INTO table_name (column_list) VALUES (value_list); 使用INSERT插入数据时&#xff0c;允许列名称列表column_list为空&#xff0c;此时&…

Web服务器之Tomcat

文章目录 Web 服务器软件简介资源分类访问流程常见的Web服务器软件 Tomcat简介使用步骤使用Tomcat注意事项部署项目的方式方式一方式二方式三 问题中文乱码黑窗口一闪而过启动报错 Web 服务器软件 简介 服务器&#xff1a;安装了服务器软件的计算机服务器软件&#xff1a;接收…

漏洞原理远程命令执行

漏洞原理远程命令/代码执行 远程命令执行函数&#xff08;Remote Command Execution Function&#xff09;是指在一个网络环境中&#xff0c;通过远程执行命令来控制另一个计算机系统或设备的功能。 远程命令执行函数可以通过网络协议&#xff08;如SSH、Telnet、RPC等&#x…

伊恩·斯图尔特《改变世界的17个方程》毕达哥拉斯定理笔记

它告诉我们什么&#xff1f; 直角三角形的三个边之间有什么关系。 为什么重要&#xff1f; 它提供了几何和代数之间的重要联系&#xff0c;使我们能够根据坐标计算距离。它也催生出了三角学。 它带来了什么&#xff1f; 测绘、导航&#xff0c;以及较近代出现的狭义和广义相对论…

第一节课,用户管理--后端初始化,项目调通。二次翻工2

一、网址来源&#xff1a; 快速开始 | MyBatis-Plus (baomidou.com) 进程&#xff1a; ​ 二、[此处不看]添加测试类&#xff0c;看下效果 2.1 参考 一、第一节课&#xff0c;用户管理--后端初始化&#xff0c;项目调通-CSDN博客 ​ 2.2 新建 SampleTest ​ 2.3 复…

python-自动化篇-运维-语音识别

文章目录 理论文本转换为语音使用 pyttsx使用 SAPI使用 SpeechLib 语音转换为文本 代码和效果01使用pyttsx实现文本_语音02使用SAPI实现文本_语音03使用SpeechLib实现文本_语音04使用PocketSphinx实现语音转换文本 理论 语音识别技术&#xff0c;也被称为自动语音识别&#xf…

安卓逆向学习之ADB的配置和使用及刷机root

ADB的配置和使用 ADB即Android Debug Bridge&#xff0c;安卓调试桥&#xff0c;是谷歌为安卓开发者提供的开发工具之一&#xff0c;可以让你的电脑以指令窗口的方式控制手机。可以在安卓开发者网页中的 SDK 平台工具页面下直接下载对应系统的 adb 配置文件&#xff0c;大小只…

矩阵键盘的使用

在定义局部变量时&#xff0c;一定要给该变量赋初值。在这个程序中&#xff0c;给按键按下的返回值变量 KeyNum 赋值为 20 。 矩阵键盘线行扫描法的学习链接&#xff1a;https://www.bilibili.com/video/BV1dv411z7Gd/?spm_id_from333.999.0.0&vd_sourceb91967c499b23106…

Python 因果推断(上)

引言 原文&#xff1a;causal-methods.github.io/Book/Introduction.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Vitor Kamada 电子邮件&#xff1a;econometrics.methodsgmail.com 最后更新日期&#xff1a;2020 年 8 月 15 日 这本书是使…

jupyter出现问题ModuleNotFoundError: No module named ‘exceptiongroup‘

今天使用pyg的jupyter环境发现这个环境没法用, 所以只能把这个kernel给重删了然后再装&#xff0c;操作记录如下 查看kernel jupyter kernelspec list注意不是jupyter kernel --list 需要加关键字spec, 删除kernel jupyter kernelspec remove pyg当重新安装这个kernel时可能…

Redis -- 常用数据结构,认识数据类型和编码方式

"人生就像骑自行车&#xff0c;要保持平衡&#xff0c;就必须保持前进。" — 爱因斯坦 说到数据结构&#xff0c;或许就能想到哈希表&#xff0c;列表集合等数据结构。对于redis来说对应的key的value的形式也可以是这些数据结构&#xff0c;如下&#xff1a; 针对上面…

导出Mysql数据库表名和字段并合并成一个word

参考链接&#xff1a; 导出MySQL数据库所有库和字段注释及相关信息为word文档——工具类 java - Apache POI - How to copy tables from one docx to another docx - Stack Overflow 领导让我研究下一个低代码平台的代码&#xff0c;我就想着做一个把数据库字段直接导出来的…

【论文阅读】Long-Tailed Recognition via Weight Balancing(CVPR2022)附MaxNorm的代码

目录 论文使用方法weight decayMaxNorm 如果使用原来的代码报错的可以看下面这个 论文 问题&#xff1a;真实世界中普遍存在长尾识别问题&#xff0c;朴素训练产生的模型在更高准确率方面偏向于普通类&#xff0c;导致稀有的类别准确率偏低。 key:解决LTR的关键是平衡各方面&a…

Android 12 系统开机动画

一、查找Android系统提供的开机动画 在Android系统源码目录下输入 find ./ -name "bootanimation.zip" 如图所示 所输出的路劲即为bootanimation.zip所在路径&#xff0c;每个系统都不一样&#xff0c;建议用命令查找 二、复制到对应目录下 android12\out\target\…