【C语言】实现简单通讯录

 项目要求:

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 以名字排序所有联系人

       接下来我们将一起实现一个静态通讯录。

 通讯录功能

        通过上面信息我们可以看出对通讯录的功能要求,包括联系人信息的添加、删除、查找、修改、显示以及排序。

void menu()
{
	printf("*****  1.添加   2.删除   ******\n");
	printf("*****  3.查找   4.修改   ******\n");
	printf("*****  5.显示   6.排序   ******\n");
	printf("*****  0.退出            ******\n");
}

 主函数框架

       同之前的三子棋、扫雷项目一样,我们首先构建一个主函数框架,通过 input 的值来确定要执行的操作,由于我们并一步执行一次就结束程序,所以嵌套一个 do-while () 循环以实现多次操作,当 input 为 0 时退出程序。

enum
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MUL,
	SHOW,
	SORT,
};
int main()
{
	int input = 1;
	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 MUL:MulContact(&con);
			break; 
		case SHOW:ShowContact(&con);
			break;
		case SORT:SortContact(&con);
			break;
		case EXIT:printf("-->结束<--\n");
			 break;
		default:printf("错误,重新输入!\n");
		}
	} while (input);
	return 0;
}

 内部实现

创建通讯录
typedef struct PeoInfo
{
	char name[NAME_MAX]; //姓名
	int age;       //年龄
	char sex[SEX_MAX];   //性别 
	char tel[TEL_MAX];  //电话
	char addr[ADDR_MAX]; //地址
}PeoInfo;
typedef struct Contact
{
	PeoInfo data[MAX];   
	int size;           //当前大小
}Contact;

       通讯录中要求存储联系人的信息包括姓名、性别、年龄、电话、住址,因此我们创建一个结构体 PeoInfo 来存放其信息。同时通讯录要求存放1000个联系人信息,我们就创建一个 data 数组,同时再创建一个 size 用于记录当前通讯录中联系人的个数。

初始化通讯录

        使用 memset ()函数将通讯录内容全都初始化为 0 。

void InitContact(Contact *p)
{
	assert(p);
	memset(p->data, 0, sizeof(p->data));
	p->size = 0;
}
增加联系人

       增加联系人时先判断通讯录是否已满,如果满了就不能再增加信息了,要是没满就通过 scanf 语句来输入信息,添加成功后 size 值加1。

//增加信息
void AddContact(Contact* p)
{
	assert(p);
	//先判断通讯录是否已满
	if (p->size == MAX)
	{
		printf("空间已满,添加失败!\n");
		return ;
	}
	printf("输入联系人姓名:");
	scanf("%s", p->data[p->size].name);
	printf("输入联系人年龄:");
	scanf("%d", &(p->data[p->size].age));
	printf("输入联系人性别:");
	scanf("%s", p->data[p->size].sex);
	printf("输入联系人电话:");
	scanf("%s", p->data[p->size].tel);
	printf("输入联系人地址:");
	scanf("%s", p->data[p->size].addr);
	p->size++;
	printf("添加成功!\n");
}
展示联系人

       添加联系人后我们想看看是否成功添加进去,所以将展示函数先放在前面。为了更清晰的看懂每个信息代表什么含义,所以打印的时候加上"姓名","年龄","性别","电话","地址"。在%后加数字是给信息预留空间,让数据展示出来更加清晰。

void ShowContact(Contact* p)
{
	assert(p);
	if (p->size == 0)
	{
		printf("通讯录为空,无需打印!\n");
		return 0;
	}
	int i = 0;
	//打印表头  姓名  年龄  性别  电话  地址
	printf("%-10s %5s %5s %12s %10s\n","姓名","年龄","性别","电话","地址");
	for (i = 0; i < p->size; i++)
	{
		printf("%-10s %5d %5s %12s %10s\n", 
			p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].tel, p->data[i].addr);
	}
}

      为了验证我们添加了一个联系人信息并将其打印出来。

删除联系人

 本文设置了两种删除方式,一是通过联系人姓名,而是通过联系人电话。还应定义通过输入姓名(电话)在通讯录中进行匹配的函数。

