这篇文章主要介绍“C语言静态版通讯录怎么实现”,在日常操作中,相信很多人在C语言静态版通讯录怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言静态版通讯录怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1. 配置运行环境
本通讯录运用到了三个文件
test.c //测试通讯录的相关功能
contact.h //声明
contact.c //通讯录的实现模块
2. 通讯录的实现
想要做通讯录,首要任务就是要把模块想好。
先打印一个通讯录的界面菜单
void menu()
{
    printf("********************************
");
    printf("*****    1. add     2. del   ***
");
    printf("*****    3. search  4. modify***
");
    printf("*****    5. show    6. sort  ***
");
    printf("*****    0. exit             ***
");
    printf("********************************
");
}2.1 通讯录的功能目录
通讯录的功能有7种:
增加联系人
删除指定联系人
查找联系人
修改联系人的信息
对联系人的排序
显示联系人的信息
退出通讯录
创建人的信息的结构体类型
第一步是封装一个人的信息的结构体类型
由于封装的结构体类型的名字太长,总是写的话感觉太麻烦了
对 struct PeoInfo进行了typdef类型重命名
struct PeoInfp 改成 PeoInfp
//表示一个人的信息
typedef struct PeoInfo
{
    char name[20];
    int age;
    char sex[5];
    char tele[12];
    char addr[30];
}PeoInfo;以上的数值如果以后会经常用到的话,可以用#define 来定义,方便以后修改
#define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30
2.2 增加信息功能代码的实现
//增加通讯录信息
void AddContact(Contact* pc)
{
    if (DATA_MAX == pc->sz)
    {
        printf("通讯录信息存储空间已满!
");
        return;
    }
    printf("请输入名字:> ");
    scanf("%s", pc->data[pc->sz].name);
    printf("请输入年龄:> ");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("请输入性别:> ");
    scanf("%s", pc->data[pc->sz].sex);
    printf("请输入电话:> ");
    scanf("%s", pc->data[pc->sz].tele);
    printf("请输入住址:> ");
    scanf("%s", pc->data[pc->sz].addr);
    printf("信息添加成功!
");
    pc->sz++;
}2.3 显示信息功能代码的实现
void ShowContact(const Contact* pc)
{
    int i = 0;
    //姓名      年龄      性别     电话      地址
    //zhangsan 20        男      123456    北京
    //
    //打印标题
    printf("%-10s %-4s %-5s %-12s %-30s
", "姓名", "年龄", "性别", "电话", "地址");
    //打印数据
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s %-4d %-5s %-12s %-30s
", 
            pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    }
}2.4 删除信息功能代码的实现
void DelContact(pContact pc)
{
    char name[MAX_NAME] = { 0 };
    if (pc->sz == 0)
    {
        printf("通讯录为空,无法删除
");
        return;
    }
    //删除
    //1. 找到要删除的人 - 位置(下标)
    printf("输入要删除人的名字:>");
    scanf("%s", name);
    int pos = FindByName(pc, name);
    if (pos == -1)
    {
        printf("要删除的人不存在
");
        return;
    }
    int i = 0;
    //2. 删除 - 删除pos位置上的数据
    for (i = pos; i<pc->sz-1; i++)
    {
        pc->data[i] = pc->data[i + 1];
    }
    pc->sz--;
    printf("删除成功
");
}2.5 查询信息功能代码的实现
void SearchContact(const Contact* pc)
{
    char name[MAX_NAME] = {0};
    printf("请输入要查找人的名字:>");
    scanf("%s", name);
    //查找
    int pos = FindByName(pc, name);
    if (pos == -1)
    {
        printf("要查找的人不存在
");
        return;
    }
    //打印
    printf("%-10s %-4s %-5s %-12s %-30s
", "姓名", "年龄", "性别", "电话", "地址");
    //打印数据
    printf("%-10s %-4d %-5s %-12s %-30s
",
        pc->data[pos].name,
        pc->data[pos].age,
        pc->data[pos].sex,
        pc->data[pos].tele,
        pc->data[pos].addr);
}2.6 修改信息功能代码的实现
void ModifyContact(Contact* pc)
{
    char name[MAX_NAME] = {0};
    printf("请输入要修改人的名字:>");
    scanf("%s", name);
    int pos = FindByName(pc, name);
    if (pos == -1)
    {
        printf("要修改的人不存在
");
        return;
    }
    //修改
    printf("请输入名字:>");
    scanf("%s", pc->data[pos].name);
    printf("请输入年龄:>");
    scanf("%d", &(pc->data[pos].age));
    printf("请输入性别:>");
    scanf("%s", pc->data[pos].sex);
    printf("请输入电话:>");
    scanf("%s", pc->data[pos].tele);
    printf("请输入地址:>");
    scanf("%s", pc->data[pos].addr);
    printf("修改成功
");
}2.7 按名字排序信息功能代码的实现
//按照名字来排序
int cmp_by_name(const void* e1, const void* e2)
{
    return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
    qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
    printf("排序成功
");
}3. 完整静态版本通讯录的全部源码
3.1 contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void InitContact(Contact* pc)
{
    pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));
}
void AddContact(Contact* pc)
{
    if (pc->sz == MAX)
    {
        printf("通讯录已满,无法增加
");
        return;
    }
    printf("请输入名字:>");
    scanf("%s", pc->data[pc->sz].name);
    printf("请输入年龄:>");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("请输入性别:>");
    scanf("%s", pc->data[pc->sz].sex);
    printf("请输入电话:>");
    scanf("%s", pc->data[pc->sz].tele);
    printf("请输入地址:>");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;
    printf("添加成功
");
}
void ShowContact(const Contact* pc)
{
    int i = 0;
    //姓名      年龄      性别     电话      地址
    //hengchuan 20        男      123456    北京
    //
    //打印标题
    printf("%-10s %-4s %-5s %-12s %-30s
", "姓名", "年龄", "性别", "电话", "地址");
    //打印数据
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s %-4d %-5s %-12s %-30s
",
            pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    }
}
static int FindByName(const Contact* pc, char name[])
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (0 == strcmp(pc->data[i].name, name))
        {
            return i;
        }
    }
    return -1;
}
void DelContact(pContact pc)
{
    char name[MAX_NAME] = { 0 };
    if (pc->sz == 0)
    {
        printf("通讯录为空,无法删除
");
        return;
    }
    //删除
    //1. 找到要删除的人 - 位置(下标)
    printf("输入要删除人的名字:>");
    scanf("%s", name);
    int pos = FindByName(pc, name);
    if (pos == -1)
    {
        printf("要删除的人不存在
");
        return;
    }
    int i = 0;
    //2. 删除 - 删除pos位置上的数据
    for (i = pos; i < pc->sz - 1; i++)
    {
        pc->data[i] = pc->data[i + 1];
    }
    pc->sz--;
    printf("删除成功
");
}
void SearchContact(const Contact* pc)
{
    char name[MAX_NAME] = { 0 };
    printf("请输入要查找人的名字:>");
    scanf("%s", name);
    //查找
    int pos = FindByName(pc, name);
    if (pos == -1)
    {
        printf("要查找的人不存在
");
        return;
    }
    //打印
    printf("%-10s %-4s %-5s %-12s %-30s
", "姓名", "年龄", "性别", "电话", "地址");
    //打印数据
    printf("%-10s %-4d %-5s %-12s %-30s
",
        pc->data[pos].name,
        pc->data[pos].age,
        pc->data[pos].sex,
        pc->data[pos].tele,
        pc->data[pos].addr);
}
void ModifyContact(Contact* pc)
{
    char name[MAX_NAME] = { 0 };
    printf("请输入要修改人的名字:>");
    scanf("%s", name);
    int pos = FindByName(pc, name);
    if (pos == -1)
    {
        printf("要修改的人不存在
");
        return;
    }
    //修改
    printf("请输入名字:>");
    scanf("%s", pc->data[pos].name);
    printf("请输入年龄:>");
    scanf("%d", &(pc->data[pos].age));
    printf("请输入性别:>");
    scanf("%s", pc->data[pos].sex);
    printf("请输入电话:>");
    scanf("%s", pc->data[pos].tele);
    printf("请输入地址:>");
    scanf("%s", pc->data[pos].addr);
    printf("修改成功
");
}
//按照名字来排序
int cmp_by_name(const void* e1, const void* e2)
{
    return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
    qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
    printf("排序成功
");
}3.2 contact.h
#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
//表示一个人的信息
typedef struct PeoInfo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
}PeoInfo;
//静态版本的设计
typedef struct Contact
{
    PeoInfo data[MAX];//存放数据
    int sz;//记录通讯录中的有效信息个数
}Contact, *pContact;
//初始化通讯录
void InitContact(Contact* pc);
//增加指定联系人
void AddContact(Contact* pc);
//显示联系人信息
void ShowContact(const Contact* pc);
//删除指定联系人
//void DelContact(Contact* pc);
void DelContact(pContact pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改通讯录
void ModifyContact(Contact* pc);
//排序通讯录元素
void SortContact(Contact* pc);3.3 test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
    printf("********************************
");
    printf("*****    1. add     2. del   ***
");
    printf("*****    3. search  4. modify***
");
    printf("*****    5. show    6. sort  ***
");
    printf("*****    0. exit             ***
");
    printf("********************************
");
}
enum Option
{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    MODIFY,
    SHOW,
    SORT
};
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:
            printf("退出通讯录
");
            break;
        default:
            printf("选择错误
");
            break;
        }
    } while (input);
    return 0;
}4. 静态版本通讯录的缺点
缺点:
通讯录的大小是固定的 - 100个元素当通讯录退出后,重新运行,之前的信息都丢了
当前通讯录中的信息都是保存在内存中的,程序退出,内存就回收了,下一次重新运行程序,内存重新分配,之前的数据就不见了