C语言 静态通讯录实现(附源码)

欢迎来到 Claffic 的博客 💞💞💞

前言:

通讯录想必大家熟知,主要功能就是保存用户的信息,这期博客跟着我用 C语言 写一个简单的通讯录,其逻辑类似于往期的猜数字游戏,让我们开始吧 。


通讯录的要求:

1.能录入联系人的信息:姓名+年龄+性别+地址+电话号码;

2.最多存放 100 个人的信息;

3.其他功能:

        ⑴ 增加联系人

        ⑵ 删除指定联系人

        ⑶ 查找指定联系人信息

        ⑷ 修改指定联系人信息

        ⑸ 展示所有联系人信息

        ⑹ 排序

按照惯例,先进行代码分块:

test.c         --- 测试通讯录(main函数所在)

contact.c   --- 通讯录实现

contact.h   --- 函数声明

1.整体框架

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

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

int main()
{
	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 6:
			break;
		case 0:
			printf("已退出通讯录\n");
			break;
		}
	} while (input);

	return 0;
}

是不是很熟悉呀?
没错,框架与往期 猜数字游戏三子棋游戏 极其类似。

2.创建通讯录

一个通讯录包含联系人信息已包含的联系人个数,这可以作为一个结构体:

//contact.h

typedef struct Contact
{
	PeoInform data[100];//存放的联系人
	int sz;//当前已经存放的联系人个数
}Contact;

联系人需要 姓名+年龄+性别+地址+电话号码 的参数,那我们又可以把它作为一个结构体

//contact.h

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

3.通讯录的初始化

封装一个初始化函数:

//test.c

Init_Contact(&con); //传地址,防止占用过大内存

memset 函数进行初始化:

//contact.c

void Init_Contact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

4.添加联系人

上来先要判断成员是否填满:

接下来就是提示和输入了。

//contact.c

void Add_Contact(Contact* pc)
{
	if (pc->sz == 100)
	{
		printf("联系人已满,无法添加\n");
	}
	else
	{
		printf("请输入名字:>\n");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入年龄:>\n");
		scanf("%d", &(pc->data[pc->sz].age));//因成员age是整型,所以需要取地址。
		printf("请输入性别:>\n");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入地址:>\n");
		scanf("%s", pc->data[pc->sz].addr);
		printf("请输入电话:>\n");
		scanf("%s", pc->data[pc->sz].tele);

		pc->sz++;
	}
}

5.查找联系人

我们按照名字查找联系人,

用名称查找函数接收返回值并进行判断,

若找不到,直接返回并提示,

若能找到,打印出找到的联系人信息。

//contact.c

void Search_Contact(const Contact* pc)
{
	assert(pc);
	char name[100] = { 0 };
	printf("请输入要查找联系人的姓名:>");
	scanf("%s", name);
	int pos = Sear_Byname(pc, name);
	if (-1 == pos)
	{
		printf("未找到该联系人\n");
		return;
	}
	printf("%-10s\t%-4d\t%-5s\t%-20s\t-12%s\n", pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].addr,
		pc->data[pos].tele);
}

切记,判断字符串是否相等要用 strcmp 函数。 

int Sear_Byname(const Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
		else
			return -1;
	}
}

6.展示所有联系人

存放了联系人,可以看看所有联系人:

//contact.c

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

打印的时候,可以在 % 与 s(或其他) 之间加入固定数值以对齐

(负数左对齐,正数右对齐)

7.删除联系人

要删除联系人,其实就是要删除的联系人被它之后的联系人覆盖而已;

依次覆盖,用循环来实现:

//contact.c

void Dele_Contact(Contact* pc)
{
	assert(pc);
	char name[100] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	int ret = Sear_Byname(pc, name);
	if (-1 == ret)
	{
		printf("要删除的人不存在\n");
		return;
	}

	int i = 0;
	//删除
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;  //总数减少,莫忘记
	printf("删除成功\n");
}

8.修改联系人

这一部分与查找联系人类似

//contact.c

void Modi_Contact(Contact* pc)
{
	assert(pc);
	char name[100] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);

	int pos = Sear_Byname(pc, name);
	if (-1 == pos)
	{
		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].addr);
	printf("请输入电话:>");
	scanf("%s", pc->data[pos].tele);

	printf("修改完成\n");
}

源码已上传至 我的gitee

拿走不谢 ~


总结:

静态通讯录的逻辑与之前的小游戏是十分类似的,写到这里,我们会发现,每次重启程序,储存的联系人信息都消失了,这也是取名静态的原因,下一期通讯录会升级为动态通讯录,期待吧 ~

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗

关注我  不迷路!!!

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Claffic

赏包辣条~

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

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

打赏作者

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

抵扣说明:

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

余额充值