通讯录的实现(初级版本)

news2025/2/26 13:32:33

思维导图:

目录

思维导图:

​编辑

一,实现通讯录的第一步——实现逻辑 

二,头文件内实现的内容

三,contect.c文件内的函数定义

3.1初始化通讯录:void InitContect(cotect*pc)

3.2:实现通讯录内容的增加:void AddContect(Contect* pc)

3.3:实现对通讯录的内容进行显示:void ShowContect(Contect* pc)

3.4对通讯录内的指定信息进行删除:void DelContect(Contect* pc)

3.5 实现对通讯录内人的信息的修改:void ModifyContect(Contect* pc)

 3.6查找联系人:void SearchContect(Contect* pc)

3.7排序联系人 :void SortContect(Contect* pc)

3.8contect.c内最特殊的函数


一,实现通讯录的第一步——实现逻辑 

1.1打印菜单

实现位置:test.c

实现函数:menu()

返回类型:void

作用:将通讯录可以实现的功能显示出来供使用对象选择

🤖代码🤖:

void menu() {
	printf("*****1.ADD    2.DEL    *****\n");
	printf("*****3.SEARCH 4.MODIFY *****\n");
	printf("*****5.SHOW   6.SORT   *****\n");
	printf("*****     0.EXIT       *****\n");
}

1.2:通讯录功能实现逻辑

实现位置:test.c

enum {
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT

};
int main() {
	Contect* con;
	InitContect(&con);//初始化通讯录
	int input = 0;
	do {
		menu();
		printf("请选择:>");
	scanf("%d", &input);
		switch (input) {
		case ADD: 
			AddContect();//添加通讯录的个人信息
			break;
		case DEL:
			DelConteCt();//删除通讯录内的信息
			break;
		case SEARCH:
			SearchContect();//查找通讯录的个人信息
			break;
		case MODIFY:
			ModifyContect();//修改通讯录里的个人信息
			break;
		case SHOW:
			ShowContect();//显示通讯录内的信息
			break;
		case SORT:
			SortCpntect();//排序通讯录内的信息
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
}

	} while (input);

}

小细节❗:

在实现switch……case语句时,我没有使用数字。原因是因为使用了enum关键字。

enum也就是枚举,会把它里面的第一个第一个参数标记为0,其它的参数在这个基础

之上按顺序加1。在我们的例子中,EXIT就表示0,ADD表示1,DEL表示为2……以此类推

二,头文件内实现的内容

实现位置:contect.h

其实头文件内部实现的内容无非就是各种函数的声明,我在这里也就不一 一介绍了,但是在这里着重介绍下面的内容。

宏定义最大值,以及通讯录内容的定义: 

通讯录的内容:

1.人的信息

名字,年龄,性别,电话,住址

2.是第几个人

代码:

#define MAX_sz 100
#define MAX_name 5
#define MAX_age 5
#define MAX_sex 5
#define MAX_Tele 12
#define MAX_address 20
typedef struct PeoInfo {
	char name[MAX_name];
	int age[MAX_age];
	char sex[MAX_sex];
	char tele[MAX_Tele];
	char address[MAX_address];
} PeoInfo;
typedef struct Contect {
	PeoInfo data[MAX_data];
	int sz;
}Contect ;

 ❗细节❗:

1.在这里使用宏定义的作用是为了后面方便修改结构体PeoInfo内的数组的大小

2.使用typedef的作用是对结构体进行重命名来方便使用结构体变量

三,contect.c文件内的函数定义

contect.c函数可谓是我们整个通讯录实现工程的重头戏了,

现在让我们把目光放到contect.c内部详细讲解这个文件内定义的函数。

3.1初始化通讯录:void InitContect(cotect*pc)

实现的功能:将通讯录内的内容初始化为0

代码:

Init(Contect* pc) {
    int sz = 0;//将sz初始化为0
	memset(pc->data, 0, sizeof(pc->data));//使用memset函数来对data进行初始化为0
};

知识补充:memset()

三个参数:

1. 要改变的数据的起始地址:pc->data

