【静态通讯录】

简介: 【静态通讯录】

今天我们来实现一个静态的通讯录,该通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

添加联系人信息

删除指定联系人信息

查找指定联系人信息

修改指定联系人信息

显示所有联系人信息

以名字排序所有联系人

清空所有联系人

一、 测试部分

先给一个菜单menu();选择后进入相应的模块。

#define _CRT_SECURE_NO_WARNINGS 1
      #include "Contact.h"      //引用自己的头文件
      void menu()
      {
        printf("******      1.Add         2.Del     ***********\n");
        printf("******      3.Search      4.Modify  ***********\n");
        printf("******      5.Show        6.Sort    ***********\n");
        printf("******      7.Clean       0.exit    ***********\n");
        printf("***********************************************\n");
      }

创建一个枚举类型,里面的枚举类型从0开始,在switch语句中可读性更强。

enum Option
      {
        EXIT,
        ADD,
        DEL,
        SEARCH,
        MODIFY,
        SHOW,
        SORT,
        CLEAN
      };

主函数部分(测试部分)

int main()
      {
        int input = 0;
        Contact con;
        InitContact(&con);
        do
        {
          menu();
          printf("请选择:\n");
          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 CLEAN:
            CleanContact(&con);
            break;
          case EXIT:
            printf("退出通讯录\n");
            break;
          default:
            printf("输入错误。请重新输入:\n");
            break;
          }
        } while (input);
        return 0;
      }

二、函数的实现部分

下面直接看代码的实现以及注释:

#define _CRT_SECURE_NO_WARNINGS 1
      #include "Contact.h"
      //初始化通讯录
      void InitContact(Contact* pc)
      {
        pc->sz = 0;
        memset(pc->data, 0, sizeof(pc->data));
      }
      //查找函数
      //加static修饰这个函数是为了这个函数只能在这个.c文件内用,出了这个文件就用不了
      static int FindByName(Contact* pc,char* name)
      {
        int i = 0;
        for (i = 0; i < pc->sz; i++)
        {
          //如果找到了就返回这个下标
          if (strcmp(pc->data[i].name, name) == 0)
          {
            return i;
          }
        }
        return -1;
      }
      //打印通讯录
      void ShowContact(Contact* pc)
      {
        int i = 0;
        //打印标题
        printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
        for (i = 0; i < pc->sz; i++)
        {
          printf("%-10s %-4d %-5s %-12s %-30s\n",
            pc->data[i].name,
            pc->data[i].age,
            pc->data[i].sex,
            pc->data[i].tele,
            pc->data[i].addr);
        }
        printf("\n");
      }
      //增加指定联系人
      void AddContact(Contact* pc)
      {
        //如果通讯录中有效信息的个数满,提示
        if (pc->sz == MAX)
        {
          printf("通讯录已满,无法添加\n");
          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);
        //添加完sz的长度++
        pc->sz++;
        printf("添加成功\n");
      }
      //删除指定联系人
      void DelContact(Contact* pc)
      {
        //通讯录为空
        if (pc->sz == 0)
        {
          printf("通讯录为空,无法删除\n");
          return;
        }
        //不为空,删除
        char name[MAX_NAME];
        printf("请输入名字:");
        scanf("%s", &name);
        //一个查找函数,因为查找功能重复,所以写一个查找函数更好
        int pos = FindByName(pc, name);
        if (pos == -1)
        {
          printf("要删除的不存在\n");
          return;
        }
        int i = 0;
        //将后面的数据往前挪
        for (i = pos; i < pc->sz; i++)
        {
          pc->data[i] = pc->data[i + 1];
        }
        //挪完后有效数据的长度--
        pc->sz--;
        printf("删除成功\n");
      }
      //在通讯录查找指定的人
      void SearchContact(Contact* pc)
      {
        printf("请输入要查找的人的名字:");
        char name[MAX_NAME];
        scanf("%s", &name);
        int pos = FindByName(pc, name);
        if (pos == -1)
        {
          printf("要查找的人不存在\n");
          return;
        }
        printf("查找成功!\n\n");
        printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
        //找到了打印数据
        printf("%-10s %-4d %-5s %-12s %-30s\n",
          pc->data[pos].name,
          pc->data[pos].age,
          pc->data[pos].sex,
          pc->data[pos].tele,
          pc->data[pos].addr);
        printf("\n");
      }
      //修改通讯录的数据
      void ModifyContact(Contact* pc)
      {
        printf("请输入需要修改的人的名字:");
        char name[MAX_NAME];
        scanf("%s", &name);
        int pos = FindByName(pc, name);
        if (pos == -1)
        {
          printf("不存在此人\n");
          return;
        }
        //找到了就修改pos下标的数据
        printf("请重新输入TA的数据\n");
        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("修改成功\n");
      }
      //按照名字排序
      int cmp_by_name(void* e1, void* e2)
      {
        //强转成PeoInfo*类型
        return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
      }
      void SortContact(Contact* pc)
      {
        printf("按照名字排列:\n");
        qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
        printf("排序成功\n\n");
      }
      //清空通讯录
      void CleanContact(Contact* pc)
      {
        pc->sz = 0;
        memset(pc->data, 0, sizeof(pc->data));
        printf("清空通讯录成功!\n");
      }

三、函数的声明部分

#define _CRT_SECURE_NO_WARNINGS 1
      #include <stdio.h>
      #include <string.h>
      #include <stdlib.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;
      //初始化通讯录
      void InitContact(Contact* pc);
      //打印通讯录
      void ShowContact(Contact* pc);
      //增加指定联系人
      void AddContact(Contact* pc);
      //删除指定联系人
      void DelContact(Contact* pc);
      //在通讯录查找指定的人
      void SearchContact(Contact* pc);
      //修改通讯录的数据
      void ModifyContact(Contact* pc);
      //排序通讯录
      void SortContact(Contact* pc);
      //清空通讯录
      void CleanContact(Contact* pc);
目录
相关文章
【动态通讯录】
【动态通讯录】
48 0
【文件版&动态版通讯录】
【文件版&动态版通讯录】
39 0
|
7月前
|
存储 编译器 C语言
通讯录详解(静态版,动态版,文件版)
通讯录详解(静态版,动态版,文件版)
117 0
|
存储
通讯录(静态版)
通讯录(静态版)
110 0
|
C语言
C/【静态通讯录】
C/【静态通讯录】
静态通讯录
C语言学习——教你学会静态通讯录的实现(保姆级教程哦~)
|
存储
通讯录(静态版)(一)
大家好,有好久没有带大家一起搞实战的编程了,今天就给大家带来一个简单的通讯录小系统
93 0
通讯录(静态版)(二)
大家好,有好久没有带大家一起搞实战的编程了,今天就给大家带来一个简单的通讯录小系统
76 0
|
C语言
通讯录【一】静态版本
通讯录【一】静态版本