【C语言】通讯录的实现(下)

简介: 【C语言】通讯录的实现(下)

优化2

对于switch语句,我们不能很清晰的知道1 2 3 4 5 0分别对应的是什么操作,

所以我们就可以使用枚举

默认值从0到5

enum Option
{
  EXIT,//0
  ADD,//1
  DEL,//2
  SEARCH,
  MODIFY,
  SHOW,//5
};

DelContact函数

两种方法

删除指定用户数据,后面的数据向前移位

或者 :将最后一个数据放到删除数据的位置上

此处介绍第一种方法

实现步骤

1.查找该用户

使用遍历查找

2.删除数据

代码如下
void DelContact(struct Contract* ps)
{
  char name[MAX_NAME];
  printf("请输入要删除用户的名字:>");
  scanf("%s", name);
  //1查找用户数据
  int i = 0;
  for (i = 0; i < (ps->size); i++)
  {
    if (strcmp(ps->data[i].name, name) == 0)
    {
      break;
    }
  }
  //2 删除
  if (i == ps->size)
  {
    printf("该用户不存在\n");
  }
  else
  {
    int j = 0;
    for (j = i; j < (ps->size) - 1; j++)
    {
      ps->data[j] = ps->data[j + 1];
    }
    ps->size--;
    printf("删除完成\n");
  }
}

SearchContract函数

优化3

在编写这个函数的时候,我们会发现,对于遍历查找用户的代码,我们又写了一遍,这就发生了代码冗余,那么我们就可以单独封装一个FindByName函数,用于查找用户

其实就是:将遍历查找的过程单独封装一个函数

static int FindByName(struct Contract* ps, char name[MAX_NAME])
{
  int i = 0;
  for (i = 0; i < (ps->size); i++)
  {
    if (strcmp(ps->data[i].name, name) == 0)
    {
      return i;
    }
  }
  return -1;
}

在定义时,加上static,让这个函数只能在自己所在的源文件内部看到及使用,

不会被外界看到

SearchContract代码如下
void SearchContract(const struct Contract* ps)
{
  char name[MAX_NAME];
  printf("请输入要查找的用户姓名:>");
  scanf("%s", name);
  int pos = FindByName(ps, name);
  //对于函数,找到用户返回下标
  //没找到就返回-1
  if (pos == -1)
  {
    printf("用户不存在\n");
  }
  else
  {
    printf("%20s\t%4s\t5s\t%12s\t%20s", "名字", "年龄", "性别", "电话", "地址");
    printf("%20s\t%4s\t5s\t%12s\t%20s", ps->data[pos].name,
        ps->data[pos].age,
        ps->data[pos].sex,
        ps->data[pos].tele,
        ps->data[pos].addr);
  }
}

MODIFY函数

利用之前编写的FindByName和Addcontract函数的部分内容

void ModifyContract(struct Contract* ps)
{
  char name[MAX_NAME];
  printf("请输入要修改用户的名字:>");
  scanf("%s", name);
  int pos = FindByName(ps, name);
  if (pos == -1)
  {
    printf("用户不存在\n");
  }
  else
  {
    printf("请输入名字:>");
    scanf("%s", ps->data[pos].name);
    printf("请输入年龄:>");
    scanf("%s", &(ps->data[pos].age));
    printf("请输入性别:>");
    scanf("%s", ps->data[pos].sex);
    printf("请输入电话:>");
    scanf("%s", ps->data[pos].tele);
    printf("请输入地址:>");
    scanf("%s", ps->data[pos].addr);
    printf("修改成功\n");
  }
}

最终代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contract.h"
void menu()
{
  printf("**************************************\n");
  printf("**********1.add        2.del   *******\n");
  printf("**********3.search    4.modify *******\n");
  printf("**********5.show      6.sort   *******\n");
  printf("**********0.exit               *******\n");
  printf("**************************************\n");
  printf("**************************************\n");
}
int main()
{
  int input = 0;
  //int size = 0;//创建一个变量来记录通讯录里面已经存储了多少个用户数据
  //int max = MAX;//创建一个变量来记录通讯录最多可以存储多少个用户数据:即MAX
  struct Contract con;//con就是创建的通讯录,里面有一个元素个数为1000的数组和size变量
  struct PeoInfo con[MAX] = { 0 };//自定义要存放的用户数量
  InitContract(&con);//初始化通讯录
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    //switch(input)
    //{
    //case 1:
    //  //AddContract(con, size);
    //  AddContract(&con);
    //  break;
    //case 2:
    //  DelContact(&con);
    //  break; 
    //case 3:
    //  break;
    //case 4:
    //  break;
    //case 5:
    //  ShowContract(&con);
    //  break;
    //case 6:
    //  break;
    //case 0:
    //  printf("退出通讯录\n");
    //  break;
    //default:
    //  printf("输入错误\n");
    //  break;
    //}
    switch (input)
    {
    case ADD:
      //AddContract(con, size);
      AddContract(&con);
      break;
    case DEL:
      DelContact(&con);
      break;
    case SEARCH:
      SearchContact(&con);
      break;
    case MODIFY:
      ModifyContract(&con);
      break;
    case SHOW:
      ShowContract(&con);
      break;
    case EXIT:
      printf("退出通讯录\n");
      break;
    default:
      printf("输入错误\n");
      break;
    }
  } while (input);
  return 0;
}

