通讯录(C语言版)(静态通讯录)

news2024/11/25 12:33:05

✨欢迎来到脑子不好的小菜鸟的文章✨

      🎈创作不易,麻烦点点赞哦🎈

          所属专栏:项目

          我的主页:脑子不好的小菜鸟

          文章特点:关键点和步骤讲解放在

          代码相应位置

 引言:

1.菜单

通讯录也如同游戏,需要菜单来供使用者选择,因此要用do...while...(第一次看我文章的小伙伴可以看看我这两篇文章啦:1.扫雷游戏(有讲解)-CSDN博客        2.猜数字游戏(C语言实现)-CSDN博客)

2.功能总结

通讯录有很多功能,因此我们在做出它之前总结一下他的功能

1.添加联系人

2.删除联系人

3.查看联系人

4.查找联系人

5.排序联系人

(根据自己的需要,可以是电话号码从小到大,也可以是名字从小到大)

6.修改联系人

0.退出

(退出是退出循环,所以设为0合适)

文件准备:

与游戏一样,通常需要三个文件:

1.contact.h

包含函数的声明和某些重要量的定义,这些量定义在头文件中方便源文件的使用,也方便代码的统一修改,使之灵活(用define来说明,如:扫雷中的行和列(row和col))

2.contact.c

包含重要的函数实现部分

3.test.c

包含菜单和某些变量的定义(如:扫雷中的棋盘)

开始制作

1.菜单

还是熟悉的do...while...啦

//菜单
void menu()
{
	//添加,删除,显示,查找,排序,修改,退出
	printf("***************************\n");
	printf("***1.Add	2.Del	***\n");
	printf("***3.Show	4.Search***\n");
	printf("***5.Sort	6.Modify***\n");
	printf("***0.exit		***\n");
	printf("***************************\n");
}

int main()
{
	int input;
	Contact con;//重要变量
	char name[NAME_MAX] = { 0 };
    //变量创建
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("添加联系人\n");
				Add(&con);
				break;
			case 2:
				printf("删除联系人\n");
				Del(&con);
				break;
			case 3:
				printf("显示联系人\n");
				Show(&con);
				break;
			case 4:
				printf("查找联系人\n");
				printf("请输入查找人的姓名:\n");
				scanf("%s", name);
				Search(&con, name);
				break;
			case 5:
				printf("排序\n");
				Sort(&con);
				printf("排序成功\n");
				break;
			case 6:
				printf("修改联系人\n");
				printf("请输入修改人的姓名:\n");
				scanf("%s", name);
				Modify(&con,name);
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	}while (input);
	return 0;
}

2.contact.h函数的实现

头文件中为函数类型的声明

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

#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 30

#define MAX 100


typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char address[ADDRESS_MAX];	
	int age;
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];
	int count;
}Contact;

void InitContact(Contact* con);

void Add(Contact* con);
void Del(Contact* con);
void Show(Contact* con);
int FindPeo(Contact* con, char name[]);
void Sort(Contact* con);
void Modify(Contact* con, char name[]);
void Search(Contact* con, char name[]);

3.contact.c函数的实现

初始化部分:

void InitContact(Contact* con)
{
	con->count = 0;
	memset(con->data, 0, sizeof(con->data));//记得用法!!!!!!!!!!!
}

这里运用了memset函数,具体函数如图所示:

由图可知,需要包含头文件<string.h> ,

void* dest:要被初始化的地址(通常为数组名);

int c:用于初始化的数(该题初始化为0);

size_t count:被初始化的元素个数

注意:!!!!!!!

memset函数是以字节来赋值的,所以count部分都是用sizeof(...)来表示,()内为要被初始化的数组名

Add部分:

void Add(Contact* con)
{
	assert(con);
    //避免空指针,断言,记得包含头文件:<assert.h>

	printf("请输入联系人名字:\n");
	scanf("%s", con->data[con->count].name);

	printf("请输入联系人性别:\n");
	scanf("%s", con->data[con->count].sex);

	printf("请输入联系人电话:\n");
	scanf("%s", con->data[con->count].tele);

	printf("请输入联系人地址:\n");
	scanf("%s", con->data[con->count].address);

	printf("请输入联系人年龄:\n");
	scanf("%d", &(con->data[con->count].age));
	/*年龄不是数组,要取地址*/
	con->count++;
    /*记得++*/
}

