超详解通讯录,保姆式教学 ,轻松学会实现通讯录的功能【c语言】

news2025/4/3 22:46:35

文章目录

  • 静态通讯录
  • Contact.h
  • test.c
    • 菜单的创建
  • Contact.c
    • 初始化通讯录
      • InitContact的实现
    • 增加联系人
      • AddContact的实现
    • 查找指定联系人的信息
      • SearchContact的实现
    • 删除指定联系人
      • DelContact的实现
    • 修改指定联系人的信息
      • ModifyContact的实现
    • 显示所有联系人的信息
      • ShowContact的实现
  • 完整代码
    • Contact.h
    • test.c
    • Contact.c

在这里插入图片描述

静态通讯录

Contact.h

  • 人的信息(姓名 ,年龄,性别,地址,电话)比较复杂,我们把人的相关信息用结构体表示
//人的信息
typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;

  • 我们把存放人的各种信息(姓名 ,年龄,性别,地址,电话)和当前已经存放通讯录人员个数,再创建一个结构体
typedef struct Contact
{
	PeoInfo data[MAX];//存放人的信息的
	int sz;//当前已经放的信息的个数
}Contact;

test.c

菜单的创建

void menu()
{
	printf("**************************************");
	printf("******** 1. add     2.del ************");
	printf("******** 3. search  4.modify *********");
	printf("******** 5. show    6.show ***********");
	printf("******** 0.exit            ***********");
}
int main()
{
	do
	{
		menu();
	} while();
	return 0;
}

Contact.c

初始化通讯录

InitContact的实现

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

增加联系人

AddContact的实现

void AddContact(Contact* pc)
{
	assert(pc);
	//判断通讯录是否满
	if (pc->sz == MAX)
	{
		printf("该通讯录已满\n");
		return;
	}
	//未满
	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("%d", pc->data[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
}

查找指定联系人的信息

SearchContact的实现

void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = {0};
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要查找的人不存在\n");
		return;
	}
	//打印信息
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].addr,
			pc->data[pos].tele);
}

删除指定联系人

DelContact的实现

int FindByName(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;
		}
	}
	return -1;
}
void DelContact(Contact* pc)
{
	assert(pc);

	char name[NAME_MAX] = {0};
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);
	int ret = FindByName(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");
}

修改指定联系人的信息

ModifyContact的实现

void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int pos = FindByName(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");
}

显示所有联系人的信息

ShowContact的实现

void ShowContact(Contact* pc)
{
	assert(pc);
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\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);
	}
}

完整代码

Contact.h

#pragma once

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


#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

//人的信息
typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;


typedef struct Contact
{
	PeoInfo data[MAX];//存放人的信息的
	int sz;//当前已经放的信息的个数
}Contact;

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

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

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

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

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

//修改指定联系人
void ModifyContact(Contact* pc);

test.c

#define _CRT_SECURE_NO_WARNINGS 1


#include "contact.h"

void menu()
{
	printf("************************************\n");
	printf("******  1. add    2. del      ******\n");
	printf("******  3. search 4. modify   ******\n");
	printf("******  5. show   6. sort     ******\n");
	printf("******  0. exit               ******\n");
	printf("************************************\n");
}

int main()
{
	int input = 0;
	//ͨѶ¼
	Contact con;
	//ʼͨѶ¼
	InitContact(&con);

	do
	{
		menu();
		printf("ѡ:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			DelContact(&con);
			break;
		case 3:
			SearchContact(&con);
			break;
		case 4:
			ModifyContact(&con);
			break;
		case 5:
			ShowContact(&con);
			break;
		case 6:
			break;
		case 0:
			printf("˳ͨѶ¼\n");
			break;
		default:
			printf("ѡ\n");
			break;
		}
	} while (input);

	return 0;
}

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

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

void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//增加一个人的信息
	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].addr);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);

	pc->sz++;
}


void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\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);
	}
}


