实现一个通讯录,要记录一个人的信息,而人是一个复杂对象
人的信息:名字、年龄、性别、电话、地址等。
可以用结构体把人的信息都包含在一起封装一个结构体类型
通讯录的功能有7种:
test.c
测试功能contact.c
通讯录功能的实现contact.h
类型的声明第一步是封装一个人的信息的结构体类型
由于封装的结构体类型的名字太长,总是写的话感觉太麻烦了
对 struct PeoInfo
进行了typdef
类型重命名
struct PeoInfp
改成 PeoInfp
//人的信息
typedef struct PeoInfo
{
char name[20]; //名字
int age; //年龄
char sex[10]; //性别
char tele[13];//电话
char addr[30];//地址
}PeoInfo;
上面定义好结构体类型后,还要创建框架,就和猜数字游戏、扫雷一样,之后定义变量开辟通讯录所需空间
之后如果对通讯录进行增加联系人、删除指定联系人、查找联系人等等各种操作时候
通讯录的人的信息和个数都在发生变化,就需要一个变量来记录通讯录里有多少个人的信息
PeoInfo data[100]
和 count
二个变量加起来才能维护通讯录
PeoInfo data[100]
增加一个人的信息后,那 count
是不是也要能这变PeoInfo data[100]
和 count
封装进一个结构体里呢就有了下面的写法:
把PeoInfo data[100]
和 count
整合到一起,以后修改和找起来就更加的方便一些
由于封装的结构体类型的名字太长,总是写的话感觉太麻烦了
对 struct Contact
进行了typdef
类型重命名
struct Contact
改成Contact
// 通讯录
typedef struct Contact
{
PeoInfo data[100];//存放人的信息
int count;//记录通讯录中人信息的个数
}Contact;
如果要进行初始化,就先定义通讯录
contact.h
文件里进行类型的声明,然后再contact.c
文件里实现Contact
是类型memset
函数进行初始化,memset
是内存设置//初始化通讯录
void InitContact(Contact* pc)
{
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
}
以上就把所有的空间初始化为 0 了
初始化的部分就完成了
上面通过函数传址的方式,把地址传给了 pc
变量,相当于 pc
指向了通讯录中下标为count
的地址
下一步是增加联系人的信息,而增加联系人的前提条件是通讯录的空间没满,满了就增加不了,直接返回(return
)
所以要先加上一个判断
MAX 是#define 定义的全局变量为100
通讯录的空间没有超过100,就进行下一步,增加联系人信息
con
里 data
的数组,下标为 count
的位置pc->data[pc->count].name
pc->data
是指向数组pc->count
是代表数组的下标 . name
是指向结构体的成员,而name
是代表数组首元素的地址,所以不用 &
整形变量
,所以要进行 &
操作&
count
要++
增加成功后,接下来就是显示打印,看打印的数值是否正确
还是以函数的方式进行实现
打印信息,就是打印 count 个人的信息,直接用 for
循环打印
\t
是水平制表
void ShowContact(const Contact* pc)
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count; i++)
{
printf("%20s\t%3d\t%5s\t%13s\t%30s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
上面打印时,没有标题,不太好理解
下面就是在输出的前一行增加标题
如果想把格式进行左对齐,就在输入格式的前面加上 -
号
显示打印的信息:
增加联系人有了,那接下来就是删除联系人了,
FindByName
)。需要传二个参数(通讯录、要查找的参数)int FindByName(Contact* pc, char name[])
{
assert(pc);
int i = 0;
for (i