用c语言简单实现通讯录(详解和具体代码)

2023-11-16

前言

一、明确通讯录的功能

1.查找通讯录上的姓名、性别、电话和住址

2.可以增加、删除或修改相关信息

二、如何实现通讯录的功能

1.使用struct函数

2.实现通讯录的步骤

(1)初始化通讯录并打印目录

(2)实现增加信息与展示通讯录

(3)实现查询、删减与修改通讯录

(4)实现清除所有联系人

(5)实现按名字排序

三、具体实现代码展示

前言

通讯录是我们用来找寻相关人信息的一种手段,我们可以通过它找到我们想要找到的人的各种信息,类似于姓名、性别、电话号码和住址等等,它也可以用于存储我们想要存储人的信息,对我们的帮助不小。

一、实现步骤

1.使用struct函数初始化通讯录并打印目录

注:

这里我们需要用到传址调用,因为如果用传值调用不能对通讯录进行修改(在函数传参的时候,传值调用产生形参,形参是实参的一份临时拷贝,对形参的修改并不能改变实参;传址调用是形参和实参公用一块地址,对形参的修改可以影响到实参)。

创建一个struct函数保存中每个人的信息,再创建一个函数实现真正的通讯录(其中sz用来计算通讯录中有多少份信息)。

这里我们使用memset函数来初始化我们的通讯录。

struct peoinfor//每个人的信息
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
};

struct Contacts
{
	struct peoinfor data[1000];
	int sz;

};
//创建通讯录
	struct Contacts con;
//对通讯录进行初始化
void init_contacts(struct Contacts *pc)
{
	assert(pc);

	pc->sz = 0;
	memset(pc->data, 0, MAX * sizeof(struct peoinfor));
}
void menu()
{
	printf("***************************\n");
	printf("*****1.Add    2.del   *****\n");
	printf("*****3.search 4.modify*****\n");
	printf("*****5.show   6.clear *****\n");
	printf("*****7.sort   0.exit  *****\n");
	printf("***************************\n");

}

2.实现增加和展示

注:

这里我们可以使用assert函数来保证这个函数指针不为空指针(及野指针)。

这里我们采用的是左对齐的方式进行打印,中间包含水平制表符来保证我们打印出来的通讯录能够很清晰的找到我们需要的信息。

void Add_contacts(struct Contacts *pc)
{
	assert(pc);

	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加数据\n");
		return;
	 }
	printf("请输入要增加人的名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入要增加人的性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入要增加人的年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入要增加人的电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入要增加人的地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("已成功添加联系人\n");
}
//展示通讯录中人的信息
void Show_contacts(const struct Contacts* pc)
{
	assert(pc);
	int i = 0;
	printf("%-20s\t%-6s\t%-5s\t%-13s\t%-30s\t\n", "性名", "性别", "年龄", "电话", "住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-6s\t%-5d\t%-13s\t%-30s\t\n", pc->data[i].name,
	          pc->data[i].sex,
              pc->data[i].age, 
			  pc->data[i].tele, 
	          pc->data[i].addr);
	}
}

 3.实现删减和修改通讯录

在实现删减之前我们需要查找该联系人是否在我们创建的通讯录中保存,这里我们用循环并用strcmp函数对两个字符串进行比较,用ret进行接收,用-1来表示该联系人不存在,其余返回i表示存在。这里我们使用static来修饰有返回值的函数,保证其私密性及只能在该文件夹中使用,在其它文件中查询不到。

static int Findbyname(char name[], struct Contacts* pc)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}

	}
	return -1;
}
//删除通讯录中人的信息
void del_contacts(struct Contacts* pc)
{
	assert(pc);
	char name[MAX_NAME];
	printf("请输入要删除人的姓名:>");
	scanf("%s", name);
	int ret = Findbyname(name, pc);
	if (-1 == ret)
	{
		printf("没有查询到要删除的人的信息\n");
	}
	else
	{
		int j = 0;
		for (j = ret; j < pc->sz; j++)
		{
			pc->data[j] = pc->data[j + 1];
			pc->sz--;
		}
	}
}
//查找通讯录中人的信息
void search_contacts(struct Contacts* pc)
{
	assert(pc);

	char name[MAX_NAME];
	printf("请输入要查找人的姓名\n");
	scanf("%s", name);
	int ret = Findbyname(name, pc);
	if (-1 == ret)
	{
		printf("没有查询到相关人的信息\n");
	}
	else
	{
		printf("%-20s\t%-6s\t%-5d\t%-13s\t%-30s\t\n", pc->data[ret].name,
			pc->data[ret].sex,
			pc->data[ret].age,
			pc->data[ret].tele,
			pc->data[ret].addr);
		printf("查询成功\n");
	}
}
//修改通讯录中人的信息
void modify_contacts(struct Contacts* pc)
{
	assert(pc);

	char name[MAX_NAME];

	printf("请输入要修改的人的姓名:>");
	scanf("%s", name);
	int ret = Findbyname(name, pc);
	if (-1 == ret)
	{
		printf("没有查询到相关人的信息\n");
	}
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[ret].name);
		printf("请输入性别:>");
		scanf("%s", pc->data[ret].sex);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[ret].age));
		printf("请输入电话:>");
		scanf("%s", pc->data[ret].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[ret].addr);

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

