通讯录(C语言版)

简介: 通讯录(C语言版)

一、通讯录的概念

通讯录一般指在日常生活中用笔记录,也在手机,电脑,电子字典等电子产品中拥有这个功能。通讯录作为通讯录地址的书本,当今的通讯录可以涵盖多项内容。

二、通讯录制作(静态版)

(1)通讯录准备工作阶段

1.菜单制作界面

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");
}

2. 类型声明

//类型的声明
//设计保存人的信息的这个结构体
typedef struct PeoInfo   
{
  char name[MAX_NAME];
  int age;
  char sex[MAX_SEX];
  char tele[MAX_TELE];
  char addr[MAX_ADDR];
 
}PeoInfo;

3.通讯录的建立

typedef struct Contact
{
  PeoInfo data[MAX];//data要增加sz就加,
  int sz;//data要减少sz减少(两个必定是联动的)
}Contact;

4.初始化通讯录

//初始化通讯录
void InitContact(Contact* pc);

初始化实现

静态版本
void InitContact(Contact* pc)
{
  assert(pc);
  memset(pc->data, 0, sizeof(pc->data));
  pc->sz=0;
}

5.利用枚举来定义

enum OPTION
{
EXIT,//默认0开始
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};

枚举用于:对于用户使用会更加的方便简洁

do 
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case ADD:
      AddContact(&con);
      break;
    case DEL:
      DelContact(&con);
      break;
    case SEARCH:
      SerchContact(&con);
      break;
    case MODIFY:
      ModifyContact(&con);
      break;
    case SHOW:
      ShowContact(&con);
      break;
    case SORT:
      //SortContact(&con);
      break;
    case EXIT:
      //释放通讯录
      DestroyContact(&con);
      printf("退出通讯录");
      break;
    default:
      printf("选择错误,重新选择");
      break;
    }
  } while (input);
}

(2)功能的实现

1.增加联系人

函数声明:

//增加联系人
void AddContact(Contact* pc);

增加联系人的实现:

静态版本
void AddContact(Contact* pc)
{
  assert(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);
 
  pc->sz++;
  printf("成功输入联系人\n");
  
}

成果展示:

2.显示联系人信息

函数声明:

//显示所有联系人的信息
void ShowContact(const Contact* pc);

显示所以联系人的信息实现:

void ShowContact(const Contact* pc)
{
  int i = 0;
  //打印列标题
  printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
  //打印数据
  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);
  }
}

成果展示:

3.删除指定联系人

函数声明:

//删除指定联系人
void DelContact( Contact* pc);

删除指定联系人实现:

void DelContact(Contact* pc)
{
  if (pc->sz == 0)
  {
    printf("通讯录为空,无法删除\n");
    return;
  }
  char name[MAX_NAME] = { 0 };
  assert(pc);
  //删除
  printf("请输入要删除的人的名字:>");
  scanf("%s", name);
  找到要删除的人
  //int i = 0;
  //int del = 0;
  //int flag = 0;
  //for (i = 0;i < pc->sz;i++)
  //{
  //  //pc->data[i].name==name这样不能比较是错误的
  //  if (strcmp(pc->data[i].name, name) == 0)
  //  {
  //    del = i;
  //    flag = 1;
  //    break;
  //  }
  //}
  //if (flag == 0)
  //{
  //  printf("要删除的人不存在\n");
  //  return;
  //}
  // 
 int del=FindByName(pc, name);
 if (del == -1)
 {
   printf("要删除的人不存在\n");
   return;
 }
 int i = 0;
 
  //删除坐标为del的联系人
  for (i = del;i < pc->sz - 1;i++)
  {
    pc->data[i] = pc->data[i + 1];
  }
  pc->sz--;
  printf("成功删除联系人\n");
 
}

成果展示:

4.查找指定联系人

函数声明:

//查找指定联系人
void SerchContact(const Contact* pc);

查找指定联系人实现:

void SerchContact(const Contact* pc)
{
  assert(pc);
  char name[MAX_NAME] = { 0 };
 
  printf("请输入要查找的人的名字:>");
  scanf("%s", name);
  int pos = FindByName(pc, name);//pos=position
  if (pos == -1)
  {
    printf("要查找的人不存在\n");
  }
  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);
 
  }
}

5.修改指定联系人

函数声明:

//修改指定联系人
void ModifyContact(Contact* pc);

函数实现:

