C++实现通讯录管理系统
通讯录是一个可以记录亲人、好友信息的工具,本博客借助黑马程序员的项目进行修改,利用C++实现一个通讯录管理系统,旨在复习C++的语法。
一、系统需求
系统需要实现的功能如下:
- 添加联系人∶向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
- 显示联系人:显示通讯录中所有联系人信息
- 添加联系人∶向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
- 显示联系人:显示通讯录中所有联系人信息
- 退出通讯录:退出当前使用的通讯录

二、菜单功能
1、封装函数显示该界面如void show/menu()
//菜单界面
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;
}
2、在main函数中调用封装好的函数
int main()
{
//菜单调用showMenu();system("pause");return 0;
}
三、退出功能
1、根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建
int main()
{
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;system("pause");return 0;break;}}system("pause");return 0;
}
2、当用户选择0时候,执行退出,选择其他先不做操作,也不会退出程序
case 0://退出通讯录cout << "欢迎下次使用" << endl;system("pause");return 0;break;
四、结构体设计
添加联系人实现步骤
1、设计联系人结构体
#include <iostream>
using namespace std;//设计联系人结构体
struct Person
{//姓名string m_Name;//性别 1 男 2 女int m_Sex;//年龄int m_Age;//电话string m_Phone;//住址string m_Addr;
};system("pause");return 0;
}
2、设计通讯录结构体
#define MAX 1000//设计通讯录结构体
struct Addressbooks
{//通讯录中保存的联系人数组struct Person personArray[MAX];//通讯录中当前记录联系人个数int m_Size;};
3、main函数中创建通讯录
//创建通讯录结构体变量Addressbooks abs;//初始化通讯录中当前人员个数abs.m_Size = 0;
4、封装添加联系人函数
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){//如果输入的是1 或者2可以退出训话,因为输入的是正确值//如果输入有误,重新输入cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->m_Size].m_Sex = sex;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;system("pause");//请按任意键继续system("cls");//清屏操作}
}
5、测试添加联系人功能
五、显示联系人
判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息
1、封装显示联系人函数
//2、显示所有联系人
void showPerson(Addressbooks * abs)
{//判断通讯录中人数是否为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;}}system("pause");//按任意键继续system("cls");//清屏
}
2、测试显示联系人功能
六、删除联系人
删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1
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
}
2、封装删除联系人函数
根据用户输入的联系人判断该通讯录中是否有此人查找到进行瑚除,并提示册除成功;查不到提示查无此人
//3、删除指定联系人
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 = 0; i < abs->m_Size; i++){//数据前移abs->personArray[i] = abs->personArray[i + 1];}abs->m_Size--;//更新通讯录中的人员数cout << "删除成功" << endl;}else{cout << "查无此人" << endl;}system("pause");system("cls");}
3、测试册除联系人功能
case 3://删除联系人{cout << "请输入删除联系人姓名:" << endl;string name;cin >> name;if (isExist(&abs, name) == -1){cout << "查无此人" << endl;}else{cout << "找到此人" << endl;}}
七、查找联系人
功能描述:按照姓名查看指定联系人信息
查找联系人实现步骤
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;}//任意键按下后 清屏system("pause");system("cls");
}
2、测试查找指定联系人
七、查找联系人
功能描述:按照姓名重新修改指定联系人修改联系人实现步骤
封装修改联系人函数测试修改联系人功能
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 << "输入有误,请重新输入" << endl;}//年龄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;}//按任意键后清屏system("pause");system("cls");
}
2、测试修改联系人功能
八、清空通讯录
清空通讯录中所有信息清空联系人实现步骤
1、封装清空联系人函教
将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可
对用户清空前进行确认操作,确认则清空,否则返回上一级
//6、清空所有联系人
void cleanPerson(Addressbooks * abs)
{cout << "您确认要删除所有联系人吗?" << endl;cout << "1 --- 确认" << endl;cout << "2 --- 返回" << endl;int num = 0;cin >> num;if (num == 1){abs->m_Size = 0;//将当前记录联系人数量置为0,做逻辑清空操作cout << "通讯录已清空" << endl;//按任意键后清屏system("pause");system("cls");}else {system("cls");}
}
2、测试清空联系人
九、总结
全部代码实现:
#include <iostream>
using namespace std;
#define MAX 1000//设计联系人结构体
struct Person
{//姓名string m_Name;//性别 1 男 2 女int m_Sex;//年龄int m_Age;//电话string m_Phone;//住址string m_Addr;
};
//设计通讯录结构体
struct Addressbooks
{//通讯录中保存的联系人数组struct Person personArray[MAX];//通讯录中当前记录联系人个数int m_Size;};//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){//如果输入的是1 或者2可以退出训话,因为输入的是正确值//如果输入有误,重新输入cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->m_Size].m_Sex = sex;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;system("pause");//请按任意键继续system("cls");//清屏操作}
}//2、显示所有联系人
void showPerson(Addressbooks * abs)
{//判断通讯录中人数是否为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;}}system("pause");//按任意键继续system("cls");//清屏
}//检测联系人是否存在,如果存在,返回联系人所在数组中的具体位置,不存在返回-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、删除指定联系人
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 = 0; i < abs->m_Size; i++){//数据前移abs->personArray[i] = abs->personArray[i + 1];}abs->m_Size--;//更新通讯录中的人员数cout << "删除成功" << endl;}else{cout << "查无此人" << endl;}system("pause");system("cls");}//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;}//任意键按下后 清屏system("pause");system("cls");
}//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 << "输入有误,请重新输入" << endl;}//年龄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;}//按任意键后清屏system("pause");system("cls");
}//6、清空所有联系人
void cleanPerson(Addressbooks * abs)
{cout << "您确认要删除所有联系人吗?" << endl;cout << "1 --- 确认" << endl;cout << "2 --- 返回" << endl;int num = 0;cin >> num;if (num == 1){abs->m_Size = 0;//将当前记录联系人数量置为0,做逻辑清空操作cout << "通讯录已清空" << endl;//按任意键后清屏system("pause");system("cls");}else {system("cls");}
}//菜单界面
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()
{//创建通讯录结构体变量Addressbooks abs;//初始化通讯录中当前人员个数abs.m_Size = 0;int select = 0;//创建用户选择输入的变量while (true){//菜单调用showMenu();cin >> select;switch (select){case 1://添加联系人addPerson(&abs);//利用地址传递,可以修饰实参break;case 2://显示联系人showPerson(&abs);break;case 3://删除联系人//{// cout << "请输入删除联系人姓名:" << endl;// string name;// cin >> name;// if (isExist(&abs, name) == -1)// {// cout << "查无此人" << endl;// }// else// {// cout << "找到此人" << endl;// }//}deletePerson(&abs);break;case 4://查找联系人findPerson(&abs);break;case 5://修改联系人modifyPerson(&abs);break;case 6://清空联系人cleanPerson(&abs);break;case 0://退出通讯录cout << "欢迎下次使用" << endl;system("pause");return 0;break;}}system("pause");return 0;
}
本次实践的通讯录管理系统熟悉了结构体和指针的使用,更加熟悉C++语法
相关文章:
C++实现通讯录管理系统
通讯录是一个可以记录亲人、好友信息的工具,本博客借助黑马程序员的项目进行修改,利用C实现一个通讯录管理系统,旨在复习C的语法。 一、系统需求 系统需要实现的功能如下: 添加联系人∶向通讯录中添加新人,信息包括…...
开关电源Y电容放置的位置
Y电容,是我们工程师做开关电源设计时都要接触到的一个非常关键的元器件,它对EMI的贡献是相当的大的,但是它是一个较难把控的元器件,原理上并没有那么直观易懂,在EMI传播路径中需要联系到很多的寄生参数才能够去分析。 …...
二叉树的最小深度——递归法、迭代法
1题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root [3,9,20,null,null,15,7]输出:2示例 2:输入&…...
Vue中常使用的三种刷新页面的方式
一、通过js原始方法刷新 缺点: 出现闪白 目录 一、通过js原始方法刷新 二、通过Vue自带的路由进行跳转 三、通过在APP页面进行demo进行刷新(推荐) 1.vue2写法 2. vue3.2写法 <template><div><div class"header"><button clic…...
【Shell】脚本
Shell脚本脚本格式第一个Shell脚本:hello.sh脚本常用执行方式1. bash或sh脚本的相对路径或绝对路径2. 输入脚本的绝对路径或相对路径3. 在脚本的路径前加上.或者source脚本格式 脚本以#!/bin/bash开头(指定解析器) #! 是一个约定的标记&…...
Mybatis的多表操作
1.Mybatis多表查询 1.1一对一查询 1.一对一查询的模型 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户2.创建Order和User实体public class…...
【JVM】字节码指令全解
文章目录 入门案例原始 java 代码编译后的字节码文件常量池载入运行时常量池方法字节码载入方法区main 线程开始运行,分配栈帧内存执行引擎开始执行字节码bipush 10istore_1ldc #3istore_2iload_1iload_2iaddistore_3getstatic #4iload_3invokevirtual #5return条件判断指令循…...
【精品】华为认证数通HCIA+HCIP题库分享(含答案解析)
嗨~大家好久不见,我是薄荷学姐,随着华为业务也全球领域的迅猛发展,越来越多人开始重视华为认证的重要性。今天给大家分享一下去年8月份的题库,基本都是一样,希望可以帮助到大家哈想要通过华为认证,除了进行…...
Qt cmake 资源文件的加载
Qt cmake 资源文件的加载概述qt_add_resourcesqt5_add_resourcesqt6_add_resources是否需要加载qrc文件需要加载qrc的情况不需要加载qrc的情况C 代码加载示例加载PNG加载CSS文件加载qrc文件Qt6相对于Qt5的一些变化Qt6和Qt5在加载资源文件方面的区别主要集中在两个方面ÿ…...
【链表OJ题(九)】环形链表延伸问题以及相关OJ题
环形链表OJ题 1. 环形链表 链接:141. 环形链表 描述: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环&…...
【C++初阶】四、类和对象(下)
文章目录一、再谈构造函数构造函数体赋值初始化列表explicit关键字二、Static成员引入- 计算类中创建了多少个类对象概念特性静态成员函数的访问三、友元友元函数友元类四、内部类五、匿名对象六、拷贝对象时的一些编译器优化一、再谈构造函数 构造函数体赋值 在创建对象时&a…...
IDEA maven没有Import Maven projects automatically解决办法
去年装了个 IDEA2022版本 配置maven时我才发现是个大坑 他没有import Maven projects automatically配置项 当时看到我人都麻了 然后项目呢 用了依赖 这东西还不会自动下依赖 整的我那是相当难受 还在最后还是找到了解决办法 我们在配置文件上点击右键 然后鼠标选择如下图选项…...
Java实习生------MySQL10道面试题打卡
今日语录:“没有执行力,就没有竞争力 ”🌹 参考资料:图解MySQL、MySQL面试题 1、事务有哪些特性? 原子性: 一个事务中的所有操作,要么全部完成,要么全部不完成,不会出现…...
帆软报表设计器 数据集之数据库查询
当点击数据库查询时,调用TableDataTreePane的 public void actionPerformed(ActionEvent var1) {TableDataTreePane.this.dgEdit(this.getTableDataInstance().creatTableDataPane(), TableDataTreePane.this.createDsName(this.getNamePrefix()), false);} 然后调用TableDat…...
CSDN 第三十七期竞赛题解
很少有时间来玩玩题目,上一次因为环境极为嘈杂的原因在时间上没有进入前十,挺遗憾的。 在 CSDN 参加的第一次没出锅的比赛。 大概只有最后一题值得好好讲讲。 T1:幼稚班作业 幼稚园终于又有新的作业了。 老师安排同学用发给同学的4根木棒拼接…...
Vue实战【常用的Vue小魔法】
目录🌟前言🌟能让你首次加载更快的路由懒加载,怎么能忘?🌟你是否还记得有一个叫Object.freeze的方法?🌟异步组件那么强,你是不是没用过?🌟你是不是还在comput…...
用C跑爬虫
爬虫自指定的URL地址开始下载网络资源,直到该地址和所有子地址的指定资源都下载完毕为止。 下面开始逐步分析爬虫的实现。 待下载集合与已下载集合 为了保存需要下载的URL,同时防止重复下载,我们需要分别用了两个集合来存放将要下载的URL和…...
【C语言】你真的了解结构体吗
引言✨我们知道C语言中存在着整形(int、short...),字符型(char),浮点型(float、double)等等内置类型,但是有时候,这些内置类型并不能解决我们的需求,因为我们无法用这些单一的内置类型来描述一些复杂的对象,…...
血氧仪是如何得出血氧饱和度值的?
目录 一、血氧饱和度概念 二、血氧饱和度监测意义 三、血氧饱和度的监测方式 四、容积脉搏波计算血氧饱和度原理 五、容积脉搏波波形的测量电路方案 1)光源和光电探测器的集成测量模块:SFH7050—反射式 2)模拟前端 六、市面上血氧仪类型…...
Java全栈知识(3)接口和抽象类
1、抽象类 抽象类就是由abstract修饰的类,其中没有只声明没有实现的方法就是抽象方法,抽象类中可以有0个或者多个抽象方法。 1.1、抽象类的语法 抽象类不能被final修饰 因为抽象类是一种类似于工程中未完成的中间件。需要有子类进行继承完善其功能,所…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
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 …...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
