简易通讯录(C语言)

简介: C语言版通讯录

 

前言

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

    1. 添加联系人信息
    2. 删除指定联系人信息
    3. 查找指定联系人信息
    4. 修改指定联系人信息
    5. 显示所有联系人信息
    6. 清空所有联系人
    7. 以名字排序所有联系人

    目录

    一、通讯录菜单

    二、枚举主函数内部选项

    三、通讯录主函数

    四、定义联系人及通讯录

    1.定义联系人

    2.定义通讯录

    五、声明全局变量

    六、初始化通讯录

    七、通讯录功能实现

    1.增加联系人

    2.删除联系人

    3.查找联系人

    4.修改联系人

    5.显示联系人

    6.清除联系人

    7.排序联系人

    八、完整代码

    utili.h

    contact.h

    contact.cpp

    contactMain.cpp

    一、通讯录菜单

    首先我们要设计一个简易菜单来完成交互

    image.gif编辑

    代码实现

    void Menu()
    {
      printf("****************通 讯 录****************\n");
      printf("*   [1] Add                 [2] Del    *\n");
      printf("*   [3] Find                [4] Modify *\n");
      printf("*   [5] Show                [6] Clear  *\n");
      printf("*   [7] Sort                [0] Quit   *\n");
      printf("****************************************\n");
    }

    image.gif

    二、枚举主函数内部选项

    我们采用枚举对主函数菜单的选择进行设置

    enum { QUIT, ADD, DEL, FIND, MODIFY, SHOW, CLEAR, SORT };

    image.gif

    三、通讯录主函数

    我们通过上面枚举,用switch分支来实现菜单选择。

    代码实现

    void main()
    {
      Contact cont;
      InitContact(&cont);
      int select = 1;
      while (select)
      {
        Menu();
        printf("请选择:>");
        scanf("%d", &select);
        if (select == QUIT)
          break;
        switch (select)
        {
        case ADD:
          AddContact(&cont);
          break;
        case DEL:
          DelContact(&cont);
          break;
        case FIND:
          FindContact(&cont);
          break;
        case MODIFY:
          ModifyContact(&cont);
          break;
        case SHOW:
          ShowContact(&cont);
          break;
        case CLEAR:
          ClearContact(&cont);
          break;
        case SORT:
          SortContact(&cont);  //qsort
          break;
        }
      }
    }

    image.gif

    四、定义联系人及通讯录

    这里是为了实现题目要求,要使用自定义结构体(struct)

    1.定义联系人

    代码实现

    typedef struct PersonInfo
    {
      char name[MAX_NAME_SIZE];
      char sex[MAX_SEX_SIZE];
      int age;
      char tel[MAX_TEL_SIZE];
      char address[MAX_ADDR_SIZE];
    }PersonInfo;

    image.gif

    2.定义通讯录

    代码实现

    typedef struct Contact
    {
      PersonInfo cont[MAX_CONTACT_SIZE];
      size_t     capacity;
      size_t     size;
    }Contact;

    image.gif

    五、声明全局变量

    这里是对上面结构体内部信息的声明

    代码实现

    #define MAX_NAME_SIZE 10
    #define MAX_SEX_SIZE   3
    #define MAX_TEL_SIZE   12
    #define MAX_ADDR_SIZE 128
    #define MAX_CONTACT_SIZE 8

    image.gif

    六、初始化通讯录

    代码实现

    void InitContact(Contact *pcont)
    {
      assert(pcont != NULL);
      memset(pcont->cont, 0, sizeof(PersonInfo)* MAX_CONTACT_SIZE);
      pcont->capacity = MAX_CONTACT_SIZE;
      pcont->size = 0;
    }

    image.gif

    七、通讯录功能实现

    1.增加联系人

    image.gif编辑

    代码实现

    void AddContact(Contact *pcont)
    {
      assert(pcont != NULL);
      if (IsFullContact(pcont))
      {
        printf("通讯录空间已满,不能新增信息.....\n");
        return;
      }
      printf("姓名:>");
      scanf("%s", pcont->cont[pcont->size].name);
      printf("性别:>");
      scanf("%s", pcont->cont[pcont->size].sex);
      printf("年龄:>");
      scanf("%d", &pcont->cont[pcont->size].age);
      printf("电话:>");
      scanf("%s", pcont->cont[pcont->size].tel);
      printf("住址:>");
      scanf("%s", pcont->cont[pcont->size].address);
      pcont->size++;
      printf("增加完成.......\n");
    }

    image.gif

    2.删除联系人

    image.gif编辑

    代码实现

    void DelContact(Contact *pcont)
    {
      assert(pcont != NULL);
      printf("请输入要删除的名字:>");
      char name[MAX_NAME_SIZE] = { 0 };
      scanf("%s", name);
      int i;
      for (i = 0; i<pcont->size; ++i)
      {
        if (strcmp(name, pcont->cont[i].name) == 0)
          break;
      }
      if (i >= pcont->size)
      {
        printf("要删除的信息不存在.....\n");
        return;
      }
      for (int k = i; k<pcont->size - 1; ++k)
        pcont->cont[k] = pcont->cont[k + 1];
      pcont->size--;
      printf("删除完成.......\n");
    }

    image.gif

    3.查找联系人

    image.gif编辑

    代码实现

    int  FindContact(Contact *pcont)
    {
      assert(pcont != NULL);
      printf("请输入要查找的姓名:>");
      char name[MAX_NAME_SIZE] = { 0 };
      scanf("%s", name);
      printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址");
      for (int i = 0; i<pcont->size; ++i)
      {
        if (strcmp(name, pcont->cont[i].name) == 0)
        {
          printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name,
            pcont->cont[i].sex,
            pcont->cont[i].age,
            pcont->cont[i].tel,
            pcont->cont[i].address);
          return i;
        }
      }
      return -1;
    }

    image.gif

    4.修改联系人

    image.gif编辑

    代码实现

    void ModifyContact(Contact *pcont)
    {
      assert(pcont != NULL);
      printf("请输入要修改的名字:>");
      char name[MAX_NAME_SIZE] = { 0 };
      scanf("%s", name);
      int i;
      for (i = 0; i<pcont->size; ++i)
      {
        if (strcmp(name, pcont->cont[i].name) == 0)
          break;
      }
      if (i >= pcont->size)
      {
        printf("要修改的信息不存在.....\n");
        return;
      }
      printf("你想修改什么信息(1-姓名 2-性别 3-年龄 4-电话 5-住址)\n");
      int select;
      scanf("%d", &select);
      if (select == 1)
      {
        printf("请输入要修改姓名:>");
        scanf("%s", pcont->cont[i].name);
      }
      else if (select == 2)
      {
        printf("请输入要修改性别:>");
        scanf("%s", pcont->cont[i].sex);
      }
      else if (select == 3)
      {
        printf("请输入要修改年龄:>");
        scanf("%d", &pcont->cont[i].age);
      }
      else if (select == 4)
      {
        printf("请输入要修改电话:>");
        scanf("%s", pcont->cont[i].tel);
      }
      else if (select == 5)
      {
        printf("请输入要修改地址:>");
        scanf("%s", pcont->cont[i].address);
      }
      printf("修改完成.......\n");
    }

    image.gif

    5.显示联系人

    image.gif编辑

    代码实现

    void ShowContact(Contact *pcont)
    {
      assert(pcont != NULL);
      printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址");
      for (int i = 0; i<pcont->size; ++i)
      {
        printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name,
          pcont->cont[i].sex,
          pcont->cont[i].age,
          pcont->cont[i].tel,
          pcont->cont[i].address);
      }
    }

    image.gif

    6.清除联系人

    image.gif编辑

    代码实现

    void ClearContact(Contact *pcont)
    {
      assert(pcont != NULL);
      pcont->size = 0;
      printf("清除完成.......\n");

    image.gif

    7.排序联系人

    image.gif编辑

    代码实现

    void SortContact(Contact *pcont)
    {
      assert(pcont != NULL);
      for (int i = 0; i<pcont->size - 1; ++i)
      {
        for (int j = 0; j<pcont->size - 1 - i; ++j)
        {
          if (strcmp(pcont->cont[j].name, pcont->cont[j + 1].name) > 0)
          {
            PersonInfo tmp = pcont->cont[j];
            pcont->cont[j] = pcont->cont[j + 1];
            pcont->cont[j + 1] = tmp;
          }
        }
      }
      printf("排序完成.......\n");
    }

    image.gif

    八、完整代码

    utili.h

    #ifndef _UTILI_H_
    #define _UTILI_H_
    #include<stdio.h>
    #include<assert.h>
    #include<string.h>
    #include<stdbool.h>
    #endif /* _UTILI_H_ */

    image.gif

    contact.h

    #ifndef _CONTACT_H_
    #define _CONTACT_H_
    #include"utili.h"
    enum { QUIT, ADD, DEL, FIND, MODIFY, SHOW, CLEAR, SORT };
    #define MAX_NAME_SIZE 10
    #define MAX_SEX_SIZE   3
    #define MAX_TEL_SIZE   12
    #define MAX_ADDR_SIZE 128
    #define MAX_CONTACT_SIZE 8
    //定义通讯录人员信息
    typedef struct PersonInfo
    {
      char name[MAX_NAME_SIZE];
      char sex[MAX_SEX_SIZE];
      int age;
      char tel[MAX_TEL_SIZE];
      char address[MAX_ADDR_SIZE];
    }PersonInfo;
    //定义通讯录结构
    typedef struct Contact
    {
      PersonInfo cont[MAX_CONTACT_SIZE];
      size_t     capacity;
      size_t     size;
    }Contact;
    /////////////////////////////////////////////////////////////
    bool IsFullContact(Contact *pcont);
    void InitContact(Contact *pcont);
    void AddContact(Contact *pcont);
    void ShowContact(Contact *pcont);
    int  FindContact(Contact *pcont);
    void DelContact(Contact *pcont);
    void ModifyContact(Contact *pcont);
    void SortContact(Contact *pcont);
    void ClearContact(Contact *pcont);
    #endif /* _CONTACT_H_ */

    image.gif

    contact.cpp

    #include"contact.h"
    void InitContact(Contact *pcont)
    {
      assert(pcont != NULL);
      memset(pcont->cont, 0, sizeof(PersonInfo)* MAX_CONTACT_SIZE);
      pcont->capacity = MAX_CONTACT_SIZE;
      pcont->size = 0;
    }
    bool IsFullContact(Contact *pcont)
    {
      assert(pcont != NULL);
      return pcont->size >= pcont->capacity;
    }
    void AddContact(Contact *pcont)
    {
      assert(pcont != NULL);
      if (IsFullContact(pcont))
      {
        printf("通讯录空间已满,不能新增信息.....\n");
        return;
      }
      printf("姓名:>");
      scanf("%s", pcont->cont[pcont->size].name);
      printf("性别:>");
      scanf("%s", pcont->cont[pcont->size].sex);
      printf("年龄:>");
      scanf("%d", &pcont->cont[pcont->size].age);
      printf("电话:>");
      scanf("%s", pcont->cont[pcont->size].tel);
      printf("住址:>");
      scanf("%s", pcont->cont[pcont->size].address);
      pcont->size++;
      printf("增加完成.......\n");
    }
    void ShowContact(Contact *pcont)
    {
      assert(pcont != NULL);
      printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址");
      for (int i = 0; i<pcont->size; ++i)
      {
        printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name,
          pcont->cont[i].sex,
          pcont->cont[i].age,
          pcont->cont[i].tel,
          pcont->cont[i].address);
      }
    }
    int  FindContact(Contact *pcont)
    {
      assert(pcont != NULL);
      printf("请输入要查找的姓名:>");
      char name[MAX_NAME_SIZE] = { 0 };
      scanf("%s", name);
      printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址");
      for (int i = 0; i<pcont->size; ++i)
      {
        if (strcmp(name, pcont->cont[i].name) == 0)
        {
          printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name,
            pcont->cont[i].sex,
            pcont->cont[i].age,
            pcont->cont[i].tel,
            pcont->cont[i].address);
          return i;
        }
      }
      return -1;
    }
    void DelContact(Contact *pcont)
    {
      assert(pcont != NULL);
      printf("请输入要删除的名字:>");
      char name[MAX_NAME_SIZE] = { 0 };
      scanf("%s", name);
      int i;
      for (i = 0; i<pcont->size; ++i)
      {
        if (strcmp(name, pcont->cont[i].name) == 0)
          break;
      }
      if (i >= pcont->size)
      {
        printf("要删除的信息不存在.....\n");
        return;
      }
      for (int k = i; k<pcont->size - 1; ++k)
        pcont->cont[k] = pcont->cont[k + 1];
      pcont->size--;
      printf("删除完成.......\n");
    }
    void ModifyContact(Contact *pcont)
    {
      assert(pcont != NULL);
      printf("请输入要修改的名字:>");
      char name[MAX_NAME_SIZE] = { 0 };
      scanf("%s", name);
      int i;
      for (i = 0; i<pcont->size; ++i)
      {
        if (strcmp(name, pcont->cont[i].name) == 0)
          break;
      }
      if (i >= pcont->size)
      {
        printf("要修改的信息不存在.....\n");
        return;
      }
      printf("你想修改什么信息(1-姓名 2-性别 3-年龄 4-电话 5-住址)\n");
      int select;
      scanf("%d", &select);
      if (select == 1)
      {
        printf("请输入要修改姓名:>");
        scanf("%s", pcont->cont[i].name);
      }
      else if (select == 2)
      {
        printf("请输入要修改性别:>");
        scanf("%s", pcont->cont[i].sex);
      }
      else if (select == 3)
      {
        printf("请输入要修改年龄:>");
        scanf("%d", &pcont->cont[i].age);
      }
      else if (select == 4)
      {
        printf("请输入要修改电话:>");
        scanf("%s", pcont->cont[i].tel);
      }
      else if (select == 5)
      {
        printf("请输入要修改地址:>");
        scanf("%s", pcont->cont[i].address);
      }
      printf("修改完成.......\n");
    }
    void SortContact(Contact *pcont)
    {
      assert(pcont != NULL);
      for (int i = 0; i<pcont->size - 1; ++i)
      {
        for (int j = 0; j<pcont->size - 1 - i; ++j)
        {
          if (strcmp(pcont->cont[j].name, pcont->cont[j + 1].name) > 0)
          {
            PersonInfo tmp = pcont->cont[j];
            pcont->cont[j] = pcont->cont[j + 1];
            pcont->cont[j + 1] = tmp;
          }
        }
      }
      printf("排序完成.......\n");
    }
    void ClearContact(Contact *pcont)
    {
      assert(pcont != NULL);
      pcont->size = 0;
      printf("清除完成.......\n");
    }

    image.gif

    contactMain.cpp

    #include"contact.h"
    void Menu()
    {
      printf("****************通 讯 录****************\n");
      printf("*   [1] Add                 [2] Del    *\n");
      printf("*   [3] Find                [4] Modify *\n");
      printf("*   [5] Show                [6] Clear  *\n");
      printf("*   [7] Sort                [0] Quit   *\n");
      printf("****************************************\n");
    }
    void main()
    {
      Contact cont;
      InitContact(&cont);
      int select = 1;
      while (select)
      {
        Menu();
        printf("请选择:>");
        scanf("%d", &select);
        if (select == QUIT)
          break;
        switch (select)
        {
        case ADD:
          AddContact(&cont);
          break;
        case DEL:
          DelContact(&cont);
          break;
        case FIND:
          FindContact(&cont);
          break;
        case MODIFY:
          ModifyContact(&cont);
          break;
        case SHOW:
          ShowContact(&cont);
          break;
        case CLEAR:
          ClearContact(&cont);
          break;
        case SORT:
          SortContact(&cont);  //qsort
          break;
        }
      }
    }

    image.gif

    相关文章
    |
    1月前
    |
    存储 C语言
    探索C语言数据结构:利用顺序表完成通讯录的实现
    本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
    22 2
    |
    1月前
    |
    存储 C语言
    手把手教你用C语言实现通讯录管理系统
    手把手教你用C语言实现通讯录管理系统
    |
    6月前
    |
    C语言
    C语言——通讯录系统—基于 VS2022
    C语言——通讯录系统—基于 VS2022
    |
    3月前
    |
    存储 搜索推荐 算法
    【C语言】C语言—通讯录管理系统(源码)【独一无二】
    【C语言】C语言—通讯录管理系统(源码)【独一无二】
    |
    3月前
    |
    存储 数据可视化 C语言
    【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
    【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
    |
    5月前
    |
    机器学习/深度学习 搜索推荐 程序员
    C语言实现个人通讯录(功能优化)-2
    C语言实现个人通讯录(功能优化)
    C语言实现个人通讯录(功能优化)-2
    |
    5月前
    |
    存储 C语言 索引
    C语言实现个人通讯录(功能优化)-1
    C语言实现个人通讯录(功能优化)
    C语言实现个人通讯录(功能优化)-1
    |
    5月前
    |
    C语言
    C语言学习记录——通讯录(静态内存)
    C语言学习记录——通讯录(静态内存)
    32 2
    |
    6月前
    |
    存储 C语言
    C语言实现通讯录
    C语言实现通讯录
    42 2
    |
    6月前
    |
    存储 C语言
    C语言实验-动态顺序表实现简易通讯录(二)
    在这个C语言实验中,你将实现一个简单的通讯录,它使用动态顺序表来存储联系人信息。
    51 2