【C语言】通讯录管理系统(附图解、源码)

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

目录

一.前言

二.准备工作

三.ContactTest.c测试区

1.菜单

2.选择功能

四.Contact.h头文件引用区

1.通讯录成员结构体函数的创建

2.实现功能函数的创建

五.ContactRealize.c功能实现区

1.初始化成员信息

2.查找目标成员位置

3.增加联系人

4.删除指定联系人

5.查找指定联系人

6.修改指定联系人

7.浏览所有联系人

8.清空所有联系人

9.排序所有联系人

 六.源码

1.ContactTest.c源码

2.Contact.h源码

3.ContactRealize.c源码


一.前言

本文讲通过c语言实现通讯录的功能,具体功能为1.添加、2.删除、3.查找、4.修改、5.浏览、6.清空、7.排序以及最后的0.退出通讯录功能。

二.准备工作

区域化编辑:

实现简单的通讯录可以分配为三大块,第一块为测试区,第二块为头文件引用区,第三块最重要,为调用实现通讯录功能函数的实现区块,我们将其分别命名为ContactTest.c,Contact.h和ContactRealize.c。

基于c语言的通讯录管理系统,c语言,c++

三.ContactTest.c测试区

1.菜单

以使用者的角度来看,需要了解到有哪些功能,那么我们就需要提供一个简洁明了的菜单功能,以便使用者使用相应的功能,参考菜单可如下:

void menu()
{
	printf("*******************************\n");
	printf("******       通讯录      ******\n");
	printf("******  1.添加   2.删除  ******\n");
	printf("******  3.查找   4.修改  ******\n");
	printf("******  5.阅览   6.清空  ******\n");
	printf("******  7.排序   0.退出  ******\n");
	printf("*******************************\n");
}

效果如下:

基于c语言的通讯录管理系统,c语言,c++

 

2.选择功能

这里我们使用switch函数来实现功能的选择,又因为会有重复的使用,因此可以使用do_while函数来实现循环,主函数我们可以这样设计:

int main()
{
	int s;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		scanf("%d", &s);
		switch (s)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			DelContact(&con);
			break;
		case 3:
			SearchContact(&con);
			break;
		case 4:
			ModifyContact(&con);
			break;
		case 5:
			ReadContact(&con);
			break;
		case 6:
			EmptyContact(&con);
			break;
		case 7:
			SortContact(&con);
			break;
		case 0:
			printf("已成功退出!\n");
			break;
		default:
			printf("请输入正确的选项!\n");
		}
	} while (s);
	return 0;
}

此时我们就已经将退出的功能完成啦!而这里各个函数的调用以及结构体的创建还没有实现,我们将在后文详细说明。

四.Contact.h头文件引用区

1.通讯录成员结构体函数的创建

每个通讯录成员都有着一定的信息,又相互关联,使用结构体保存这一系列数据相对要方便很多;而通讯录成员并不是一个,所以我们需要一个结构体数组,同时还要了解到当前通讯录成员的数量,以此来实现通讯录的各项功能,具体结构体实现如下:

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

//个体成员信息
typedef struct ContactMember
{
	char Name[NAME_MAX];
	char Sex[SEX_MAX];
	int Age;
	char Number[TELE_MAX];
	char Address[ADDR_MAX];
}ContactMember;

//所有成员信息
typedef struct Contact
{
	ContactMember ContactMembers[MAX];
	int sz;
}Contact;

 这里定义各个成员信息具体内容的大小是为了方便修改,以达到简洁方便的目的。

2.实现功能函数的创建

因为要用到具体通讯录成员的信息和当前成员数量的信息,我们可以把Contact*类型的函数传递进功能函数,具体函数如下:

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

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

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

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

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

//查看所有联系人
void ReadContact(Contact* con);

//清空所有联系人
void EmptyContact(Contact* con);

//排序所有联系人
void SortContact(Contact* con);

设置返回值为空,因为不需要返回值,只要实现相应功能就行了;同时,传递结构体指针是为了提高内存的性能,如果使用的Contact类型的函数,那么将又要为结构体数组开辟出一大块空间来实现函数,大量挤占内存,不是明智之举。

五.ContactRealize.c功能实现区

1.初始化成员信息

因为创建的Contact函数并没有初始化,因此先将其初始化将是一份安全保险,养成良好习惯,从你我做起。

