通讯录(C++实现)

news2024/11/25 7:03:35

系统需求

通讯录是一个可以记录亲人、好友信息的工具。

本章主要利用C++来实现一个通讯录管理系统

系统中需要实现的功能如下:

添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人

显示联系人:显示通讯录中所有联系人信息

删除联系人:按照姓名进行删除指定联系人

查找联系人:按照姓名查看指定联系人信息

修改联系人:按照姓名重新修改指定联系人

清空联系人:清空通讯录中所有信息

退出通讯录:退出当前使用的通讯录

菜单功能

功能描述:用户选择功能的界面

菜单界面效果如下图:

写成代码不难,就是利用“cout”打印

步骤:

  1. 封装函数显示该界面如void showMenu()

  1. 在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;
}

然后我们在把“showMenu”写到主函数“main”里调用就行了。

退出功能

我们先来实现退出功能(因为它最简单)。但是在此之前我们要给用户做选择,而说到选择自然而然地离不开“switch”函数。

我们实现通讯录,不希望只是实现一次就完了,那么不可避免的要用“while”。

写成代码就是这样:

int main()
{
    //创建结构体变量
    Addressbooks abs;

    //初始化结构体1
    abs.m_Size = 0;

    while (true)
    {
        //菜单调用
        showMenu();
        //输入变量
        int select = 0;
        //用户选择
        cout << "用户请选择:" << endl;
        cin >> select;

        switch (select)
        {
        case 1://添加联系人
        {
            AddPerson(&abs);
            break;
        }
        case 2://显示联系人
        {
            showPerson(&abs);
            break;
        }
        case 3://删除联系人
        {
            deletePerson(&abs);
            break;
        }
        break;
        case 4://查找联系人
        {
            findPerson(&abs);
            break;
        }
        case 5://修改联系人
        {
            modifyPerson(&abs);
            break;
        }
        case 6://清空联系人
            cleanPerson(&abs);
            break;
        case 0://退出通讯录
        {
            break;
        }
        default:
            break;
        }
    }
    system("pause");
    return 0;
}

我们接下来看一下退出功能的具体实现。

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择0时候,执行退出,选择其他先不做操作,也不会退出程序

写成代码:

case 0://退出通讯录
        {
            cout << "欢迎下次使用" << endl;
            system("pause");
            return 0;
            break;
        }

设计联系人结构体

联系人信息包括:姓名、性别、年龄、联系电话、家庭住址

设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量

//联系人结构体
struct Person
{
    string m_Name;
    int m_Sex;
    int m_Age;
    string m_Phone;
    string m_Addr;
};
//通讯录结构体
#define MAX 1000//最大人数

struct Addressbooks
{
    Person PersonArray[MAX];
    int m_Size;//当前结构体人数的个数
};

添加联系人

功能描述:

实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)

添加联系人实现步骤:

  • 设计联系人结构体

  • 设计通讯录结构体

  • main函数中创建通讯录

  • 封装添加联系人函数

  • 测试添加联系人功能

将思路转换为代码就是:

//添加联系人
void AddPerson(Addressbooks* abs)
{
    //判断是否满了
    if (abs->m_Size == MAX)
    {
        cout << "通讯录已满" << endl;
        return;
    }

    string name;
    cout << "请输入姓名:" << endl;
    cin >> name;
    abs->PersonArray[abs->m_Size].m_Name = name;

    int sex = 0;
    cout << "请输入性别:" << endl;
    cout << "1、男  2、女" << endl;
    while (true)
    {
        cin >> sex;
        if (sex == 1 || sex == 2)
        {
            abs->PersonArray[abs->m_Size].m_Sex = sex;
            break;
        }
        else
        {
            cout << "输入错误,请重新输入" << endl;
            continue;
        }
    }

    cout << "请输入年龄:" << endl;
    int age = 0;
    cin >> age;
    abs->PersonArray[abs->m_Size].m_Age = age;

    cout << "请输入电话号码:" << endl;
    string phone = "0";
    cin >> phone;
    abs->PersonArray[abs->m_Size].m_Phone = phone;

    cout << "请输入家庭地址:" << endl;
    string addr = "0";
    cin >> addr;
    abs->PersonArray[abs->m_Size].m_Addr = addr;

    //更新通讯录中的人数
    abs->m_Size++;

    cout << "添加成功" << endl;

    system("pause");
    system("cls");
}

