一. 通讯录功能介绍
1.添加联系人
2.删除联系人
3.修改联系人信息
4.查找联系人
5.显示所有联系人信息
6.对通讯录进行排序
0.退出程序
二. 程序文件设计
分三个文件,一个头文件与两个源文件
MaliList.h
——主要用于进行头文件的包含,define定义常量,声明结构体,声明函数
test.c
——用于测试整个程序,实现打印菜单,判断用户输入信息等交互性功能
MailList.c
——用于实现头文件中声明的函数。
二. 各个模块具体实现
2.1 创建联系人类的结构体,创建通讯录类的结构体
联系人结构体成员包含以下几点:1.姓名 2.性别 3. 年龄 4.电话号码 5.家庭住址
通讯录结构体成员包含以下几点:1.联系人结构体类型的数组 2.已经存储的联系人数量
实现代码:
//define 宏定义
#define MAX_DATA 100
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TELE 12
#define MAX_ADDR 30
//创建结构体
//通讯录成员信息
struct Information
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
};
//通讯录
struct MailList
{
struct Information data[MAX_DATA];
int count;
};
2.2 初始化通讯录——InintMailList
实现代码:
//初始化通讯录
void InintMailList(struct MailList* pl);
void InintMailList(struct MailList* pl)
{
assert(pl);
memset(pl, 0, MAX_DATA * sizeof(struct Information) + sizeof(int));
}
利用memset
函数可以很方便地对一块内存空间进行初始化。
MAX_DATA * sizeof(struct Information) + sizeof(int)
这段代码的意思就是初始化内存空间的大小,MAX_DATA*sizeof(struct Information)
代表整个联系人信息数组的大小,即struct Information data[MAX_DATA];
所占空间的大小;sizeof(int)
则代表count
所占内存空间的大小。
2.3 添加联系人模块——AddInformation
实现代码:
//添加联系人
void AddInformation(struct MailList* pl);
void AddInformation(struct MailList* pl)
{
if (pl->count == MAX_DATA)
{
printf("通讯录已满,无法添加联系人\n请删除部分联系人后再进行添加\n");
}
else
{
printf("请输入想要添加的联系人的姓名:>\n");
scanf("%s", pl->data[pl->count].name);
printf("请输入想要添加的联系人的年龄:>\n");
scanf("%d", &pl->data[pl->count].age);
printf("请输入想要添加的联系人的性别:>\n");
scanf("%s", pl->data[pl->count].sex);
printf("请输入想要添加的联系人的电话:>\n");
scanf("%s", pl->data[pl->count].tele);
printf("请输入想要添加的联系人的住址:>\n");
scanf("%s", pl->data[pl->count].addr);
pl->count++;
printf("添加联系人成功!");
}
}
2.4 显示通讯录信息模块——ShowMailList
实现代码:
//显示通讯录信息
void ShowMailList(struct MailList* pl);
void ShowMailList(struct MailList* pl)
{
if (!pl->count)
{
printf("通讯录为空!\n");
}
else
{
printf("%-20s\t%-6s\t%-6s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
for (int i = 0; i < pl->count; i++)
{
printf("%-20s\t%-6s\t%-d\t%-12s\t%-30s\n", pl->data[i].name,
pl->data[i].sex,
pl->data[i].age,
pl->data[i].tele,
pl->data[i].addr);
}
}
}
注意的一点就是print
f函数在打印数据时的对齐
2.5 辅助模块——FindByName
实现代码:
//通过名字查找联系人
static int FindByName(struct MailList* pl, char n[])
{
for (int i = 0; i < pl->count; i++)
{
if (0 == strcmp(pl->data[i].name, n))
{
return i;
}
}
return -1;
}
2.6 查找联系人——SearchInformation
实现代码:
//查找联系人
void SearchInformation(struct MailList* pl);
void SearchInformation(struct MailList* pl)
{
char name[MAX_NAME] = { 0 };
printf("请输入想要查找的联系人的姓名:>\n");
scanf("%s", name);
int ret = FindByName(pl, name);
if (-1 == ret)
{
printf("没找到该联系人!\n");
}
else
{
printf("找到了!\n");
printf("%-20s\t%-6s\t%-6s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-6s\t%-d\t%-12s\t%-30s\n", pl->data[ret].name,
pl->data[ret].sex,
pl->data[ret].age,
pl->data[ret].tele,
pl->data[ret].addr);
}
}
2.7 删除联系人模块——DelInformation
实现代码:
//删除联系人
void DelInformation(struct MailList* pl);
/删除联系人
void DelInformation(struct MailList* pl)
{
char name[MAX_NAME] = { 0 };
printf("请输入想要删除的联系人的名字:>\n");
scanf("%s", name);
int ret = FindByName(pl, name);
if (-1 == ret)
{
printf("没找到该联系人!\n");
}
else
{
for (int i = ret; i < pl->count - 1; i++)
{
pl->data[i] = pl->data[i + 1];
}
pl->count--;
printf("删除成功!\n");
}
}
2.8 修改联系人——ModifyInformation
实现代码:
//修改联系人信息
void ModifyInformation(struct MailList* pl);
void ModifyInformation(struct MailList* pl)
{
char name[MAX_NAME];
printf("请输入想要修改的联系人的姓名:>\n");
scanf("%s", name);
int ret = FindByName(pl, name);
if (-1 == ret)
{
printf("没有找到该联系人!\n");
}
else
{
printf("请输入想要添加的联系人的姓名:>\n");
scanf("%s", pl->data[pl->count].name);
printf("请输入想要添加的联系人的年龄:>\n");
scanf("%d", &pl->data[pl->count].age);
printf("请输入想要添加的联系人的性别:>\n");
scanf("%s", pl->data[pl->count].sex);
printf("请输入想要添加的联系人的电话:>\n");
scanf("%s", pl->data[pl->count].tele);
printf("请输入想要添加的联系人的住址:>\n");
scanf("%s", pl->data[pl->count].addr);
printf("修改联系人成功! \n");
}
}
2.9 排序联系人——SortMailList
通过名字排序
实现代码:
//按名字排序联系人
void SortMailList(struct MailList* pl);
int CmpByName(const void* e1, const void* e2)
{
return strcmp(((struct Information*)e1)->name, ((struct Information*)e2)->name);
}
void SortMailList(struct MailList* pl)
{
printf("排序中...\n");
qsort(pl, pl->count, sizeof(struct Information), CmpByName);
Sleep(3000);
printf("排序完成!\n");
}
三. 整体源代码与程序运行效果
源代码:gitee链接
程序运行效果展示:
这里只展示大概效果吧,具体可以自己测试
总结
本篇博客主要介绍了静态版本的通讯录的简易实现方式。动态版和可以进行文件操作的版本将会在之后的博客中写道。希望对大家有帮助!