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

【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 提供了动态批处理功能&#xff0c;将多个请求组合在一起执行同一模型以提供更大的吞吐量。 默认情况下&#xff0c;只有当每个输入在…...

Python的并行(持续更新)

0. 参考&#xff1a; 《Python并行编程 中文版》https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/index.html 1. 线程和进程&#xff1a; 进程可以包含多个并行运行的线程&#xff1b;通常&#xff0c;操作系统创建和管理线程比进程更省CPU资源&am…...

chatgpt赋能python:Python实现Fibonacci数列

Python实现Fibonacci数列 Fibonacci数列是一个非常经典的数列&#xff0c;定义如下&#xff1a; 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) 也就是说&#xff0c;第n个数等于前两个数之和…...

开环模块化多电平换流器仿真(MMC)N=6

模型简介&#xff1a; 运行环境MATLAB2021a 开环模块化多电平换流器仿真&#xff08;MMC&#xff09;N&#xff1d;6&#xff0c;连接负载&#xff0c;采用载波移相调制。 可以得到换流器输出N&#xff0b;1&#xff1d;7电平的相电压波形。可考虑线路阻抗。 子模块采用半桥结…...

java springboot整合MyBatis联合查询

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

windows2022证书配置.docx

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

HCIP网络笔记分享——IA回顾及OSPF协议

第一部分 HCIA回顾1、网络基础2、动态路由协议3、路由认证4、路由控制&#xff08;AD metric &#xff09; 一、知识巩固二、场景模拟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地址是因特网协议&#xff08;IP&#xff09;中使用的一种数字标识符&#xff0c;用于唯一地标识网络…...

编程的未来 - 还有未来么?

缘起 唐门教主上个月某天深夜写了一篇博客 --《编程的未来》&#xff0c;要我谈谈感想。 这也是最近软件工程师们聊得比较多的问题&#xff0c;上周&#xff0c;在上海的 “关东小磨” 和十多位 CSDN 博主聚会的时候&#xff0c;大家也稍微谈了一下这个话题&#xff0c;但是谈…...

从零开始搭建群众权益平台(二)

这篇文章我们要建立的群众权益维护平台需要提供用户注册、登录、提交和查看问题或建议的功能,并且支持电话短信登录。在这个过程中,我们需要存储用户的登录信息。 我们将使用Node.js和Express.js作为后端框架,MongoDB作为数据库,并且使用Twilio服务发送短信验证码来实现手…...

Mysql之数据备份

一.日志 1.MySQL 的日志默认保存位置为 /usr/local/mysql/data2.修改日志配置文件 vim /etc/my.cnf [mysqld] ##错误日志&#xff0c;用来记录当MySQL启动、停止或运行时发生的错误信息&#xff0c;默认已开启 log-error/usr/local/mysql/data/mysql_error.log #指定日志的…...

【数据库数据恢复】SQL Server数据表结构损坏的数据恢复案例

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

C语言/C++ 之 打飞机游戏

【项目简介】 1、设计思想&#xff1a;本项目主要是为了实现打飞机游戏&#xff0c;主要包括5个函数模块&#xff0c;和1个主函数框架。分别是chu_shi_hua();、you_cao_zuo&#xff1b;、wu_cao_zuo();、show()&#xff1b;、main();等。项目完成过程中主要运用了C/C中的输入输…...

在 Docker 中部署 Mino 并挂载配置文件

创建本地目录 首先&#xff0c;在主机上创建一个目录&#xff0c;用于存放 Mino 的配置文件。例如&#xff0c;创建一个名为 mino 的目录&#xff0c;用于存放 Mino 的配置文件。 mkdir mino拉取 Mino 镜像 使用以下命令从 Docker Hub 上拉取 Mino 的最新镜像&#xff1a; …...

无限脉动:释放音乐和区块链在音乐领域的力量

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

读发布!设计与部署稳定的分布式系统(第2版)笔记09_一窝蜂和容量

