C语言实现简易通讯录1.0

C语言实现通讯录

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.清空所有联系人
7.以名字排序所有联系人
0.退出通讯录


前言

程序的实现需要进行分布进行,下面我们来一起进行通讯录的实现

把通讯录进行一步一步拆分,再进行代码的实现


正文开始

一、通讯录菜单的实现

程序与用户的交互,需要一个菜单来进行引导,所以我们第一步先实现菜单
需要把菜单的功能列举出来让用户可以进行下一步操作

void mean()//菜单的实现
{
    
    
    printf("*****************************************************************\n");
    printf("*********           1.add              2.del          ***********\n");
    printf("*********           3.seek             4.mod          ***********\n");
    printf("*********           5.show             6.empty        ***********\n");
    printf("*********           7.sort             0.exit         ***********\n");
    printf("*****************************************************************\n");
}

在这里插入图片描述


二、main函数实现

第二步我们对主函数进行实现

int main()
{
    
    
    //初始化通讯录
    ab content;                                        //定义结构体变量content
    Iniab(&content);                                //初始化通讯录,这里传参选择传地址过去
    int input = 0;
    do
    {
    
    
        mean();
        printf("请选择->");
        scanf("%d", &input);
        switch (input)
        {
    
    
        case EXIT:
            printf("退出通讯录\n");
            break;
        case ADD:
            addcontent(&content);                        //增加联系人函数
            break;
        case DEL:
            delcontent(&content);                        //删除联系人函数
            break;
        case SEEK:
            seekcontent(&content);                        //寻找联系人函数
            break;
        case MOD:
            modcontent(&content);                        //修改联系人函数
            break;
        case SHOW:
            showcontent(&content);                        //展示联系人函数
            break;
        case EMPTY:
            emptycontent(&content);                        //清空联系人信息
            break;
        case SORT:
            sortcontent(&content);                        //排序联系人信息
            break;
        }
    } while (input);
    return 0;
}

将所有需要实现的情况都放在main,方便自己可以逻辑清晰的编写代码

扫描二维码关注公众号,回复: 14495036 查看本文章

三、枚举选项

一开始我们就用数字来编辑了菜单的选项,在这里需要用到枚举来实现菜单的选项,与主函数中的case进行对应

enum mean
{
    
    
    EXIT,//0
    ADD,//1
    DEL,//2
    SEEK,//3
    MOD,//4
    SHOW,//5
    EMPTY,//6
    SORT//7
};

运用枚举是为了让代码逻辑更加简洁易懂,提高代码的可维护性


四、定义通讯录内容以及联系人内容

这里运用结构体来定义通讯录内容和联系人内容

typedef struct message
{
    
    
    char name[MAN_NAME];
    char sex[MAN_SEX];
    int age;
    char number[MAX_NUMBER];
    char address[MAX_ADDRESS];
}meaaage;
typedef struct PEOINF
{
    
    
    meaaage adta[MAX];                    //定义数组来存储1000个人的信息
    int sz;                                //定义变量来记录通讯录中有效信息个数
}ab;

五、对全局变量进行声明

我们需要对通讯录内的数据做一定的限制,这里需要对全局变量做一些声明

#define MAN_NAME 15                        //定义名字数组中字符元素个数
#define MAN_SEX 5                        //定义性别数组中字符元素个数
#define MAX_NUMBER 30                    //定义号码数组中字符元素个数
#define MAX_ADDRESS 30                    //定义地址数组中字符元素个数
#define MAX 1000                        //定义数组中元素个数

六、通讯录功能的实现

我们已经拥有一个简易的通讯录了,现在需要对前文列举的功能进行一一实现

1.初始化通讯录

首先我们需要实现通讯录的保存功能,我们需要实现通讯录的初始化功能

//初始化通讯录函数
void Iniab(ab* content)
{
    
    
    content->sz = 0;
    memset(content->adta, 0, sizeof(content->adta));
    return;
}

2.实现新增联系人(1.add)