system("pause"):按任意键继续

system("cls"):清屏操作

注意:cls 是windows下的,Linux下是clear

显示联系人

功能描述:显示通讯录中已有的联系人信息

显示联系人实现步骤:

  • 封装显示联系人函数

  • 测试显示联系人功能

封装显示联系人函数

思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息

//显示联系人
void showPerson(Addressbooks* abs)
{
    //判断
    if (abs->m_Size == 0)
    {
        cout << "当前通讯录未添加人\n";
    }
    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

封装删除联系人函数

根据用户输入的联系人判断该通讯录中是否有此人

查找到进行删除,并提示删除成功

查不到提示查无此人。

我们先来做一个查找函数

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;
    system("pause");
    system("cls");
}

试验一下,判断能否查找到人

//实验一下
            cout << "请输入要查找的人:" << endl;
            string name = "0";
            cin >> name;
            if (isExist(&abs, name) == -1)
            {
              cout << "查无此人" << endl;
            }
            else
            {
                cout << "找到此人" << endl;
            }
        }

删除函数的实现:

void deletePerson(Addressbooks* abs)
{ 
    cout << "请输入要删除的人:" << endl;
    string name;
    cin >> name;
    //是否存在
    int ret = isExist(abs, name);
    if (ret == -1)
    {
        cout << "查无此人" << endl;
        return;
    }
    else
    {
        for (int i = ret; i < abs->m_Size; i++)
        {
            abs->PersonArray[i] = abs->PersonArray[i + 1];
        }

        abs->m_Size--;
        cout << "删除成功\n";
        system("pause");
        system("cls");
    }
}

查找联系人

功能描述:按照姓名查看指定联系人信息

查找联系人实现步骤

  • 封装查找联系人函数

  • 测试查找指定联系人

封装查找联系人函数

实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人。

void findPerson(Addressbooks* abs)
{
    cout << "请输入要查找的人:" << endl;
    string name;
    cin >> name;
    int i = isExist(abs, name);
    if (i == -1)
    {
        cout << "查无此人" << endl;
    }
    else
    {
        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");
}

修改联系人

功能描述:按照姓名重新修改指定联系人

修改联系人实现步骤:

  • 封装修改联系人函数

  • 测试修改联系人功能

封装修改联系人函数

实现思路:查找用户输入的联系人,如果查找成功进行修改操作查找失败提示查无此人

void modifyPerson(Addressbooks* abs)
{
    cout << "请输入要修改的人:" << endl;
    string name;
    cin >> name;
    int i = isExist(abs, name);

    if (i == -1)
    {
        cout << "查无此人" << endl;
    }
    else
    {
        cout << "请输入姓名:" << endl;
        cin >> name;
        abs->PersonArray[i].m_Name = name;

        int sex = 0;
        cout << "请输入性别:" << endl;
        cout << "1、男  2、女" << endl;
        while (true)
        {
            cin >> sex;
            if (sex == 1 || sex == 2)
            {
                abs->PersonArray[i].m_Sex = sex;
                break;
            }
            else
            {
                cout << "输入错误,请重新输入" << endl;
                continue;
            }
        }

        cout << "请输入年龄:" << endl;
        int age = 0;
        cin >> age;
        abs->PersonArray[i].m_Age = age;

        cout << "请输入电话号码:" << endl;
        string phone = "0";
        cin >> phone;
        abs->PersonArray[i].m_Phone = phone;

        cout << "请输入家庭地址:" << endl;
        string addr = "0";
        cin >> addr;
        abs->PersonArray[i].m_Addr = addr;

        system("pause");
        system("cls");
    }
}

清空联系人

功能描述:清空通讯录中所有信息

清空联系人实现步骤

封装清空联系人函数

测试清空联系人

封装清空联系人函数

实现思路:将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可。清空联系人代码:

void cleanPerson(Addressbooks* abs)
{
    abs->m_Size = 0;
    cout << "清除成功" << endl;
    system("pause");
    system("cls");
}

整体代码

为了避免大家更好的测试代码,我将整个代码复制下来,以便于小伙伴们对照学习。

#include<iostream>
#include<string>
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;
}
//联系人结构体
struct Person
{
    string m_Name;
    int m_Sex;
    int m_Age;
    string m_Phone;
    string m_Addr;
};
//通讯录结构体
#define MAX 1000//最大人数

