C语言—通讯录

这篇具有很好参考价值的文章主要介绍了C语言—通讯录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通讯录的创建

通讯录中是存放人的信息的,人的信息包括:姓名、年龄、性别、电话、住址。可以把人的信息定义成结构体,因为每个联系人的信息都有这几个要素。

#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30

//类型的定义
typedef struct PeoInfo   //定义人的信息类型
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

注:用#define定义的标识符常量,使用修改时可以降低维护成本。如联系人的信息中名字的宽度为20,以便之后需要修改时只需修改一处,而不是修改全部用到名字的宽度为20的地方。

定义完结构体类型之后,创建通讯录(通讯录需要能够存放1000个人的信息)可以利用人信息类型创建元素为1000的数组。但是当要操作通讯录中联系人的信息内容时,比如增加联系人信息,这时就需要知道通讯录中的联系人是否已经到达上限或者需要知道在哪个位置添加人的信息(需要知道当前通讯录中有几个人的信息),如果达到上限就无法再添加联系人。综上通讯录在维护时需要存放数据的空间和通讯录中当前总共有几个元素,将这两个变量放到一起定义成结构体通讯录。这样就避免了执行每个功能时都要相同地传入两个变量(联系人信息,已有联系人个数)方便传参。

//通讯录定义
typedef struct Contact
{
	PeoInfo data[MAX];//存放添加进来的人的信息
	int sz;//记录的是当前通讯录中有效信息的个数
}Contact;

通讯录的初始化

通讯录创建完之后,需要将通讯录进行初始化。内存空间清零并将记录的是当前通讯录中有效信息的个数清零

//通讯录初始化
void InitContact(Contact* pc)
{
	pc->sz = 0;
	//memset();  - 内存设置
	memset(pc->data, 0, sizeof(pc->data));
}

通讯录添加联系人信息

添加联系人时需要注意如果通讯录满了就不能再添加了,如果通讯录没满需要注意通讯录添加联系人信息的位置正好是已知记录当前通讯录中有效信息的个数所在联系人信息数组的下标的位置。当添加完联系人信息之后需要对当前通讯录中有效信息的个数进行加一。

// 增加联系人
void AddContact(Contact* 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].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("增加成功\n");
}

通讯录删除特定联系人信息

通讯录删除特定联系人信息如果通讯录为空则不能删除,如果通讯录不为空,则需要判断要删除的联系人是否存在于通讯录中(查找要删除的人)。如果要删除的联系人存在于通讯录中则删除。

查找函数是通过联系人的名字在通讯录中进行查找,查找的过程就是排除的过程。通过遍历进行查找,如果找到了返回通讯录中联系人信息所在的下标,否则返回-1。

通讯录删除特定联系人信息的方式有两种:
C语言—通讯录
注:

  • 第一种方式在删除的时候需要将要删除联系人信息的位置用后一个联系人信息的位置进行覆盖即可,依次类推,直到将最后一个联系人信息的位置覆盖到倒数第二个联系人信息的位置即可。不需要将最后一个联系人的信息也覆盖这是毫无意义的,因为删除完信息之后通讯录中有效信息的个数会减一这时也就看不到最后一个联系人信息了。这样也可以避免数组越界访问
  • 虽然第二种方法操作起来比较简单,移动的次数也更少,但是还是使用第一种方法进行删除,因为第二种方法会捣乱联系人的先后顺序。

最后删除完指定联系人信息后需要将当前通讯录中有效信息的个数减一。

static int FindByName(Contact* pc, char name[])
{
	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)
{
	char name[MAX_NAME] = { 0 };

	if (pc->sz == 0)
	{
		printf("通讯录为空,无需删除\n");
		return;
	}
	printf("请输入要删除人的名字:>");
	scanf("%s", name);

	//1. 查找要删除的人
	//有/没有
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//2. 删除
	int i = 0;
	for (i = pos; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}

	pc->sz--;
	printf("删除成功\n");
}


通讯录查找特定联系人信息