Sort部分:

运用了qsort函数,具体可参考该文章:qsort函数的使用和模拟实现排序-CSDN博客

void cmp(const void* e1, const void* e2)
{
	return 	(strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name));
                /*比较的是字符串,要运用strcmp函数,记得头文件:<string.h>*/
                /*强制转换为结构体类型*/

   // return ((PeoInfo*)e1)->tele - ((PeoInfo*)e2)->tele);
    /*按照号码排序*/
}

void Sort(Contact* con)
{
	assert(con);

	qsort(con->data, con->count, sizeof(PeoInfo),cmp);//通过名字排序
									/*因为比较的是结构体*/

}

Show部分:

void Show(Contact* con)
{
	printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
	for (int i = 0; i < con->count; i++)
	{
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
			con->data[i].sex,
			con->data[i].tele,
			con->data[i].address,
			con->data[i].age);
	}
}

剩下的部分都要运用到查找部分,我将查找部分写为了FindPeo函数

FindPeo部分:

int FindPeo(Contact* con,char name[])
{
	assert(con);

	for (int i = 0; i < con->count; i++)
	{
		if (strcmp(name, con->data[i].name) == 0)//如果名字相同,则返回下标
			return i;			
	}
	return -1;//未找到,返回-1
}

Del部分:

void Del(Contact* con)
{
	assert(con);

	char name[NAME_MAX];
	printf("请输入联系人名字:\n");
	scanf("%s", name);

	int j = FindPeo(con, name);
	if (FindPeo(con, name) != -1)
	{
		for (int i = j; i < con->count - 1; i++)
		{
			con->data[i] = con->data[i + 1];
		}
		con->count--;
		printf("删除成功\n");
	}
	else
		printf("未找到该联系人,删除失败\n");
}

Search部分:

void Search(Contact* con, char name[])
{
	int i=FindPeo(con, name);
	if(i==-1)
		printf("没有找到该联系人\n");
	else
	{
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
			con->data[i].sex,
			con->data[i].tele,
			con->data[i].address,
			con->data[i].age);
	}
}

Modify部分:

void Modify(Contact* con, char name[])
{
	assert(con);

	int i = FindPeo(con, name);
	if (FindPeo(con, name)==-1)
	{
		printf("未找到该联系人,更改失败\n");
	}
	else
	{
		printf("请输入联系人名字:\n");
		scanf("%s", con->data[i].name);

		printf("请输入联系人性别:\n");
		scanf("%s", con->data[i].sex);

		printf("请输入联系人电话:\n");
		scanf("%s", con->data[i].tele);

		printf("请输入联系人地址:\n");
		scanf("%s", con->data[i].address);

		printf("请输入联系人年龄:\n");
		scanf("%d", &(con->data[i].age));

		printf("更改成功\n");
	}
}

好的,现在只需在test.c部分运用一些语句修饰就可以啦!

4.test.c函数的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

										/*静态通讯录*/
void menu()
{
	//添加,删除,显示,查找,排序,修改,退出
	printf("***************************\n");
	printf("***1.Add	2.Del	***\n");
	printf("***3.Show	4.Search***\n");
	printf("***5.Sort	6.Modify***\n");
	printf("***0.exit		***\n");
	printf("***************************\n");
}

int main()
{
	int input;
	Contact con;
	char name[NAME_MAX] = { 0 };

	/*记得初始化啊!!!!!!!!!!*/
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("添加联系人\n");
				Add(&con);
				break;
			case 2:
				printf("删除联系人\n");
				Del(&con);
				break;
			case 3:
				printf("显示联系人\n");
				Show(&con);
				break;
			case 4:
				printf("查找联系人\n");
				printf("请输入查找人的姓名:\n");
				scanf("%s", name);
				Search(&con, name);
				break;
			case 5:
				printf("排序\n");
				Sort(&con);
				printf("排序成功\n");
				break;
			case 6:
				printf("修改联系人\n");
				printf("请输入修改人的姓名:\n");
				scanf("%s", name);
				Modify(&con,name);
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	}while (input);
	return 0;
}

