学C的第三十一天【通讯录的实现】-3

简介: 7 . 函数 ModifyContact() -- 查找指定通讯录成员信息: 先输入并接收要修改的联系人名字, 再调用 FindByName()函数 在通讯录中查找该人下标,

7 . 函数 ModifyContact() -- 查找指定通讯录成员信息:

               

输入接收修改的联系人名字

               

调用 Fi未找到打印相应信息并返回

       

找到了修改该下标联系人信息

             
图示:
dByName()函数在通讯录中查找该人下标

image.png

该文件对应代码:

#define _CRT_SECURE_NO_WARNINGS 1
//contact.c文件 -- 自定义函数的实现:
//包含头文件:
#include "contact.h"
//1.函数 InitContact() --初始化通讯录类型变量
void InitContact(Contact* pc)
{
  //断言:
  assert(pc);
  memset(pc->data, 0, sizeof(pc->data));
  /*使用 memset系统函数,初始化data数组。
  参数1:被设置的空间 -- data
  参数2:要设置的指-- 0 (全部初始化为0)
  参数3:要设置的空间大小-- sizeof(pc->data) ,
       直接计算出大小*/
  //联系人个数初始化为0:
  pc->sz = 0;
}
//2.函数 AddContact() 的声明 -- 增加通讯录成员:
void AddContact(Contact* pc)
{
  //断言:
  assert(pc);
  //增加的前提是还没放满:
  if (pc->sz == MAX)
  {
    printf("通讯录已满,无法添加\n");
    //无法添加直接返回:
    return;
  }
  //没满则开始增加信息:
  // sz 和 data数组 的下标是对应的,
  // 所以可以通过 sz 找到 data 的对应元素,
  // 再通过对应元素找到对应元素的相应信息
  // 如果对应的信息是数组。可以不加&
  //名字:
  printf("请输入名字:>");
  //使用 scanf()函数 将信息放进去
  scanf("%s", pc->data[pc->sz].name);
  //年龄:
  printf("请输入年龄:>");
  //使用 scanf()函数 将信息放进去
  scanf("%d", &pc->data[pc->sz].age);
  //性别:
  printf("请输入性别:>");
  //使用 scanf()函数 将信息放进去
  scanf("%s", pc->data[pc->sz].sex);
  //电话:
  printf("请输入电话:>");
  //使用 scanf()函数 将信息放进去
  scanf("%s", pc->data[pc->sz].tele);
  //地址:
  printf("请输入地址:>");
  //使用 scanf()函数 将信息放进去
  scanf("%s", pc->data[pc->sz].addr);
  //添加完一个联系人后,将指针移向下一个联系人位置:
  pc->sz++;
  //打印添加成功信息:
  printf("成功添加联系人\n");
}
//3 . 函数 ShowContact() -- 打印通讯录所有成员信息:
void ShowContact(const Contact* pc)
{
  //断言:
  assert(pc);
  printf("\n");
  //打印列标题:
  printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", 
       "名字", "年龄", "性别", "电话", "地址");
  //使用 for循环 循环打印信息:
  int i = 0;
  for (i = 0; i < pc->sz; i++)
  {
    printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,
                         pc->data[i].age,
                         pc->data[i].sex,
                         pc->data[i].tele,
                         pc->data[i].addr
        );
    // %20S:打印20个字符,这里名字是20个字符
    // \t: 使用制表符进行对齐
    // %4d:打印4个整型,这里是年龄
    // “-”号 :左对齐
  }
  printf("\n");
}
//4 . 函数 FindByName() -- 删除指定通讯录成员信息:
int FindByName(const Contact* pc, char name[])
{
  //遍历查找该人坐标:
  int i = 0;
  for (i = 0; i < pc->sz; i++)
  {
    if (strcmp(pc->data[i].name, name) == 0)
      //如果 找到了一个下标元素的name 和 要找的name 一样
    {
      return i; //返回此时找到的下标
    }
  }
  return -1; //未找到则返回-1
}
//5 . 函数 DelContact() --删除指定通讯录成员信息:
void DelContact(Contact* pc)
{
  //断言:
  assert(pc);
  //先判断通讯录是否为空:
  if (pc->sz == 0)
  {
    //为空就没法删除了,直接返回
    printf("通讯录为空,无法删除\n");
    return;
  }
  //创建存放要删除联系人名字的字符数组:
  char name[MAX_NAME] = { 0 };
  //输入并接收删除联系人名字:
  printf("请输入要删除的人名字:>");
  scanf("%s", name);
  //因为在通讯录中查找某人是多个功能所需要的,
  //所以可以将其封装成函数,再调用:
  int del = FindByName(pc, name);
  //如果del为-1,说明未找到:
  if (del == -1)
  {
    printf("要删除的人不存在\n");
    return; //直接返回
  }
  //如果找到了则删除坐标为del的联系人:
  int i = 0;
  for (i = del; i < pc->sz-1; i++)
    //从del下标开始,到倒数第二个元素
  {
    pc->data[i] = pc->data[i + 1];
    //把del后1个元素赋给del,循环覆盖掉del的元素
    //倒数第二个元素+1 为最后一个元素为止
  }
  //删除一个后,将pc指针向前移一位:
  pc->sz--;
  //打印提示:
  printf("成功删除该联系人\n");
}
//6 . 函数 SearchContact() -- 查找指定通讯录成员信息:
void SearchContact(const Contact* pc)
{
  //断言:
  assert(pc);
  //创建存放要查找的联系人名字的字符数组:
  char name[MAX_NAME] = { 0 };
  //输入并接收要查找联系人名字:
  printf("请输入要查找的联系人名字:>");
  scanf("%s", name);
  //使用 FindByName() 函数查找该人在通讯录中的下标:
  int pos = FindByName(pc, name);
  //如果del为-1,说明未找到:
  if (pos == -1)
  {
    printf("要查找的人不存在\n");
    return; //直接返回
  }
  else //找到了则打印该人信息: 
  {
    //打印列标题:
    printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n",
      "名字", "年龄", "性别", "电话", "地址");
    //打印对应信息:
    printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name,
                          pc->data[pos].age,
                          pc->data[pos].sex,
                          pc->data[pos].tele,
                          pc->data[pos].addr);
  }
}
//7 . 函数 ModifyContact() -- 查找指定通讯录成员信息:
void ModifyContact(Contact* pc)
{
  //断言:
  assert(pc);
  //创建存放要修改的联系人名字的字符数组:
  char name[MAX_NAME] = { 0 };
  //输入并接收要修改联系人名字:
  printf("请输入要修改的联系人名字:>");
  scanf("%s", name);
  //使用 FindByName() 函数查找该人在通讯录中的下标:
  int pos = FindByName(pc, name);
  //如果del为-1,说明未找到:
  if (pos == -1)
  {
    printf("要修改的人不存在\n");
    return; //直接返回
  }
  else //找到了则修改该人信息: 
  {
    //名字:
    printf("请输入名字:>");
    //使用 scanf()函数 将信息放进去
    scanf("%s", pc->data[pos].name);
    //年龄:
    printf("请输入年龄:>");
    //使用 scanf()函数 将信息放进去
    scanf("%d", &pc->data[pos].age);
    //性别:
    printf("请输入性别:>");
    //使用 scanf()函数 将信息放进去
    scanf("%s", pc->data[pos].sex);
    //电话:
    printf("请输入电话:>");
    //使用 scanf()函数 将信息放进去
    scanf("%s", pc->data[pos].tele);
    //地址:
    printf("请输入地址:>");
    //使用 scanf()函数 将信息放进去
    scanf("%s", pc->data[pos].addr);
    printf("修改成功\n");
  }
}

