«

C语言静态版通讯录怎么实现

时间:2024-6-10 11:15     作者:韩俊     分类: Java


这篇文章主要介绍“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个元素当通讯录退出后,重新运行,之前的信息都丢了

    当前通讯录中的信息都是保存在内存中的,程序退出,内存就回收了,下一次重新运行程序,内存重新分配,之前的数据就不见了

    标签: java

    热门推荐