C语言实现通讯录 (附完整代码) 1

简介: C语言实现通讯录 (附完整代码)

🍀实现一个通讯录:

通讯录中保存人的信息:

名字
年龄
性别
电话
住址

🍀通讯录的功能:

1.通讯录可以存放100个人的信息
2.显示所有联系人的信息
3.排序功能
4.增:增加联系人
5.删:删除指定联系人
6.查:查找指定联系人
7.改:修改指定联系人

🍀多文件实现

test.c 测试通讯录
contact.h 函数和类型的声明
contact.c 函数的实现

💮设计结构体——保存人的信息

初级:

struct PeoInfo
{
  char name[20];
  int age;
  char sex[5];//一个汉字占两个字符
  char tele[12];
  char addr[30];
};

结构体的引用:

struct PeoInfo num1 ;
struct PeoInfo num2;
struct PeoInfo data[50];

改进:

考虑到每次使用结构体都需要写 struct PeoInfo比较繁琐,能不能直接把struct自己省略掉呢?

这时候就需要对改结构体进行重命名typedef

typedef struct PeoInfo
{
  char name[20];
  int age;
  char sex[5];
  char tele[12];
  char addr[30];
}PeoInfo;

这样,当我们使用结构体时,就不用用 struct PeoInfo了,直接使用PeoInfo就可以了。

💮初始通讯录

因为我们刚刚定义了结构体用来存储人的信息,但一个通讯录中有很多人,我们上面设置了该通讯录可以存放100个人的信息,所以我们需要用结构体数组将每一个类型都是结构体的元素存储起来。

C语言定义结构体数组一般形式:

结构体类型 数组名[数组长度];

所以我们定义 通讯录:

PeoInfo data[100];

同时,我们需要一个变量,来判断通讯录里已经存放数据的个数。(以防止在增添联系人时,超过了定义的通讯录的最大容量)

int sz=0;

💮封装通讯录

在上面考虑到通讯录PeoInfo data[100]和变量 sz是一种封锁的关系。即,sz等于几,PeoInfo data里面就有几个数据元素。sz加1,则PeoInfo data数组里会再存放一个元素。

所以,我们考虑将通讯录进行进一步的封装,构建一个结构体

typedef struct Contact
{
  PeoInfo data[100];
  int sz;
}Contact;

这时,我们的通讯录就为 con

Contact con;

💮define宏定义修改通讯录的最大容量

同样我们也可以对 我们刚开始定义的 姓名、地址、联系方式等 以同样的宏定义进行转变。

初始化通讯录

将通讯录初始化为0。可以定义一个函数,用来初始化通讯录。

void InitContact(Contact* pc)
{
  memset(pc->data, 0, sizeof(pc->data);
  pc->sz = 0;
}

因为我们要改变通讯录的内部,所以函数参数是一个地址值,类型是我们定义的通讯录结构体 Contact类型。

利用memset函数,将结构体中数组所有元素全部赋值为0.同时将pc所指向的sz也初始化为0.

void InitContact(Contact* pc)
{
  memset(pc->data, 0, sizeof(pc->data);
  pc->sz = 0;
}

💐💐大致框架

接下来,我们在void test ()函数中写一下大概的框架:

(因为要尽可能避免在主函数中太过冗长,所以我们把通讯录的具体实现——增删查找等等都放在test函数中,之后我们就只需要在主函数中进行调用即可。)

首先,我们可以用do...while循环 打印一个菜单。

定义一个函数 void menu()完成打印。在()函数中调用即可。

之后我们利用switch,对输入的input进行判断,进行相应的操作。对于下面的七种情况,我们可以写七个函数分别实现其相应的功能。

我们进行的所有操作都是对于通讯录而言的,所以在test函数中必须有通讯录。所以我们将我们已经初始化的通讯录放在函数中。

不要忘了包含头文件contact.h

(在contact.h头文件中,包含着本身已经封装好的常见的头文件 比如 等,还有我们自己对于结构体或者函数的一些声明和定义,比如定义人的信息的结构体 PeoInfo、定义通讯录的 Contact,以及我们函数的声明,完成Contact初始化的函数InitContact等,还有之后,我们要对通讯录进行操作的一系列增删查找函数等函数的声明都会放在都文件中。)

(要注意,函数的定义不是放在头文件中的,而是在contat.c中)

💐改进–枚举 提高代码的可读性

🌼🌼定义函数实现功能

🌼AddContact

//增加联系人的信息
void AddContact(Contact* pc)
{
  //判断数组是否可以增添?
  if (pc->sz == 100)
  {
    printf("通讯录已满,无法添加\n");
    return;
  }
  //通讯录没满
  else
  {
    printf("请输入名字:>");
    scanf("%s", pc->data[pc->sz].name);//pc->data 指向的是结构体数组 数组名本身就是地址,不用用取地址符号
    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("增加联系人成功!");
  }
}


相关文章
|
2月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
64 4
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
2月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
76 1
|
3月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
3月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
3月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
46 2
|
4月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
72 4
|
3月前
|
C语言
C语言练习题代码
C语言练习题代码