(3). test.c文件 -- 测试通讯录:

             

1 . 函数 void menu() -- 打印通讯录菜单:

告知使用者输入对应数字实现对应功能

             

图示:

image.png

2 . 函数 void test() -- 完成通讯录测试:

               

(一).

使用 do while 循环

     打印菜单

             

根据输入的选项判断是否需要再进行服务

可以使用 switch 语句进行筛选判断

图示:            

image.png

(二).

包含<contact.h>头文件

通过结构体 struct contact (Contact),

创建通讯录类型变量 -- con

包含data数组,存放有效的通讯录数据

sz,记录存放数据的个数

创建后还需要初始化

调用 函数InitContact() 进行初始化

参数接收通讯录类型变量的地址 -- &con

图示:                    

image.png

(三).

如果用户输入 1

则调用 函数AddContact()

增加联系人,

参数接收 &con 对通讯录进行对应操作

如果用户输入 2

则调用 函数DelContact()

删除指定通讯录成员,

参数接收 &con 对通讯录进行对应操作

如果用户输入 3

则调用 函数SearchContact()

查找指定联系人信息,

参数接收 &con 对通讯录进行对应操作            

如果用户输入 4

则调用 函数ModifyContact()

修改指定联系人信息,

参数接收 &con 对通讯录进行对应操作

如果用户输入 5

则调用 函数ShowContact()

打印所有联系人信息,

参数接收 &con 对通讯录进行对应操作

如果用户输入 0

打印对应信息退出程序

             

如果用户 输入非法