//增加联系人函数
void addcontent(ab* content)
{
    
    
    assert(content);
    //在增加联系人之前要判断通讯录是否满了
    if (content->sz == MAX)                                                //通讯录满了
    {
    
    
        printf("通讯录满了\n");
        return;
    }
    //通讯录没满
    printf("请输入联系人姓名->");
    scanf("%s", content->adta[content->sz].name);
    printf("请输入联系人性别->");
    scanf("%s",content->adta[content->sz].sex);
    printf("请输入联系人年龄->");
    scanf("%d", &(content->adta[content->sz].age));
    printf("请输入联系人电话->");
    scanf("%s", content->adta[content->sz].number);
    printf("请输入联系人住址->");
    scanf("%s", content->adta[content->sz].address);
    printf("增加联系人成功\n");
    content->sz++;
    return;
}

在这里插入图片描述


3.实现删除联系人(2.del)

//删除联系人函数
void delcontent(ab* content)
{
    
    
    char name[MAN_NAME] = {
    
    0};
    assert(content);
    printf("请输入要删除的联系人姓名->");
    scanf("%s", name);
    int pos = Findbyname(content, name);                                //查找名字函数
    //在删除联系人之前先判断是否有该要删除的联系人
    if (pos == -1)
    {
    
    
        printf("没有找到要删除的联系人\n");
 
    }
    else
    {
    
    
        int i = 0;
        for (i = pos; i < content->sz; i++)
        {
    
    
            content->adta[i] = content->adta[i + 1];
        }
        content->sz--;
        printf("删除指定联系人成功\n");
    }
    return;
}

请添加图片描述


4.实现查找联系人(3.seek)

4.1.编写一个查找函数

为了使代码的可读性更高,功能更加齐全,我们需要编写一个通过姓名可以查找的功能

//查找名字函数
int Findbyname(ab* content, char name[])
{
    
    
    int i = 0;
    for (i = 0; i < content->sz; i++)
    {
    
    
        if (strcmp(name, content->adta[i].name) == 0)
        {
    
    
            return i;
        }
    }
    return -1;
}

4.2实现查找联系人

//查联系人信息函数
void information(ab* content, char name[])
{
    
    
        printf("请输入联系人姓名->");
        scanf("%s", name);
        int pos = Findbyname(content, name);                            //查找名字函数
        //判断是否有该联系人
        if (pos == -1)
        {
    
    
            printf("没有找到该联系人\n");
        }
        else
        {
    
    
            //查找到相应联系人,将联系人的信息展示出来
            int i = pos;
            printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
            printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
                content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
        }
}

在这里插入图片描述


5.实现修改联系人(4.mod)

//修改联系人信息函数
void modcontent(ab* content)
{
    
    
    assert(content);
    char name[MAN_NAME] = {
    
     0 };
    printf("请输入要修改信息的联系人姓名->");
    scanf("%s", name);
    //int i
    int pos = Findbyname(content, name);                                            //查找名字函数
    printf("请输入修改后的信息\n");
    printf("请输入联系人姓名->");
    scanf("%s", content->adta[pos].name);
    printf("请输入联系人性别->");
    scanf("%s", content->adta[pos].sex);
    printf("请输入联系人年龄->");
    scanf("%d", &(content->adta[pos].age));
    printf("请输入联系人电话->");
    scanf("%s", content->adta[pos].number);
    printf("请输入联系人住址->");
    scanf("%s", content->adta[pos].address);
    printf("修改信息联系人成功\n");
}

请添加图片描述


6.实现展示联系人(5.show)