总结:

contact.h:

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

#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 30

#define MAX 100


typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char address[ADDRESS_MAX];	
	int age;
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];
	int count;
}Contact;

void InitContact(Contact* con);

void Add(Contact* con);
void Del(Contact* con);
void Show(Contact* con);
int FindPeo(Contact* con, char name[]);
void Sort(Contact* con);
void Modify(Contact* con, char name[]);
void Search(Contact* con, char name[]);

contact.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void InitContact(Contact* con)
{
	con->count = 0;
	memset(con->data, 0, sizeof(con->data));//记得用法!!!!!!!!!!!
}

void Add(Contact* con)
{
	assert(con);

	printf("请输入联系人名字:\n");
	scanf("%s", con->data[con->count].name);

	printf("请输入联系人性别:\n");
	scanf("%s", con->data[con->count].sex);

	printf("请输入联系人电话:\n");
	scanf("%s", con->data[con->count].tele);

	printf("请输入联系人地址:\n");
	scanf("%s", con->data[con->count].address);

	printf("请输入联系人年龄:\n");
	scanf("%d", &(con->data[con->count].age));
	//年龄不是数组,要取地址
	con->count++;
}

void Del(Contact* con)
{
	assert(con);

	char name[NAME_MAX];
	printf("请输入联系人名字:\n");
	scanf("%s", name);

	int j = FindPeo(con, name);
	if (FindPeo(con, name) != -1)
	{
		for (int i = j; i < con->count - 1; i++)
		{
			con->data[i] = con->data[i + 1];
		}
		con->count--;
		printf("删除成功\n");
	}
	else
		printf("未找到该联系人,删除失败\n");
}

int FindPeo(Contact* con,char name[])/*!!!!!!!是数组啊,不是字符啊!!!!!!*/
{
	assert(con);

	for (int i = 0; i < con->count; i++)
	{
		if (strcmp(name, con->data[i].name) == 0)
			return i;			
	}
	return -1;
}

void Search(Contact* con, char name[])
{
	int i=FindPeo(con, name);
	if(i==-1)
		printf("没有找到该联系人\n");
	else
	{
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
			con->data[i].sex,
			con->data[i].tele,
			con->data[i].address,
			con->data[i].age);
	}
}

void cmp(const void* e1, const void* e2)
{
	return 	(strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name));
}

void Sort(Contact* con)
{
	assert(con);

	//pai_xu_by_name(con);
	qsort(con->data, con->count, sizeof(PeoInfo),cmp);//通过名字排序
									/*因为比较的是结构体*/
}

void Modify(Contact* con, char name[])
{
	assert(con);

	int i = FindPeo(con, name);
	if (FindPeo(con, name)==-1)
	{
		printf("未找到该联系人,更改失败\n");
	}
	else
	{
		printf("请输入联系人名字:\n");
		scanf("%s", con->data[i].name);

		printf("请输入联系人性别:\n");
		scanf("%s", con->data[i].sex);

		printf("请输入联系人电话:\n");
		scanf("%s", con->data[i].tele);

		printf("请输入联系人地址:\n");
		scanf("%s", con->data[i].address);

		printf("请输入联系人年龄:\n");
		scanf("%d", &(con->data[i].age));

		printf("更改成功\n");
	}
}

void Show(Contact* con)
{
	printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
	for (int i = 0; i < con->count; i++)
	{
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
			con->data[i].sex,
			con->data[i].tele,
			con->data[i].address,
			con->data[i].age);
	}
}

test.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

										/*静态通讯录*/
