云原生——动态通讯录

简介: 云原生——动态通讯录
💎💎💎今天学习一个自制小项目——动态通讯录

在这里插入图片描述

一、效果展示

☀️☀️☀️我们可以实现纯C语言实现通讯录项目,效果如下

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、功能实现(详细版)

1.通讯录信息格式的初始化

#define DEFAULT_SZ 3
#define INC_SZ 2

#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX  10
#define MAX_TELE 12
#define MAX_ADDR 30


//定义一个人的信息
typedef struct peo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}peo;

typedef struct contact
{
    peo* data;//存放个人信息
    int count;//统计通讯录中实际人的个数
    int capacity;//统计通讯录容量
}contact;

2.通讯录初始化

int Initcontact(contact* con)
{
    assert(con);
    con->count = 0;
    con->data = (peo*)calloc(DEFAULT_SZ, sizeof(peo));
    if (con->data == NULL)
    {
        printf("Initcontact:%s", strerror(errno));
        return 1;
    }
    con->capacity = DEFAULT_SZ;
    return 0;
}

3.添加通讯录信息

void CheckCapacity(contact* con)
{
    if (con->count == con->capacity)
    {
        peo* ptr = (peo*)realloc(con->data, (con->capacity + INC_SZ) * sizeof(peo));
        if (ptr == NULL)
        {
            printf("Addcontact:%s", strerror(errno));
            return;
        }
        else
        {
            con->data = ptr;
            con->capacity += INC_SZ;
            printf("增容成功\n");
        }
    }
}
void Addcontact(contact* con)
{
    assert(con);
    //对通讯录进行增容
    CheckCapacity(con);
    //开始添加通讯录信息
    printf("请输入名字:>");
    scanf("%s", con->data[con->count].name);
    printf("请输入年龄:>");
    scanf("%d", &con->data[con->count].age);
    printf("请输入性别:>");
    scanf("%s", con->data[con->count].sex);
    printf("请输入电话;>");
    scanf("%s", con->data[con->count].tele);
    printf("请输入地址:>");
    scanf("%s", con->data[con->count].addr);
    con->count++;
    printf("增加成功\n");
}

4.删除通讯录信息

void Delcontact(contact* con)
{
    char name[MAX_NAME] = { 0 };
    assert(con);
    int i = 0;
    if (con->count == 0)
    {
        printf("没有信息可删除\n");
        return;
    }
    printf("请输入要删除的姓名:>");
    scanf("%s", name);
    //在通讯录里查找是否存在这个联系人
    int pos = Find_Name(con, name);
    if (pos == -1)
    {
        printf("要删除的人不存在\n");
        return;
    }
    //删除
    for (i = pos; i < con->count - 1; i++)
    {
        con->data[i] = con->data[i + 1];
    }
    con->count--;
    printf("删除成功\n");
}

5.修改通讯录信息

void Modifycontact(contact* con)
{
    assert(con);
    char name[MAX_NAME] = { 0 };
    printf("请输入要修改的姓名:>");
    scanf("%s", name);
    //查找
    int pos = Find_Name(con, name);
    if (pos == -1)
    {
        printf("要修改的人不存在\n");
        return;
    }
    printf("请开始修改\n");
    //修改
    printf("请输入名字:>");
    scanf("%s", con->data[pos].name);
    printf("请输入年龄:>");
    scanf("%d", &con->data[pos].age);
    printf("请输入性别:>");
    scanf("%s", con->data[pos].sex);
    printf("请输入电话;>");
    scanf("%s", con->data[pos].tele);
    printf("请输入地址:>");
    scanf("%s", con->data[pos].addr);
    printf("修改成功\n");
}

6.排序通讯录信息

int cmp_peo_name(const void* e1, const void* e2)
{
    return strcmp(((peo*)e1)->name, ((peo*)e2)->name);
}
void Sortcontact(contact* con)
{
    assert(con);
    qsort(con->data, con->count, sizeof(peo), cmp_peo_name);
    printf("排序成功\n");
}