struct Addressbooks
{
    Person PersonArray[MAX];
    int m_Size;//当前结构体人数的个数
};

//添加联系人
void AddPerson(Addressbooks* abs)
{
    //判断是否满了
    if (abs->m_Size == MAX)
    {
        cout << "通讯录已满" << endl;
        return;
    }

    string name;
    cout << "请输入姓名:" << endl;
    cin >> name;
    abs->PersonArray[abs->m_Size].m_Name = name;

    int sex = 0;
    cout << "请输入性别:" << endl;
    cout << "1、男  2、女" << endl;
    while (true)
    {
        cin >> sex;
        if (sex == 1 || sex == 2)
        {
            abs->PersonArray[abs->m_Size].m_Sex = sex;
            break;
        }
        else
        {
            cout << "输入错误,请重新输入" << endl;
            continue;
        }
    }

    cout << "请输入年龄:" << endl;
    int age = 0;
    cin >> age;
    abs->PersonArray[abs->m_Size].m_Age = age;

    cout << "请输入电话号码:" << endl;
    string phone = "0";
    cin >> phone;
    abs->PersonArray[abs->m_Size].m_Phone = phone;

    cout << "请输入家庭地址:" << endl;
    string addr = "0";
    cin >> addr;
    abs->PersonArray[abs->m_Size].m_Addr = addr;

    //更新通讯录中的人数
    abs->m_Size++;

    cout << "添加成功" << endl;

    system("pause");
    system("cls");
}
//显示联系人
void showPerson(Addressbooks* abs)
{
    //判断
    if (abs->m_Size == 0)
    {
        cout << "当前通讯录未添加人\n";
    }
    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");
}

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;
    system("pause");
    system("cls");
}

void findPerson(Addressbooks* abs)
{
    cout << "请输入要查找的人:" << endl;
    string name;
    cin >> name;
    int i = isExist(abs, name);
    if (i == -1)
    {
        cout << "查无此人" << endl;
    }
    else
    {
        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");
}

void modifyPerson(Addressbooks* abs)
{
    cout << "请输入要修改的人:" << endl;
    string name;
    cin >> name;
    int i = isExist(abs, name);

    if (i == -1)
    {
        cout << "查无此人" << endl;
    }
    else
    {
        cout << "请输入姓名:" << endl;
        cin >> name;
        abs->PersonArray[i].m_Name = name;

        int sex = 0;
        cout << "请输入性别:" << endl;
        cout << "1、男  2、女" << endl;
        while (true)
        {
            cin >> sex;
            if (sex == 1 || sex == 2)
            {
                abs->PersonArray[i].m_Sex = sex;
                break;
            }
            else
            {
                cout << "输入错误,请重新输入" << endl;
                continue;
            }
        }

        cout << "请输入年龄:" << endl;
        int age = 0;
        cin >> age;
        abs->PersonArray[i].m_Age = age;

        cout << "请输入电话号码:" << endl;
        string phone = "0";
        cin >> phone;
        abs->PersonArray[i].m_Phone = phone;

        cout << "请输入家庭地址:" << endl;
        string addr = "0";
        cin >> addr;
        abs->PersonArray[i].m_Addr = addr;

        system("pause");
        system("cls");
    }

}

void deletePerson(Addressbooks* abs)
{ 
    cout << "请输入要删除的人:" << endl;
    string name;
    cin >> name;
    //是否存在
    int ret = isExist(abs, name);
    if (ret == -1)
    {
        cout << "查无此人" << endl;
        return;
    }
    else
    {
        for (int i = ret; i < abs->m_Size; i++)
        {
            abs->PersonArray[i] = abs->PersonArray[i + 1];
        }

        abs->m_Size--;
        cout << "删除成功\n";
        system("pause");
        system("cls");
    }
}

void cleanPerson(Addressbooks* abs)
{
    abs->m_Size = 0;
    cout << "清除成功" << endl;
    system("pause");
    system("cls");
}


int main()
{
    //创建结构体变量
    Addressbooks abs;

    //初始化结构体1
    abs.m_Size = 0;

    while (true)
    {
        //菜单调用
        showMenu();
        //输入变量
        int select = 0;
        //用户选择
        cout << "用户请选择:" << endl;
        cin >> select;

        switch (select)
        {
        case 1://添加联系人
        {
            AddPerson(&abs);
            break;
        }
        case 2://显示联系人
        {
            showPerson(&abs);
            break;
        }
        case 3://删除联系人
        {
            deletePerson(&abs);
            break;
        }
        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;
        }
        default:
            break;
        }
    }
    system("pause");
    return 0;
}

