C语言实现通讯录

本文介绍了如何使用C语言实现一个模块化的通讯录系统,包括创建结构体表示联系人信息,定义通讯录结构体,实现添加、删除、查找和修改联系人等功能,并提供了相应的代码实现。通过枚举类型管理菜单选项,使得程序更加清晰易懂。
摘要由CSDN通过智能技术生成

目录

前言

通讯录实现的思路与逻辑

通讯录具体实现步骤

完整代码展现

contact.h文件

contact.c文件

test.c文件


前言

通讯录采用模块化编程思路,test.c文件专门测试通讯录的功能,contact.h文件存放函数声明 contact.c存放通讯录对应功能的具体实现;

通讯录的功能能够保存联系人的信息,而联系人的信息包括 姓名 性别 年龄 电话号码 地址
通讯录的功能应该包含如下选项:   
1.增加联系人 2.删除指定联系人 3.查找指定联系人
4.修改指定联系人信息 5.显示通讯录中联系人的信息 0.退出通讯录

通讯录实现的思路与逻辑

  1. 创建通讯录菜单函数以供用户选择其想实现的功能
  2. 使用结构体描述联系人信息并创建通讯录,通讯录实现得有空间保存联系人的信息并且记录当前联系人的个数;
  3. 初始化通讯录;
  4. 增加联系人的信息;
  5. 显示通讯录中的信息;
  6. 删除指定联系人的信息;
  7. 查找指定联系人的信息;
  8. 修改指定联系人的相关信息;

通讯录具体实现步骤

  • 菜单界面
void menu()
{   
	printf("********************************\n");
	printf("******1.Add     2.Del   ********\n");
	printf("******3.Search  4.Modify********\n");
	printf("******5.Show    0.Exit**********\n");
	printf("********************************\n");
}

void test()
{
	
	int input = 0;
	do
	{
		menu();
		printf("请输入选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3: 
			break;
		case 4:
			break;
		case 5:
			break;
		case Exit:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} 
	while (input);
}
int main()
{
	test();
	return 0;
}
  • 创建通讯录

通讯录里面存放联系人的相关信息,而联系人的信息由姓名 性别 年龄 电话号码 地址组成

typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char tele[12];
	char addr[30];
}PeoInfo;

通讯录实现得有空间保存联系人的信息并且记录当前联系人的个数,为了方便函数传参,封装成一个结构体;

typedef struct Contact
{
	PeoInfo data[1000];//可以存放1000个人的信息
	int sz;//记录通讯录中已经保存的联系人的个数
}Contact;

为了方便代码可以修改指定大小,使用#define定义的标识符常量代替,同时对上述数字用标识符常量代替

#define Data_Max 1000
#define Name_Max 20
#define Sex_Max 5
#define Tele_Max 12
#define Addr_Max 30

建立菜单功能和选项具有一定的关联性使用枚举;

enum Option
{
	Exit,// 0
	Add,//  1
	Del,//  2
	Search,//3
	Modify,//4
	Show  //5
};

菜单界面修改如下:

void menu()
{   
	printf("********************************\n");
	printf("******1.Add     2.Del   ********\n");
	printf("******3.Search  4.Modify********\n");
	printf("******5.Show    0.Exit**********\n");
	printf("********************************\n");
}

void test()
{
    //创建通讯录
	Contact con;

	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 Exit:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} 
	while (input);
}
int main()
{
	test();
	return 0;
}

结构体个人信息修改如下:

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[Data_Max];//可以存放1000个人的信息
	int sz;//记录通讯录中已经保存的联系人的个数
}Contact;
  • 初始化通讯录

使用memset()函数将数组初始化为0,并且将记录通讯录联系人个数的sz置为0;

//初始化通讯录
void InitContact(Contact * pc)
{
	assert(pc != NULL);
	memset(pc->data, 0, sizeof(pc->data));//pc->data相当于data数组的数组名,即data数组起始位置的地址;
	pc->sz = 0;
}
  • 增加联系人的信息

