新闻资讯

    通讯录

    一. 通讯录功能介绍

    1.添加联系人

    2.删除联系人

    3.修改联系人信息

    4.查找联系人

    5.显示所有联系人信息

    6.对通讯录进行排序

    0.退出程序

    二. 程序文件设计

    分三个文件c语言简单通讯录,一个头文件与两个源文件

    .h——主要用于进行头文件的包含,定义常量,声明结构体,声明函数

    test.c——用于测试整个程序c语言简单通讯录,实现打印菜单,判断用户输入信息等交互性功能

    .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 初始化通讯录——

    实现代码:

    //初始化通讯录
    void InintMailList(struct MailList* pl);
    void InintMailList(struct MailList* pl)
    {
    	assert(pl);
    	memset(pl, 0, MAX_DATA * sizeof(struct Information) + sizeof(int));
    }
    

    利用函数可以很方便地对一块内存空间进行初始化。

    MAX_DATA * sizeof(struct Information) + sizeof(int)
    

    这段代码的意思就是初始化内存空间的大小,*( )代表整个联系人信息数组的大小,即 data[];所占空间的大小;(int)则代表count所占内存空间的大小。

    2.3 添加联系人模块——

    实现代码:

    //添加联系人
    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 显示通讯录信息模块——

    实现代码:

    //显示通讯录信息
    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);
    		}
    	}
    }
    

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

    2.5 辅助模块——

    实现代码:

    //通过名字查找联系人
    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 查找联系人——

    实现代码:

    //查找联系人
    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 删除联系人模块——

    实现代码:

    //删除联系人
    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 修改联系人——

    实现代码:

    //修改联系人信息
    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 排序联系人——通过名字排序

    实现代码:

    //按名字排序联系人
    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链接

    程序运行效果展示:

    这里只展示大概效果吧,具体可以自己测试

    总结

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

网站首页   |    关于我们   |    公司新闻   |    产品方案   |    用户案例   |    售后服务   |    合作伙伴   |    人才招聘   |   

地址:北京市海淀区    电话:010-     邮箱:@126.com

备案号:冀ICP备2024067069号-3 北京科技有限公司版权所有