void ModifyContact(Contact* pc)
{
  assert(pc);
  char name[MAX_NAME] = { 0 };
  printf("请输入要修改的人的名字:>");
  scanf("%s", name);
  int pos = FindByName(pc, name);//pos=position
  if (pos == -1)
  {
    printf("要修改的人不存在\n");
  }
  else 
  {
    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");
  }
}

6.释放通讯录

函数声明:

void DestroyContact(Contact * pc);

函数实现:

void DestroyContact(Contact* pc)
{
  free(pc->data);
  pc->data = NULL;
  pc->capacity = 0;
  pc->sz = 0;
}

三、通讯录制作(动态版)

1.结构体优化

//动态版本
typedef struct Contact
{
  PeoInfo *data;//指向了存放数据的空间
  int sz;//记录当前放的有效元素个数
  int capacity;//通讯录当前的最大容量
}Contact;

2.初始化

//动态版本
void InitContact(Contact* pc)
{
  assert(pc);
  pc->data = (PeoInfo*)malloc(DEFAUL_SZ *sizeof(PeoInfo));
  if (pc->data == NULL)
  {
    perror("InitContact");
    return;
  }
    pc->sz = 0;
    pc->capacity = DEFAUL_SZ;
}

3.增加联系人+增容(优化)

//动态版本
int CheckCapacity(Contact* pc) 
{
  if (pc->sz == pc->capacity)
    {
    PeoInfo* ptr=(PeoInfo*)realloc(pc->data,( pc->capacity + INC_SZ)* sizeof(PeoInfo));
    if (ptr == NULL)
    {
      perror("CheckCapacity");
      return 0;
    }
    else
    {
      pc->data = ptr;
      pc->capacity += INC_SZ;
      printf("增容成功\n");
      return 1;
      
    }
    }
  return 1;
}
void AddContact(Contact* pc)
{
  assert(pc);
  
  if (0==CheckCapacity(pc))
  {
    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);
 
  pc->sz++;
  printf("成功输入联系人\n");
 
}

四、总代码

1.Contact.h

#pragma once
#include<string.h>
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
#define DEFAUL_SZ 3
#define INC_SZ 2
enum OPTION
{
EXIT,//默认0开始
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};
 
 
//类型的声明
//设计保存人的信息的这个结构体
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];//data要增加sz就加,
//  int sz;//data要减少sz减少(两个必定是联动的)
//}Contact;
//动态版本
typedef struct Contact
{
  PeoInfo *data;//指向了存放数据的空间
  int sz;//记录当前放的有效元素个数
  int capacity;//通讯录当前的最大容量
}Contact;
 
//函数声明
 
//初始化通讯录
void InitContact(Contact* pc);
//增加联系人
void AddContact(Contact* pc);
 
//显示所以联系人的信息
void ShowContact(const Contact* pc);
//删除指定联系人
void DelContact( Contact* pc);
//查找指定联系人
void SerchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//
void DestroyContact(Contact * pc);

2.Contact.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//静态版本
//void InitContact(Contact* pc)
//{
//  assert(pc);
//  memset(pc->data, 0, sizeof(pc->data));
//  pc->sz=0;
//}
//动态版本
void InitContact(Contact* pc)
{
  assert(pc);
  pc->data = (PeoInfo*)malloc(DEFAUL_SZ *sizeof(PeoInfo));
  if (pc->data == NULL)
  {
    perror("InitContact");
    return;
  }
    pc->sz = 0;
    pc->capacity = DEFAUL_SZ;
}
//静态版本
//void AddContact(Contact* pc)
//{
//  assert(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);
//
//  pc->sz++;
//  printf("成功输入联系人\n");
//  
//}
 
 
//动态版本
int CheckCapacity(Contact* pc) 
{
  if (pc->sz == pc->capacity)
    {
    PeoInfo* ptr=(PeoInfo*)realloc(pc->data,( pc->capacity + INC_SZ)* sizeof(PeoInfo));
    if (ptr == NULL)
    {
      perror("CheckCapacity");
      return 0;
    }
    else
    {
      pc->data = ptr;
      pc->capacity += INC_SZ;
      printf("增容成功\n");
      return 1;
      
    }
    }
  return 1;
}
void AddContact(Contact* pc)
{
  assert(pc);
  
  if (0==CheckCapacity(pc))
  {
    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);
 
  pc->sz++;
  printf("成功输入联系人\n");
 
}
 
void ShowContact(const Contact* pc)
{
  int i = 0;
  //打印列标题
  printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
  //打印数据
  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);
  }
}
 