总结

我们利用了C++基础知识完成了通讯录,大家在对照学习过程中可以很好的发现自己在哪方面的语法有什么不足点。如果大家能够理解通讯录了,说明大家在初学C++上迈出了重要的一步。希望大家能够有所收获,而不是仅仅只是复制了代码。

最后恭喜大家!正式迈入C++世界的大门。

欢迎大家点赞收藏!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401463.html

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

相关文章

【006】Redis主从/哨兵/分片集群Docker搭建

项目源码合集 https://gitee.com/qiuyusy/small-project-study 搭建过程疯狂踩坑,记录一下希望各位少走弯路 目录主从搭建配置文件redis.conf运行容器测试优化哨兵集群配置文件运行容器测试代码读写分离分片集群mkdir -p /opt/docker/redis_study/redis_0/conf mkdir -p /opt/…

藏经阁(五)温湿度传感器 SHT3x-DIS 手册 解析

文章目录芯片特性芯片内部框图芯片引脚定义芯片温湿度范围芯片寄存器以及时序讲解信号转换公式芯片特性 湿度和温度传感器完全校准&#xff0c;线性化温度补偿数字输出供电电压范围宽&#xff0c;从2.4 V到5.5 VI2C接口通讯速度可达1MHz和两个用户可选地址典型精度 2% RH和 0.…

Python 二分查找:bisect库的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

优先级队列详解

目录优先级队列简介关于堆为什么得用完全二叉树用堆来实现优先级队列插入/删除/获取优先级最高的元素模拟实现使用PriorityQueue的注意事项PriorityQueue常用接口优先级队列的构造方法优先级队列简介 PriorityQueue&#xff0c;即优先级队列。它可以保证每次出出来的数据是队列…

探究:kafka生产者/消费者与多线程安全

目录 1. 多线程安全 1.1. 生产者是多线程安全的么&#xff1f; 1.1. 消费者是多线程安全的么&#xff1f; 2. 消费者规避多线程安全方案 2.1. 每个线程维护一个kafkaConsumer 2.2. [单/多]kafkaConsumer实例 多worker线程 2.3.方案优缺点对比 1. 多线程安全 1.1. 生产…

我的Git stash不小心清空了怎么办,提了代码能反悔吗

文章目录1. 前言2. git stash清空场景2. git stash clear后如何还原3.Git撤销已经推送(push)至远端仓库的信息1. 前言 本文总结的知识很实用哈&#xff0c;虽然是git工具的不常用操作&#xff0c;但是绝对不是冷知识&#xff0c;学会可以从会用git升级到git高手。 主要是两种场…

Centos7 安装Mysql8.0

1、到指定目录下下载安装包[rootVM-0-14-centos ~]# cd /usr/local/src2、下载mysql8[rootVM-0-14-centos src]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz3、解压mysql8, 通过xz命令解压出tar包&#xff0c; 然后通过t…

KDZD耐电压高压击穿强度测试仪