7.查找通讯录信息

static int Find_Name(contact* con, char name[])
{
    assert(con);
    int i = 0;
    for (i = 0; i < con->count; i++)
    {
        if (strcmp(name, con->data[i].name) == 0)
            return i;
    }
    return -1;
}
void Searchcontact(contact* con)
{
    assert(con);
    char name[MAX_NAME] = { 0 };
    printf("请输入要查找人的信息:>");
    scanf("%s", name);
    //查找
    int pos = Find_Name(con, name);
    if (pos == -1)
    {
        printf("要查找的人不存在\n");
        return;
    }
    //打印
    printf("%20s\t%5s\t%5s\t%12s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "地址");
    int i = pos;
    printf("%20s\t%5d\t%5s\t%12s\t%15s\t\n", con->data[i].name, con->data[i].age, con->data[i]
        .sex, con->data[i].tele, con->data[i].addr);
}

8.显示通讯录所有信息

void Showcontact(contact* con)
{
    assert(con);
    printf("%20s\t%5s\t%5s\t%12s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "地址");
    int i = 0;
    for (i = 0; i < con->count; i++)
    {
        printf("%20s\t%5d\t%5s\t%12s\t%15s\t\n", con->data[i].name, con->data[i].age, con->data[i]
            .sex, con->data[i].tele, con->data[i].addr);
    }

}

9.释放通讯录动态空间

void Destroycontact(contact* con)
{
    assert(con);
    free(con->data);
    con->data = NULL;
}

三、test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

enum operation
{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    MODIFY,
    SHOW,
    SORT
};
void menu()
{
    printf("************************************\n");
    printf("*******  1.add      2.del    *******\n");
    printf("*******  3.search   4.modify *******\n");
    printf("*******  5.show     6.sort   *******\n");
    printf("*******  0.exit              *******\n");
    printf("************************************\n");

}
int main()
{
    int input = 0;
    contact con;//定义一个通讯录
    //初始化通讯录
    Initcontact(&con);
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case ADD:
            Addcontact(&con);
            break;
        case DEL:
            Delcontact(&con);
            break;
        case SEARCH:
            Searchcontact(&con);
            break;
        case MODIFY:
            Modifycontact(&con);
            break;
        case SHOW:
            Showcontact(&con);
            break;
        case SORT:
            Sortcontact(&con);
            break;
        case EXIT:
            Destroycontact(&con);
            printf("退出通讯录\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
    return 0;
}

四、contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

int Initcontact(contact* con)
{
    assert(con);
    con->count = 0;
    con->data = (peo*)calloc(DEFAULT_SZ, sizeof(peo));
    if (con->data == NULL)
    {
        printf("Initcontact:%s", strerror(errno));
        return 1;
    }
    con->capacity = DEFAULT_SZ;
    return 0;
}

void Destroycontact(contact* con)
{
    assert(con);
    free(con->data);
    con->data = NULL;
}

void CheckCapacity(contact* con)
{
    if (con->count == con->capacity)
    {
        peo* ptr = (peo*)realloc(con->data, (con->capacity + INC_SZ) * sizeof(peo));
        if (ptr == NULL)
        {
            printf("Addcontact:%s", strerror(errno));
            return;
        }
        else
        {
            con->data = ptr;
            con->capacity += INC_SZ;
            printf("增容成功\n");
        }
    }
}
void Addcontact(contact* con)
{
    assert(con);
    //对通讯录进行增容
    CheckCapacity(con);
    //开始添加通讯录信息
    printf("请输入名字:>");
    scanf("%s", con->data[con->count].name);
    printf("请输入年龄:>");
    scanf("%d", &con->data[con->count].age);
    printf("请输入性别:>");
    scanf("%s", con->data[con->count].sex);
    printf("请输入电话;>");
    scanf("%s", con->data[con->count].tele);
    printf("请输入地址:>");
    scanf("%s", con->data[con->count].addr);
    con->count++;
    printf("增加成功\n");
}


void Showcontact(contact* con)
{
    assert(con);
    printf("%20s\t%5s\t%5s\t%12s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "地址");
    int i = 0;
    for (i = 0; i < con->count; i++)
    {
        printf("%20s\t%5d\t%5s\t%12s\t%15s\t\n", con->data[i].name, con->data[i].age, con->data[i]
            .sex, con->data[i].tele, con->data[i].addr);
    }

}


static int Find_Name(contact* con, char name[])
{
    assert(con);
    int i = 0;
    for (i = 0; i < con->count; i++)
    {
        if (strcmp(name, con->data[i].name) == 0)
            return i;
    }
    return -1;
}
void Delcontact(contact* con)
{
    char name[MAX_NAME] = { 0 };
    assert(con);
    int i = 0;
    if (con->count == 0)
    {
        printf("没有信息可删除\n");
        return;
    }
    printf("请输入要删除的姓名:>");
    scanf("%s", name);
    //在通讯录里查找是否存在这个联系人
    int pos = Find_Name(con, name);
    if (pos == -1)
    {
        printf("要删除的人不存在\n");
        return;
    }
    //删除
    for (i = pos; i < con->count - 1; i++)
    {
        con->data[i] = con->data[i + 1];
    }
    con->count--;
    printf("删除成功\n");
}

void Searchcontact(contact* con)
{
    assert(con);
    char name[MAX_NAME] = { 0 };
    printf("请输入要查找人的信息:>");
    scanf("%s", name);
    //查找
    int pos = Find_Name(con, name);
    if (pos == -1)
    {
        printf("要查找的人不存在\n");
        return;
    }
    //打印
    printf("%20s\t%5s\t%5s\t%12s\t%15s\t\n", "姓名", "年龄", "性别", "电话", "地址");
    int i = pos;
    printf("%20s\t%5d\t%5s\t%12s\t%15s\t\n", con->data[i].name, con->data[i].age, con->data[i]
        .sex, con->data[i].tele, con->data[i].addr);
}

void Modifycontact(contact* con)
{
    assert(con);
    char name[MAX_NAME] = { 0 };
    printf("请输入要修改的姓名:>");
    scanf("%s", name);
    //查找
    int pos = Find_Name(con, name);
    if (pos == -1)
    {
        printf("要修改的人不存在\n");
        return;
    }
    printf("请开始修改\n");
    //修改
    printf("请输入名字:>");
    scanf("%s", con->data[pos].name);
    printf("请输入年龄:>");
    scanf("%d", &con->data[pos].age);
    printf("请输入性别:>");
    scanf("%s", con->data[pos].sex);
    printf("请输入电话;>");
    scanf("%s", con->data[pos].tele);
    printf("请输入地址:>");
    scanf("%s", con->data[pos].addr);
    printf("修改成功\n");
}
int cmp_peo_name(const void* e1, const void* e2)
{
    return strcmp(((peo*)e1)->name, ((peo*)e2)->name);
}
void Sortcontact(contact* con)
{
    assert(con);
    qsort(con->data, con->count, sizeof(peo), cmp_peo_name);
    printf("排序成功\n");
}

五、contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

#define DEFAULT_SZ 3
#define INC_SZ 2

#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX  10
#define MAX_TELE 12
#define MAX_ADDR 30


//定义一个人的信息
typedef struct peo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}peo;

typedef struct contact
{
    peo* data;//存放个人信息
    int count;//统计通讯录中实际人的个数
    int capacity;//统计通讯录容量
}contact;

//初始化通讯录
int Initcontact(contact*);

//增加通讯录信息
void Addcontact(contact*);

//删除通讯录信息
void Delcontact(contact*);

//显示通讯录信息
void Showcontact(contact*);

//查找通讯录信息
void Searchcontact(contact*);

//修改通讯录信息
void Modifycontact(contact*);

//按姓名排序通讯录信息
void Sortcontact(contact*);

//删除通讯录信息
void Destroycontact(contact*);

目录
相关文章
|
8月前
|
人工智能 监控 Cloud Native
阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态
阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态
|
8月前
|
运维 Cloud Native Devops
云原生技术的未来展望:构建动态且高效的应用生态系统
【5月更文挑战第25天】 在数字化转型的浪潮中,云原生技术以其独特的弹性、可扩展性和敏捷性成为推动企业IT架构现代化的关键动力。本文将深入探讨云原生的核心组件如容器化、微服务、持续集成/持续部署(CI/CD)和DevOps文化等,分析它们如何共同塑造一个高效、自动化的云计算环境。同时,文章也将对云原生技术未来可能的发展路径进行预测,并讨论如何利用这些技术来应对日益复杂的业务挑战。
|
8月前
|
运维 Cloud Native 持续交付
云原生架构的未来演进:打造更加动态和自动化的基础设施
【5月更文挑战第25天】 随着企业数字化转型的深入,云原生技术以其独特的弹性、敏捷性和自动化能力成为支撑现代应用的关键。本文将探讨云原生架构的最新发展趋势,重点分析其在提高运维效率、促进资源优化配置以及支持复杂业务场景中的作用。文章还将讨论如何通过持续集成、持续部署(CI/CD)流程,微服务架构和容器化技术,实现基础设施的自愈能力,从而推动企业向完全自动化的云原生未来迈进。
|
8月前
|
Cloud Native Devops 持续交付
云原生技术的未来:构建更加动态和可伸缩的系统
【5月更文挑战第30天】 在数字化转型的浪潮中,企业正迅速采用云原生技术来构建和部署应用程序。本文探讨了云原生生态系统的最新发展,并分析了如何利用这些技术实现系统的动态性和可伸缩性。我们将深入讨论容器化、微服务架构、持续集成/持续部署(CI/CD)等关键技术,并提出一个综合实践框架,帮助企业实现真正的云原生转型。
|
8月前
|
边缘计算 Cloud Native 持续交付
云原生技术的未来展望:构建更加动态和灵活的IT基础设施
【5月更文挑战第23天】 随着云计算的不断演进,云原生技术正成为推动企业数字化转型的关键驱动力。本文深入探讨了云原生的核心概念、关键技术以及在现代IT基础设施中实现敏捷性、可扩展性和弹性的重要性。通过分析容器化、微服务架构、持续集成和持续部署(CI/CD)等技术实践,文章揭示了如何利用云原生方法来优化资源利用率,加速开发周期,并确保系统的稳定性和安全性。此外,文中还提出了对未来云原生发展趋势的预测,包括无服务器计算、自动化运维和边缘计算的融合,为企业采纳云原生技术提供了战略性的视角。
|
存储 Cloud Native 安全
高性能存储SIG月度动态:受邀分享 erofs 云原生进展,io_uring 基线完成更新
高性能存储SIG月度动态:受邀分享 erofs 云原生进展,io_uring 基线完成更新
|
消息中间件 运维 Prometheus
阿里云蝉联 Forrester FaaS 领导者象限丨云原生 7 月产品技术动态
阿里云蝉联 Forrester FaaS 领导者象限丨云原生 7 月产品技术动态
|
人工智能 Prometheus Kubernetes
一键部署通义千问预体验丨阿里云云原生 5 月动态
一键部署通义千问预体验丨阿里云云原生 5 月动态
|
消息中间件 人工智能 Kubernetes
阿里云斩获 4 项年度云原生优秀案例丨阿里云云原生 6 月动态
阿里云斩获 4 项年度云原生优秀案例丨阿里云云原生 6 月动态
|
消息中间件 运维 Kubernetes
云原生月报丨值得开发者关注的最新动态
云原生月报丨值得开发者关注的最新动态
云原生月报丨值得开发者关注的最新动态