C语言实现通讯录(实现增删查改显示功能)

简介: 本文讲解:C语言实现通讯录(实现增删查改显示功能)面向对象的编程

 image.gif编辑

前言

大家好,我是程序猿爱打拳。今天我给大家带来的是C语言实现通讯录,主要的实现方式是结构体。

目录

1.设计思想

2.各个模块的实现

3.最终效果展示


1.设计思想

首先,我们在设计一个通讯录的时候。我们得知道通讯录的基本功能是什么。比如当你在街上遇见一个女孩你很中意她,因此首先你要做的是向她要电话号码,这时候我们手机的通讯录就发挥作用了,当你要到电话号码后你得死皮赖脸一点再问她要姓名然后继续发起攻势问她要住址、年龄。这样通讯录存入的一条记录就诞生了。当然,某一天你跟这个女生聊掰了,你想删除关于她所有的信息。这时你要使用到的功能就是删除信息。当然我们可以把模块设置得更丰富一些,因此我们设计可以有以下几个模块:

    • 增加信息
    • 删除信息
    • 查找信息
    • 修改信息
    • 显示信息

    2.各个模块的实现

    (1)增加信息

    //函数的声明
    void AddContact(Console* pc);
    //函数的定义
    void AddContact(Console* pc)
    {
      if (pc->sz == Per_Max)
      {
        printf("通讯录人员已满!\n");
        return;
      }
      printf("请输入姓名:>");
      scanf("%s", pc->date[pc->sz].name);
      printf("请输入年龄:>");
      scanf("%d", &(pc->date[pc->sz].age));
      printf("请输入性别:>");
      scanf("%s", pc->date[pc->sz].sex);
      printf("请输入地址:>");
      scanf("%s", pc->date[pc->sz].addr);
      printf("请输入电话:>");
      scanf("%d", &(pc->date[pc->sz].tele));
      pc->sz++;
    }

    image.gif


    (2)删除信息

    //函数的声明
    void DeleContact(Console* pc);
    //函数的定义
    void DeleContact(Console* pc)
    {
      char key[Name_Max] = {0};
      int i = 0;
      int pos = 0;
      if (pc->sz == 0)
      {
        printf("通讯录里面还没有记录!\n");
        return;
      }
      printf("请输入此人的姓名:>");
      scanf("%s", &key);
      for (i = 0; i < pc->sz; i++)
      {
        if (strcmp(pc->date[i].name, key) == 0)
        {
          pos = i;
          break;
        }
      }
      for (i = pos; i < pc->sz-1; i++)
      {
        pc->date[i] = pc->date[i+1];
      }
      pc->sz--;
      printf("删除成功!\n");
    }

    image.gif


    (3)查找信息

    //函数的声明-查找信息
    void SearchContact(Console* pc);
    //函数的定义
    void SearchContact(Console* pc)
    {
      char key[Name_Max];
      int i = 0;
      int ret = -1;
      printf("请输入查找人的姓名:>");
      scanf("%s", key);
      for (i = 0; i < pc->sz; i++)
      {
        if (strcmp(pc->date[i].name,key) == 0)
        {
          ret = 1;
          break;
        }
      }
      if (ret==-1)
      {
        printf("没有此人!");
      }
      else
      {
        printf("查找的信息为:\n");
        printf("%-10s%-10d%-10s%-10s%-10d\n",
          pc->date[i].name,
          pc->date[i].age,
          pc->date[i].sex,
          pc->date[i].addr,
          pc->date[i].tele
          );
      }
    }

    image.gif


    (4)修改信息

    //函数的声明-修改信息
    void ModifyContact(Console* pc);
    //函数的定义
    void ModifyContact(Console* pc)
    {
      assert(pc);
      char key[Name_Max];
      int i = 0;
      int ret = -1;
      printf("请输入你要修改的人姓名:>");
      scanf("%s", key);
      for (i = 0; i < pc->sz; i++)
      {
        if (strcmp(pc->date[i].name, key) == 0)
        {
          ret = 1;
          break;
        }
      }
      if (ret == -1)
      {
        printf("没有此人!\n");
      }
      else
      {
        printf("此人的信息为:\n");
        printf("%-10s%-10d%-10s%-10s%-10d\n",
          pc->date[i].name,
          pc->date[i].age,
          pc->date[i].sex,
          pc->date[i].addr,
          pc->date[i].tele
        );
      }
      printf("请输入姓名:>");
      scanf("%s", pc->date[i].name);
      printf("请输入年龄:>");
      scanf("%d", &(pc->date[i].age));
      printf("请输入性别:>");
      scanf("%s", pc->date[i].sex);
      printf("请输入地址:>");
      scanf("%s", pc->date[i].addr);
      printf("请输入电话:>");
      scanf("%d", &(pc->date[i].tele));
      printf("修改成功!\n");
    }

    image.gif


    (5)显示信息

    //函数的声明-显示信息
    void ShowContact(Console* pc);
    //函数的定义
    void ShowContact(Console* pc)
    {
      int i = 0;
      printf("%-10s%-10s%-10s%-10s%-10s\n", 
      "姓名", "年龄", 
      "性别", "地址", "电话");
      for (i = 0; i < pc->sz; i++)
      {
        printf("%-10s%-10d%-10s%-10s%-10d\n", 
        pc->date[i].name,
        pc->date[i].age,
        pc->date[i].sex,
        pc->date[i].addr,
        pc->date[i].tele
        );
      }
    }

    image.gif


    3.最终效果展示

    为了编写程序的便利,我们一般模块化编写程序,各个函数用到头文件和函数的声明我们封装到一个名为.h的头文件里面。函数的定义我们放到一个.c的文件里面,主函数我们再放入另一个.c的文件里面。那么我在设计通讯录的工程中,我把各个函数用到头文件和函数的声明放到contact.h文件中,函数的定义放到contact.c文件中,主函数放到test.c文件中。

    (1)contact.h文件中

    //Person结构体内的参数设置
    #define Per_Max 100
    #define Name_Max 20
    #define Sex_Max 5
    #define Addr_Max 20
    //各个函数用到的头文件
    #include<stdio.h>
    #include<string.h>
    #include<assert.h>
    //定义Person结构体
    typedef struct Person
    {
      char name[Name_Max];
      int age;
      char sex[Sex_Max];
      char addr[Addr_Max];
      int tele;
    }Person;
    //控制Person结构体
    typedef struct Console
    {
      Person date[Per_Max];
      int sz;
    }Console;
    //初始化通讯录
    void InitContact(Console* pc);
    //增加信息
    void AddContact(Console* pc);
    //删除信息
    void DeleContact(Console* pc);
    //查找信息
    void SearchContact(Console* pc);
    //修改信息
    void ModifyContact(Console* pc);
    //显示信息
    void ShowContact(Console* pc);

    image.gif


    (2)contact.c文件中

    //引入contact.h头文件
    #include"contact.h"
    //初始化通讯录
    void InitContact(Console* pc)
    {
      assert(pc);
      memset(pc->date, 0, sizeof(pc->date));
      pc->sz = 0;
    }
    //增加信息
    void AddContact(Console* pc)
    {
      assert(pc);
      if (pc->sz == Per_Max)
      {
        printf("通讯录人员已满!\n");
        return;
      }
      printf("请输入姓名:>");
      scanf("%s", pc->date[pc->sz].name);
      printf("请输入年龄:>");
      scanf("%d", &(pc->date[pc->sz].age));
      printf("请输入性别:>");
      scanf("%s", pc->date[pc->sz].sex);
      printf("请输入地址:>");
      scanf("%s", pc->date[pc->sz].addr);
      printf("请输入电话:>");
      scanf("%d", &(pc->date[pc->sz].tele));
      pc->sz++;
    }
    //删除信息
    void DeleContact(Console* pc)
    {
      assert(pc);
      char key[Name_Max] = {0};
      int i = 0;
      int pos = 0;
      if (pc->sz == 0)
      {
        printf("通讯录里面还没有记录!\n");
        return;
      }
      printf("请输入此人的姓名:>");
      scanf("%s", &key);
      for (i = 0; i < pc->sz; i++)
      {
        if (strcmp(pc->date[i].name, key) == 0)
        {
          pos = i;
          break;
        }
      }
      for (i = pos; i < pc->sz-1; i++)
      {
        pc->date[i] = pc->date[i+1];
      }
      pc->sz--;
      printf("删除成功!\n");
    }
    //查找信息
    void SearchContact(Console* pc)
    {
      assert(pc);
      char key[Name_Max];
      int i = 0;
      int ret = -1;
      printf("请输入查找人的姓名:>");
      scanf("%s", key);
      for (i = 0; i < pc->sz; i++)
      {
        if (strcmp(pc->date[i].name,key) == 0)
        {
          ret = 1;
          break;
        }
      }
      if (ret==-1)
      {
        printf("没有此人!");
      }
      else
      {
        printf("%-10s%-10s%-10s%-10s%-10s\n",
          "姓名", "年龄",
          "性别", "地址", "电话");
        printf("%-10s%-10d%-10s%-10s%-10d\n",
          pc->date[i].name,
          pc->date[i].age,
          pc->date[i].sex,
          pc->date[i].addr,
          pc->date[i].tele
          );
      }
    }
    //修改信息
    void ModifyContact(Console* pc)
    {
      assert(pc);
      char key[Name_Max];
      int i = 0;
      int ret = -1;
      printf("请输入你要修改的人姓名:>");
      scanf("%s", key);
      for (i = 0; i < pc->sz; i++)
      {
        if (strcmp(pc->date[i].name, key) == 0)
        {
          ret = 1;
          break;
        }
      }
      if (ret == -1)
      {
        printf("没有此人!\n");
      }
      else
      {
        printf("此人的信息为:\n");
        printf("%-10s%-10d%-10s%-10s%-10d\n",
          pc->date[i].name,
          pc->date[i].age,
          pc->date[i].sex,
          pc->date[i].addr,
          pc->date[i].tele
        );
      }
      printf("请输入姓名:>");
      scanf("%s", pc->date[i].name);
      printf("请输入年龄:>");
      scanf("%d", &(pc->date[i].age));
      printf("请输入性别:>");
      scanf("%s", pc->date[i].sex);
      printf("请输入地址:>");
      scanf("%s", pc->date[i].addr);
      printf("请输入电话:>");
      scanf("%d", &(pc->date[i].tele));
      printf("修改成功!\n");
    }
    //显示信息
    void ShowContact(Console* pc)
    {
      assert(pc);
      int i = 0;
      printf("%-10s%-10s%-10s%-10s%-10s\n",
        "姓名", "年龄",
        "性别", "地址", "电话");
      for (i = 0; i < pc->sz; i++)
      {
        printf("%-10s%-10d%-10s%-10s%-10d\n",
          pc->date[i].name,
          pc->date[i].age,
          pc->date[i].sex,
          pc->date[i].addr,
          pc->date[i].tele
        );
      }
    }

    image.gif


    (3)test.c文件中

    //引入contact.h头文件
    #include"contact.h"
    //菜单
    void men()
    {
      printf("+--------------+--------------+\n");
      printf("|  1.增加信息  |  2.删除信息  |\n");
      printf("+--------------+--------------+\n");
      printf("|  3.查找信息  |  4.修改信息  |\n");
      printf("+--------------+--------------+\n");
      printf("|  5.显示信息  |  0.退出程序  |\n");
      printf("+--------------+--------------+\n");
    }
    //主函数
    int main()
    {
      int input = 0;
      Console con;
      InitContact(&con);
      do
      {
        men();
        printf("请输入你的选项:>");
        scanf("%d", &input);
        switch (input)
        {
        case 0:
          printf("你已退出程序!");
          break;
        case 1:
          AddContact(&con);
          break;
        case 2:
          DeleContact(&con);
          break;
        case 3:
          SearchContact(&con);
          break;
        case 4:
          ModifyContact(&con);
          break;
        case 5:
          ShowContact(&con);
          break;
        default:
          printf("请选择正确的选项!");
          break;
        }
      } while (input);
      return 0;
    }

    image.gif

    效果展示:

    image.gif编辑

    image.gif编辑

    image.gif编辑

    image.gif编辑

    image.gif编辑

    image.gif编辑

    注意:

    细心的伙伴会发现,我们每一个函数的实现都用到了查找信息。因此我们可以把查找信息专门设置为一个函数。因此每个函数都可以调用查找信息函数,实现函数的嵌套,你可以尝试一下。

    当然,每当这个程序退出去以后。所有的信息都会消失,我们得重新输入。这就是单个语言的局限性,因此我们需要学习数据库知识。或者你可以通过.text文件保存下来,你也可以尝试下。

    此通讯录可以增添功能,如排序等等。


    以上就是本次博文的内容,感谢阅读!

    image.gif编辑

    Never Give Up

    相关文章
    |
    1月前
    |
    存储 C语言
    探索C语言数据结构:利用顺序表完成通讯录的实现
    本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
    22 2
    |
    1月前
    |
    存储 C语言
    手把手教你用C语言实现通讯录管理系统
    手把手教你用C语言实现通讯录管理系统
    |
    2月前
    |
    网络协议 C语言
    C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
    这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
    |
    2月前
    |
    存储 测试技术 C语言
    C语言实现链表的各种功能
    本文详细介绍了如何使用C语言实现链表的各种功能,包括链表节点结构的定义与操作函数的实现。链表作为一种常用的数据结构,具有节点自由插入删除、动态变化等特点。文中通过`link_list.h`和`link_list.c`两个文件,实现了链表的初始化、插入、删除、查找、修改等核心功能,并在`main.c`中进行了功能测试。这些代码不仅展示了链表的基本操作,还提供了丰富的注释帮助理解,适合作为学习链表的入门资料。
    |
    2月前
    |
    网络协议 C语言
    C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
    这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
    |
    2月前
    |
    C语言
    C语言 网络编程(八)并发的UDP服务端 以进程完成功能
    这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
    |
    2月前
    |
    C语言
    C语言 网络编程(九)并发的UDP服务端 以线程完成功能
    这是一个基于UDP协议的客户端和服务端程序,其中服务端采用多线程并发处理客户端请求。客户端通过UDP向服务端发送登录请求,并根据登录结果与服务端的新子线程进行后续交互。服务端在主线程中接收客户端请求并创建新线程处理登录验证及后续通信,子线程创建新的套接字并与客户端进行数据交换。该程序展示了如何利用线程和UDP实现简单的并发服务器架构。
    |
    3月前
    |
    存储 搜索推荐 算法
    【C语言】C语言—通讯录管理系统(源码)【独一无二】
    【C语言】C语言—通讯录管理系统(源码)【独一无二】
    |
    3月前
    |
    存储 数据可视化 C语言
    【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
    【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
    |
    3月前
    |
    C语言 索引
    C语言编译环境中的 调试功能及常见错误提示
    这篇文章介绍了C语言编译环境中的调试功能,包括快捷键操作、块操作、查找替换等,并详细分析了编译中常见的错误类型及其解决方法,同时提供了常见错误信息的索引供参考。