在通讯录查找特定联系人信息,如果找到将查找函数返回的通讯录中联系人信息所在下标并打印通讯录中特定联系人信息的内容。如果未找到则将打印要查找的人不存在。

void SearchContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);

	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	else
	{
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		//打印数据
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}

通讯录修改特定联系人信息

在通讯录中查找特定联系人信息,如果找到了则对其特定联系人信息进行修改(重新录入)。如果未找到则打印要修改的人不存在。

void ModifyContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);

	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	else
	{
		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].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[pos].addr);

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

通讯录排序联系人信息

排序联系人信息可以通过qosrt函数进行排序,这里只需要写一个自定义的比较函数即可。


//自定义比较函数
static int CmpByName(const void* e1, const void* e2)
{
	return strcmp((const char*)e1, (const char*)e2);
}


void SortContact(struct Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(PeoInfo), CmpByName);//排序
	printf("排序成功\n");
}

通讯录打印联系人信息

当前通讯录中有效信息的个数有几个,通讯录中联系人信息就打印几个。

void PrintContact(const Contact* pc)
{
	int i = 0;
	//打印标题
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

通讯录整体代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1

//通讯录-静态版本
//1.通讯录中能够存放1000个人的信息
//每个人的信息:
//名字+年龄+性别+电话+地址
//2. 增加人的信息
//3. 删除指定人的信息
//4. 修改指定人的信息
//5. 查找指定人的信息
//6. 排序通讯录的信息



#include "contact.h"

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

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT
};

int main()
{
	int input = 0;
	//创建通讯录
	Contact con;//通讯录
	//初始化通讯录
	InitContact(&con);

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			//增加
			AddContact(&con);
			break;
		case DEL:
			//删除
			DelContact(&con);
			break;
		case SEARCH:
			//查找
			SearchContact(&con);
			break;
		case MODIFY:
			//修改
			ModifyContact(&con);
			break;
		case SORT:
			//排序
			SortContact(&con);
			break;
		case PRINT:
			//打印
			PrintContact(&con);
			break;
		case EXIT:	
			//退出
			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)
{
	pc->sz = 0;
	//memset();  - 内存设置
	memset(pc->data, 0, sizeof(pc->data));
}




// 增加联系人
void AddContact(Contact* 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].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("增加成功\n");
}



void PrintContact(const Contact* pc)
{
	int i = 0;
	//打印标题
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

static int FindByName(Contact* pc, char name[])
{
	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)
{
	char name[MAX_NAME] = { 0 };

	if (pc->sz == 0)
	{
		printf("通讯录为空,无需删除\n");
		return;
	}
	printf("请输入要删除人的名字:>");
	scanf("%s", name);

	//1. 查找要删除的人
	//有/没有
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//2. 删除
	int i = 0;
	for (i = pos; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}

	pc->sz--;
	printf("删除成功\n");
}


void SearchContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);

	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	else
	{
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		//打印数据
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}


void ModifyContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);

	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	else
	{
		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].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[pos].addr);

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



//自定义比较函数
static int CmpByName(const void* e1, const void* e2)
{
	return strcmp((const char*)e1, (const char*)e2);
}


void SortContact(struct Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(PeoInfo), CmpByName);//排序
	printf("排序成功\n");
}

contact.h

#pragma once


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

#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30


#define MAX 1000




//类型的定义
typedef struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

//通讯录的定义
typedef struct Contact
{
	PeoInfo data[MAX];//存放添加进来的人的信息
	int sz;//记录的是当前通讯录中有效信息的个数
}Contact;



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

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

//打印联系人信息
void PrintContact(const Contact* pc);

//删除联系人的信息
void DelContact(Contact* pc);

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

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


//排序联系人信息
void SortContact(struct Contact* pc);


注:文章来源地址https://www.toymoban.com/news/detail-453882.html

  • test.c是用于测试通讯录的模块、contact.c用于通讯录模块的函数实现、contact.h用于通讯录模块的类型定义以及函数声明
  • 使用枚举可以增加代码的可读性,避免程序员写代码以及阅读代码时不明确代码其中的的具体意义。