int FindName(Contact *p,char name[])
{
	int i = 0;
	for (i = 0; i < p->size; i++)
	{
		if (strcmp(name, p->data[i].name) == 0)
			return i;
	}
    return -1;
}
int FindTel(Contact* p, char tel[])
{
	int i = 0;
	for (i = 0; i < p->size; i++)
	{
		if (strcmp(tel, p->data[i].tel) == 0)
			return i;
	}
	return -1;
}

先对通讯录指针 p 进行断言,判断是否有效,接下来判断通讯录是否为空,若为空则不能进行删除操作;输入 1 或 2 后通过 switch 语句跳转到对应的删除方式对应的函数,删除成功后及时对 p->size 减1。

void DelContact(Contact* p)
{
	assert(p);
	//判断通讯录是否为空
	if (p->size == 0)
	{
		printf("通讯录为空,无需删除!\n");
		return ;
	}
	printf("***  1.姓名  2.电话  ***\n");
	printf("请选择通过哪种方式删除:");
	int k = 0;
	scanf("%d", &k);
	switch (k)
	{
	case 1:DelContact_name(p);
		break;
	case 2:DelContact_tel(p);
		break;
	default:printf("选择错误,退出操作!\n");
	}
}
//通过姓名删除
void DelContact_name(Contact* p)
{
	//输入要删除联系人的姓名
	char name[NAME_MAX] = { 0 };
	int i = 0;
	printf("输入姓名:");
	scanf("%s", &name);
	int ret = FindName(p, name);
	if (ret == -1)
	{
		printf("要删除的人不存在!\n");
		return;
	}
	else  //从要删除的位置开始 将后面的元素往前移
	{
		int i = 0;
		for (i = ret; i < p->size - 1; i++)
		{
			p->data[i] = p->data[i + 1];
		}
		p->size--;
		printf("删除成功!\n");
	}
}
//通过电话删除
void DelContact_tel(Contact* p)
{
	//输入要删除联系人的电话
	char tel[TEL_MAX] = { 0 };
	int i = 0;
	printf("输入电话:");
	scanf("%s", &tel);
	int ret = FindName(p, tel);
	if (ret == -1)
	{
		printf("要删除的人不存在!\n");
		return;
	}
	else
	{
		int i = 0;
		for (i = ret; i < p->size - 1; i++)
		{
			p->data[i] = p->data[i + 1];
		}
		p->size--;
		printf("删除成功!\n");
	}
}
修改联系人

       判断通讯录是否为空;输入要修改联系人的姓名,通过删除模块内的 FindName()函数找到该名字联系人所在的数组下标,然后对其进行修改。

