通讯录的实现(详解)(后附完整源代码)

news2024/12/23 22:12:34

通讯录的实现

  • 一.所需要的功能
  • 二.大致菜单
  • 三.创建通讯录
  • 四.增加联系人
  • 五.显示联系人
  • 六.查找联系人
  • 七.删除联系人
  • 八.修改联系人

在这里插入图片描述

一.所需要的功能

对于通讯录来说,我们需要它实现以下几个功能。

1.人的信息:姓名+年龄+性别+电话+地址。
2.可以存放100个人的信息。
功能:
1>增加联系人。
2>删除联系人。
3>查找指定联系人信息。
4>修改指定联系人信息。
5>显示所有联系人信息。

接下来分为三个模块,test.c->用来测试通讯录;contact.c->通讯录主体部分;contact.h->用于函数的声明。

二.大致菜单

#include"contact.h"


void menu()
{
	printf("********************************\n");
	printf("****** 1.增加      2.删除 ******\n");
	printf("****** 3.查找      4.修改 ******\n");
	printf("****** 5.展示      0.退出 ******\n");
	printf("********************************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 0:
			printf("退出通讯录。\n");
			break;
		default:
			printf("输入无效,请重新输入。\n");
			break;
		}
	} while (input);
	return 0;
}

这一块很简单,就不再多说。菜单是属于测试部分,所以我将它放入test.c文件里。

三.创建通讯录

对于一个人,肯定有多方面的因数,所以将其封装在一个结构体内。这里使用到typedef,如果不太熟悉可以看看这篇博客typedef的使用

在这里插入图片描述

接下来,再封装一个结构体里面存放100个人的信息和当前人的个数。

在这里插入图片描述

接着在主函数里使用该结构体创建通讯录。然后进行初始化。

在这里插入图片描述

初始化函数在contact.h里声明。

在这里插入图片描述

在contact.c里实现,需要使用到memset,如果不太明白可以看看这篇博客memset如何使用

在这里插入图片描述

四.增加联系人

在这里插入图片描述

在contact.h里声明。

在这里插入图片描述

在contact.c里面实现。
在这里插入图片描述

五.显示联系人

在这里插入图片描述

在contact.h里声明。

在这里插入图片描述

在contact.c里实现。这里使用到\t,向后隔开8个字节,用于分隔。同时例如%-20s是右边隔开20个字节,也就是进行左对齐。

在这里插入图片描述

在这里插入图片描述

六.查找联系人

我们发现无论是查找,删除还是修改都需要先找到这个人。所以我们干脆将寻找封装成一个函数来使用。我们通过名字来查找(需要使用strcmp,如果不熟悉可以看看这篇博客strcmp的使用)

在这里插入图片描述

完成后正式进行查找。

在这里插入图片描述

老规矩,现在contact.h里进行声明。ps:前面的find不用声明是因为find只在contact.c里使用。

在这里插入图片描述

在contact.c里实现。

在这里插入图片描述

七.删除联系人

这里采用一种最简单的方法,就是从后往前依次覆盖。首先找到该名字的位置,然后依次将后面的往前挪。

在这里插入图片描述

在contact.h里声明。

在这里插入图片描述

在contact.c里实现。

在这里插入图片描述

八.修改联系人

在这里插入图片描述

老规矩在contact.h里进行声明。

在这里插入图片描述

在contact.c里实现。修改其实就是重新录入,找到位置,重新写一遍就好了。

在这里插入图片描述

好了,以上就是通讯录的实现功能啦,下面是源代码。

test.c

#include"contact.h"


void menu()
{
	printf("********************************\n");
	printf("****** 1.增加      2.删除 ******\n");
	printf("****** 3.查找      4.修改 ******\n");
	printf("****** 5.展示      0.退出 ******\n");
	printf("********************************\n");
}
int main()
{
	int input = 0;
	//创建通讯录
	Contact con;//该结构体包含100个人的信息和已填充人的个数
	//初始化通讯录
	InitContact(&con);//结构体传参
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			Dlete(&con);
			break;
		case 3:
			Search(&con);
			break;
		case 4:
			Modify(&con);
			break;
		case 5:
			ShowContact(&con);
			break;
		case 0:
			printf("退出通讯录。\n");
			break;
		default:
			printf("输入无效,请重新输入。\n");
			break;
		}
	} while (input);
	return 0;
}

contact.h

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


//人的信息
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char addr[30];
	char tele[12];
}PeoInfo;


typedef struct Contact
{
	PeoInfo data[100];//存放人的信息
	int sz;//当前已经放的信息个数
}Contact;//同理,这里也进行了重命名


//声明初始化函数
void InitContact(Contact* pc);

//声明增加联系人函数
void AddContact(Contact*pc);

//声明显示联系人函数
void ShowContact(const Contact*pc);

//声明查找函数
void Search(const Contact*pc);//查找依然不会改变,所以加上const

//声明删除函数
void Dlete(Contact*pc);