到了这里,关于C语言—通讯录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言—通讯录

    通讯录中是存放人的信息的,人的信息包括:姓名、年龄、性别、电话、住址。可以把人的信息定义成结构体,因为每个联系人的信息都有这几个要素。 注:用#define定义的标识符常量,使用修改时可以降低维护成本。如联系人的信息中名字的宽度为20,以便之后需要修改时只

    2024年02月05日
    浏览(72)
  • C语言——通讯录

    相信大家都有过通讯录,今天我来带大家实现以下最简单的通讯录,通过本篇文章,相信可以让大家对C语言有进一步的认识。 话不多说,我们先放函数的实现  是不是看到这里会感到很害怕??不用怕,跟着我的思路,你也可以实现它,我带着你一步一步实现每一个功能  

    2024年02月13日
    浏览(51)
  • C语言---认识动态内存管理并实现一个动态通讯录:静态通讯录别来沾边

    👧个人主页:@小沈熬夜秃头中୧⍤⃝❅ 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C语言学习 🔑本章内容:动态内存管理 送给各位💌:当你的能力还驾驭不了你的目标时那你就应该沉下心来历练 记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~ 提示:以下是本篇

    2024年02月08日
    浏览(92)
  • 【c语言】通讯录(静态)

    小张刚学习完结构体,枚举,联合相关的知识,实践实践,写一个通讯录呗! 通讯录的功能 1.通讯录可存放100的信息 2.信息的内容姓名,性别,年龄,电话,地址 3.支持增加联系人 4.支持删除联系人 5.支持查找联系人 6.支持修改联系人 7.支持排序联系人 8.打印数据 文件类型

    2024年02月13日
    浏览(43)
  • 通讯录实现【C语言】

    目录 前言 一、整体逻辑分析 二、实现步骤 1、创建菜单和多次操作问题 2、创建通讯录 3、初始化通讯录 4、添加联系人 5、显示联系人 6、删除指定联系人 ​7、查找指定联系人 8、修改联系人信息 9、排序联系人信息 三、全部源码 我们上期已经详细的介绍了自定义类型,本

    2024年02月11日
    浏览(60)
  • 【C语言】实战项目——通讯录

    学会创建一个通讯录,对过往知识进行加深和巩固。 文章很长,要耐心学完哦!                ✨  猪巴戒 :个人主页✨                 所属专栏 :《C语言进阶》         🎈 跟着猪巴戒 ,一起学习C语言🎈 目录 引言 实战 建立文件 包含头文件 结构体的使用 

    2024年02月04日
    浏览(51)
  • 【C语言】通讯录(文件) -- 详解

    前面介绍了 【C语言】静态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客 和 【C语言】动态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客 。当通讯录运行起来时,可以对通讯录中的数据进行增加、删除或修改等。此时数据是存放在内存中,当程序退出时,通讯录中的数据自然就

    2024年02月12日
    浏览(41)
  • C语言进阶——静态通讯录

    作者: 敲代码の流川枫 博客主页:流川枫的博客 专栏:C语言从入门到进阶 语录: Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 目录 1.contact.h——通讯录相关的声明 2.contact.c——通讯录相关的

    2024年02月16日
    浏览(46)
  • 动态通讯录实现(C语言)

    目录 前言: 一:单个节点的设计和主逻辑  结点设计 主逻辑 二:接口实现 (1)生成一个新的结点 (2)增加信息 (3)打印信息 (4)查找  (5)删除信息 (6)修改信息 (7)排序  插入排序 快速排序 (8)已有数据读取 (9)更新数据录入 三:全部代码 contact.h(声明) contact.c(接口) test.c(主逻辑) 本

    2024年02月05日
    浏览(58)
  • C语言--通讯录的实现

    人的信息:姓名+年龄+性别+住址+电话 通讯录中可以存放100个人的信息 增加联系人 删除指定联系人 查找指定联系人 修改指定联系人 显示所有联系人的信息 test.c----测试通讯录 contact.c----通讯录的实现 contact.h----函数的声明 代码如下(示例): 代码如下(示例):

    2024年02月15日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包