C语言结构体实现简易通讯录

❤️ C语言结构体实现简易通讯录(静态版)

前言:

在对结构体、枚举等自定义类型的学习后,便尝试使用结构体等相关知识来实现简易通讯录。由于对C语言的GUI界面未能了解,所以此次实现的通讯录只是十分简易的通讯录,该通讯录有静态版,动态版,文件版今天主要实现静态版

前排提醒因涉及代码实现及思路,文章略长,不看思路的同学也可以直接移步到代码仓库查看源码哦!

💗: 查看详细代码请移步到仓库 -------> 通讯录代码

🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻 🐻


🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰 🐰

💙代码速览 + 成果展示

☀️代码速览

//主文件中代码展示
int main()
{
	int input = 0;
	Contact_people con; //利用通讯录结构体在主文件中创建一个名为con的通讯录
	Init_Contact(&con);  //进行封装初始化
	do
	{
		menu();
		printf("请选择 >");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出通讯录\n");
			break;
		case 1:
			Add(&con);   
			break;
		case 2:
			Del(&con);
			break;
		case 3:
			Search_Contact(&con);
			break;
		case 4:
			Modify_Contact(&con);
			break;
		case 5:
			Show_Contact(&con);
			break;
		case 6:
			Sort_Contact(&con);
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}
//头文件中代码展示
//创建一个结构体表示通讯录中人的信息
typedef struct PeInfo 
{
	char name[20];  
	int age;
	char tele[12];
	char sex[10];
	char addr[20];
}PeInfo;    //
//创建一个结构体将通讯录中的人的信息和数量进行封装
typedef struct Contact_people
{
	PeInfo message[100];
	int num;
}Contact_people;

//初始化函数声明
void Init_Contact(struct Contact_people* pc);

//增添人的信息函数声明
void Add(struct Contact_people* pc);

//显示人的信息函数声明
void Show_Contact(struct Contact_people* pc);

//寻找人的信息函数声明
void Search_Contact(struct Contact_people* pc);

//删除人的信息函数声明
void Del(struct Contact_people* pc);

//修改人的信息函数声明
void Modify_Contact(struct Contact_people* pc);

//排序人的信息
void Sort_Contact(struct Contact_people* pc);

❄️ 部分成果展示

在这里插入图片描述

💛实现思路

既然如此,那怎样一步步的达到最终效果呢?

🐰 1、使用结构体创建通讯录

最先考虑的就是我们可以使用什么类型来创建一个通讯录,传统意义上的int、float等数据类型肯定是行不通的。那我们可不可以直接使用字符数组来创建通讯录呢?答案同样也是不可以的!毕竟一个人的信息不是单一的,他有姓名、年龄、电话、家庭地址。我们需要将同一个人的信息整合到一起,实现模块化。

我们可以使用结构体嵌套来创建通讯录

typedef struct PeInfo 
{
	char name[20];  
	int age;
	char tele[12];
	char sex[10];
	char addr[20];
}PeInfo; 
//创建一个结构体将通讯录中的人的信息和数量进行封装
typedef struct Contact_people
{
	PeInfo message[100];
	int num; //记录当前通讯录中人的个数
}Contact_people;

//先创建一个PeInfo的结构体类型,该结构体中存放着人的基本信息
//再创建一个Contact_people的结构体类型,;用来表示通讯录,同时可以将人的信息进行总和

🐮2、打印目录供用户选择并初始化所创建的通讯录

在头文件中创建好结构体类型后,便可在源文件中通过该结构体类型创建一个通讯录,并且创建好类型后必须要及时对其进行初始化

使用 do----while实现目录的重复打印,使用switch ----case语句实现功能的选择

//初始化函数,使用memset函数来对内存进行初始化
void Init_Contact(struct Contact_people* pc)
{
	assert(pc); //如果pc为空指针就报错
	pc->num = 0;
	memset(pc->message, 0, sizeof(pc->message)); // 利用memset函数对已知地址进行初始化
}

🐯3、逐一实现各个功能函数

在实现这些功能函数时我们应该要注意的地方

①:通讯录是以结构体变量所创建的,同时实现了结构体嵌套,所以在访问结构体成员时应厘清他们之间的关系,同时使用结构体成员访问操作符(箭头操作符和点操作符)来实现对数据的更改

	printf("请输入要增添人的姓名>:");
	scanf("%s", pc->message[pc->num].name);
//如在Add函数中需要添加姓名时,应先找打Contact_People中的message成员,因为message为数组,再通过num找到相对应的第几个人,然后再
//通过点操作符访问PeInfo中的name

②:实现排序功能的时候,使用qsort函数来对姓名进行排序,大家应详细了解qsort函数的用处来实现自己想要的排序方式

int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp(((PeInfo*)e1)->name,((PeInfo*)e2)->name);
}
void Sort_Contact(struct Contact_people* pc)
{
	assert(pc);  //如果pc为空指针就报错
	if (0 == pc->num)
	{
		printf("通讯录为空,无法排序!\n");
		return;
	}
	else
	{
		qsort(pc->message, pc->num, sizeof(PeInfo), cmp_by_name);  //这里的qsort函数需要注意
		printf("排序成功啦!\n"); 
	}
}

💜 学习经验总结

在对通讯录实现过程中,我又进一步对结构体,嵌套结构体,memset函数,qsort函数,strcmp函数以及分文件模块化操作等等有了更一步的了解。

🏈 1、在设计指针传参时,应多使用assert()来对形参进行断言,防止因NULL而导致的误操作

⛹ 2、当代码数量过多时,应进行分文件操作,将函数的声明和实现分开,保证对应的头文件和源文件有相同的名字

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kunmu.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值