2.你想要改变为的值:0

3.你要改变的数据的字节大小:sizeof(pc->data)//sizeof(数组名)表示整个数组的大小

3.2:实现通讯录内容的增加:void AddContect(Contect* pc)

实现功能:对通讯录进行内容的填充

实现条件:在通讯录的空间还没有满

 代码:

void AddContect(Contect* pc) {
	if (pc -> sz < MAX_data) {
		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);
		pc->sz++;
		printf("增加联系人成功\n");
	}
	else {
		printf("通讯录已满\n");
	}

}

3.3:实现对通讯录的内容进行显示:void ShowContect(Contect* pc)

实现功能:对通讯录的内容进行容易看懂的展示

代码:

void ShowContect(Contect* pc) {
	printf("%-10s%-5s%-5s%-20s%-5s\n", 
		"名字","年龄","性别","电话","住址");
	int i = 0;
	while (i < pc->sz) {
		printf("%-10s%-5d%-5s%-20s%-5s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
		    i++;
	}
}

3.4对通讯录内的指定信息进行删除:void DelContect(Contect* pc)

实现功能:对指定的联系人的信息的删除。

代码:

Find_By_Name(Contect* pc) {
	char name[20];
	printf("请输入你要删除的人的名字:>");
	scanf("%s", name);
	int i = 0;
	for (i = 0;i < pc->sz;i++) {
		if (strcmp(name, pc->data[i].name)==0)
			return i;
	}
	return -1;
}
void DelContect(Contect* pc) {
	int pos = 0;
	int i = 0;
	 pos = Find_By_Name(pc);
	if (pos == -1) {
		printf("要删除的人的信息不存在\n");
		return;
	}
	for (i = pos;i < pc->sz - 1;i++) {
		pc->data[pos] = pc->data[pos + 1];
	}
	printf("删除成功!\n");
	pc->sz--;

}

实现方法:通过一个Find_By_Name函数来对要查找的人的信息进行定位,找到了就返回该信息的下标,找不到就返回-1。在找到该成员下标的前提下,通过该下标后面的人的信息覆盖前面人的信息的方法来达到删除的目的。

3.5 实现对通讯录内人的信息的修改:void ModifyContect(Contect* pc)

实现功能:对你所不满的人的信息进行修改 

 代码:

void ModifyContect(Contect* pc) {
	printf("请输入要修改人的名字:>");
	int pos = Find_By_Name(pc);
	if (pos == -1) {
		printf("找不到要修改的联系人\n");
return;
	}
	else {
		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");

	}

}

实现方法:通过Find_By_Name函数来找到要修改的人的下标,然后返回这个下标。如果这个下标是-1那就输出找不到这个联系人的信息结束进程。如果不是-1那就通过下标来对指定联系人的信息进行逐个修改。

 3.6查找联系人:void SearchContect(Contect* pc)

实现功能:找到联系人的信息并将他的信息显示出来。

代码:

void SearchContect(Contect* pc) {
	int pos = 0;
	printf("请输入要查找的人的信息:>");
	pos = Find_By_Name(pc);
	if (pos == -1) {
		printf("要查找的人的信息不存在\n");
		return;
	}
	else {
		printf("%-10s%-5s%-5s%-20s%-5s\n",
			"名字", "年龄", "性别", "电话", "住址");
			printf("%-10s%-5d%-5s%-20s%-5s\n",
				pc->data[pos].name,
				pc->data[pos].age,
				pc->data[pos].sex,
				pc->data[pos].tele,
				pc->data[pos].addr);
		
		
	}
}

实现方法:通过Find_By_Name函数对想要查找的联系人的信息进行查找,定位下标。找到了便对该下标对应的信息进行打印显示。找不到就打印提示信息。

3.7排序联系人 :void SortContect(Contect* pc)

实现功能:对通讯录的内容进行排序

代码:

int cmp_By_Name(void* e1, void* e2) {
	return strcmp(((Contect*)e1)->data->name , ((Contect*)e2)->data->name);
}
		
void SortContect(Contect* pc) {
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_By_Name);
	printf("排序成功\n");
}

 实现方法:运用qsort函数来对通讯录里的内容进行排序。现在排的是升序,如果你想要拍成降序只需要将cmp_By_Name内的两个参数交换一下位置就可以了。在这里也要注意,比较按照名字来排序也就是需要比较字符串,所以在比较时需要使用strcmp函数来进行比较