一、技术参数 01、输入电压&#xff1a; 交流 220 V。 02、输出电压&#xff1a; 交流 0--50KV ; 直流 0—50kv 。 03、电器容量&#xff1a;3KVA。 04、高压分级&#xff1a;0—50KV&#xff0c;&#xff08;全程可调&#xff09;。 05、升压速率&#xff1a;0.1KV/s-…

c++11 标准模板(STL)(std::unordered_map)(八)

定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…

【C++】你不得不爱的——继承

凡是面向对象的语言&#xff0c;都有三大特性&#xff0c;继承&#xff0c;封装和多态&#xff0c;但并不是只有这三个特性&#xff0c;是因为者三个特性是最重要的特性&#xff0c;那今天我们一起来看继承&#xff01; 目录 1.继承的概念及定义 1.概念 2.继承的定义 2.基类…

Linux进程学习【进程地址】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…

Dynabook笔记本电脑无法开机怎么重装新系统?

Dynabook笔记本电脑无法开机怎么重装新系统&#xff1f;有用户使用Dynabook笔记本电脑出现了无法正常开机的情况。遇到这样的问题是我们的电脑系统出现了损坏&#xff0c;可以尝试进行系统修复。如果无法修复的话&#xff0c;就需要进行系统重装了。以下为大家带来Dynabook笔记…

SQLMap安装教程

注意&#xff1a;在python3环境下安装sqlmap的时候会提示需要在python2的环境下才能安装&#xff0c;其实在python3.6以后也都支持sqlmap了。 sqlmap安装步骤&#xff1a; 一、下载python&#xff1b; 下载地址 https://www.python.org/downloads/ 下载教程参考&#xff08…

通过反射获取注解的属性值(内含源代码)

通过反射获取注解的属性值&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87554543 目录通过反射获取注解的属性值&#xff08;内含源代码&#xff09;源代码下载链接地址&#xff1a;[https://downl…

做互联网自媒体创业的月薪收入真的能过万吗?

搞自媒体创业有前途吗&#xff1f;收入月薪过万是真的吗&#xff1f; 自媒体创业是一种新兴的创业方法&#xff0c;它的远景十分广阔。自媒体创业能够让人们在自己的兴趣爱好和专业范畴上发挥自己的才能&#xff0c;一起也能够获得不错的收入。可是&#xff0c;月薪过万并不是…

ArangoDB——AQL编辑器

AQL 编辑器 ArangoDB 的查询语言称为 AQL。AQL与关系数据库管理系统 (RDBMS)区别在于其更像一种编程语言&#xff0c;更自然地适合无模式模型&#xff0c;并使查询语言非常强大&#xff0c;同时保持易于读写。数据建模概念 数据库是集合的集合。集合存储记录&#xff0c;称为文…

三维人脸实践:基于Face3D的人脸生成、渲染与三维重建 <三>

face3d: Python tools for processing 3D face git code: https://github.com/yfeng95/face3d paper list: PaperWithCode 基于BFM模型&#xff0c;估计3DMM的参数&#xff0c;可以实现线性的人脸表征&#xff0c;该方法可用于基于关键点的人脸生成、位姿检测以及渲染等。推荐…

信息收集之搜索引擎

Google Hacking 也可以用百度&#xff0c;不过谷歌的搜索引擎更强大 site 功能&#xff1a;搜索指定域名的网页内容&#xff0c;可以用来搜索子域名、跟此域名相关的内容 示例&#xff1a; site:zhihu.com 搜索跟zhihu.com相关的网页“web安全” site:zhihu.com 搜索zhihu…

提升学习 Prompt 总结

NLP现有的四个阶段&#xff1a; 完全有监督机器学习完全有监督深度学习预训练&#xff1a;预训练 -> 微调 -> 预测提示学习&#xff1a;预训练 -> 提示 -> 预测 阶段1&#xff0c;word的本质是特征&#xff0c;即特征的选取、衍生、侧重上的针对性工程。 阶段2&…

C++核心编程

一、内存分区模型概述&#xff1a;C程序在执行时&#xff0c;将内存划分为4个区域程序运行前&#xff1a;代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统管理①共享。共享的目的是对于频繁被执行的程序&#xff0c;在内存中只需有一份代码即可②只读。使其只…