//声明修改函数
void Modify(Contact*pc);

contact.c

#include"contact.h"



//初始化函数的实现
void InitContact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}


//增加联系人
void AddContact(Contact* pc)
{
	assert(pc);//一个好的习惯判断是否为空指针(当然不加也没影响)
	if (pc->sz == 100)
	{
		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)//因为显示不会改变元素,所以最好加上const
{
	assert(pc);
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");//提示
	for (int 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[])//两个参数,一个是通讯录里存的名字,一个是你要查找的名字
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;//找到返回下标
		}
	}
	return -1;//没找到,返回-1
}


//查找
void Search(const Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("请输入要查找的名字:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("查无此人。\n");
		return;
	}
	//找到了,打印信息
	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 Dlete(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("请输入要删除的名字:");
	scanf("%s", name);
	int dle = FindByName(pc, name);//找到位置
	if (dle == -1)
	{
		printf("查无此人。\n");
		return;
	}
	for (int i = dle; i < pc->sz-1; i++)//从后往前覆盖,同时-1避免越界
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;//删除完成后别忘了个数-1
	printf("删除成功\n");
}



//修改
void Modify(Contact* pc)
{
	assert(pc);
	char name[20] = { 0 };
	printf("请输入要修改的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("查无此人\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", pc->data[ret].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[ret].age));
	printf("请输入性别:");
	scanf("%s", pc->data[ret].sex);
	printf("请输入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[ret].tele);

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

在这里插入图片描述

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

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

相关文章

VMware Workstation Pro 16安装Windows 11

1&#xff1a;首先在机器中安装VMware Workstation Pro。 2&#xff1a;准备Windows 11的安装镜像。 3&#xff1a;安装Windows 11的系统要求&#xff0c;这个很关键不满足条件无法安装&#xff0c;其中我们只需要注意系统固件和TPM这两项就行。 4&#xff1a;运行VMware Wor…

使用SQL4Automation让CodeSYS连接数据库

使用SQL4Automation让CodeSYS连接数据库 摘要&#xff1a;本文旨在说明面向CodeSYS的数据库连接方案SQL4Automation的使用方法。 1.SQL4Automation简介 1.1.什么是SQL4Automation SQL4Automation是一套工业用途的软件解决方案&#xff0c;它主要的功能就是为PLC和机器人控制提…

王道操作系统笔记(一)———— 计算机系统概述

文章目录一、操作系统基本概念1.1 基本概念1.2 四大特征1.3 目标和功能二、操作系统的分类与发展三、操作系统的运行环境3.1 运行机制3.2 中断和异常3.3 系统调用四、操作系统的体系结构4.1 宏内核与微内核4.2 分层结构4.3 模块化4.4 外核五、操作系统引导六、虚拟机一、操作系…

nacos2.x集群版搭建

1. 预备环境准备 请确保是在环境中安装使用: 64 bit OS Linux/Unix/Mac&#xff0c;推荐使用Linux系统。--这里使用linux系统64 bit JDK 1.8&#xff1b;下载. 配置。Maven 3.2.x&#xff1b;下载. 配置。3个或3个以上Nacos节点才能构成集群。官网地址:集群部署说明 2、服务器…

Android 深入系统完全讲解(12)

11 跟踪一个服务&#xff0c;直接找到驱动实现 如果说我自己学习整个系统&#xff0c;直到底层驱动的方法&#xff0c;我想说的就是我常用的就是跟踪震动这个模块&#xff0c;而为什么是这个&#xff0c;主要是简单&#xff0c;但是又是从上到下都具备&#xff0c;对于学习系统…

【OpenCV】拾遗

前言 本篇博客主要是总结OpenCV使用过程中遇到的一些问题&#xff0c;便于以后参考。 以下所有内容均基于VS2015 OpenCV_v4.5.1 及 VS Code MinGW_v4.3.5 CMake_v3.20.0 OpenCV_v4.5.1&#xff0c;前者的配置教程可以参考这个链接&#xff0c;后者的配置教程可以参考这个链…

2022年衣物清洁行业市场报告:洗衣液等四大高增长类目分析

随着人们经济水平的提高以及消费观念的升级&#xff0c;当前个护家清用品逐渐朝品质化、精细化、个性化的方向发展&#xff0c;类目衍生更替更频繁、迭代速度更快。 得益于庞大的人口规模&#xff0c;个护家清产品规模巨大&#xff0c;衣物清洁行业虽增速放缓但仍在个护家清行…

OpenFoam收缩扩张喷管(拉瓦尔喷管)边界条件的设置

简介 收缩扩张喷管&#xff08;也成拉瓦尔喷管&#xff09;广泛应用于火箭推进。将其流动特性定性描述如下&#xff1a; &#xff08;1&#xff09;当入口流量较小时&#xff0c;不出现雍塞&#xff0c;流速先增大后减小&#xff0c;全程为亚声速。出口压力即为大气压&#x…

金融数学建模——2022年大湾区杯金融数学建模B题(解题思路及部分python代码)

目录 一、概述 二、赛题及解读 1.赛题详情 2.赛题解读 三、解题方法 1.第一问 第一问部分代码 2.第二问 第二问部分代码 3.第三问&#xff1a; 第三问部分代码 4.第四问 三、总结 一、概述 这次比赛是我们队伍第一次参加金融数学建模&#xff0c;尽管在比赛前用2020年…

数据结构与算法4—队列

队列 队列的定义 队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入&#xff0c;而在另一端进行删除。允许删除的一端称为队头(front)&#xff0c;允许插入的一端称为队尾(rear)。队列的修改是依先进先出的原则进行的。队列的基本操作 1&#xff0e;初始化队…

Vue前后端页面下载功能实现演示,Python+flask提供后台下载服务

Vue前后端页面下载功能实现效果图后台下载服务实现前台简单实现[ 文章推荐 ] Python 地图篇 - 使用 pyecharts 绘制世界地图、中国地图、省级地图、市级地图实例详解 效果图 首先看下演示效果。 点文档的话是 html 文档&#xff0c;跳转的预览&#xff0c;点下载的话是压缩包…

pycharm python 程序打包相关

前言 终于入门了python打包这个大话题&#xff0c;将目前学到的技能分享一下。 pycharm启动虚拟环境pipenv 缩小打包 和很多博客说的一样&#xff0c;打包那么大是因为打包了多余的库&#xff0c;因此想要缩小就需要一个干净的&#xff0c;没有多余的库的环境进行打包。也就是…

一文读懂内容生态驱动的“菌落式”增长

健康的内容生态对文娱行业极为重要。本文详细介绍了用内容生态建设驱动用户“菌落式”增长的路径。点击文末“阅读原文”立即观看完整直播回放&#xff0c;并下载演讲文档。内容生态与用户增长内容生态建设与用户增长互为因果。一方面&#xff0c;出圈的内容直接带来用户增长。…

《2022大数据产业年度创新服务企业》榜重磅发布丨金猿奖

‍年度金猿榜单/奖项本届“数据猿年度金猿策划活动——2021大数据产业创新服务企业榜单/奖项”由金猿&数据猿&上海大数据联盟共同推出。‍数据智能产业创新服务媒体——聚焦数智 改变商业2022年下半年度&#xff0c;由数据猿、金猿组委会共同推出的第五届 “年度金猿季…

通过usb利用adb实现android手机和pc机通信

1、 adb forward 原理概述 adb forward 的功能是建立一个转发 如&#xff1a;adb forward tcp:8000 tcp:9000 的意思是&#xff0c;将PC端的 8000 端口收到的数据&#xff0c;转发给手机中的 9000 端口。 但是光执行这个命令还不能转发数据&#xff0c;还需要完成下面两个步骤才…

【主色提取】HSV 颜色空间与 RGB 颜色空间互相转化的公式和代码

系列文章目录 第二章 主色提取之颜色空间转化 目录 系列文章目录 文章目录 前言 一、HSV 和 RGB 颜色空间 二、颜色转化 1. RGB to HSV 2. HSV to RGB 三、 完整代码 前言 HSV 颜色空间和 RGB 颜色空间的转化。 一、HSV 和 RGB 颜色空间 RGB颜色使用的最多&#xff0…

C语言详解【通讯录的实现】

前言&#xff1a; 在之前的学习中我们已经了解了结构体的一些知识&#xff0c;有了之前的知识的储备&#xff0c;在这里我们就可以尝试通讯录的实现。 目录问题描述基本流程前期的准备工作实现过程第一阶段第二阶段第三阶段1.增加联系人2.删除联系人3.打印通讯录4.查找指定联系…

高等数学(第七版)同济大学 习题11-7 个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题11-7 函数作图软件&#xff1a;Mathematica 1.试对曲面Σ&#xff1a;zx2y2&#xff0c;x2y2≤1&#xff0c;Py2&#xff0c;Qx&#xff0c;Rz2验证斯托克斯公式.\begin{aligned}&1. \ 试对曲面\Sigma&#xff1a;zx^…

yolov5+车道线检测

目标检测与车道线检测在自动驾驶以及车辆定位中起着重要的辅助作用&#xff0c;是环境感知中不可缺少的一个部分。基于深度学习的车道线检测方法近年来也在不断的提升&#xff0c;比如论文&#xff1a;Ultra Fast Deep Lane Detection with HybridAnchor Driven Ordinal Classi…

Allegro如何Wavie DRC操作指导

Allegro如何Wavie DRC操作指导 在做PCB设计的时候,会因为规则设置的原因,导致出现很多DRC,不方便检查,Allegro支持直接Waive掉正常DRC,方便检查,如下图 芯片中心需要打过孔方便散热,但是这些过孔的DRC是不需要显示的 具体操作如下 选择Display选择 Waive DRCs