通讯录的实现(详解)

本篇博客将为大家带来通讯录的实现!!!

目录

通讯录的基本介绍:

 通讯录的实现过程:

1.设计通讯录的目录

2.基础菜单的实现:

3.定义人的信息

4.定义通讯录的信息

5.创建通讯录并且初始化

6.添加联系人的信息

7.显示通讯录的信息

8.删除联系人的信息

9.查找联系人的信息

10.修改联系人的信息

11.排序联系人的信息—按名字排序

完整代码展现:

test.c:

contact.c:

contact.h:

结语:


通讯录的基本介绍:

记录一个人的基本信息,并且需要它可以实现增删查改等功能;

可以保存100个人的信息                                    人的信息:

        1.添加联系人信息;                                    名字

        2.删除联系人信息;                                    年龄

        3.查找联系人信息;                                    性别

        4.修改联系人信息;                                    电话

        5.显示联系人信息;                                    地址

        6.排序联系人信息;

        0.退出程序 

     


 通讯录的实现过程:

建议:实现之前我们可以分成三个模块

test.c用于专门测试通讯录功能

contact.c用于实现通讯录具体功能

contact.h用于实现接口的声明

1.设计通讯录的目录

void menu()
{
	printf("******************************************\n");
	printf("*****      1.add          2.del       ****\n");
	printf("*****      3.search       4.modify    ****\n");
	printf("*****      5.show         6.sort      ****\n");
	printf("*****            0.  exit             ****\n");
	printf("******************************************\n");

}

2.基础菜单的实现:

#include <stdio.h>
void menu()
{
	printf("******************************************\n");
	printf("*****      1.add          2.del       ****\n");
	printf("*****      3.search       4.modify    ****\n");
	printf("*****      5.show         6.sort      ****\n");
	printf("*****            0.  exit             ****\n");
	printf("******************************************\n");

}
enum
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			break;
		case DEL:
			break;
		case SEARCH:
			break;
		case MODIFY:
			break;
		case SHOW:
			break;
		case SORT:
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

3.定义人的信息

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30



//定义人的信息
typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

4.定义通讯录的信息

#define MAX 100
typedef struct Contact
{
	PeoInfo data[MAX];//存放数据
	int sz;//记录的时当前通讯录中存放的人的信息个数
}Contact;

5.创建通讯录并且初始化

通讯录的信息已经在contact.h定义好,我们需要在test.c创建并且给它初始化

void InitContact(Contact* con)
{
    assert(con);
	con->sz = 0;
	memset(con->data, 0, sizeof(con->data));

}

 现在已经全部初始化为0 如果不初始化将会是随机值

注:实现过程都是在contact.c中的文件实现

6.添加联系人的信息

void ADDContact(Contact* con)
{
	assert(con);
	//判断一下通讯录是否满了
	if (con->sz == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return ;
	}
	printf("请输入联系人名字\n");
	scanf("%s", con->data->name);
	printf("请输入联系人年龄\n");
	scanf("%d", &(con->data->age));
	printf("请输入联系人性别\n");
	scanf("%s", con->data->sex);
	printf("请输入联系人电话\n");
	scanf("%s", con->data->tele);
	printf("请输入联系人地址\n");
	scanf("%s", con->data->addr);
	
	con->sz++;
	printf("添加完成\n");

}

7.显示通讯录的信息

既然已经完成了添加联系人的信息了,我们可以显示一下到底输入了什么

void SHOWContact(Contact* con)
{
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录无内容\n");
		return;
	}
	printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	int i;
	for (i = 0; i < con->sz; i++)
	{
		printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name, 
			                      con->data[i].age,
			                      con->data[i].sex, 
			                      con->data[i].tele,
			                      con->data[i].addr);
	}

}

8.删除联系人的信息

int Fing_by_name(Contact* con, char* name)
{
	assert(con);
	int i;
	for (i = 0; i < con->sz; i++)
	{
		if (strcmp(con->data[i].name, name) == 0)
		{
			return i;

		}
	}
	return -1;
}

void DELContact(Contact* con)
{
	char name[NAME_MAX];
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return ;
	}
	printf("请输入你想删除联系人的名字:\n");
	scanf("%s", name);
	// 查找通讯录里有没有该名字
	int ret=Fing_by_name(con, name);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
		return ;
	}
	//否则返回他的下标  
	//思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可
	int i;
	for (i = ret; i < con->sz - 1; i++)
	{
		con->data[i] = con->data[i + 1];
	}
	con->sz--;
	printf("删除成功\n");
}

不懂的可以看里面的注释,这个先要写一个查找函数,在删除

9.查找联系人的信息

void SEARCHContact(Contact* con)
{

	char name[NAME_MAX];
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录为空,无法查找\n");
		return;
	}
	printf("请输入你想查找联系人的名字:\n");
	scanf("%s", name);
	int ret = Fing_by_name(con, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,
		con->data[ret].age,
		con->data[ret].sex,
		con->data[ret].tele,
		con->data[ret].addr);
}

思路很简单了 ,先查找出来 再打印出来

10.修改联系人的信息

void MODIFYContact(Contact* con)
{
	char name[NAME_MAX];
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录为空,无法修改\n");
		return;
	}
	printf("请输入你想修改联系人的名字:\n");
	scanf("%s", name);
	int ret = Fing_by_name(con, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("请输入联系人名字:");
	scanf("%s", con->data[ret].name);
	printf("请输入联系人年龄:");
	scanf("%d", &(con->data[ret].age));
	printf("请输入联系人性别:");
	scanf("%s", con->data[ret].sex);
	printf("请输入联系人电话:");
	scanf("%s", con->data[ret].tele);
	printf("请输入联系人地址:");
	scanf("%s", con->data[ret].addr);
	printf("修改完成\n");
}