4.实现清除所有联系人

这里类似于对函数进行初始化。

//清空所有联系人
void clear_contacts(struct Contacts* pc)
{
	assert(pc);
    
	pc->sz = 0;
	memset(pc->data, 0, MAX * sizeof(struct peoinfor));
}

int CmpByName(const void* e1, const void* e2)
{
	return strcmp(((struct peoinfor*)e1)->name, ((struct peoinfor*)e2)->name);
}

5.实现按名字排序

这里使用qsort函数对通讯录中的信息进行快速排序

创建一个函数指针

将两个指针作为参数(均转换为常量 void*)。该函数通过返回(以稳定和传递的方式)来定义元素的顺序:

返回值 意义
<0 指向 的元素位于 指向 的元素之前p1p2
0 指向 的元素等效于 指向 的元素p1p2
>0 指向 的元素在 指向 的元素之后p1p2

int CmpByName(const void* e1, const void* e2)
{
	return strcmp(((struct peoinfor*)e1)->name, ((struct peoinfor*)e2)->name);
}

//按照名字来排序
void sort_contacts(struct Contacts* pc)
{
	qsort(pc->data, pc->sz, sizeof(struct peoinfor), CmpByName);
}

二、具体代码展示

1.contacts.c文件

#define _CRT_SECURE_NO_WARNINGS 1

#include "contacts.h"

//对通讯录进行初始化
void init_contacts(struct Contacts *pc)
{
	assert(pc);

	pc->sz = 0;
	memset(pc->data, 0, MAX * sizeof(struct peoinfor));
}
//在通讯录中增加一个人的信息
void Add_contacts(struct Contacts *pc)
{
	assert(pc);

	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加数据\n");
		return;
	 }
	printf("请输入要增加人的名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入要增加人的性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入要增加人的年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入要增加人的电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入要增加人的地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("已成功添加联系人\n");
}
//展示通讯录中人的信息
void Show_contacts(const struct Contacts* pc)
{
	assert(pc);
	int i = 0;
	printf("%-20s\t%-6s\t%-5s\t%-13s\t%-30s\t\n", "性名", "性别", "年龄", "电话", "住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-6s\t%-5d\t%-13s\t%-30s\t\n", pc->data[i].name,
	          pc->data[i].sex,
              pc->data[i].age, 
			  pc->data[i].tele, 
	          pc->data[i].addr);
	}
}

static int Findbyname(char name[], struct Contacts* pc)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}

	}
	return -1;
}
//删除通讯录中人的信息
void del_contacts(struct Contacts* pc)
{
	assert(pc);
	char name[MAX_NAME];
	printf("请输入要删除人的姓名:>");
	scanf("%s", name);
	int ret = Findbyname(name, pc);
	if (-1 == ret)
	{
		printf("没有查询到要删除的人的信息\n");
	}
	else
	{
		int j = 0;
		for (j = ret; j < pc->sz; j++)
		{
			pc->data[j] = pc->data[j + 1];
			pc->sz--;
		}
	}
}
//查找通讯录中人的信息
void search_contacts(struct Contacts* pc)
{
	assert(pc);

	char name[MAX_NAME];
	printf("请输入要查找人的姓名\n");
	scanf("%s", name);
	int ret = Findbyname(name, pc);
	if (-1 == ret)
	{
		printf("没有查询到相关人的信息\n");
	}
	else
	{
		printf("%-20s\t%-6s\t%-5d\t%-13s\t%-30s\t\n", pc->data[ret].name,
			pc->data[ret].sex,
			pc->data[ret].age,
			pc->data[ret].tele,
			pc->data[ret].addr);
		printf("查询成功\n");
	}
}
//修改通讯录中人的信息
void modify_contacts(struct Contacts* pc)
{
	assert(pc);

	char name[MAX_NAME];

	printf("请输入要修改的人的姓名:>");
	scanf("%s", name);
	int ret = Findbyname(name, pc);
	if (-1 == ret)
	{
		printf("没有查询到相关人的信息\n");
	}
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[ret].name);
		printf("请输入性别:>");
		scanf("%s", pc->data[ret].sex);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[ret].age));
		printf("请输入电话:>");
		scanf("%s", pc->data[ret].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[ret].addr);

		printf("修改成功\n");
	}
}
//清空所有联系人
void clear_contacts(struct Contacts* pc)
{
	assert(pc);
    
	pc->sz = 0;
	memset(pc->data, 0, MAX * sizeof(struct peoinfor));
}