//展示联系人函数
void showcontent(ab* content)
{
    
    
    //姓名、性别、年龄、电话、住址
    assert(content);
    int i = 0;
    printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
    for (i = 0; i < content->sz; i++)
    {
    
    
        printf("%-7s\t%-5s\t%-5d\t%-15s\t%-15s\n",
            content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
    }
    return;
}

请添加图片描述


7.实现清空联系人(6.empty)

//清空联系人函数
void emptycontent(ab* content)
{
    
    
    assert(content);
    char input = 0;
    printf("请确认是否要清空通讯录(Y/N)->");
    while ((getchar()) != '\n')
    {
    
    
        ;
    }
    if ((input = getchar()) == 'Y')
        Iniab(content);                                    //初始化函数——将通讯录全部初始化
    return;
}

在这里插入图片描述


8.实现排序联系人信息(7.sort)

//排序联系人信息函数
void sortcontent(ab* content)
{
    
    
    assert(content);
    //用qsort函数快速实现排序
    qsort(content->adta,content->sz,sizeof(content->adta[0]),int_cmp_name);
    int i = 0;
    printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
    for (i = 0; i < content->sz; i++)
    {
    
    
        printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
            content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
    }
    return;
}

请添加图片描述


9.代码总览

到这里简易通讯录1.0已经全部完成了,下面就是程序的源代码

9.1 function.h

#define MAN_NAME 15                        //定义名字数组中字符元素个数
#define MAN_SEX 5                        //定义性别数组中字符元素个数
#define MAX_NUMBER 30                    //定义号码数组中字符元素个数
#define MAX_ADDRESS 30                    //定义地址数组中字符元素个数
#define MAX 1000                        //定义数组中元素个数
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
typedef struct message
{
    
    
    char name[MAN_NAME];
    char sex[MAN_SEX];
    int age;
    char number[MAX_NUMBER];
    char address[MAX_ADDRESS];
}meaaage;
typedef struct PEOINF
{
    
    
    meaaage adta[MAX];                    //定义数组来存储1000个人的信息
    int sz;                                //定义变量来记录通讯录中有效信息个数
}ab;
 
//初始化通讯录
void Iniab(ab* content);                //初始化通讯录函数声明
 
//增加联系人信息
void addcontent(ab* content);            //增加联系人函数声明
 
//删除联系人信息
void delcontent(ab* content);            //删除联系人函数声明
 
//寻找联系人信息
void seekcontent(ab* content);            //寻找联系人函数声明
 
//修改联系人信息
void modcontent(ab* content);            //修改联系人函数声明
 
//展示联系人信息
void showcontent(ab* content);            //展示联系人函数声明
 
//清空联系人信息
void emptycontent(ab* content);            //清空联系人函数声明
 
//排序联系人信息
void sortcontent(ab* content);            //排序联系人信息函数声明

9.2 main.c

#include "function.h"
//实现通讯录:通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
//1.添加联系人信息
//2.删除指定联系人信息
//3.查找指定联系人信息
//4.修改指定联系人信息
//5.显示所有联系人信息
//6.清空所有联系人
//7.以名字排序所有联系人
enum mean
{
    
    
    EXIT,//0
    ADD,//1
    DEL,//2
    SEEK,//3
    MOD,//4
    SHOW,//5
    EMPTY,//6
    SORT//7
};
void mean()//菜单的实现
{
    
    
    printf("*****************************************************************\n");
    printf("*********           1.add              2.del          ***********\n");
    printf("*********           3.seek             4.mod          ***********\n");
    printf("*********           5.show             6.empty        ***********\n");
    printf("*********           7.sort             0.exit         ***********\n");
    printf("*****************************************************************\n");
}
int main()
{
    
    
    //初始化通讯录
    ab content;                                        //定义结构体变量content
    Iniab(&content);                                //初始化通讯录,这里传参选择传地址过去
    int input = 0;
    do
    {
    
    
        mean();
        printf("请选择->");
        scanf("%d", &input);
        switch (input)
        {
    
    
        case EXIT:
            printf("退出通讯录\n");
            break;
        case ADD:
            addcontent(&content);                        //增加联系人函数
            break;
        case DEL:
            delcontent(&content);                        //删除联系人函数
            break;
        case SEEK:
            seekcontent(&content);                        //寻找联系人函数
            break;
        case MOD:
            modcontent(&content);                        //修改联系人函数
            break;
        case SHOW:
            showcontent(&content);                        //展示联系人函数
            break;
        case EMPTY:
            emptycontent(&content);                        //清空联系人信息
            break;
        case SORT:
            sortcontent(&content);                        //排序联系人信息
            break;
        }
    } while (input);
    return 0;
}


9.3 function.c

#include "function.h"
 
//查找名字函数
int Findbyname(ab* content, char name[])
{
    
    
    int i = 0;
    for (i = 0; i < content->sz; i++)
    {
    
    
        if (strcmp(name, content->adta[i].name) == 0)
        {
    
    
            return i;
        }
    }
    return -1;
}
 
//查联系人信息函数
void information(ab* content, char name[])
{
    
    
        printf("请输入联系人姓名->");
        scanf("%s", name);
        int pos = Findbyname(content, name);                            //查找名字函数
        //判断是否有该联系人
        if (pos == -1)
        {
    
    
            printf("没有找到该联系人\n");
        }
        else
        {
    
    
            //查找到相应联系人,将联系人的信息展示出来
            int i = pos;
            printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
            printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
                content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
        }
}
 
int_cmp_name(const void* p1, const void* p2)                                            //字符比较函数
{
    
    
    return strcmp(((meaaage*)p1)->name, ((meaaage*)p2)->name);
}
 
//初始化通讯录函数
void Iniab(ab* content)
{
    
    
    content->sz = 0;
    memset(content->adta, 0, sizeof(content->adta));
    return;
}
 
 
//增加联系人函数
void addcontent(ab* content)
{
    
    
    assert(content);
    //在增加联系人之前要判断通讯录是否满了
    if (content->sz == MAX)                                                //通讯录满了
    {
    
    
        printf("通讯录满了\n");
        return;
    }
    //通讯录没满
    printf("请输入联系人姓名->");
    scanf("%s", content->adta[content->sz].name);
    printf("请输入联系人性别->");
    scanf("%s",content->adta[content->sz].sex);
    printf("请输入联系人年龄->");
    scanf("%d", &(content->adta[content->sz].age));
    printf("请输入联系人电话->");
    scanf("%s", content->adta[content->sz].number);
    printf("请输入联系人住址->");
    scanf("%s", content->adta[content->sz].address);
    printf("增加联系人成功\n");
    content->sz++;
    return;
}
 
 
//删除联系人函数
void delcontent(ab* content)
{
    
    
    char name[MAN_NAME] = {
    
    0};
    assert(content);
    printf("请输入要删除的联系人姓名->");
    scanf("%s", name);
    int pos = Findbyname(content, name);                                //查找名字函数
    //在删除联系人之前先判断是否有该要删除的联系人
    if (pos == -1)
    {
    
    
        printf("没有找到要删除的联系人\n");
 
    }
    else
    {
    
    
        int i = 0;
        for (i = pos; i < content->sz; i++)
        {
    
    
            content->adta[i] = content->adta[i + 1];
        }
        content->sz--;
        printf("删除指定联系人成功\n");
    }
    return;
}
 
 
//寻找联系人函数
void seekcontent(ab* content)
{
    
    
    assert(content);
    char name[MAN_NAME] = {
    
     0 };
    information(content, name);                                            //查联系人信息函数
    return;
}
 
 
//修改联系人信息函数
void modcontent(ab* content)
{
    
    
    assert(content);
    char name[MAN_NAME] = {
    
     0 };
    printf("请输入要修改信息的联系人姓名->");
    scanf("%s", name);
    //int i
    int pos = Findbyname(content, name);                                            //查找名字函数
    printf("请输入修改后的信息\n");
    printf("请输入联系人姓名->");
    scanf("%s", content->adta[pos].name);
    printf("请输入联系人性别->");
    scanf("%s", content->adta[pos].sex);
    printf("请输入联系人年龄->");
    scanf("%d", &(content->adta[pos].age));
    printf("请输入联系人电话->");
    scanf("%s", content->adta[pos].number);
    printf("请输入联系人住址->");
    scanf("%s", content->adta[pos].address);
    printf("修改信息联系人成功\n");
}
 
 
//展示联系人函数
void showcontent(ab* content)
{
    
    
    //姓名、性别、年龄、电话、住址
    assert(content);
    int i = 0;
    printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
    for (i = 0; i < content->sz; i++)
    {
    
    
        printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
            content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
    }
    return;
}
 
//清空联系人函数
void emptycontent(ab* content)
{
    
    
    assert(content);
    char input = 0;
    printf("请确认是否要清空通讯录(Y/N)->");
    while ((getchar()) != '\n')
    {
    
    
        ;
    }
    if ((input = getchar()) == 'Y')
        Iniab(content);                                    //初始化函数——将通讯录全部初始化
    return;
}
 
 
//排序联系人信息函数
void sortcontent(ab* content)
{
    
    
    assert(content);
    //用qsort函数快速实现排序
    qsort(content->adta,content->sz,sizeof(content->adta[0]),int_cmp_name);
    int i = 0;
    printf("%-7s\t%-10s\t%-10s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
    for (i = 0; i < content->sz; i++)
    {
    
    
        printf("%-7s\t%-10s\t%-10d\t%-15s\t%-15s\n",
            content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
    }
    return;
}

这是一个简易版本的通讯录,后期还会更新2.0版本的通讯录
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_60338933/article/details/124210381