void menu()
{
	//添加,删除,显示,查找,排序,修改,退出
	printf("***************************\n");
	printf("***1.Add	2.Del	***\n");
	printf("***3.Show	4.Search***\n");
	printf("***5.Sort	6.Modify***\n");
	printf("***0.exit		***\n");
	printf("***************************\n");
}

int main()
{
	int input;
	Contact con;
	char name[NAME_MAX] = { 0 };

	/*记得初始化啊!!!!!!!!!!*/
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("添加联系人\n");
				Add(&con);
				break;
			case 2:
				printf("删除联系人\n");
				Del(&con);
				break;
			case 3:
				printf("显示联系人\n");
				Show(&con);
				break;
			case 4:
				printf("查找联系人\n");
				printf("请输入查找人的姓名:\n");
				scanf("%s", name);
				Search(&con, name);
				break;
			case 5:
				printf("排序\n");
				Sort(&con);
				printf("排序成功\n");
				break;
			case 6:
				printf("修改联系人\n");
				printf("请输入修改人的姓名:\n");
				scanf("%s", name);
				Modify(&con,name);
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	}while (input);
	return 0;
}

恭喜你啦,今天又进步了一点点~

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

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

相关文章

【史上最全】前端页面深入浅出浏览器渲染原理

前言 浏览器的核心组件&#xff0c;即通常所说的浏览器内核&#xff0c;是支撑整个浏览器运行的关键性底层软件架构&#xff0c;它由两个关键组成部分构成&#xff1a;一个是负责网页内容解析和渲染的渲染引擎&#xff0c;另一个则是用于执行JavaScript代码的JS引擎。各浏览器厂…

汽车芯片「新变量」

编者按&#xff1a;汽车行业的格局重构和技术革新&#xff0c;也在推动芯片赛道进入变革周期。不同商业模式的博弈&#xff0c;持续升温。 对于智能汽车来说&#xff0c;过去几年经历了多轮硬件和软件的性能迭代&#xff0c;甚至是革新&#xff0c;如今&#xff0c;市场正在进…

阿里云国外云服务器多少钱?2024年最新价格

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

DevExpress Web Report Designer中文教程 - 如何自定义控件和表达式注册?

