【C语言】通讯录管理系统(保姆级教程+内含源码)

C系列文章目录


目录

C系列文章目录

前言

一,模块化编程

二,系统框架构建

1.成员信息的创建

2.菜单实现

3.系统功能声明

三、系统功能实现

1.初始化通讯录

2.增加联系人

3.显示所有联系人

4.根据姓名查找位置

5.删除指定联系人

6.查找指定联系人

7.修改指定联系人

8.清空所有联系人

9.按照名字排序所有联系人

四,源文件展示

1.test.c

2.game.c

3.game.h

总结


前言

通过使用C语言来创建一个通讯录的管理系统,管理人员可对成员信息进行管理。成员信息包括姓名、年龄、电话、性别以及住址,执行操作有增删改查这四项基本操作以及成员信息全览和信息排序。

一,模块化编程

  1. 可维护性:模块化编程将代码划分为独立的模块,每个模块负责特定的任务或功能。这样,在需要修改或调试某个功能时,只需关注相关的模块,而不需要涉及整个程序。这大大简化了维护和调试的工作,使得代码更易于理解和修改。

  2. 重用性:模块化编程鼓励开发人员将一些常用的功能封装成模块,然后在不同的项目中重复使用。这样可以避免重复编写相同的代码,减少了开发工作量,提高了开发效率。同时,通过不断重用经过测试和验证的模块,可以提高代码的可靠性和稳定性。

  3. 可扩展性:当需要添加新的功能或修改现有功能时,模块化编程能够提供更好的可扩展性。由于模块之间的依赖关系明确定义和管理,可以单独修改或替换某个模块,而不会影响到其他模块。这种灵活性使得系统更容易适应变化和演化。

  4. 并行开发:模块化编程允许多个开发人员并行工作,每个人负责开发和测试不同的模块。这样可以提高开发效率,缩短项目的开发周期。同时,模块化编程也方便团队协作和沟通,降低了开发过程中的冲突和合并的风险。

  5. 可测试性:模块化编程使得单元测试更容易进行。每个模块都是相对独立的,可以单独测试其功能和性能。这样可以更容易地发现和修复问题,提高软件的质量和稳定性。

总之,模块化编程的优势包括可维护性、重用性、可扩展性、并行开发和可测试性。这些优势使得代码更易于理解、修改和维护,提高了开发效率和软件质量。

在学习通讯录管理系统前,我们先了解模块化编程,模块化编程的思想可以让我们更好的进行编程,让我们更好的理解接下来的通讯录管理系统过程。

二,系统框架构建

1.成员信息的创建

因为我们要输入成员信息较多,所有我们可以选择通过创建结构体来创建一个通讯录结构体和一个成员信息结构体。
通讯录结构体内部会嵌套一个成员信息结构体和一个表示成员数量的变量。

typedef struct PeoInfo//创建成员信息结构体
{
	char name[FILENAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact//创建通讯录结构体
{
	PeoInfo data[MAX];
	int sz;
}Contact;

2.菜单实现

首先对于我们要创建的通讯录管理系统来说,建立一个菜单让人们选择功能是非常重要的,这就好比在一个餐厅里,只有提供了一份菜单,顾客就可以根据自己的意愿的点菜,在操作界面显示一个完整简明的菜单,才能更好地管理通讯录系统。

void nume()
{
	printf("*******************************\n");
	printf("*****   通讯录管理系统    ******\n");
	printf("***  1.add          2.del  ****\n");//增加和删除指定联系人
	printf("***  3.search       4.modify***\n");//查找和修改指定联系人
	printf("***  5.show         6.sort ****\n");//显示和排序所有联系人
	printf("***  7.empty        0.exit ****\n");//清除所有联系人,和退出程序
	printf("*******************************\n");
}

3.系统功能声明

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

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

//显示联系人
void ShowContact(Contact* pc);

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

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

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

//清空所有联系人
void QingContact(Contact* pc);

//排序联系人
void PaiContact(Contact* pc);

三、系统功能实现

1.初始化通讯录

为什么要对通讯录进行初始化呢,因为在创建了通讯录之后,里边的所有信息的以随机值的形式存在,不知道的还以为这个通讯录里已经存放了成员信息,所以要进行初始化。

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);//防止空指针
	pc->sz = 0;//将sz初始化为0
	memset(pc->data, 0, sizeof(pc->data));//数组名,替换,替换数
}

2.增加联系人

//增加联系人
void AddContact(Contact* pc)
{
	assert(pc);//防止空指针
	if (pc->sz == MAX)//表示通讯录结构体的开辟的空间满了
	{
		printf("通讯录已满,无法增加\n");
		return;
	}
	//通讯录没有满就输入
	else
	{
		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");
	}
}