//修改联系人信息
void MulContact(Contact* p)
{
	assert(p);
	char name[NAME_MAX];
	if (p->size == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("输入要修改的人的姓名:");
	scanf("%s", &name);
	int ret = FindName(p, name);
	if (ret == -1)
	{
		printf("此人不存在!\n");
		return;
	}
	else
	{
		printf("输入联系人姓名:");
		scanf("%s", p->data[ret].name);
		printf("输入联系人年龄:");
		scanf("%d", &(p->data[ret].age));
		printf("输入联系人性别:");
		scanf("%s", p->data[ret].sex);
		printf("输入联系人电话:");
		scanf("%s", p->data[ret].tel);
		printf("输入联系人地址:");
		scanf("%s", p->data[ret].addr);
		printf("修改成功!\n");
	}
}
查找联系人

       首先还是判断通讯录是否为空;输入要查找的联系人的姓名,通过 FindName ()函数找到下标,打印出该联系人的所有信息。查找成功则输出”查询成功!“。

//查找联系人信息
void SearchContact(Contact* p)
{
	assert(p);
	char name[NAME_MAX];
	if (p->size == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("输入要查询的姓名:");
	scanf("%s", &name);
	int ret = FindName(p, name);
	if (ret == -1)
	{
		printf("此人不存在!\n");
		return;
	}
	else
	{
		printf("%-10s %5s %5s %12s %10s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-10s %5d %5s %12s %10s\n",
			p->data[ret].name, p->data[ret].age, p->data[ret].sex, p->data[ret].tel, p->data[ret].addr);
		printf("查询成功!\n");
	}
}
排序联系人

        通过联系人姓名排序,采用的排序方法为冒泡排序,排序完后将其打印出来。

//排序通讯录
void SortContact(Contact* p)
{
	assert(p);
	if (p->size <= 0)
		printf("通讯录为空,请添加!\n");
	int i = 0;
	int j = 0;
	for (i = 0; i < p->size - 1; i++)
	{
		for (j = 0; j < p->size - 1 - i; j++)
		{
			if (strcmp(p->data[j].name, p->data[j + 1].name) > 0)
			{
				PeoInfo tmp;
				tmp = p->data[j];
				p->data[j] = p->data[j + 1];
				p->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功!\n");
	ShowContact(p);
}

        对排序功能进行测试,将入输入以下三人信息,试想排序后结果是什么呢?

       

     结果如下

       

总代码

1.contact.h
#define SEX_MAX 5
#define TEL_MAX 12
#define ADDR_MAX 10

#define MAX 100
#include<stdio.h>
#include<assert.h>
#include<string.h>
typedef struct PeoInfo
{
	char name[NAME_MAX]; //姓名
	int age;       //年龄
	char sex[SEX_MAX];   //性别 
	char tel[TEL_MAX];  //电话
	char addr[ADDR_MAX]; //地址
}PeoInfo;
typedef struct Contact
{
	PeoInfo data[MAX];   
	int size;           //当前大小
}Contact;

//初始化通讯录
void InitContact(Contact* p);
//增加联系人信息
void AddContact(Contact* p);
//删除联系人信息
void DelContact(Contact* p);
//查找联系人信息
void SearchContact(Contact* p);
//修改联系人信息
void MulContact(Contact* p);
//排序通讯录
void SortContact(Contact* p);
//打印联系人信息
void ShowContact(Contact* p);
2.contact.c
#include"contact.h"
void InitContact(Contact *p)
{
	assert(p);
	memset(p->data, 0, sizeof(p->data));
	p->size = 0;
}
//增加信息
void AddContact(Contact* p)
{
	assert(p);
	//先判断通讯录是否已满
	if (p->size == MAX)
	{
		printf("空间已满,添加失败!\n");
		return ;
	}
	printf("输入联系人姓名:");
	scanf("%s", p->data[p->size].name);
	printf("输入联系人年龄:");
	scanf("%d", &(p->data[p->size].age));
	printf("输入联系人性别:");
	scanf("%s", p->data[p->size].sex);
	printf("输入联系人电话:");
	scanf("%s", p->data[p->size].tel);
	printf("输入联系人地址:");
	scanf("%s", p->data[p->size].addr);
	p->size++;
	printf("添加成功!\n");
}

//通过姓名删除
int FindName(Contact *p,char name[])
{
	int i = 0;
	for (i = 0; i < p->size; i++)
	{
		if (strcmp(name, p->data[i].name) == 0)
			return i;
	}
    return -1;
}
void DelContact_name(Contact* p)
{
	//输入要删除联系人的姓名
	char name[NAME_MAX] = { 0 };
	int i = 0;
	printf("输入姓名:");
	scanf("%s", &name);
	int ret = FindName(p, name);
	if (ret == -1)
	{
		printf("要删除的人不存在!\n");
		return;
	}
	else  //从要删除的位置开始 将后面的元素往前移
	{
		int i = 0;
		for (i = ret; i < p->size - 1; i++)
		{
			p->data[i] = p->data[i + 1];
		}
		p->size--;
		printf("删除成功!\n");
	}
}
//通过电话删除
int FindTel(Contact* p, char tel[])
{
	int i = 0;
	for (i = 0; i < p->size; i++)
	{
		if (strcmp(tel, p->data[i].tel) == 0)
			return i;
	}
	return -1;
}

void DelContact_tel(Contact* p)
{
	//输入要删除联系人的电话
	char tel[TEL_MAX] = { 0 };
	int i = 0;
	printf("输入电话:");
	scanf("%s", &tel);
	int ret = FindName(p, tel);
	if (ret == -1)
	{
		printf("要删除的人不存在!\n");
		return;
	}
	else
	{
		int i = 0;
		for (i = ret; i < p->size - 1; i++)
		{
			p->data[i] = p->data[i + 1];
		}
		p->size--;
		printf("删除成功!\n");
	}
}
//删除联系人信息
void DelContact(Contact* p)
{
	assert(p);
	//判断通讯录是否为空
	if (p->size == 0)
	{
		printf("通讯录为空,无需删除!\n");
		return ;
	}
	printf("***  1.姓名  2.电话  ***\n");
	printf("请选择通过哪种方式删除:");
	int k = 0;
	scanf("%d", &k);
	switch (k)
	{
	case 1:DelContact_name(p);
		break;
	case 2:DelContact_tel(p);
		break;
	default:printf("选择错误,退出操作!\n");
	}
}
//查找联系人信息
void SearchContact(Contact* p)
{
	assert(p);
	char name[NAME_MAX];
	if (p->size == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("输入要查询的姓名:");
	scanf("%s", &name);
	int ret = FindName(p, name);
	if (ret == -1)
	{
		printf("此人不存在!\n");
		return;
	}
	else
	{
		printf("%-10s %5s %5s %12s %10s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-10s %5d %5s %12s %10s\n",
			p->data[ret].name, p->data[ret].age, p->data[ret].sex, p->data[ret].tel, p->data[ret].addr);
		printf("查询成功!\n");
	}
}
//修改联系人信息
void MulContact(Contact* p)
{
	assert(p);
	char name[NAME_MAX];
	if (p->size == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("输入要修改的人的姓名:");
	scanf("%s", &name);
	int ret = FindName(p, name);
	if (ret == -1)
	{
		printf("此人不存在!\n");
		return;
	}
	else
	{
		printf("输入联系人姓名:");
		scanf("%s", p->data[ret].name);
		printf("输入联系人年龄:");
		scanf("%d", &(p->data[ret].age));
		printf("输入联系人性别:");
		scanf("%s", p->data[ret].sex);
		printf("输入联系人电话:");
		scanf("%s", p->data[ret].tel);
		printf("输入联系人地址:");
		scanf("%s", p->data[ret].addr);
		printf("修改成功!\n");
	}
}
//排序通讯录
void SortContact(Contact* p)
{
	assert(p);
	if (p->size <= 0)
		printf("通讯录为空,请添加!\n");
	int i = 0;
	int j = 0;
	for (i = 0; i < p->size - 1; i++)
	{
		for (j = 0; j < p->size - 1 - i; j++)
		{
			if (strcmp(p->data[j].name, p->data[j + 1].name) > 0)
			{
				PeoInfo tmp;
				tmp = p->data[j];
				p->data[j] = p->data[j + 1];
				p->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功!\n");
	ShowContact(p);
}
//打印联系人信息
void ShowContact(Contact* p)
{
	assert(p);
	if (p->size == 0)
	{
		printf("通讯录为空,无需打印!\n");
		return 0;
	}
	int i = 0;
	//打印表头  姓名  年龄  性别  电话  地址
	printf("%-10s %5s %5s %12s %10s\n","姓名","年龄","性别","电话","地址");
	for (i = 0; i < p->size; i++)
	{
		printf("%-10s %5d %5s %12s %10s\n", 
			p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].tel, p->data[i].addr);
	}
}
3.test.c
#include"contact.h"
void menu()
{
	printf("*****  1.添加   2.删除   ******\n");
	printf("*****  3.查找   4.修改   ******\n");
	printf("*****  5.显示   6.排序   ******\n");
	printf("*****  0.退出            ******\n");
}
enum
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MUL,
	SHOW,
	SORT,
};
int main()
{
	int input = 1;
	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 MUL:MulContact(&con);
			break; 
		case SHOW:ShowContact(&con);
			break;
		case SORT:SortContact(&con);
			break;
		case EXIT:printf("-->结束<--\n");
			 break;
		default:printf("错误,重新输入!\n");
		}
	} while (input);
	return 0;
}

     以上为通讯录的简单实现,希望对你有所帮,若有哪些描述和写法错误的地方希望大家多多指点。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天学习了吗•

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值