C语言实现通讯录(静态版)

一. 通讯录功能介绍

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

注意的一点就是printf函数在打印数据时的对齐

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链接
程序运行效果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里只展示大概效果吧,具体可以自己测试

总结

本篇博客主要介绍了静态版本的通讯录的简易实现方式。动态版和可以进行文件操作的版本将会在之后的博客中写道。希望对大家有帮助!

猜你喜欢

转载自blog.csdn.net/m0_72482689/article/details/127051490