3.8contect.c内最特殊的函数

在这个文件里最特殊的函数便是Find_By_Name()这个函数。这个函数特殊的点在于它是没有在头文件里面声明的,因为这个函数只需要在contect.c文件里面使用。所以为了使这个函数能更加隐蔽,我们可以在Find_By_Name这个函数的前面加上一个static关键字。

static Find_By_Name(const Contect* pc) {
	char name[20];
	scanf("%s", name);
	int i = 0;
	for (i = 0;i < pc->sz;i++) {
		if (strcmp(name, pc->data[i].name)==0)
			return i;
	}
	return -1;
}

今天分享完毕!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

投稿指南【NO.14】SCI期刊推荐(mdpi旗下)

写在前面&#xff1a;SCI论文发表是我国高校机构与基地评估、成果评奖、项目立项、人才培养等方面的重要考核指标&#xff0c;更不要要说关系到我们个人的毕业、晋升和前途。SCI含金量之高&#xff0c;要是读研读博科研工作期间能发表&#xff0c;将对直博、找工作、国奖申请、…

04 | 连接池:别让连接池帮了倒忙

04 | 连接池&#xff1a;别让连接池帮了倒忙 连接池一般对外提供获得连接、归还连接的接口给客户端使用&#xff0c;并暴露最小空闲连接数、最大连接数等可配置参数&#xff0c;在内部则实现连接建立、连接心跳保持、连接管理、空闲连接回收、连接可用性检测等功能。 注意鉴…

MySQL 主从同步及延迟原因分析

主从同步的基本原理 MySQL主从同步步骤详见 MySQL binlog模式及主备的基本原理 谈到主备的并行复制能力&#xff0c;我们要关注的是图中黑色的两个箭头。一个箭头代表了客户端写入主库&#xff0c;另一箭头代表的是从库上sql_thread执行中转日志&#xff08;relay log&#xff…

《Squeeze-and-Excitation Networks》

Squeeze-and-Excitation Networks1. 摘要2. 介绍3. 网络设计4. 代码实现1. 摘要 卷积操作可以使网络通过在每层的局部感受野内融合空间和通道级信息以构建信息特征&#xff1b;空间信息尝试通过加强CNN整个特征层次的空间编码质量以加强CNN的表示能力&#xff1b;本文主要聚焦…

【计算机网络-应用层】万维网

文章目录1 统一资源定位符 URL2 万维网文档2.1 超文本标记语言 HTML2.2 层叠样式表 CSS2.3 JavaScript3 超文本传输协议 HTTP3.1 HTTP 报文格式3.1.1 HTTP 请求报文3.1.2 HTTP 响应报文3.2 HTTP 的工作过程3.2.1 HTTP/1.03.2.2 HTTP/1.13.2.3 相关例题4 Cookie1 统一资源定位符…

如何从根本上防止服务器被攻击

随着互联网的发展&#xff0c;服务器成为了企业和个人网络应用的重要基础设施。但是&#xff0c;随之而来的网络安全威胁也在不断增加&#xff0c;服务器安全问题也成为了影响企业信息安全的重要因素。针对这种情况&#xff0c;服务器安全防御变得尤为重要。   服务器安全防御…

6.Swagger的实战使用

六.Swagger的实战使用 1.什么是swagger 2.swagger的基本使用 3.swagger实战使用 六.Swagger的实战使用 1.什么是swagger swagger是后端接口文档的生成并且提供ui界面进行测试过去用postman测试 缺点&#xff1a;需要自己写地址&#xff0c;如果项目变了需要自己更改 2.sw…

CF区间DP作业题解

