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; 的相关…

【NodeJS】005- NodeJS的NVM与express框架

1.NVM介绍与使用 1.介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工具,方便切换不同版本的Node.js 2.使用 nvm 的使用非常的简单,跟 npm 的使用方法类似 3.下载安装 首先先下载 nvm,下载地址 https://github.com/coreybutler/nvm-windows/rel…

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;此时&…

网络安全战略中的法律问题

文章目录 前言一、各国网络安全的法律需求陡增二、战争的多维化使对法律的需求也越加多样(一)从平时到战时,网络斗争的平战模糊性增加法律适用难度(二)从高维到低维,博弈的多维性使法律需求层次更加丰富(三)从防御到进攻,网络空间的攻防不均衡改变法律斗争重点三、各国…

flink分别使用FilterMap和ProcessFunction实现去重逻辑

背景 在日常的工作中&#xff0c;对数据去重是一件很常见的操作&#xff0c;比如我们只需要保留重复记录的第一条&#xff0c;而忽略掉后续重复的记录&#xff0c;达到去重的效果&#xff0c;本文就使用flink的FilterMap和ProcessFunction来实现去重逻辑 FilterMap和ProcessF…

Compose | UI组件(十) | Box,Surface - 帧布局

文章目录 前言Box 组件的参数说明Box 组件的使用Surface 的参数说明Surface 的使用 总结 前言 Box组件是 按子组件依次叠加 的布局组件&#xff0c;相当传统View中的 FrameLayout Box 组件的参数说明 Composable inline fun Box(modifier: Modifier Modifier, …

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 复…

SouthLeetCode-打卡24年01月第3周

SouthLeetCode-打卡24年01月第3周 // Date : 2024/01/15 ~ 2024/01/21 013.二分查找 (1) 题目描述 013#LeetCode.27.#北岸计划2024/01/15 // 略 (2) 题解代码 // 重做 014.移除元素 (1) 题目描述 014#LeetCode.160.#北岸计划2024/01/16 (2) 题解代码 Version1.0 c…

SpringMVC RESTful风格

Restful是一种软件架构风格、设计风格&#xff0c;而不是标准&#xff0c;只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件&#xff0c;基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存机制等。 Restful风格的请求是…

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

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

C++ STL库之Vector简介及例题(二)

C STL库之Vector简介及例题&#xff08;二&#xff09; 继“C STL库之Vector简介及例题&#xff08;一&#xff09;【点击查看】”之后&#xff0c;这篇文章我们继续上一次的介绍&#xff0c;继续对vector的一些算法的函数进行简析及例题分析。 元素操作 删除第2个元素&…

Hive之set参数大全-22(完)

指定是否启用矢量化处理复杂数据类型 在 Hive 中&#xff0c;hive.vectorized.complex.types.enabled 是一个配置参数&#xff0c;用于指定是否启用矢量化处理复杂数据类型。以下是有关该参数的一些解释&#xff1a; 用途&#xff1a; 该参数用于控制是否启用 Hive 的矢量化执…