//通讯录初始化后,里面数据为0;
//当我们增加一个人的信息,置于data数组下标为sz的位置;
void AddContact(Contact * pc)
{
	assert(pc != NULL);
	//考虑异常情况 当通讯录数据存放满,直接返回
	if (pc->sz == Data_Max)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//1.录入信息
	printf("请输入名字: ");
	scanf("%s", (pc->data[pc->sz]).name);
	printf("请输入年龄: ");
	scanf("%d", &(pc->data[pc->sz]).age);
	printf("请输入性别: ");
	scanf("%s", (pc->data[pc->sz]).sex);
	printf("请输入电话号码: ");
	scanf("%s", (pc->data[pc->sz]).tele);
	printf("请输入地址: ");
	scanf("%s", (pc->data[pc->sz]).addr);
	//2.sz++;
	pc->sz++;
	printf("添加成功\n");
}
  • 显示通讯录中的信息
void ShowContact(const Contact * pc)
{
	assert(pc != NULL);

	int i = 0;
	printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age,
			pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);
	}

}
  • 删除指定联系人的信息

先根据姓名找到要删除的元素(不考虑重名),然后删除,删除方法-要删除指定位置的元素,只需从指定位置开始,后一个元素覆盖掉前一个元素即可,依次进行;

int FindByName(const Contact* pc,char name[])
{
	assert(pc != NULL);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		//比较姓名—实际比较字符串—strcmp()函数
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	//遍历完整个数组,仍然没有返回,说明找不到;
	return -1;
}

//删除指定联系人的信息
void DelContact(Contact *pc)
{
	assert(pc != NULL);
	//如果通讯录里面元素为0,直接返回;
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法删除\n");
		return;
	}
	//根据姓名查找
	char name[Name_Max] = { 0 };
	printf("请输入姓名:");
	scanf("%s", name);
	//根据名字找到所对应的元素,找到了返回data数组的下标,找不到返回-1;
	int pos=FindByName(pc,name);
	if (pos == -1)
	{
		printf("联系人不存在,无法删除\n");
		return;
	}
	//删除  
	int j = 0;

	for (j = pos; j <pc->sz-1; j++)
	{
		pc->data[j] = pc->data[j + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}
  • 查找指定联系人的信息;
void SearchContact(const Contact* pc)
{
	assert(pc != NULL);
	char name[Name_Max] = { 0 };
	printf("请输入查找人的姓名:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在\n");
		return;
	}
	//找到联系人,显示联系人相关信息;
	printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age,
			pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);

}
  • 修改联系人的相关信息
void ModContact(Contact* pc)
{
	assert(pc != NULL);
	//先根据姓名查找要修改的元素
	char name[Name_Max] = { 0 };
	printf("请输入修改人的姓名:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在\n");
		return;
	}
	//重新输入该位置的信息;
	printf("请输入名字: ");
	scanf("%s", (pc->data[pos]).name);
	printf("请输入年龄: ");
	scanf("%d", &(pc->data[pos]).age);
	printf("请输入性别: ");
	scanf("%s", (pc->data[pos]).sex);
	printf("请输入电话号码: ");
	scanf("%s", (pc->data[pos]).tele);
	printf("请输入地址: ");
	scanf("%s", (pc->data[pos]).addr);
	printf("修改成功\n");
}

完整代码展现

contact.h文件

# include <stdio.h>
# include <string.h>
# include <assert.h>

#define Data_Max 1000
#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;
//通讯录实现得有空间保存联系人的信息并且记录当前联系人的个数;
//为了方便传参,封装成一个结构体;
typedef struct Contact
{
	PeoInfo data[Data_Max];//可以存放1000个人的信息
	int sz;//记录通讯录中已经保存的联系人的个数
}Contact;

//建立菜单功能和选项的关联使用枚举;
enum Option
{
	Exit,// 0
	Add,//  1
	Del,//  2
	Search,//3
	Modify,//4
	Show  //5
};

//函数的声明

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

//增加联系人的信息
void AddContact(Contact * pc);

//显示通讯录中的信息
void ShowContact(const Contact * pc);

//删除指定联系人的信息
void DelContact(Contact *pc);

//查找指定联系人的信息
void SearchContact(const Contact* pc);

//修改联系人的相关信息
void ModContact(Contact* pc);

contact.c文件