获取DevExpress v23.2正式版下载(Q技术交流&#xff1a;909157416&#xff09; 自定义控件集成 DevExpress Reports中的自定义报表控件注册变得更加容易&#xff0c;为了满足web开发人员的需求&#xff0c;DevExpressv23.1包括简化的自定义控件注册支持(在服务器级别实现)。如…

时序分解 | Matlab实现CEEMDAN+PE自适应噪声完备集合经验模态分解+排列熵计算

时序分解 | Matlab实现CEEMDANPE自适应噪声完备集合经验模态分解排列熵计算 目录 时序分解 | Matlab实现CEEMDANPE自适应噪声完备集合经验模态分解排列熵计算效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CEEMDANPE自适应噪声完备集合经验模态分解排列熵计算 运行环境m…

Spring Boot 整合 Camunda 实现工作流

工作流是我们开发企业应用几乎必备的一项功能&#xff0c;工作流引擎发展至今已经有非常多的产品。最近正好在接触Camunda&#xff0c;所以来做个简单的入门整合介绍。如果您也刚好在调研或者刚开始计划接入&#xff0c;希望本文对您有所帮助。如果您是一名Java开发或Spring框架…

echarts格式化X,Y轴坐标的值(格式单位)

现在一个需求要求将y轴数据切换为万单位 加入一下代码 yAxis: {type: "value",axisLabel: {formatter: function (value, index) {return value > 10000 ? parseInt(value / 10000) "万" : value;},},}, 效果如下 其中&#xff0c;axisLabel支持两种…

面试题 05.06. 整数转换(力扣)(OJ题)

题目链接&#xff1a;面试题 05.06. 整数转换 - 力扣&#xff08;LeetCode&#xff09; 所属专栏&#xff1a;刷题 整数转换。编写一个函数&#xff0c;确定需要改变几个位才能将整数A转成整数B。 示例1: 输入&#xff1a;A 29 &#xff08;或者0b11101&#xff09;, B 15…

Spring Web文件上传功能简述

文章目录 正文简单文件上传文件写入 总结 正文 在日常项目开发过程中&#xff0c;文件上传是一个非常常见的功能&#xff0c;当然正规项目都有专门的文件服务器保存上传的文件&#xff0c;实际只需要保存文件路径链接到数据库中即可&#xff0c;但在小型项目中可能没有专门的文…

【控制篇 / 分流】(7.4) ❀ 03. 对国内和国际IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带用来上网&#xff0c;一条电信&#xff0c;一条IPLS国际专线&#xff0c;由于IPLS仅有2M&#xff0c;且价格昂贵&#xff0c;领导要求&#xff0c;访问国内IP走电信&#xff0c;国际IP走IPLS&#xff0c;那么应该怎么做&#xff1f; 国内IP地址组 我们已…

Pytorch各种Dropout层应用于详解

目录 torch框架Dropout functions详解 dropout 用途 用法 使用技巧 参数 数学理论公式 代码示例 alpha_dropout 用途 用法 使用技巧 参数 数学理论公式 代码示例 feature_alpha_dropout 用途 用法 使用技巧 参数 数学理论 代码示例 dropout1d 用途 用…

echarts X轴数据过多导致重叠展示不全问题(已解决)

问题 x轴数据过多导致坐标轴数据重叠 修改后 List item interval为0代表每个标签都显示&#xff0c;即间隔为0&#xff01; 将其设置为我们想要的数值即可。 xAxis: {type: "time",splitLine: {show: false,},axisLine: {show: false,lineStyle: {color: &qu…

正则表达式中的“回引用(回溯)”——别名引用与序号引用的差异及正则表达式中的“P”关键字

读到一段巧妙的正则表达式&#xff0c;勾起我对正则表达式欠缺知识点的探寻&#xff1a; P y t h o n Python Python正则表达式中的“回引用(回溯)”——分组别名引用与序号引用的差异及正则表达式中的“P”关键字详情。 (笔记模板由python脚本于2024年01月14日 07:49:35创建&a…

RT-Thread Studio学习(十四)ADC

RT-Thread Studio学习&#xff08;十四&#xff09;ADC 一、简介二、新建RT-Thread项目并使用外部时钟三、启用ADC四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用ADC设备。硬件及开发环境如下&#xff1a; OS WIN10STM32F407VET6STM…

16.5 参考文献——深度学习定位

16.5 一种高效鲁棒的多楼层室内环境指纹定位方法 同济大学 Zhao Y, Gong W, Li L, et al. An Efficient and Robust Fingerprint Based Localization Method for Multi Floor Indoor Environment[J]. IEEEa Internet of Things Journal, 2023. 2.相关工作 B.基于深度学习的…

情人节专属--html5 canvas制作情人节告白爱心动画特效

💖效果展示 💖html展示 <!doctype html> <html> <head> <meta charset=

2024杭州国际智慧城市,人工智能,安防展览会(杭州智博会)

在智能化浪潮的冲击下&#xff0c;我们的生活与环境正在经历一场深刻的变革。这是一场前所未有的技术革命&#xff0c;它以前所未有的速度和广度&#xff0c;改变着我们的生活方式、工作方式、思维方式和社会结构。在这场变革中&#xff0c;有的人选择激流勇进&#xff0c;拥抱…

Redis中的Java客户端

一、Jedis Jedis是一个Java实现的Redis客户端连接工具。 Jedis使用非常简单&#xff0c;直接引入依赖。基于默认参数的Jedis连接池&#xff0c;初始化连接池类&#xff08;使用默认连接池参数&#xff09;JedisPool&#xff0c;获取一个Jedis连接Jedis jedisjp.getResource()…

Git将某个文件合并到指定分支

企业开发中&#xff0c;经常会单独拉分支去做自己的需求开发&#xff0c;但是某些时候一些公共的配置我们需要从主线pull&#xff0c;这时候整个分支merge显然不合适 1.切换至待合并文件的分支 git checkout <branch>2.将目标分支的单个文件合并到当前分支 git checkou…