contract.h

#define _CRT_SECURE_NO_WARNINGS 1
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
#include<stdio.h>
#include<string.h>
#include<string.h>
enum Option
{
  EXIT,//0
  ADD,//1
  DEL,//2
  SEARCH,
  MODIFY,
  SHOW,
  SORT//6
};
struct PeoInfo
{
  char name[MAX_NAME];
  int age;
  char sex[MAX_SEX];
  char tele[MAX_TELE];
  char addr[MAX_ADDR];
};
struct Contract
{
  struct PeoInfo data[MAX];
  int size;
};
//声明函数
void InitContract(struct Contract* ps);
//添加用户数据
void AddContract(struct Contract* ps);
//打印用户信息
void ShowContract(const struct Contract* ps);
//删除用户信息
void DelContact(struct Contract* ps);
//查找用户信息
void SearchContract(const struct Contract* ps);
//修改用户数据
void ModifyContract(struct Contract* ps);

contract.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contract.h"
void InitContract(struct Contract* ps)
{
  memset(ps->data, 0, sizeof(ps->data));//data是一块很大的空间,所以我们可以使用memset函数
  ps->size = 0;//设置通讯录只有零个元素
}
void AddContract(struct Contract* ps)
{
  if ((ps->size) = MAX)
  {
    printf("通讯录已满,请停止添加\n");//判断是否填满
  }
  else
  {
    printf("请输入名字:>");
    scanf("%s", ps->data[ps->size].name);
    printf("请输入年龄:>");
    scanf("%s", &(ps->data[ps->size].age));
    //提示:因为age不是数组名,所以需要取地址
    printf("请输入性别:>");
    scanf("%s", ps->data[ps->size].sex);
    printf("请输入电话:>");
    scanf("%s", ps->data[ps->size].tele);
    printf("请输入地址:>");
    scanf("%s", ps->data[ps->size].addr);
    (ps->size)++;
    printf("添加成功\n");
  }
}
void ShowContract(const struct Contract* ps)
{
  if (ps->size == 0)
  {
    printf("通讯录为空\n");
  }
  else
  {
    int i = 0;
    printf("%20s\t%4s\t5s\t%12s\t%20s", "名字", "年龄", "性别", "电话", "地址");
    for (i = 0; i < (ps->size); i++)
    {
      printf("%20s\t%4s\t5s\t%12s\t%20s",ps->data[i].name,
        ps->data[i].age,
        ps->data[i].sex,
        ps->data[i].tele,
        ps->data[i].addr);
    }
  }
}
static int FindByName(struct Contract* ps, char name[MAX_NAME])
{
  int i = 0;
  for (i = 0; i < (ps->size); i++)
  {
    if (strcmp(ps->data[i].name, name) == 0)
    {
      return i;
    }
  }
  return -1;
}
void DelContact(struct Contract* ps)
{
  char name[MAX_NAME];
  printf("请输入要删除用户的名字:>");
  scanf("%s", name);
  //1查找用户数据
  /*int i = 0;
  for (i = 0; i < (ps->size); i++)
  {
    if (strcmp(ps->data[i].name, name) == 0)
    {
      break;
    }
  }*/
  int pos = FindByName(ps, name);
  if (pos == -1)
  {
    printf("用户不存在\n");
  }
  //2.删除数据
  else
  {
    int j = 0;
    for (j = pos; j < (ps->size) - 1; j++)
    {
      ps->data[j] = ps->data[j + 1];
    }
    ps->size--;
    printf("删除完成\n");
  }
}
void SearchContract(const struct Contract* ps)
{
  char name[MAX_NAME];
  printf("请输入要查找的用户姓名:>");
  scanf("%s", name);
  int pos = FindByName(ps, name);
  //对于函数,找到用户返回下标
  //没找到就返回-1
  if (pos == -1)
  {
    printf("用户不存在\n");
  }
  else
  {
    printf("%20s\t%4s\t5s\t%12s\t%20s", "名字", "年龄", "性别", "电话", "地址");
    printf("%20s\t%4s\t5s\t%12s\t%20s", ps->data[pos].name,
        ps->data[pos].age,
        ps->data[pos].sex,
        ps->data[pos].tele,
        ps->data[pos].addr);
  }
}
void ModifyContract(struct Contract* ps)
{
  char name[MAX_NAME];
  printf("请输入要修改用户的名字:>");
  scanf("%s", name);
  int pos = FindByName(ps, name);
  if (pos == -1)
  {
    printf("用户不存在\n");
  }
  else
  {
    printf("请输入名字:>");
    scanf("%s", ps->data[pos].name);
    printf("请输入年龄:>");
    scanf("%s", &(ps->data[pos].age));
    printf("请输入性别:>");
    scanf("%s", ps->data[pos].sex);
    printf("请输入电话:>");
    scanf("%s", ps->data[pos].tele);
    printf("请输入地址:>");
    scanf("%s", ps->data[pos].addr);
    printf("修改成功\n");
  }
}

结语

通讯录的实现到这里就结束了,希望这篇文章对你有帮助,

我们下篇文章见~

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