3.显示所有联系人

//打印所有联系人
void ShowContact(Contact* pc)
{
	assert(pc);//防止空指针
	if (pc->sz == 0)//检查sz是否是指向开头
	{
		printf("通讯录为空,无需打印\n");
		return;
	}
	int i = 0;
	printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);
	}
}

4.根据姓名查找位置

这个函数的存在就是为了通讯录管理人员通过成员姓名来查找该成员信息所处的位置。

static int FindByName(Contact* pc, char name[])
{
	assert(pc);//防止空指针
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)//对比数据是否相同,如果相同就返回该指针的指向数据,不相同就返回-1
		{
			return i;
		}
	}
	return -1;
}

5.删除指定联系人

//删除指定联系人
void DelContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	if (pc->sz == 0)//先要看通讯录是否为空
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	printf("请输入要删除人的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);//返回查找函数
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	int i = 0;
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

6.查找指定联系人

void SearchContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("请输入要查找人的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");
	printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
}

7.修改指定联系人

//修改联系人
void ModifyContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("请输入要修改人的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", pc->data[ret].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:");
	scanf("%s", pc->data[ret].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[ret].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("修改成功\n");
}

8.清空所有联系人

//清空所有联系人
void QingContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
	printf("删除成功\n");

}

9.按照名字排序所有联系人

使用qsort函数经行排序

//排序所有人
int cmp_s(const void* elem1, const void* elem2)
{
	return strcmp((char*)elem1, (char*)elem2);
}
void PaiContact(Contact* pc)
{
	assert(pc);
	qsort(pc, pc->sz, sizeof(pc->data[0]), cmp_s);
	int i = 0;
	printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s%-5d%-5s%-12s%-30s%\n", 
			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

四,源文件展示

1.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void nume()
{
	printf("*******************************\n");
	printf("*****   通讯录管理系统   ******\n");
	printf("***  1.add          2.del  ****\n");//增加和删除指定联系人
	printf("***  3.search       4.modify***\n");//查找和修改指定联系人
	printf("***  5.show         6.sort ****\n");//显示和排序所有联系人
	printf("***  7.empty        0.exit ****\n");//清除所有联系人,和退出程序
	printf("*******************************\n");
}
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
	EMPTY,
};
int main()
{
	int input = 0;
	Contact con;
	InitContact(&con);
	do
	{
		nume();
		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 SHOW:
			ShowContact(&con);
			break;
		case SORT:
			PaiContact(&con);
			break;
		case EMPTY:
			QingContact(&con);
			break;
		default:
			break;
		}
	} while(input);
	return 0;
}

