C语言实现通讯录

2023-10-31

对于通讯录中的每一个成员,有姓名、年龄、电话等信息,所以可以通过结构体实现通讯录。

通讯录的功能如下:

1.可以保存自定义最大数量人的信息:年龄(age)、性别(sex)、姓名(name)、地址(addr)、电话(tele).

2.可以对存储的信息进行增删查改,排序和打印。

对代码进行分块处理,包括test.c的测试文件,contact.c的函数实现文件,contact.c的声明文件

contact.h头文件

#define MAX 10000
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_ADDR 30
#define MAX_TELE 20
#define INIAT 3
typedef struct peoinof
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];	
	char addr[MAX_ADDR];
	char tele[MAX_TELE];
}peoinof;
typedef struct contact
{
	peoinof* data;
	int sz;//当前的元素个数
	int capacity;//最大元素个数
}contact;

void Initcontact(contact* pc);//初始化函数
void addcontact(contact* pc);//增加信息函数
void delcontact(contact* pc);//删除信息函数
void showcontact(const contact* pc);//打印信息函数
void modifycontact(contact* pc);//修改信息函数
void sortcontact(contact*pc);//排序函数
void seachcontact(contact* pc);//查找信息函数

text.c函数

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include"test.h"
enum Oprion
{
	EXIT,//0
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	SHOW
};
void meau1()
{
	printf("********************************\n");
	printf("********************************\n");
	printf("***1.add       2.del ***********\n");
	printf("***3.seacher   4.modify ********\n");
	printf("***5.sort      6.show **********\n");
	printf("***   0.exit          **********\n");
	printf("********************************\n");	
	printf("********************************\n");
}
int main()
{
	int input = 0;
	contact con = { 0 };//创建通讯录
	Initcontact(&con);//初始化
	do 
	{
		meau1();
		printf("请选择\n");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			addcontact(&con);
			break;
		case DEL:
			delcontact(&con);
			break;
		case SEARCH:
			seachcontact(&con);
			break;
		case MODIFY:
			modifycontact(&con);
			break;
		case SORT:
			sortcontact(&con);
			break;
		case SHOW:
			showcontact(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

contact.c文件

1.初始化通讯录

void Initcontact(contact* pc)
{
	assert(pc);
	pc->sz = 0;
	peoinof* tmp = (peoinof*)malloc(sizeof(peoinof) * INIAT);
	if (tmp!=NULL)
	{
		pc->data = tmp;
	}
	else
	{
		printf("Initcontact()::%s\n", strerror(errno));
		return;
	}
	pc->capacity = INIAT; //通讯录初始存储最大联系人数量
}

2.增加联系人函数

增加联系人的时候,需要考虑已经有的人数和最大人数的关系,所以可以通过checkcontact函数判断

void checkcontact(contact* con)
{
	assert(con);
	if (con->sz==con->capacity)
	{
		peoinof* tmp = (peoinof*)realloc(con->data, sizeof(peoinof) * (con->capacity + 2));
		if (tmp != NULL)
		{
			con->data = tmp;
			printf("增容成功\n");
		}
		else
		{
			printf("cheackcontact():: %s\n", strerror(errno));
		}
	}
}
void addcontact(contact*pc)
{
	assert(pc);
	checkcontact(pc);
	if (pc->sz ==MAX)
	{
		printf("通讯录满了,无法添加信息\n");
		return;
	}
	printf("请输入添加的姓名:\n");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入添加的年龄:\n");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入添加的性别:\n");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入添加的地址:\n");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入添加的电话:\n");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;
	printf("联系人添加成功\n");
}

3.删除联系人函数

删除联系人信息时,是通过核对姓名进行删除。所以还需要一个查找姓名的函数。如果能在通讯录中找到,就返回对于的下标,如果没有找到就返回-1;

int findname(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;
}
void delcontact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录没有信息,无法删除\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("请输入要删除人的姓名:\n");
	scanf("%s", name);
	int key = findname(pc, name);
	if (key == -1)
	{
		printf("没有想删除的信息\n");
		return;
	}
	else
	{
		for (int i = key; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
}

4.查找联系人信息

通过遍历通讯录,找到和联系人姓名相同的人的信息

void seachcontact(contact* pc)
{
	assert(pc);
	printf("请输入查找人的姓名:\n");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	int key=findname(pc, name);
	if (key == -1)
		printf("查找人不存在\n");
	else
	{
		printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-10s\t%-5d\t%-5s\t%-13s\t%-20s\n",
			pc->data[key].name, pc->data[key].age, pc->data[key].sex, pc->data[key].tele, pc->data[key].addr);
	}
}

5.修改联系人信息函数

void modifycontact(contact* pc)
{
	assert(pc);
	printf("请输入修改人的姓名\n");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	int key = findname(pc, name);
	if (key == -1)
	{
		printf("修改人不存在\n");
	}
	else
	{
		printf("请输入添加的姓名:\n");
		scanf("%s", pc->data[key].name);
		printf("请输入添加的年龄:\n");
		scanf("%d", &pc->data[key].age);
		printf("请输入添加的性别:\n");
		scanf("%s", pc->data[key].sex);
		printf("请输入添加的地址:\n");
		scanf("%s", pc->data[key].addr);
		printf("请输入添加的电话:\n");
		scanf("%s", pc->data[key].tele);
		printf("修改成功\n");
	}
}

6.打印通讯录信息函数

void showcontact(const contact* pc)
{
	assert(pc);
	int i = 0;
	printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s\t%-5d\t%-5s\t%-13s\t%-20s\n",
			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

7.排序函数

排序有两种排序方法,一种是联系人的姓名,一种是联系人的年龄。

enum chose
{
	EXIT,
	NAME,
	AGE
};
void meau2()
{
	printf("******************************\n");
	printf("****1.name      2.age    *****\n");
	printf("****0.exit  ******************\n");
	printf("******************************\n");
}

int cmp_name(const void* e1, const void* e2)
{
	assert(e1 && e2);
	return strcmp(((peoinof*)e1)->name, ((peoinof*)e2)->name);
}
int cmp_age(const void* e1, const void* e2)
{
	assert(e1 && e2);
	if (((peoinof*)e1)->age == ((peoinof*)e2)->age)
		return 0;
	else if (((peoinof*)e1)->age > ((peoinof*)e2)->age)
		return 1;
	else
		return -1;
}
void sortcontact(contact* pc)
{
	assert(pc);
	int input = 0;
	meau2();
	printf("请选择排序方式\n");
	scanf("%d", &input);
	switch (input)
	{
	case NAME:
		qsort(pc->data, pc->sz, sizeof(peoinof), cmp_name);
		break;
	case AGE:
		qsort(pc->data, pc->sz, sizeof(peoinof), cmp_age);
		break;
	case EXIT:
		printf("退出选择\n");
		break;
	default:
		printf("选择错误\n");
		break;
	}


}

运行结果

 

 

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

C语言实现通讯录 的相关文章

随机推荐

  • TCP三次握手,两次可以吗?

    这个问题网络上的回答超级多 众说纷纭 以 RFC 793 来回答这个问题可能更加准确 Reliability The TCP must recover from data that is damaged lost duplicated or
  • C语言——qsort()函数用法

    qsort函数简介及用法 一 qsort 函数的简介 二 qsort 函数实例 1 排序整形数组 2 排序double型数组 3 排序字符型数据 4 结构体类型数据排序 三 使用冒泡排序模拟qsort 函数 一 qsort 函数的简介 qs
  • ' requires string as left operand, not int' aria-label='TypeError: 'in ' requires string as left operand, not int'> TypeError: 'in ' requires string as left operand, not int

    报错 Traceback most recent call last File D PyCharm 5 0 3 WorkSpace 2 NLP 9 DL在NLP中的应用 4 VectorizerVisualization py line 4
  • docker和k8s的关系

    docker和k8s的关系 过去十年间 云计算的技术得到了长足的发展 越来越多的人开始了解 云原生 技术 以著名的云原生计算基金会 CNCF Cloud Native Computing Foundation 为首 各大企业和社区都开始发展
  • javascript:;与javascript:void(0)使用介绍

    最近看了好几个关于 a 标签和javascript void 0 的帖子 谨记于此 以资查阅 注 以下代码未经全面测试 但每一种方法可能会出现的情况都基本做了说明 在做页面时 如果想做一个链接点击后不做任何事情 或者响应点击而完成其他事情
  • 一文读懂CAN总线及通信协议

    CAN总线的汽车 CAN概念 CAN是控制器域网 Controller Area Network CAN 的简称 是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的 并最终成为国际标准 ISO11898 是ISO国际标准化的串行通信
  • CTFSHOW web入门——web171

    首先查询有多少列 1 order by 3 然后查询库名 1 union select 1 2 database 查看ctfshow web库的表 1 union select 1 2 table name from information
  • AtomicInteger如何保证线程安全?

    1 AtomicInteger不是final类型 如何保证线程安全 先看一下AtomicInteger类局部源码 关注两个字段 U以及value public class AtomicInteger extends Number imple
  • 使用Kalibr工具线对相机+IMU离线标定

    传感器标定的准确后面做算法才会更准确 所以对Kalibr进行学习 一 Kalibr编译 1 下载kalibr包 GitHub下载地址 2 解压后放到 catkin ws src文件夹下 重新命令文件夹为kalibr 3 安装依赖库 sudo
  • wireshark抓包tcp为何没有四次挥手 而是三次挥手

    在wireshark上抓包 使用telnet直接连接baidu的ip 端口使用www p4 u1804 ping www baidu com PING www a shifen com 183 232 231 174 56 84 bytes
  • LDA(latent dirichlet allocation)的应用

    主题模型LDA latent dirichlet allocation 的应用还是很广泛的 之前我自己在检索 图像分类 文本分类 用户评论的主题词抽取等都用过 做feature 降维等 例如可以用主题维度来表示原来的字典维度 大大的降低了文
  • 最新骗局:利用支付宝快捷支付 套取手机验证码转账

    最新骗局 利用支付宝快捷支付 套取手机验证码转账 小心 骗子在你不知情的情况下 也能帮你开通支付宝快捷支付 昨天 市民王先生向媒体反映 骗子通过QQ知道他的银行账号等信息后 又通过花言巧语骗取他的手机验证码 替他开通支付宝快捷支付功能 并转
  • LeetCode-1237. 找出给定方程的正整数解【双指针,二分查找】

    LeetCode 1237 找出给定方程的正整数解 双指针 二分查找 题目描述 解题思路一 双指针 首先我们不管f是什么 即function id等于什么不管 但是我们可以调用customfunction中的f函数 然后我们遍历x y 1
  • 如何在Idea打开一个本地项目(超详细版)

    背景 网上关于Idea的介绍和使用其实很多了 但是答应了某人还是要写一个打开项目的详细教程 下载项目压缩包 从本地打开 比如说我下载一个海大校园通的项目到本地 解压后 打开Idea 在左上角点击File gt New gt Project
  • 手把手,如何搭建一个通用组件库?(文档+样式+按需打包

    之前的文章 手把手 如何搭建一个通用组件库 并发布到npm 搭建了一个简单的组件库框架 并发布到了npm 在文章结果也留了几个个坑 1 没有样式 2 文档系统也没有 3 组件也不能按需加载 我们今天来一一解决 样式系统 搭建之前 先来看看e
  • 永久设置pip指定国内镜像源(含Windows和Linux)

    永久设置pip指定国内镜像源 含Windows和Linux 前言 首先来看一下Python临时指定安装的镜像源 命令格式 sudo pip3 install 包名 i 镜像源url eg sudo pip3 install redis i
  • MySQL_第00章_MySQL数据库基础篇大纲

    第00章 写在前面 一 MySQL数据库基础篇大纲 MySQL 数据库基础篇分为 5 个篇章 1 数据库概述与MySQL安装篇 第 01 章 数据库概述 第 02 章 MySQL 环境搭建 2 SQL之SELECT使用篇 第 03 章 基本
  • 决策树的训练过程

    决策树 以分类有毒和无毒蘑菇为例 这里的原始数据是agaricus lepiota data文件 每一行代表一个样本 每一列代表一个特征 这里一共8024个样本 每个样本有22个特征 其中第一列是样本标签 标示有毒 p 和无毒 e 除此之外
  • UE4游戏提取的通用步骤(21_9_8)

    准备工具 1 UEViewer最新版本 Umodel的新名 2 UnrealPakTool最新版本 用于查看uproject文件确认版本号 3 Uasset Reader新版 用于查看Uasset的内容 可有可无 4 NotePad 文本查
  • C语言实现通讯录

    对于通讯录中的每一个成员 有姓名 年龄 电话等信息 所以可以通过结构体实现通讯录 通讯录的功能如下 1 可以保存自定义最大数量人的信息 年龄 age 性别 sex 姓名 name 地址 addr 电话 tele 2 可以对存储的信息进行增删