int CmpByName(const void* e1, const void* e2)
{
	return strcmp(((struct peoinfor*)e1)->name, ((struct peoinfor*)e2)->name);
}

//按照名字来排序
void sort_contacts(struct Contacts* pc)
{
	qsort(pc->data, pc->sz, sizeof(struct peoinfor), CmpByName);
}



2.contacts.h文件

#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <Windows.h>
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TELE 13
#define MAX_ADDR 30


struct peoinfor//每个人的信息
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
};

struct Contacts
{
	struct peoinfor data[1000];
	int sz;

};
//初始化通讯录
void init_contacts(struct Contacts* pc);

//增加通讯录中人的信息
void Add_contacts(struct Contacts* pc);

//展示通讯录中人的信息
void Show_contacts(struct Contacts* pc);

//删除通讯录中指定人的信息
void del_contacts(struct Contacts* pc);

//查找通讯录中人的信息
void search_contacts(struct Contacts* pc);

//修改通讯录中人的信息
void modify_contacts(struct Contacts* pc);

//清空通讯录中人的信息
void clear_contacts(struct Contacts* pc);

//以名字排序所有联系人
void sort_contacts(struct Contacts* pc);





3.test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "contacts.h"

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

}

int main()
{
	int input = 0;
	//创建通讯录
	struct Contacts con;
	//初始化通讯录
	init_contacts(&con);
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Add_contacts(&con);
			system("cls");
			break;
		case 2:
			del_contacts(&con);
			system("cls");
			break;
		case 3:
			search_contacts(&con);
			break;
		case 4:
			modify_contacts(&con);
			system("cls");
			break;
		case 5:
			Show_contacts(&con);
			break;
		case 6:
			clear_contacts(&con);
			break;
		case 7:
			sort_contacts(&con);
			system("cls");
			break;

		case 0:
			printf("退出通讯录\n");
			break;
		default:
			break;
		}
	} while (input);
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用c语言简单实现通讯录(详解和具体代码) 的相关文章