1. 停电事故后电力恢复的方式 1.1. 停电后常见的情形是&#xff0c;送电几秒钟后又再次断电 1.2. 数百万台空调和冰箱的用电需求&#xff0c;使刚刚恢复的电力供应发生过载 1.3. 当电力供应不足时&#xff0c;增加的电流很快就到达满负荷&#xff0c;导致过载&#xff0c;触…...

详解java定时任务

在我们编程过程中如果需要执行一些简单的定时任务&#xff0c;无须做复杂的控制&#xff0c;我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例以及Timer缺陷三个方面来解析java Timer定时器。 一、简介 在java中一个完整定时任务需要由Timer、TimerTask两个…...

PCIe卡设计方案:单路12Gsps 3G 带宽模拟信号源PCIe卡

一、板卡概述 单路3G带宽模拟信号源卡由DA子卡和PCIe底板组成&#xff0c;二者通过标准FMC连接器互联&#xff0c;可以实现将PCIe总线数据转换为一路高速的模拟量输出。北京太速科技板可广泛用于雷达、通信、光电领域的噪声信号、毛刺、脉冲信号模拟产生等领域。 二、 …...

第1章 计算机网络和因特网

1、主机或端系统通过&#xff08; &#xff09;接入因特网。 A. ISPB. 调制解调器C. 交换机D. 路由器 P21&#xff1a;端系统&#xff08;PC、智能手机、Web 服务器、电子邮件服务器等&#xff09;经过一个接入 ISP 与因特网相连。 2、‌主机一般被划分为两类&#xff1a;客…...

QT入门基础知识

什么是QT QT是一个跨平台的C图像用户界面应用程序框架QT在1991年由奇趣科技开发QT的优点 跨平台,几乎支持所有平台接口简单&#xff0c;容易上手一定程度上简化了内存回收机制有很好的社区氛围可以进行嵌入式开发 QWidget QT注意事项 命名规范 类名 首字母大写&#xff0c;单…...

Leetcode---350周赛

题目列表 6901. 总行驶距离 6890. 找出分区值 6893. 特别的排列 6447. 给墙壁刷油漆 一、总行驶距离 很显然&#xff0c;这题单纯就是一道数学应用题&#xff0c;我们要明白最关键的一点 &#xff1a;只有当mainTank>5并且additionalTank>0时&#xff0c;才能发生副油…...

Django通过Nginx和uWSGI实现负载均衡

Django是一款非常流行的Web应用程序框架&#xff0c;它允许开发人员以快速、简单和灵活的方式构建可扩展和可维护的Web应用程序。当你的应用程序开始变得越来越受欢迎时&#xff0c;你可能会发现需要使用负载均衡来确保应用程序的可用性和性能。在本文中&#xff0c;我们将介绍…...

单元测试框架——Junit5

文章目录 Junit1. 注解2.断言3.测试用例执行顺序4.测试套件Suite1) 指定多个类2) 指定包 5. 参数化1) 单参数2) 多参数3) 文件注入 6.动态参数 Junit Junit是一个开源的用于Java语言的单元测试框架&#xff0c;也是Java方向使用最广泛的单元测试框架。 在pom.xml中引入Junit5…...

centos 系列添加 yum 源

nginx 首先&#xff0c;安装 EPEL (Extra Packages for Enterprise Linux) 仓库。这是一个由 Fedora 项目提供的免费扩展软件包仓库&#xff0c;其中包含许多有用的软件包。 sudo yum install epel-release 接下来&#xff0c;导入 Nginx 的官方 GPG 密钥&#xff0c;以便验证安…...

[Hive高级特性与 DDL和DML语法]

目录 &#x1f387;前言: &#x1f387; HiveQL语言的基本语法&#xff0c;包括DDL和DML两个方面。 &#x1f387;DDL&#xff08;数据定义语言&#xff09;&#xff1a; &#x1f387;DML&#xff08;数据操作语言&#xff09;&#xff1a; &#x1f387; Hive高级特性 多种…...

Web服务器群集:Web基础与HTTP协议