打印对应信息重新输入

图示:              

image.png

3 . 主函数

               

直接调用 test()测试函数即可

               

图示:

image.png

该文件对应代码:

#define _CRT_SECURE_NO_WARNINGS 1
//test.c文件 -- 测试通讯录:
//包含<contact.h>头文件:
#include "contact.h"
//1 . 函数 void menu() -- 打印通讯录菜单:
void menu()
{
  // 选1:增加联系人   选2:删除联系人
  // 选3:搜索联系人   选4:修改联系人信息
  // 选5:显示所有联系人 选6:对联系人进行排序
  //        选0:退出通讯录
  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");
}
//函数 void test() -- 完成通讯录测试:
void test()
{
  //创建通讯录类型变量:
  Contact con;
  //调用函数初始化通讯录类型变量:
  InitContact(&con);
  int input = 0;//接收输入的数据
  do
  {
    //调用菜单函数打印菜单:
    menu();
    //接收输入数据:
    printf("请选择:>");
    scanf("%d", &input);
    //使用switch语句进行筛选判断:
    switch (input)
    {
    case ADD:
      //如果用户输入1,
      //则调用AddContact()函数
      //添加联系人:
      AddContact(&con);
      //参数接收 &con ,对通讯录进行对应操作
      break;
    case DEL:
      //如果用户输入2,
      //则调用DelContact()函数
      //删除指定联系人:
      DelContact(&con);
      //参数接收 &con ,对通讯录进行对应操作
      break;
    case SEARCH:
      //如果用户输入3,
      //则调用SearchContact()函数
      //查找指定联系人:
      SearchContact(&con);
      //参数接收 &con ,对通讯录进行对应操作
      break;
    case MODIFY:
      //如果用户输入 4 ,
      //则调用ModifyContact()函数
      //修改指定联系人信息
      ModifyContact(&con);
      //参数接收 &con ,对通讯录进行对应操作
      break;
    case SHOW:
      //如果用户输入5,
      //则调用ShowContact()函数
      //打印所有联系人信息:
      ShowContact(&con);
      //参数接收 &con ,对通讯录进行对应操作
      break;
    case SORT:
      //待定
      break;
    case EXIT:
      //如果用户输入0,
      //打印对应信息并退出程序:
      printf("退出通讯录\n");
      break;
    default:
      //如果用户 输入非法,
      //打印对应信息并程序输入:
      printf("选择错误,重新选择\n");
      break;
    }
  } while (input);
  //只要输入数据不为0就继续进行
}
//主函数:
int main()
{
  //调用测试函数进行测试:
  test();
  return;
}

最终实现效果:

fdf1be9cd7724e1bb726fe19ebddc974.png

相关文章
|
6天前
|
C++
C++案例简单通讯录
C++案例简单通讯录
6 0
|
25天前
|
存储 C语言
C语言学习记录——通讯录(动态内存)
C语言学习记录——通讯录(动态内存)
14 0
|
2月前
|
数据管理
【通讯录项目 (3 / 3)】基于顺序表的通讯录实现——通讯录项目实现
通讯录项目我们实现了大部分内容,接下来你可以自行探索,丰富功能。
21 0
|
2月前
|
C语言
【通讯录项目 (2 / 3)】基于顺序表的通讯录实现——顺序表功能实现
顺序表的功能我们已经实现,我们使用的是最简单的顺序表,所以整个过程看起来没有困难。在下一篇文章中我们将进行通讯录的实现。 在通讯录里,顺序表的类型不在是简单的" int ",而是结构体类型。 下面给出通讯录的基本功能供大家参考预习。
24 0
|
2月前
动态通讯录(并不难都能拿下)
动态通讯录(并不难都能拿下)
|
2月前
|
程序员 编译器 C语言
C语言第三十四弹---动态内存管理(下)
C语言第三十四弹---动态内存管理(下)
|
12月前
学C的第三十一天【通讯录的实现】-2
9 . 函数 SearchContact() 的声明 -- 查找指定通讯录成员信息: 参数接收 -- const Contact* pc (只是打印,不用修改所以设置为常量) 返回类型 -- void
|
12月前
学C的第三十一天【通讯录的实现】-1
通讯录需求: 实现一个通讯录, 通讯录中存放保存人的信息: 名字、年龄、性别、 电话、地址 通讯录相关功
|
11月前
手把手教你写通讯录(含动态版) 2
手把手教你写通讯录(含动态版)
|
程序员 编译器 C语言
C语言---认识动态内存管理并实现一个动态通讯录:静态通讯录别来沾边
C语言学习——动态内存管理(上)+优化版通讯录+笔试题