先查找到改信息 在重新输入

11.排序联系人的信息—按名字排序

int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp(   ((PeoInfo*)e1)->name  , ((PeoInfo*)e2)->name);
}
void SORTContact(Contact* con)
{
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录为空,无法排序\n");
		return;
	}
	qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);
	printf("排序完成\n");
}

 这里要运用的qosrt函数,不会的可以看我之前的文章有介绍,很好实现的


完整代码展现:

test.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include "contact.h"
void menu()
{
	printf("******************************************\n");
	printf("*****      1.add          2.del       ****\n");
	printf("*****      3.search       4.modify    ****\n");
	printf("*****      5.show         6.sort      ****\n");
	printf("*****            0.  exit             ****\n");
	printf("******************************************\n");

}
enum
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};
int main()
{
	int input = 0;
	
	//创建通讯录
	Contact con;
	//初始化通讯录
	InitContact(&con);

	do
	{

		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			ADDContact(&con);
			break;
		case DEL:
			DELContact(&con);
			break;
		case SEARCH:
			SEARCHContact(&con);
			break;
		case MODIFY:
			MODIFYContact(&con);
			break;
		case SHOW:
			SHOWContact(&con);
			break;
		case SORT:
			SORTContact(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

contact.c:

#include "contact.h"
void InitContact(Contact* con)
{
	assert(con);
	con->sz = 0;
	memset(con->data, 0, sizeof(con->data));

}


void ADDContact(Contact* con)
{
	assert(con);
	//判断一下通讯录是否满了
	if (con->sz == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return ;
	}
	printf("请输入联系人名字:");
	scanf("%s", con->data[con->sz].name);
	printf("请输入联系人年龄:");
	scanf("%d", &(con->data[con->sz].age));
	printf("请输入联系人性别:");
	scanf("%s", con->data[con->sz].sex);
	printf("请输入联系人电话:");
	scanf("%s", con->data[con->sz].tele);
	printf("请输入联系人地址:");
	scanf("%s", con->data[con->sz].addr);
	
	con->sz++;
	printf("添加完成\n");

}



void SHOWContact(Contact* con)
{
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录无内容\n");
		return;
	}
	printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	int i;
	for (i = 0; i < con->sz; i++)
	{
		printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name, 
			                      con->data[i].age,
			                      con->data[i].sex, 
			                      con->data[i].tele,
			                      con->data[i].addr);
	}

}

int  Fing_by_name(Contact* con, char* name)
{
	assert(con);
	int i;
	for (i = 0; i < con->sz; i++)
	{
		if (strcmp(con->data[i].name, name) == 0)
		{
			return i;

		}
	}
	return -1;
}

void DELContact(Contact* con)
{
	char name[NAME_MAX];
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return ;
	}
	printf("请输入你想删除联系人的名字:\n");
	scanf("%s", name);
	// 查找通讯录里有没有该名字
	int ret=Fing_by_name(con, name);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
		return ;
	}
	//否则返回他的下标  
	//思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可
	int i;
	for (i = ret; i < con->sz - 1; i++)
	{
		con->data[i] = con->data[i + 1];
	}
	con->sz--;
	printf("删除成功\n");
}



void SEARCHContact(Contact* con)
{

	char name[NAME_MAX];
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录为空,无法查找\n");
		return;
	}
	printf("请输入你想查找联系人的名字:\n");
	scanf("%s", name);
	int ret = Fing_by_name(con, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,
		con->data[ret].age,
		con->data[ret].sex,
		con->data[ret].tele,
		con->data[ret].addr);
	printf("查找完成");
}



void MODIFYContact(Contact* con)
{
	char name[NAME_MAX];
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录为空,无法修改\n");
		return;
	}
	printf("请输入你想修改联系人的名字:\n");
	scanf("%s", name);
	int ret = Fing_by_name(con, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("请输入联系人名字:");
	scanf("%s", con->data[ret].name);
	printf("请输入联系人年龄:");
	scanf("%d", &(con->data[ret].age));
	printf("请输入联系人性别:");
	scanf("%s", con->data[ret].sex);
	printf("请输入联系人电话:");
	scanf("%s", con->data[ret].tele);
	printf("请输入联系人地址:");
	scanf("%s", con->data[ret].addr);
	printf("修改完成\n");
}

int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp(   ((PeoInfo*)e1)->name  , ((PeoInfo*)e2)->name);
}
void SORTContact(Contact* con)
{
	assert(con);
	if (con->sz == 0)
	{
		printf("通讯录为空,无法排序\n");
		return;
	}
	qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);
	printf("排序完成\n");
}

contact.h:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100



//定义人的信息
typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];//存放数据
	int sz;//记录的时当前通讯录中存放的人的信息个数
}Contact;


//初始化通讯录
void InitContact(Contact* con);

//添加联系人的信息
void ADDContact(Contact* con);

//显示通讯录的信息
void SHOWContact(Contact* con);


//删除联系人的信息
void DELContact(Contact* con);


//查找联系人的信息
void SEARCHContact(Contact* con);


//修改联系人的信息
void MODIFYContact(Contact* con);


//排序联系人的信息-按名字
void SORTContact(Contact* con);

结语:

首先非常感谢大家的观看,这只是一个初步的通讯录,它还可以进阶实现

这个通讯录还存在很多缺陷:

1.它不能保存完成,一旦退出就消失了

2.它至少固定的大小,我们只开创了100个联系人,万一少于联系人,这个就浪费了很多的空间

所以下次我们会使用动态内存管理,可以自由开辟内存,就不会有浪费或不够。

猜你喜欢

转载自blog.csdn.net/chaodddddd/article/details/133243764
今日推荐