目录 一、理论 1.Web基础 2.HTTP协议 二、实验 1.浏览本地HTML页面 三、总结 一、理论 1.Web基础 &#xff08;1&#xff09;域名和DNS ① 域名 网络是基于TCP/IP 协议进行通信和连接的&#xff0c;每一台主机都有一个唯一的标识&#xff08;固定的IP地 址&#xff0…...

cmd命令常用速记

cmd命令大全 常见的appwiz.cpl control calc 等&#xff0c;各类功能、设置、甚至是文件属性和系统版本&#xff0c;都可以通过命令的方式快速查看和操作&#xff0c;有助于我们的提高工作效率&#xff0c;具体见下文。 cmd命令:开始&#xff0d;>运行&#xff0d;>键入…...

Python网络爬虫基础进阶到实战教程

文章目录 认识网络爬虫HTML页面组成Requests模块get请求与实战效果图代码解析 Post请求与实战代码解析 发送JSON格式的POST请求使用代理服务器发送POST请求发送带文件的POST请求 Xpath解析XPath语法的规则集&#xff1a;XPath解析的代码案例及其详细讲解&#xff1a;使用XPath解…...

树莓派使用VNC、SSH、Xrdp等方式进行远程控制的方法和注意事项

下面来总结一下远程操控树莓派用到的三种方式及其注意事项&#xff0c;其实这三种方式对于所有的Linux系统来说都是适用的。 目录 一、ssh控制树莓派 1.开启 ssh服务方法一 2.开启 ssh服务方法二 二、VNC远程连接 三、xrdp远程连接 四、其他注意事项 一、ssh控制树莓派 S…...

域名注册完成后如何做网站/湖南网络推广排名

python读写文件 通常我们是通过open函数来读写文件的。 以下是open函数的源码&#xff1a; def open(file, moder, bufferingNone, encodingNone, errorsNone, newlineNone, closefdTrue):我们通常只会用到前两个参数&#xff0c;其中file指的是文件名&#xff0c;而mode指的…...

dw cs4怎么做网站/百度网盘app免费下载安装老版本

很多人都学习了网络技术, 里面有许许多的知识点。包括cisco的路由交换技术,linux系统的各种服务, windows系统的各种服务等等。一想到划分 / 隔离必然要考虑vlan ?vlan多了&#xff0c;就上三层交换机 ?难道控制上网行为就acl ?防火墙就会想到ISA ?我想说的是书中所涉及的…...

攸县网站定制/护肤品软文推广

Chargpt是通过模仿人类的思考方式来理解复杂逻辑的。它会先读取输入文本&#xff0c;然后使用自然语言处理技术来理解文本中的词语和句子的含义。然后它会使用逻辑推理能力来思考文本中的逻辑关系&#xff0c;并利用这些信息来回答问题或完成其他任务。 Chargpt在理解复杂逻辑时…...

怎么做付款链接网站/账户竞价托管费用

20个二叉树面试高频 0. 几个概念1. 求二叉树中的节点个数2. 求二叉树的最大层数(最大深度)3. 先序遍历/前序遍历4. 中序遍历5. 后序遍历6. 分层遍历7. 求二叉树第K层的节点个数8. 求二叉树第K层的叶子节点个数9. 判断两棵二叉树是否结构相同10. 判断二叉树是不是平衡二叉树11.…...

建设捐款网站/百度首页登录入口

Chapter12 回环检测词袋模型(BoW)字典字典的结构实践&#xff1a;创建字典相似度的计算理论部分实践&#xff1a;相似度计算相似性评分的处理关键帧的处理检测之后的验证词袋模型(BoW) 确定BoW的单词&#xff0c;从而组成字典。确定一副图像中出现了哪些在字典中定义的概念&am…...

大丰做网站/发帖效果好的网站

一、读音不同coaching&#xff1a;英 [ˈkəʊtʃɪŋ] 美 [ˈkoʊtʃɪŋ]mentoring&#xff1a;英 [ˈmentɔ:(r)ɪŋ] 美 [mentɔ:rɪŋ]二、意思不完全同coaching 在中文里多称“教练”&#xff0c;是指导他人为了某个特定的目标而制定计划&#xff0c;并鼓励学员有创意…...