文章目录
一、总体设计思路
1、设计背景
在前面的文章中我们依次学习了结构体、动态内存管理以及文件操作的相关知识,所以我们今天可以分别来编写静态版、动态版和文件版的通讯录,用于对已学知识的应用与巩固,和对我们前面学习效果的检测。
2、设计框架
与正常的项目设计一样,我们把程序封装在三个文件中:
test.c:通讯录的总体逻辑,主要用于对通讯录各功能的测试;
contact.c:通讯录各种功能的具体实现;
contact.h:各种必要的声明,包括库函数头文件的声明、自定义结构的声明以及自定义函数的声明;
3、功能概述
我们这里设计的通讯录应包含如下功能:
静态版:通讯录内部联系人的增删查改、对联系人按姓名进行排序、显示通讯录中所有联系人、清空通讯录、退出通讯录;
动态版:动态版的通讯录与静态版通讯录功能一样,但是内部实现由固定大小改为动态增容;
文件版:文件版的通讯录与动态版功能与实现方式一样,但是会在程序退出时把联系人信息保存在文件中,在程序运行时把文件中的联系人信息加载到通讯录中;
二、通讯录(静态版)
1、结构体设计
这里我们设计两个结构体:一个用于管理联系人的各种属性,比如姓名、年龄、性别、电话号码、住址;另一个结构体用于管理通讯录,它由一个联系人结构体数组加上一个记录联系人数量的变量构成;由于我们这里设计的是静态版的通讯录,所以联系人结构体数组的大小是固定的。
#define MAX 100 //联系人的最大数量
#define MAX_NAME 20 //宏定义各种联系人信息变量的大小,方便以后修改
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
//联系人信息结构体
typedef struct PeoInfo {
char name[MAX_NAME]; //姓名
char sex[MAX_SEX]; //性别
int age; //年龄
char tele[MAX_TELE]; //电话
char addr[MAX_ADDR]; //住址
}PeoInfo; //结构体重命名
//通讯录结构体
typedef struct Contact {
PeoInfo date[MAX]; //储存联系人信息(固定大小)
int count; //记录实际联系人数量
}Contact;
2、初始化通讯录
我们可以使用前面学习的 memset 函数来吧通讯录中存放联系人信息的数组的内容全部初始化为0,然后再把用于记录实际联系人数量的变量置为0,完成通讯录得初始化。
void InitContact(Contact* pc) //初始化通讯录
{
assert(pc);
memset(pc->date, 0, sizeof(pc->date)); //通讯录里面的信息全部初始化为0
pc->count = 0;
}
3、添加联系人信息
这里由于通讯录大小是固定的,所以我们在添加联系人的时候要注意检查通讯录是否已满,如果没满才能正常添加,满了就打印提示信息并直接 return。
void AddPeoInfo(Contact* pc) //添加联系人信息
{
assert(pc);
if (pc->count == MAX) //检查通讯录是否满了
{
printf("通讯录已满,无法添加联系人
");
return;
}
else
{
printf("请输入姓名:>");
scanf("%s", pc->date[pc->count].name);
printf("请输入性别:>");
scanf("%s", pc->date[pc->count].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->date[pc->count].age));
printf("请输入电话:>");
scanf("%s", pc->date[pc->count].tele);
printf("请输入住址:>");
scanf("%s", pc->date[pc->count].addr);
pc->count++; //联系人数量++
printf("添加联系人成功
");
}
}
4、删除联系人信息
这里有两个需要注意的地方:一是需要检查通讯录是否为空,如果为空提示后直接返回;二是我们要检查我们希望删除的这个人是否存在,所以我们需要设计一个find函数来查找联系人,根据find函数的结果来进行后续操作。
void DeletePeoInfo(Contact* pc) //删除联系人信息
{
assert(pc);
if (pc->count == 0) //通讯录为空直接返回
{
printf("通讯录为空
");
return;
}
else
{
char name[MAX_NAME];
printf("请输入要删除的联系人的姓名:>");
scanf("%s", &name);
int pos = find_by_name(pc, name); //检查通讯录中是否有该联系人
if (pos == -1)
{
printf("该联系人不存在
");