int FindByName(const Contact*pc,char name[])
{
  int i = 0;
  for (i = 0;i < pc->sz;i++)
  {
    //pc->data[i].name==name这样不能比较是错误的
    if (strcmp(pc->data[i].name, name) == 0)
    {
      
      return 1;//找到了
    }
  }
  return -1;//找不到
}
 
void DelContact(Contact* pc)
{
  if (pc->sz == 0)
  {
    printf("通讯录为空,无法删除\n");
    return;
  }
  char name[MAX_NAME] = { 0 };
  assert(pc);
  //删除
  printf("请输入要删除的人的名字:>");
  scanf("%s", name);
  找到要删除的人
  //int i = 0;
  //int del = 0;
  //int flag = 0;
  //for (i = 0;i < pc->sz;i++)
  //{
  //  //pc->data[i].name==name这样不能比较是错误的
  //  if (strcmp(pc->data[i].name, name) == 0)
  //  {
  //    del = i;
  //    flag = 1;
  //    break;
  //  }
  //}
  //if (flag == 0)
  //{
  //  printf("要删除的人不存在\n");
  //  return;
  //}
  // 
 int del=FindByName(pc, name);
 if (del == -1)
 {
   printf("要删除的人不存在\n");
   return;
 }
 int i = 0;
 
  //删除坐标为del的联系人
  for (i = del;i < pc->sz - 1;i++)
  {
    pc->data[i] = pc->data[i + 1];
  }
  pc->sz--;
  printf("成功删除联系人\n");
 
}
void SerchContact(const Contact* pc)
{
  assert(pc);
  char name[MAX_NAME] = { 0 };
 
  printf("请输入要查找的人的名字:>");
  scanf("%s", name);
  int pos = FindByName(pc, name);//pos=position
  if (pos == -1)
  {
    printf("要查找的人不存在\n");
  }
  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);
 
  }
}
void ModifyContact(Contact* pc)
{
  assert(pc);
  char name[MAX_NAME] = { 0 };
  printf("请输入要修改的人的名字:>");
  scanf("%s", name);
  int pos = FindByName(pc, name);//pos=position
  if (pos == -1)
  {
    printf("要修改的人不存在\n");
  }
  else 
  {
    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");
  }
}
 
void DestroyContact(Contact* pc)
{
  free(pc->data);
  pc->data = NULL;
  pc->capacity = 0;
  pc->sz = 0;
}

3.test.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Contact.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");
}
 
void test()
{
  int input = 0;
  //首先要有通讯录
  Contact con;
  //封装一个函数,把通讯录初始化一下
  InitContact(&con);
  do 
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case ADD:
      AddContact(&con);
      break;
    case DEL:
      DelContact(&con);
      break;
    case SEARCH:
      SerchContact(&con);
      break;
    case MODIFY:
      ModifyContact(&con);
      break;
    case SHOW:
      ShowContact(&con);
      break;
    case SORT:
      //SortContact(&con);
      break;
    case EXIT:
      //释放通讯录
      DestroyContact(&con);
      printf("退出通讯录");
      break;
    default:
      printf("选择错误,重新选择");
      break;
    }
  } while (input);
}
 
int main()
{
  test();
  return 0;
 
}

❤️结语:

本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,蜗牛必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!

相关文章
|
2月前
|
C语言
用c语言实现一个通讯录
用c语言实现一个通讯录
10 0
|
2月前
|
存储 C语言
C语言详解【通讯录的实现】
C语言详解【通讯录的实现】
|
4月前
|
存储 XML JSON
【C语言-通讯录的分析与实现】
我们以手机里面的通讯录为例,说明通讯录主要有以下什么功能,我们先用一张简单的图来说明一下
22 0
|
5月前
|
C语言
C语言实现通讯录--动态版
C语言实现通讯录--动态版
35 0
|
4月前
|
C语言
【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化
动态内存管理的函数有:malloc,calloc,ralloc,free,本文讲解动态内存函数和使用,如何进行动态内存管理,实现通讯录联系人容量的动态化,对常见动态内存错误进行总结。
35 0
|
5天前
|
存储 算法 C语言
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
|
2月前
|
程序员 C语言
【C语言实战项目】通讯录(动态增容版)
【C语言实战项目】通讯录(动态增容版)
21 0
|
2月前
|
存储 编译器 C语言
【C语言实战项目】通讯录
【C语言实战项目】通讯录
28 0
|
6月前
|
文件存储 C语言
【C语言】通讯录系统实现 (保姆级教程,附源码)
【C语言】通讯录系统实现 (保姆级教程,附源码)
164 0
|
2月前
|
C语言
【C语言】通讯录实现(下)
【C语言】通讯录实现(下)