int FindByName(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;
		}
	}
	return -1;
}

void DelContact(Contact* pc)
{
	assert(pc);

	char name[NAME_MAX] = {0};
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);
	int ret = FindByName(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");
}

void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = {0};
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要查找的人不存在\n");
		return;
	}
	//打印信息
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].addr,
			pc->data[pos].tele);
}


void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int pos = FindByName(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");
}

在这里插入图片描述

如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!

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

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

相关文章

vite项目为什么可以直接使用NODE_ENV?

背景 我们知道&#xff0c;在process.env中并没有NODE_ENV这个变量&#xff0c;但是我们却可以在项目的代码中使用process.env.NODE_ENV这个值来判断当前是development环境还是production环境&#xff0c;然后进行后续的逻辑操作。 这说明&#xff0c;在vite内部&#xff0c;…

大数据面试题集锦-Hadoop面试题(二)-HDFS

你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题&#xff0c;关注一下"张飞的猪大数据分享"吧&#xff0c;公众号会不定时的分享相关的知识和资料。 1、 HDFS 中的 block 默认保存几份&#xff1f; 默认保存…

MacBook Pro外接显示器竖屏显示

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3;哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d;一位上进心十足的【Java ToB端大厂领…

接口性能测试避坑 Django+Nginx+uwsgi接口性能调优postman Apifox ab

Django开发了个接口供外部调用&#xff0c;Django的并发性能弱早有所闻&#xff0c;所以采用DjangoNginxuwsgi架构来提高并发量。然后使用测试工具测试并发量。服务器配置&#xff1a;CPU 2&#xff0c;内存8G接口内容只有3句&#xff1a;request_data {"code":&quo…

MyBatis复习

本文章根据尚硅谷MyBatis教程整理而来 原视频地址&#xff1a;https://www.bilibili.com/video/BV1VP4y1c7j7 MyBatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁 移到了Google Code。随着开发团队转投Goo…

力扣刷题记录——521. 最长特殊序列 Ⅰ、541. 反转字符串 II、557. 反转字符串中的单词 III

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《521. 最长特殊序列 Ⅰ、541. 反转字符串 II、557. 反转字…

PhotoZoom Pro8全新版本功能介绍及系统要求

PhotoZoom 2023&#xff08;PhotoZoom 8&#xff09;全新版本震撼来袭。 一款划时代的、技术上产生革命性影响的数码图片放大工具。 我们获取图片的方法&#xff0c;一般是从度娘图片和各个图库里找素材。但一般网上搜索到的很多图片像素都非常小&#xff0c;普通方法放大就像打…

修改配置文件的定时任务

1.问题背景 下发文件给下游系统设置的是定时任务&#xff0c;原本是每天的18&#xff1a;08定时发送&#xff0c;突然下游说要立马发送&#xff0c;于是只能去修改定时任务。 2.修改操作 查看权限—修改权限—备份–修改—重启 查看权限 进入配置文件目录&#xff1a;cd /…

分享77个HTMLCSS源码,总有一款适合您

HTML&CSS源码 分享77个HTML&CSS源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1QRSokzVy2ZAaSD6VR…

DataGear 4.4.0 发布,数据可视化分析平台

DataGear 4.4.0 发布&#xff0c;带来看板新特性&#xff0c;具体更新内容如下&#xff1a; 新增&#xff1a;看板新增dg-chart-manual-render属性&#xff0c;用于控制是否手动渲染图表&#xff1b;新增&#xff1a;看板dg-dashboard-code属性新增"instance"值&…

Linux——线程概念及私有数据和优缺点

目录 一.什么是线程 二.线程私有的数据 三.线程的优点 四.线程的缺点 五.线程与进程对比 一.什么是线程 线程是在进程内部运行&#xff0c;一个进程可以有多个线程。 打个比方&#xff0c;假如人是一个进程&#xff0c;那么走路、思考、吃饭、说话作为不同的线程。一个进…