随机推荐

  • An error occured, please see below or look at Nuxt.js terminal for more info. Error: EACCES: permiss

    这个问题应该就是mac会遇到 把npm run dev 前面加个sudo sudo npm run dev 就可以了
  • 《人工智能导论》 第1章 绪论&第2章 知识表示&第3章 确定性推理方法&第4章 不确定推理方法

    绪论 人工智能的基本概念 智能的概念 目前对智能还没有确切的定义 主要流派有 思维理论 智能的核心是思维 认为通过对思维规律与方法的研究可揭示智能的本质 知识阈值理论 智能取决于知识的数量及一般化程度 认为智能是在巨大的搜索空间中迅速找到满
  • 华为机试training-03

    蛇形矩阵 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形 例如 当输入5时 应该输出的三角形为 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 其具体实现代码如下 include
  • mybatits的PageHelper分页工具的使用

    最近开发一个后台管理系统 有一些东西记录一下 之前都是没有这个工具之前都是传递参数到xml进行分页查询 1 首先导入一些可能导入的包
  • Java 集合深入理解 (十一) :HashMap之实现原理及hash碰撞

    文章目录 前言 哈希表原理 实现示例 HashMap实现原理 全篇注释分析 实现注意事项 默认属性分析 属性分析 构造方法分析 重要的put方法 总结 前言 哈希表 hashMap 又叫散列表 是一种非常重要的数据结构基于map接口实现 应
  • STM32 MCP2515连发 多发 MCP2515收发程序 多路CAN通信 2路CAN

    MCP2515在发送数据时 如果通信速率较低一切都正常 但是当通信速率较高 比如1M时 发送一帧数据后 MCP2515有时会出现自动重复发送多帧数据的情况 为解决这现象 请参照官方给的 MCP2515勘误手册 第5条 给出了解决CAN速率较
  • IDEA正则表达式高级替换

    1 需求 需要将如下注释转换成另外一个形式 员工姓名 private String name 员工姓名 private String name 2 在idea中输入正则表达式进行快速替换 3 具体的正则表达式如下 替换前正则 替换后正则 1
  • openGL之API学习(二零二)glsl的smooth flat

    采用flat着色时 OpenGL将使用图元中某个顶点的颜色来渲染整个图元 通常情况下会选择图元的第一个或最后一个顶点的颜色作为该图元的颜色 在使用smooth着色时 OpenGL会独立的处理图元中各个顶点的颜色 对于线段图元 线段上各点的颜
  • 电子信息工程专业毕设题目选题推荐

    文章目录 1前言 2 如何选题 3 选题方向 2 1 嵌入式开发方向 2 2 物联网方向 2 3 移动通信方向 2 4 人工智能方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 3 4 学长作品展示 4 最后 1前
  • Oracle开窗分析函数,Oracle 惯用的分析开窗函数

    SELECT T EMAIL USER NAME COUNT OVER PARTITION BY T EMAIL MAIL ORDER BY T EMAIL TEL DESC C FROM T BASE EMAIL T SELECT T E
  • python startswith与endswith

    python startswith与endswith 如果你要用python匹配字符串的开头或末尾是否包含一个字符串 就可以用startswith 和endswith 比如 content ilovepython 如果字符串content以
  • 以模板的方式重载"operator <<"需要注意的地方

    当我们用C 进行后台开发的时候 常常需要知道某一时刻一个容器的内容 通常 我们的做法是利用迭代器将容器内容打印到日志文件中 然后进行观察分析 如果每次打印都去找迭代器的麻烦 显然不是我们想要的 这样 顺理成章的我们就想到了封装函数 为了更方
  • Vue3 —— 使用Vite配置环境变量

    文章目录 一 为什么要配置环境变量 二 在Vite中配置环境变量 1 环境变量和模式 2 环境变量 3 生产环境替换 4 env 文件 总结 一 为什么要配置环境变量 在一个产品的前端开发过程中 一般来说会经历本地开发 测试脚本 开发自测
  • Spring boot定制个性化banner(七彩佛祖版)

    1 在项目的src main resources目录下创建banner txt文件 2 创建完成banner txt文件后 即可以在文件中放入需要自定义的任意字符图案 本次以佛祖图案为例 代码直接复制放到banner txt文件即可 不用做
  • 2021年蓝桥杯Python常见考点【持续更新ing】

    目录 一 常用技巧 一 输入输出 1 一行输入数值 2 多行输入 二 列表 1 存储多行 用 2 从多行数字 转变为二维列表 3 怎样将以下列表转化为整数 三 元组 四 集合 二 常见内置函数 一 itertools 二 数学函数 三 数据
  • Redis主从复制与Redis集群

    Redis主从复制与Redis集群 前言 一 主从复制 1 是什么 2 能干嘛 3 怎么玩 主从复制 4 新建redis conf配置文件 5 主从集群常用3种 1 主从模式一 一主二从 2 主从模式二 薪火相传 3 主从模式三 反客为主
  • Python循环的技巧

    Python的for循环是coder最常用的语句之一 如果只是简单地对容器循环遍历 那便会少了很多美好的体验 像下面这样 for i in range 10 print i python提供了很多用于循环的技巧 这些方法能让代码更加简洁美观
  • [Linux] 输入命令ls -laF后的各字段含义解析

    在登陆Ubuntu之后 我们切换超级管理用户root su root 然后切换到其所在的主目录 cd 然后以该目录下的所有文件以及文件夹为例进行介绍 我们输入命令查看该目录下面的所有文件以及文件夹 包括隐藏文件 ls laF 然后显示的内容
  • 回调函数使用

    https www cnblogs com shenwen p 9046482 html
  • 用c语言简单实现通讯录(详解和具体代码)

    前言 一 明确通讯录的功能 1 查找通讯录上的姓名 性别 电话和住址 2 可以增加 删除或修改相关信息 二 如何实现通讯录的功能 1 使用struct函数 2 实现通讯录的步骤 1 初始化通讯录并打印目录 2 实现增加信息与展示通讯录 3