1. Recovering BST 由于互质关系不是传递的&#xff0c;所以尽量挂在树的最下面&#xff0c;刚好构成二叉树 f[i][j][0]f[i][j][0]f[i][j][0] 表示区间 [i,j][i,j][i,j] 以 iii 为根&#xff0c;是否可以构成一棵树。 f[i][j][1]f[i][j][1]f[i][j][1] 表示区间 [i,j][i,j][i,j…

Spring理论学习

1、什么是IOC IoC&#xff08;Inversion of Control:控制反转&#xff09; 是一种设计思想&#xff0c;而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权&#xff0c;交由 Spring 框架来管理。不过&#xff0c; IoC 并非 Spring 特有&#xff0c;…

阿里通义千问、ChatGPT和文心一言有何区别,在哪里能使用?

目前&#xff0c;聊天机器人技术在人工智能领域的发展越来越成熟了。现在已经有几款备受关注的聊天机器人产品问世&#xff0c;例如ChatGPT、阿里的通义千问和百度的文心一言。它们有什么区别&#xff0c;怎么使用呢&#xff1f; 其实&#xff0c;我也挺好奇的&#xff0c;毕竟…

人人拥有ChatGPT的时代来临了,这次微软很大方!

技术迭代的在一段时间内是均匀发展甚至止步不前的&#xff0c;但在某段时间内会指数级别的爆发。 ChatGPT背后的GPT 3.5训练据说花了几百万美金外加几个月的时间&#xff0c;参数大概有1700多亿。 这对于绝大多数的个人或企业来说绝对是太过昂贵的。 然而&#xff0c;微软&am…

月薪过 3w 的 软件测试工程师 都是怎么做到的?

对任何职业而言&#xff0c;薪资始终都会是众多追求的重要部分。前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。 当然&#xff0c;我说的是最基础的功能测试的岗…

如何使用双轴XY平台绘制正弦曲线

1. 功能说明 本文示例将实现双轴XY平台绘制正弦曲线的功能。 2. 电子硬件 在这个示例中&#xff0c;采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigfish2.1扩展板 SH-ST步进电机扩展板 电池11.1V动…

跟着原子学I2C

I2C通讯 1、IIC总线介绍 集成电路总线&#xff0c;是一种同步串行半双工通信总线。 总线or协议&#xff1f;&#xff01; 总线是数据传输通道&#xff0c;协议是数据传输规则。 1、1介绍 a、由时钟线SCL和数据线SDA组成&#xff0c;并且都接上拉电阻&#xff0c;确保总线空…

UDP套接字

大家好,又见面了,&#x1f389;&#x1f389;&#x1f389;&#x1f338;&#x1f338;&#x1f338; 今天为大家带来UDP套接字的相关知识 文章目录认识socketUDP和TCP认识UDPAPI有关方法基于UDP实现回显服务器UDP的方法基于UDP实现回显程序认识socket UDP和TCP 认识UDPAPI有…

【数据结构】二叉树的概念及结构

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; 初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是…

Linux内核设备驱动设备树概念与使用

一、设备树概念以及作用 1.1设备树概念 设备树(Device Tree)&#xff0c;将这个词分开就是“设备”和“树”&#xff0c;描述设备树的文件叫做 DTS(DeviceTree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff0c;比…

prometheus基本介绍

001 基本介绍 1.主要功能 多维数据模型&#xff08;时序由metric名字和k/v的labels构成&#xff09;灵活的查询语句无依赖存储&#xff0c;支持local和remote不同的模型采用http协议&#xff0c;使用pull模式&#xff0c;拉取数据&#xff0c;简单易懂监控目标&#xff0c;可…

session,zookeeper,mq-rabbitmq,kafka,websocket

spring-boot-demo-session pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

INSERT INTO IF NOT EXISTS问题

情景说明&#xff1a;工作上遇到一个树形结构的数据&#xff0c;如有文件夹和子文件夹这样的数据。由于后端逻辑问题&#xff0c;导致在前端页面操作了删除功能后&#xff0c;数据库中仅部分数据被删除&#xff0c;比如只把根节点或是父节点删除了&#xff0c;没有级联删除所有…