//初始化成员信息
void InitContact(Contact* con)
{
	con->sz = 0;//初始化下标
	memset(con, 0, sizeof(con));//初始化所有成员
}

这里成员数量还是好初始化的,而成员结构体数组可以用memset函数来帮助我们实现初始化。

2.查找目标成员位置

具体功能中虽然没有该函数的使用,但该函数频繁出现在部分功能函数实现的内容中,在此单独写出来可以防止码重复代码,节约时间成本。

//查找目标成员位置
int FindName(Contact* con, char* name)
{
	for (int i = 0; i < con->sz; i++)
	{
		if (strcmp(con->ContactMembers[i].Name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

这里我们使用姓名来查找目标成员,将目标成员的姓名通过遍历和strcmp函数与各个成员信息比对从来找到目标成员的下标(位置)。

3.增加联系人

增加成员,需要将姓名、性别等信息录入相应位置的结构体,同时sz可以充当当前位置和数量的值,添加成功后联系人成员+1,但要防止超出存储上限的情况,可以在添加联系人之前做出判断来防止此类情况的发生。

//增加联系人
void AddContact(Contact* con)
{
	assert(con);

	if (con->sz == MAX)
	{
		printf("通讯录已满!\n");
		return;
	}

    //增加
	printf("请输入姓名:");
	scanf("%s", con->ContactMembers[con->sz].Name);
	printf("请输入性别:");
	scanf("%s", con->ContactMembers[con->sz].Sex);
	printf("请输入年龄:");
	scanf("%d", &con->ContactMembers[con->sz].Age);
	printf("请输入住址:");
	scanf("%s", con->ContactMembers[con->sz].Address);
	printf("请输入号码:");
	scanf("%s", con->ContactMembers[con->sz].Number);
	printf("输入完毕!\n");

	con->sz++;
}

效果如下:

基于c语言的通讯录管理系统,c语言,c++

4.删除指定联系人

删除目标成员,首先就要先找到目标成员,此时先前写到的查找目标函数就可以直接调用啦!我们可以调用memmove来实现函数的删除,将删除目标的后面的成员全都向前移动一位,将目标成员的信息覆盖掉,便可以达到删除的效果啦!同时,还要小心没有可以删除目标的情况,在删除前先判断排除该情况。

//删除指定联系人
void DelContact(Contact* con)
{
	assert(con);

	if (con->sz == 0)
	{
		printf("没有可以删除的目标!\n");
		return;
	}
    
    //查找
	printf("请输入目标删除人:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindName(con, name);
	if (ret == -1)
	{
		printf("目标人物不存在!\n");
		return;
	}

    //删除
	memmove(con->ContactMembers + ret, con->ContactMembers + ret + 1, sizeof(con->ContactMembers[0]) * (con->sz - ret - 1));
	printf("删除成功!\n");

	con->sz--;
}

5.查找指定联系人

此处又用到了查找目标联系人的函数,直接调用后打印即可。

//查找指定联系人
void SearchContact(Contact* con) 
{
	assert(con);

    //查找
	char name[NAME_MAX];
	printf("请输入要查询的人:");
	scanf("%s", name);
	int ret = FindName(con, name);
	if (ret == -1)
	{
		printf("查询目标不存在!\n");
		return;
	}

    //显示
	printf("%-20s\t%-5s\t%s\t%-30s\t%-12s\n", "姓名", "性别", "年龄", "地址", "号码");
	printf("%-20s\t%-5s\t%d\t%-30s\t%-12s\n", con->ContactMembers[ret].Name,
		con->ContactMembers[ret].Sex,
		con->ContactMembers[ret].Age,
		con->ContactMembers[ret].Address,
		con->ContactMembers[ret].Number);
}

值得注意的是直接打印出来未免太过生硬,所以这里添加了姓名等标签在上一行来标志清楚,同时采用左对齐的方式,清晰美观。模拟实现如下:

基于c语言的通讯录管理系统,c语言,c++

6.修改指定联系人

这个函数于查找函数有着异曲同工之妙,只需要将打印目标成员信息的步骤改为输入即可。

//修改指定联系人
void ModifyContact(Contact* con)
{
	assert(con);

    //查找
	char name[NAME_MAX];
	printf("请输入要修改目标的姓名:");
	scanf("%s", name);
	int ret = FindName(con, name);
	if (ret == -1)
	{
		printf("修改目标不存在!\n");
		return;
	}

    //修改
	printf("请输入要修改的姓名:");
	scanf("%s", con->ContactMembers[ret].Name);
	printf("请输入要修改的性别:");
	scanf("%s", con->ContactMembers[ret].Sex);
	printf("请输入要修改的年龄:");
	scanf("%d", &con->ContactMembers[ret].Age);
	printf("请输入要修改的地址:");
	scanf("%s", con->ContactMembers[ret].Address);
	printf("请输入要修改的号码:");
	scanf("%s", con->ContactMembers[ret].Number);
	printf("修改完毕!\n");
}

效果如下:

基于c语言的通讯录管理系统,c语言,c++

 

7.浏览所有联系人

该函数也类似于查找函数,不过不需要输入,直接遍历每个成员的每个信息并打印出来就达成目的啦。

//浏览所有联系人
void ReadContact(Contact* con)
{
	assert(con);

    //浏览
	printf("%-20s\t%-5s\t%s\t%-30s\t%-12s\n", "姓名", "性别", "年龄", "地址", "号码");
	for (int i = 0; i < con->sz; i++)
	{
		printf("%-20s\t%-5s\t%d\t%-30s\t%-12s\n", con->ContactMembers[i].Name,
			con->ContactMembers[i].Sex,
			con->ContactMembers[i].Age,
			con->ContactMembers[i].Address,
			con->ContactMembers[i].Number);
	}
}

效果如下:

基于c语言的通讯录管理系统,c语言,c++

8.清空所有联系人

这里我们可以悄悄偷个懒...其实并不是,我们可以使用先前写好了的初始化通讯录的函数,直接调用就可以啦!

//清空所有联系人
void EmptyContact(Contact* con)
{
	assert(con);

	InitContact(con);

	printf("重置成功!\n");
}

效果如下:

 

基于c语言的通讯录管理系统,c语言,c++

9.排序所有联系人

排序我们可以通过qsort函数来实现,将所有成员的数组名传递过去,即第一个成员结构体的地址,排序con->sz(成员数)次,每个元素大小为一个成员结构体的大小,而排序函数我们则通过比较两个结构体成员内容的大小即可,使用memcmp函数来实现对相同结构体内容的比较。

//排序函数
int Sort(const void* a, const void* b)
{
	ContactMember* A = (ContactMember*)a;
	ContactMember* B = (ContactMember*)b;
	return memcmp(B, A, sizeof(ContactMember));
}

//排序所有联系人
void SortContact(Contact* con)
{
	assert(con);

    //排序
	qsort(con->ContactMembers, con->sz, sizeof(con->ContactMembers[0]), Sort);
	printf("排序完毕!\n");
}

 具体效果如下:

基于c语言的通讯录管理系统,c语言,c++

 六.源码

最后把源码分享出来,方便各位学习与交流。文章来源地址https://www.toymoban.com/news/detail-771106.html

1.ContactTest.c源码

#include "Contact.h"

void menu()
{
	printf("*******************************\n");
	printf("******       通讯录      ******\n");
	printf("******  1.添加   2.删除  ******\n");
	printf("******  3.查找   4.修改  ******\n");
	printf("******  5.阅览   6.清空  ******\n");
	printf("******  7.排序   0.退出  ******\n");
	printf("*******************************\n");
}

int main()
{
	int s;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		scanf("%d", &s);
		switch (s)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			DelContact(&con);
			break;
		case 3:
			SearchContact(&con);
			break;
		case 4:
			ModifyContact(&con);
			break;
		case 5:
			ReadContact(&con);
			break;
		case 6:
			EmptyContact(&con);
			break;
		case 7:
			SortContact(&con);
			break;
		case 0:
			printf("已成功退出!\n");
			break;
		default:
			printf("请输入正确的选项!\n");
		}
	} while (s);
	return 0;
}

2.Contact.h源码

#pragma once

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

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

//成员信息
typedef struct ContactMember
{
	char Name[NAME_MAX];
	char Sex[SEX_MAX];
	int Age;
	char Number[TELE_MAX];
	char Address[ADDR_MAX];
}ContactMember;

typedef struct Contact
{
	ContactMember ContactMembers[MAX];
	int sz;
}Contact;

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

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

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

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

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

//查看所有联系人
void ReadContact(Contact* con);

//清空所有联系人
void EmptyContact(Contact* con);

//排序所有联系人
void SortContact(Contact* con);

3.ContactRealize.c源码

#include "Contact.h"

//初始化成员信息
void InitContact(Contact* con)
{
	con->sz = 0;
	memset(con, 0, sizeof(con));
}

//查找目标成员位置
int FindName(Contact* con, char* name)
{
	for (int i = 0; i < con->sz; i++)
	{
		if (strcmp(con->ContactMembers[i].Name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//大小排序(qsort实现)
int Sort(const void* a, const void* b)
{
	ContactMember* A = (ContactMember*)a;
	ContactMember* B = (ContactMember*)b;
	return memcmp(B, A, sizeof(ContactMember));
}

void AddContact(Contact* con)
{
	assert(con);

	if (con->sz == MAX)
	{
		printf("通讯录已满!\n");
		return;
	}

	printf("请输入姓名:");
	scanf("%s", con->ContactMembers[con->sz].Name);
	printf("请输入性别:");
	scanf("%s", con->ContactMembers[con->sz].Sex);
	printf("请输入年龄:");
	scanf("%d", &con->ContactMembers[con->sz].Age);
	printf("请输入住址:");
	scanf("%s", con->ContactMembers[con->sz].Address);
	printf("请输入号码:");
	scanf("%s", con->ContactMembers[con->sz].Number);
	printf("输入完毕!\n");

	con->sz++;
}

void DelContact(Contact* con)
{
	assert(con);
	if (con->sz == 0)
	{
		printf("没有可以删除的目标!\n");
		return;
	}
	printf("请输入目标删除人:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindName(con, name);
	if (ret == -1)
	{
		printf("目标人物不存在!\n");
		return;
	}
	memmove(con->ContactMembers + ret, con->ContactMembers + ret + 1, sizeof(con->ContactMembers[0]) * (con->sz - ret - 1));
	printf("删除成功!\n");

	con->sz--;
}

void SearchContact(Contact* con) 
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入要查询的人:");
	scanf("%s", name);
	int ret = FindName(con, name);
	if (ret == -1)
	{
		printf("查询目标不存在!\n");
		return;
	}
	printf("%-20s\t%-5s\t%s\t%-30s\t%-12s\n", "姓名", "性别", "年龄", "地址", "号码");
	printf("%-20s\t%-5s\t%d\t%-30s\t%-12s\n", con->ContactMembers[ret].Name,
		con->ContactMembers[ret].Sex,
		con->ContactMembers[ret].Age,
		con->ContactMembers[ret].Address,
		con->ContactMembers[ret].Number);
}

void ModifyContact(Contact* con)
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入要修改目标的姓名:");
	scanf("%s", name);
	int ret = FindName(con, name);
	if (ret == -1)
	{
		printf("修改目标不存在!\n");
		return;
	}
	printf("请输入要修改的姓名:");
	scanf("%s", con->ContactMembers[ret].Name);
	printf("请输入要修改的性别:");
	scanf("%s", con->ContactMembers[ret].Sex);
	printf("请输入要修改的年龄:");
	scanf("%d", &con->ContactMembers[ret].Age);
	printf("请输入要修改的地址:");
	scanf("%s", con->ContactMembers[ret].Address);
	printf("请输入要修改的号码:");
	scanf("%s", con->ContactMembers[ret].Number);
	printf("修改完毕!\n");
}

void ReadContact(Contact* con)
{
	assert(con);
	printf("%-20s\t%-5s\t%s\t%-30s\t%-12s\n", "姓名", "性别", "年龄", "地址", "号码");
	for (int i = 0; i < con->sz; i++)
	{
		printf("%-20s\t%-5s\t%d\t%-30s\t%-12s\n", con->ContactMembers[i].Name,
			con->ContactMembers[i].Sex,
			con->ContactMembers[i].Age,
			con->ContactMembers[i].Address,
			con->ContactMembers[i].Number);
	}
}

void EmptyContact(Contact* con)
{
	assert(con);

	InitContact(con);

	printf("重置成功!\n");
}

void SortContact(Contact* con)
{
	assert(con);
	qsort(con->ContactMembers, con->sz, sizeof(con->ContactMembers[0]), Sort);
	printf("排序完毕!\n");
}

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

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

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

相关文章

  • C语言课程设计_通讯录管理系统

    以本班同学的具体数据为背景,设计一个本班同学通讯录。 1)  通讯录编辑(添加、删除)。 2)  按不同的项进行查找。 3)  对已存在的通讯录按不同的项排序。 4)  将通讯录写入文件 5)从文件读入通讯录 备注:通讯录至少应该有以下数据项: 姓名,地址,电话,邮编,

    2024年02月06日
    浏览(52)
  • c语言:通讯录管理系统(增删查改)

      前言: 本通讯录管理系统一共三个版本,除此文章以外还有如下俩个版本,大家可以根据需求自取: 动态分配内测版 :c语言:通讯录管理系统(动态分配内存版)-CSDN博客 文件版本 :c语言:通讯录管理系统(文件版本)-CSDN博客 目录 一.大体的框架 主函数初步设计 联系

    2024年02月08日
    浏览(48)
  • c语言:通讯录管理系统(动态分配内存版)

    前言: 本通讯录管理系统一共三个版本,除此文章以外还有如下俩个版本,大家可以根据需求自取: 基础增删查改功能版本 :c语言:通讯录管理系统(增删查改)_luming.02的博客-CSDN博客 文件保存版本 :c语言:通讯录管理系统(文件版本)-CSDN博客         本文是在基

    2024年02月08日
    浏览(60)
  • C语言用链表实现通讯录管理系统

    目录 总体思路 具体代码 编译通过 总体代码 一、创建一个结构体保存通讯录信息。 二、构建链表,并存于文件中。 三、实现链表结点的增加、删除、查询、输出。 一、创建一个结构体,保存信息。 二、用尾插法创建一个链表,并让用户选择是否输入数据。 三、将链表数据

    2024年02月02日
    浏览(52)
  • C语言课程设计|通讯录管理系统(含完整代码)

    目录 菜单功能 录入联系人信息功能 查看系统中全部信息功能 查看单个信息功能 删除全部信息功能 删除单个信息功能 修改信息功能 完整代码 在长达一个多月的学习过程中,终于将C语言学完,因此专门写一个C语言课程设计来检验这一个多月的学习成果,由于写的比较急,

    2024年02月01日
    浏览(46)
  • 精通C语言:打造高效便捷的通讯录管理系统

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言项目 贝蒂的主页:Betty‘s blog 在我们大致学习完C语言之后,我们就可以利用目前所学的知识去做一些有意思的项目,而今天贝蒂就带大家完成一个通讯录的简易实现, 本章你可能需要

    2024年02月19日
    浏览(50)
  • 【C语言】通讯录管理系统(保姆级教程+内含源码)

    目录 C系列文章目录 前言 一,模块化编程 二,系统框架构建 1.成员信息的创建 2.菜单实现 3.系统功能声明 三、系统功能实现 1.初始化通讯录 2.增加联系人 3.显示所有联系人 4.根据姓名查找位置 5.删除指定联系人 6.查找指定联系人 7.修改指定联系人 8.清空所有联系人 9.按照名

    2024年02月08日
    浏览(42)
  • 使用C语言实现通讯录管理系统1.0版本(持续更新)

    本篇文章会教大家用C语言实现一个通讯录系统,此程序将会持续更新优化。觉得博主写的不错的朋友可以关注点赞收藏一波,支持一下博主,感谢大家! 此通讯录系统可以存储1000个联系人的:姓名,性别,年龄,电话号码,家庭地址。 主要实现的系统功能有:添加联系人,

    2024年02月03日
    浏览(56)
  • C语言期末课程设计—【通讯录管理系统】让课程设计不再是痛苦

    目录 摘要 第一章 绪论 1.1项目意义 1.2通讯录功能 第二章 详细设计与实现  2.1 Contact程序运行流程图 2.2 AddContact(增加)函数流程图 2.3 DelContact(删除)函数流程图 2.4 SearchConact(查找)函数流程图 2.5 ModifyContact(修改)函数流程图 2.6 SortContact(排序)函数流程图 第三章

    2024年02月09日
    浏览(37)
  • 数据结构课设—C语言实现通讯录管理系统(顺序表实现)

    这个项目是我大一时期数据结构的课程设计,在我潜心研究下出来的,对于当时的我来说算是非常满意啦,哈哈哈哈哈哈哈哈哈哈☆*: .。. o(≧▽≦)o .。.:*☆ 目录 一、引言 1.目的: 2.意义: 3.主要任务: 4.程序功能: 5.编译工具: 二、正文 1.系统模块: 2.算法流程图: 3.各

    2024年02月02日
    浏览(78)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包