《Linux Shell脚本攻略》学习笔记-第十章

10.1 Linux的生态系统由网络、硬件、负责分配资源的操作系统内核、接口模块、系统实用工具以及用户程序所组成的。 10.2 运行在计算机中的多个进程都被分配了一个被称为进程ID的唯一标识数字。进程属性包括拥有该进程的用户、进程使用的内存数量、进程占用的CPU时间。 ps命令默…

拉伯证券|年内第二大解禁周来袭

Wind数据显现&#xff0c;除掉新上市公司&#xff0c;本周A股共有54家公司限售股解禁&#xff0c;解禁数量270.57亿股&#xff0c;以最新收盘价计算&#xff08;下同&#xff09;&#xff0c;解禁市值1752.90亿元&#xff0c;为年内第二大解禁周。 本周解禁市值超越10亿元的公司…

YOLOv8代码上线,官方宣布将发布论文,附精度速度初探和对比总结

【YOLOv8 注意事项】 1. YOLOv8 的官方仓库和代码已上线&#xff0c;文档教程网址也刚刚更新。 2. YOLOv8 代码集成在 ultralytics 项目中&#xff0c;目前看不会再单独创建叫做 YOLOv8 的项目。 3. YOLOv8 即将有论文了&#xff01;要知道 YOLOv5 自从 2020 年发布以来&…

阿里云服务器安装图形界面

为了自动化流程安装图形界面&#xff0c;我的服务器是Centos7 1、yum安装gnome图形界面 yum groupinstall “GNOME Desktop” -y 2、安装远程桌面服务端 yum -y install tigervnc-server -y 3、启动远程桌面服务端(将桌面服务绑定到5903端口) vncserver :3 4、阿里控制台放开59…

SpringBoot+VUE前后端分离项目学习笔记 - 【23 权限菜单 续】

BUG1 : 路由跳转问题 访问错误路由&#xff1a; 已登录用户返回404&#xff0c;未登录用户返回登录页面 Route/index.js 路由守卫增加判断 router.beforeEach((to, from, next) > {localStorage.setItem("currentPathName", to.name) // 设置当前的路由名称s…

【墙角数枝梅,凌寒独自开】代码改变未来

墙角数枝梅&#xff0c;凌寒独自开 “墙角数枝梅&#xff0c;凌寒独自开。” 出自王安石的《梅花》 诗句是集语言中的精华&#xff0c;浓缩为七言、五言和四言等&#xff0c;寥寥几句道尽人生酸甜苦辣&#xff0c;儿女情长。 而我更愿把现代的程序员称作诗人&#xff0c;语言是…

ESP32设备驱动-TCS34725颜色传感器驱动

TCS34725颜色传感器驱动 文章目录 TCS34725颜色传感器驱动1、TCS34725介绍2、硬件准备3、软件准备4、驱动实现1、TCS34725介绍 TCS3472 器件提供红色、绿色、蓝色 (RGB) 和清晰光感应值的数字返回。 集成在芯片上并定位于颜色传感光电二极管的 IR 阻挡滤光片可最大限度地减少入…

并发场景使用SimpleDateFormat异常问题和解决

SimpleDateFormat类主要是负责日期的格式化与转换操作&#xff0c;因为它不是线程安全的&#xff0c;所以使用SimpleDateFormat时&#xff0c;务必确保同一个SimpleDateFormat对象不要与其他线程共享&#xff0c;否则并发情况下会出现问题 目录异常示例解决方案1&#xff1a;创…

Camera | 2.MIPI、CSI基础

瑞芯微专栏 上一篇我们讲解了camera的一些基础概念和知识。 我们说了&#xff0c;现在的手机由于高分辨率的要求&#xff0c;现在基本上都是基于MIPI、CSI协议来实现的&#xff0c; 本篇讲解MIPI、CSI的一些基础知识。 摄像头常用术语 下面这些术语是camera驱动中经常用到的…