C语言 静态通讯录实现

简介: C语言 静态通讯录实现

前言:

通讯录想必大家熟知,主要功能就是保存用户的信息,这期博客跟着我用 C语言 写一个简单的通讯录,其逻辑类似于往期的猜数字游戏,让我们开始吧 。


通讯录的要求:

1.能录入联系人的信息:姓名+年龄+性别+地址+电话号码;

2.最多存放 100 个人的信息;

3.其他功能:

       ⑴ 增加联系人

       ⑵ 删除指定联系人

       ⑶ 查找指定联系人信息

       ⑷ 修改指定联系人信息

       ⑸ 展示所有联系人信息

       ⑹ 排序


按照惯例,先进行代码分块:

test.c        --- 测试通讯录(main函数所在)

contact.c   --- 通讯录实现

contact.h   --- 函数声明


1.整体框架


#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
  printf("***************************\n");
  printf("**  1.Add      2.Delete  **\n");
  printf("**  3.Search   4.Modify  **\n");
  printf("**  5.Show     6.Sort    **\n");
  printf("**        0.Exit         **\n");
  printf("***************************\n");
}
int main()
{
  int input = 0;
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      break;
    case 2:
      break;
    case 3:
      break;
    case 4:
      break;
    case 5:
      break;
    case 6:
      break;
    case 0:
      printf("已退出通讯录\n");
      break;
    }
  } while (input);
  return 0;
}

是不是很熟悉呀?

没错,框架与往期 猜数字游戏三子棋游戏 极其类似。


2.创建通讯录


一个通讯录包含联系人信息已包含的联系人个数,这可以作为一个结构体:

//contact.h
typedef struct Contact
{
  PeoInform data[100];//存放的联系人
  int sz;//当前已经存放的联系人个数
}Contact;

联系人需要 姓名+年龄+性别+地址+电话号码 的参数,那我们又可以把它作为一个结构体

//contact.h
typedef struct PeoInform
{
  char name[20];
  int age;
  char sex[5];
  char addr[30];
  char tele[12];
}PeoInform;


3.通讯录的初始化


封装一个初始化函数:

//test.c
Init_Contact(&con); //传地址,防止占用过大内存

memset 函数进行初始化:

//contact.c
void Init_Contact(Contact* pc)
{
  pc->sz = 0;
  memset(pc->data, 0, sizeof(pc->data));
}


4.添加联系人


上来先要判断成员是否填满:

接下来就是提示和输入了。

//contact.c
void Add_Contact(Contact* pc)
{
  if (pc->sz == 100)
  {
    printf("联系人已满,无法添加\n");
  }
  else
  {
    printf("请输入名字:>\n");
    scanf("%s", pc->data[pc->sz].name);
    printf("请输入年龄:>\n");
    scanf("%d", &(pc->data[pc->sz].age));//因成员age是整型,所以需要取地址。
    printf("请输入性别:>\n");
    scanf("%s", pc->data[pc->sz].sex);
    printf("请输入地址:>\n");
    scanf("%s", pc->data[pc->sz].addr);
    printf("请输入电话:>\n");
    scanf("%s", pc->data[pc->sz].tele);
    pc->sz++;
  }
}


5.查找联系人


我们按照名字查找联系人,

用名称查找函数接收返回值并进行判断,

若找不到,直接返回并提示,

若能找到,打印出找到的联系人信息。

//contact.c
void Search_Contact(const Contact* pc)
{
  assert(pc);
  char name[100] = { 0 };
  printf("请输入要查找联系人的姓名:>");
  scanf("%s", name);
  int pos = Sear_Byname(pc, name);
  if (-1 == pos)
  {
    printf("未找到该联系人\n");
    return;
  }
  printf("%-10s\t%-4d\t%-5s\t%-20s\t-12%s\n", pc->data[pos].name,
    pc->data[pos].age,
    pc->data[pos].sex,
    pc->data[pos].addr,
    pc->data[pos].tele);
}

切记,判断字符串是否相等要用strcmp 函数

int Sear_Byname(const Contact* pc, char name[])
{
  assert(pc);
  int i = 0;
  for (i = 0; i < pc->sz; i++)
  {
    if (strcmp(pc->data[i].name, name) == 0)
    {
      return i;
    }
    else
      return -1;
  }
}


6.展示所有联系人


存放了联系人,可以看看所有联系人:

//contact.c
void Show_Contact(Contact* pc)
{
  assert(pc);
  printf("%-10s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
  int i = 0;
  for (i = 0; i < pc->sz; i++)
  {
    printf("%-10s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
                   pc->data[i].age,
                   pc->data[i].sex,
                   pc->data[i].addr,
                   pc->data[i].tele);
  }
}

打印的时候,可以在 % 与 s(或其他) 之间加入固定数值以对齐

(负数左对齐,正数右对齐)


7.删除联系人


要删除联系人,其实就是要删除的联系人被它之后的联系人覆盖而已;

依次覆盖,用循环来实现:

//contact.c
void Dele_Contact(Contact* pc)
{
  assert(pc);
  char name[100] = { 0 };
  if (pc->sz == 0)
  {
    printf("通讯录空,无法删除\n");
    return;
  }
  //删除
  //找到要删除的人
  printf("请输入要删除人的名字:>");
  scanf("%s", name);
  int ret = Sear_Byname(pc, name);
  if (-1 == ret)
  {
    printf("要删除的人不存在\n");
    return;
  }
  int i = 0;
  //删除
  for (i = ret; i < pc->sz - 1; i++)
  {
    pc->data[i] = pc->data[i + 1];
  }
  pc->sz--;  //总数减少,莫忘记
  printf("删除成功\n");
}


8.修改联系人


这一部分与查找联系人类似

//contact.c
void Modi_Contact(Contact* pc)
{
  assert(pc);
  char name[100] = { 0 };
  printf("请输入要修改人的名字:>");
  scanf("%s", name);
  int pos = Sear_Byname(pc, name);
  if (-1 == pos)
  {
    printf("要修改的人不存在\n");
    return;
  }
  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].addr);
  printf("请输入电话:>");
  scanf("%s", pc->data[pos].tele);
  printf("修改完成\n");
}

总结:

静态通讯录的逻辑与之前的小游戏是十分类似的,写到这里,我们会发现,每次重启程序,储存的联系人信息都消失了,这也是取名静态的原因,下一期通讯录会升级为动态通讯录,期待吧 ~

目录
相关文章
|
1月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
19 2
|
1月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
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
|
5月前
|
存储 人机交互 C语言
【C语言项目实战】使用单链表实现通讯录
【C语言项目实战】使用单链表实现通讯录
|
5月前
|
存储 C语言
C语言学习记录——通讯录(动态内存)
C语言学习记录——通讯录(动态内存)
32 0
|
6月前
|
存储 C语言
动态+静态+文件操作 C语言实现通讯录
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
37 0