2.game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);//防止空指针
	pc->sz = 0;//将sz初始化为0
	memset(pc->data, 0, sizeof(pc->data));//数组名,替换,替换数
}
//增加联系人
void AddContact(Contact* pc)
{
	assert(pc);//防止空指针
	if (pc->sz == MAX)//表示通讯录结构体的开辟的空间满了
	{
		printf("通讯录已满,无法增加\n");
		return;
	}
	//通讯录没有满就输入
	else
	{
		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 ShowContact(Contact* pc)
{
	assert(pc);//防止空指针
	if (pc->sz == 0)//检查sz是否是指向开头
	{
		printf("通讯录为空,无需打印\n");
		return;
	}
	int i = 0;
	printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s%-5d%-5s%-12s%-30s%\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[])
{
	assert(pc);//防止空指针
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)//对比数据是否相同,如果相同就返回该指针的指向数据,不相同就返回-1
		{
			return i;
		}
	}
	return -1;
}
//删除指定联系人
void DelContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	if (pc->sz == 0)//先要看通讯录是否为空
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	printf("请输入要删除人的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);//返回查找函数
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	int i = 0;
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}
//查找联系人
void SearchContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("请输入要查找人的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");
	printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
}
//修改联系人
void ModifyContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("请输入要修改人的名字:");
	scanf("%s", name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", pc->data[ret].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:");
	scanf("%s", pc->data[ret].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[ret].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("修改成功\n");
}
//清空所有联系人
void QingContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
	printf("删除成功\n");

}
//排序所有人
int cmp_s(const void* elem1, const void* elem2)
{
	return strcmp((char*)elem1, (char*)elem2);
}
void PaiContact(Contact* pc)
{
	assert(pc);
	qsort(pc, pc->sz, sizeof(pc->data[0]), cmp_s);
	int i = 0;
	printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s%-5d%-5s%-12s%-30s%\n", 
			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

3.game.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100

typedef struct PeoInfo
{
	char name[FILENAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;


typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;
}Contact;

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

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

//显示联系人
void ShowContact(Contact* pc);

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

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

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

//清空所有联系人
void QingContact(Contact* pc);

//排序联系人
void PaiContact(Contact* pc);

总结

本篇文章详细的,有体系的介绍了通讯录管理系统的结构,方便我们小白的更加理解C语言的自定义结构体。

C语言课程设计任务书(4) 一、题目:通讯录管理 二、目的与要求 1. 目的: (1)基本掌握面向过程程序设计的基本思路和方法; (2)达到熟练掌握C语言的基本知识和技能; (3)能够利用所学的基本知识和技能,解决简单的程序设计问题 2. 要求 基本要求: 1.         要求利用C语言面向过程的编程思想来完成系统的设计; 2.       突出C语言的函数特征,以多个函数实现每一个子功能; 3.         画出功能模块图; 4.         具有清晰的程序流程图和数据结构的详细定义; 5.       熟练掌握C语言对文件的各种操作。 创新要求: 在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员和一般别的用户系统功能操作不同 三、信息描述 有关该系统基本信息的描述,如:姓名、电话、城市和邮编等。 四、功能描述 1.       名单基本信息(姓名,城市,电话,邮编等)的录入,并存放在文件当中。 2.       基本信息的查询与修改。 3.       记录的添加和删除。 4.       对同一类型记录的查找:如查找同一城市的记录或同一省份的记录。 五、解决方案 1.       分析程序的功能要求,划分程序功能模块。 2.       画出系统流程图。 3.       代码的编写。定义数据结构和各个功能子函数。 4.       程序的功能调试。 5.       完成系统总结报告以及使用说明书 六、进度安排 此次课程设计时间为一周或两周,分四个阶段完成: 1.       分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。 2.       编码调试阶段:根据设计分析方案编写C代码,然后调试该代码,实现课题要求的功能。 3.       总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。 4.       考核阶段。 七、撰写课程设计报告或课程设计总结 课程设计报告要求: 总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。 八、参考资料  《C语言程序设计教程》   网上相关资料(....略)
通讯录管理系统是一种用于存储和管理联系人的软件系统。在C语言中,可以使用结构体和文件操作来实现一个简单的通讯录管理系统。 首先,我们可以定义一个结构体来表示一个联系人的信息,包括姓名、电话号码和电子邮件地址等字段。例如: ```c struct Contact { char name[50]; char phone[20]; char email[50]; }; ``` 然后,我们可以使用数组来存储多个联系人的信息。可以定义一个数组来表示通讯录,例如: ```c struct Contact contacts[100]; int numContacts = 0; // 记录当前通讯录中联系人的数量 ``` 接下来,我们可以实现一些基本的功能,比如添加联系人、显示所有联系人、查找联系人等。下面是一个简单的示例代码: ```c #include <stdio.h> #include <string.h> void addContact() { if (numContacts >= 100) { printf("通讯录已满,无法添加新联系人。\n"); return; } struct Contact newContact; printf("请输入联系人姓名:"); scanf("%s", newContact.name); printf("请输入联系人电话:"); scanf("%s", newContact.phone); printf("请输入联系人邮箱:"); scanf("%s", newContact.email); contacts[numContacts] = newContact; numContacts++; printf("联系人添加成功。\n"); } void displayContacts() { if (numContacts == 0) { printf("通讯录为空。\n"); return; } printf("所有联系人信息如下:\n"); for (int i = 0; i < numContacts; i++) { printf("姓名:%s,电话:%s,邮箱:%s\n", contacts[i].name, contacts[i].phone, contacts[i].email); } } void searchContact() { char name[50]; printf("请输入要查找的联系人姓名:"); scanf("%s", name); for (int i = 0; i < numContacts; i++) { if (strcmp(contacts[i].name, name) == 0) { printf("联系人信息如下:\n"); printf("姓名:%s,电话:%s,邮箱:%s\n", contacts[i].name, contacts[i].phone, contacts[i].email); return; } } printf("未找到该联系人。\n"); } int main() { int choice; while (1) { printf("\n通讯录管理系统\n"); printf("1. 添加联系人\n"); printf("2. 显示所有联系人\n"); printf("3. 查找联系人\n"); printf("4. 退出\n"); printf("请选择操作:"); scanf("%d", &choice); switch (choice) { case 1: addContact(); break; case 2: displayContacts(); break; case 3: searchContact(); break; case 4: return 0; default: printf("无效的选择,请重新输入。\n"); break; } } return 0; } ``` 这是一个简单的通讯录管理系统的示例,你可以根据自己的需求进行扩展和修改。希望对你有帮助!
评论 84
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值