# include "contact.h"
//初始化通讯录
void InitContact(Contact * pc)
{
	assert(pc != NULL);
	memset(pc->data, 0, sizeof(pc->data));//pc->data相当于data数组的数组名,即data数组起始位置的地址;
	pc->sz = 0;
}
//增加联系人的信息
//通讯录初始化后,里面数据为0;
//当我们增加一个人的信息,置于data数组下标为sz的位置;
void AddContact(Contact * pc)
{
	assert(pc != NULL);
	//考虑异常情况 当通讯录数据存放满,直接返回
	if (pc->sz == Data_Max)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//1.录入信息
	printf("请输入名字: ");
	scanf("%s", (pc->data[pc->sz]).name);
	printf("请输入年龄: ");
	scanf("%d", &(pc->data[pc->sz]).age);
	printf("请输入性别: ");
	scanf("%s", (pc->data[pc->sz]).sex);
	printf("请输入电话号码: ");
	scanf("%s", (pc->data[pc->sz]).tele);
	printf("请输入地址: ");
	scanf("%s", (pc->data[pc->sz]).addr);
	//2.sz++;
	pc->sz++;
	printf("添加成功\n");
}
//显示通讯录中的信息
void ShowContact(const Contact * pc)
{
	assert(pc != NULL);

	int i = 0;
	printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age,
			pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);
	}
}

int FindByName(const Contact* pc,char name[])
{
	assert(pc != NULL);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		//比较姓名—实际比较字符串—strcmp()函数
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	//遍历完整个数组,仍然没有返回,说明找不到;
	return -1;
}

//删除指定联系人的信息
void DelContact(Contact *pc)
{
	assert(pc != NULL);
	//如果通讯录里面元素为0,直接返回;
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法删除\n");
		return;
	}
	//先根据姓名找到要删除的元素(不考虑重名)
	char name[Name_Max] = { 0 };
	printf("请输入姓名:");
	scanf("%s", name);
	//根据名字找到所对应的元素,找到了返回data数组的下标,找不到返回-1;
	int pos=FindByName(pc,name);
	if (pos == -1)
	{
		printf("联系人不存在,无法删除\n");
		return;
	}
	//删除  
	//删除方法-要删除指定位置的元素,只需从指定位置开始,后一个元素覆盖掉前一个元素即可,依次进行;
	int j = 0;

	for (j = pos; j <pc->sz-1; j++)
	{
		pc->data[j] = pc->data[j + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

//查找指定联系人的信息
void SearchContact(const Contact* pc)
{
	assert(pc != NULL);
	char name[Name_Max] = { 0 };
	printf("请输入查找人的姓名:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在\n");
		return;
	}
	//找到联系人,显示联系人相关信息;
	printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age,
			pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);

}

//修改联系人的信息
void ModContact(Contact* pc)
{
	assert(pc != NULL);
	//先根据姓名查找要修改的元素
	char name[Name_Max] = { 0 };
	printf("请输入修改人的姓名:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在\n");
		return;
	}
	//重新输入该位置的信息;
	printf("请输入名字: ");
	scanf("%s", (pc->data[pos]).name);
	printf("请输入年龄: ");
	scanf("%d", &(pc->data[pos]).age);
	printf("请输入性别: ");
	scanf("%s", (pc->data[pos]).sex);
	printf("请输入电话号码: ");
	scanf("%s", (pc->data[pos]).tele);
	printf("请输入地址: ");
	scanf("%s", (pc->data[pos]).addr);
	printf("修改成功\n");
}

test.c文件

# include "contact.h"
void menu()
{   
	printf("********************************\n");
	printf("******1.Add     2.Del   ********\n");
	printf("******3.Search  4.Modify********\n");
	printf("******5.Show    0.Exit**********\n");
	printf("********************************\n");
}

void test()
{
	//创建通讯录
	Contact con;
	
	//初始化通讯录
	InitContact(&con);
	int input = 0;
	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:
			ModContact(&con);
			break;
		case Show:
			ShowContact(&con);
			break;
		case Exit:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} 
	while (input);
}
int main()
{
	test();
	return 0;
}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小呆瓜历险记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值