IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言通讯录管理系统 -> 正文阅读

[C++知识库]C语言通讯录管理系统


前言

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

一、系统框架搭建

1.成员信息创建

由于成员信息较多,可以选择通过结构体来创建一个通讯录结构体和一个成员信息结构体。
通讯录结构体内部会嵌套一个成员信息结构体和一个表示成员数量的变量。

struct Infor
{
	char name[nlen];
	int age;
	char tele[tlen];
	char sex[slen];
	char addres[alen];
};


struct Contact
{
	struct Infor data[MAX];
	int size;
};

2.菜单实现

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

void menu()
{
	printf("************************************\n");
	printf("*******    通讯录管理系统     *******\n");
	printf("************************************\n");
	printf("*******       1.add          *******\n");//添加信息
	printf("*******       2.delete       *******\n");//删除信息
	printf("*******       3.update       *******\n");//更改信息
	printf("*******       4.read         *******\n");//查找信息
	printf("*******       5.show         *******\n");//打印信息
	printf("*******       6.sort         *******\n");//排序信息
	printf("*******       0.exit         *******\n");//退出
	printf("************************************\n");
}

3.系统功能声明

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

//添加信息
void AddContact(struct Contact* stu);

//打印信息
void ShowContact(const struct Contact* stu);

//根据姓名查找位置
int FindByName(const struct Contact* stu, char name[nlen]);

//删除信息
void DeleteContact(struct Contact* stu);

//查找信息
void ReadContact(const struct Contact* stu);

//修改信息
void UpdateContact(struct Contact* stu);

//排序信息
void SortContact(struct Contact* stu);

二、系统功能实现

1.初始化通讯录

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

void InitContact(struct Contact* stu)
{
	memset(stu->data, 0, sizeof(stu->data));
	stu->size = 0;
}

2.添加信息

void AddContact(struct Contact* stu)
{
	if (stu->size == MAX)
	{
		printf("通讯录已满,无法添加信息!\n");
	}
	else
	{
		printf("请添加姓名:");
		scanf("%s", (stu->data)[stu->size].name);
		printf("请添加年龄:");
		scanf("%d", &((stu->data)[stu->size].age));
		printf("请添加电话:");
		scanf("%s", (stu->data)[stu->size].tele);
		printf("请添加性别:");
		scanf("%s", (stu->data)[stu->size].sex);
		printf("请添加地址:");
		scanf("%s", (stu->data)[stu->size].addres);
		stu->size++;
		printf("添加成功\n");
	}
}

3.打印信息

void ShowContact(const struct Contact* stu)
{
	if (stu->size == 0)
	{
		printf("通讯录为空\n");
	}
	else
	{
		printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
		for (int i = 0; i < stu->size; i++)
		{
			printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
				stu->data[i].name,
				stu->data[i].age,
				stu->data[i].tele,
				stu->data[i].sex,
				stu->data[i].addres);
		}
	}
}

4.根据姓名查找位置

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

static int FindByName(const struct Contact* stu,char name[nlen] )
{
	int i = 0;
	for (i = 0; i < stu->size; i++)
	{
		if (0 == strcmp(stu->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

5.删除信息

void DeleteContact(struct Contact* stu)
{
	if (stu->size == 0)
	{
		printf("通讯录为空,无法删除\n");
	}
	char name[nlen];
	printf("请输入要删除信息人的名字:");
	scanf("%s", name);	
	int ret = FindByName(stu, name);
	if (ret == -1)
	{
		printf("您要删除的信息不存在!\n");
	}
	else
	{
		for (int j = ret; j < stu->size - 1; j++)
		{
			stu->data[j] = stu->data[j + 1];
		}
		stu->size--;
		printf("删除成功\n");
	}
}

6.查找信息

void ReadContact(const struct Contact* stu)
{
	printf("请输入要查找信息人的名字:");
	char name[nlen];
	scanf("%s", name);
	int ret = FindByName(stu, name);
	if (ret == -1)
	{
		printf("您要查找的信息不存在\n");
	}
	else
	{
		printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
		printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
			stu->data[ret].name,
			stu->data[ret].age,
			stu->data[ret].tele,
			stu->data[ret].sex,
			stu->data[ret].addres);
	}
}

7.修改信息

void UpdateContact(struct Contact* stu)
{
	printf("请输入要该信息人的名字:");
	char name[nlen];
	scanf("%s", name);
	int ret = FindByName(stu, name);
	if (ret == -1)
	{
		printf("您要修改的信息不存在\n");
	}
	else
	{
		printf("请添加姓名:");
		scanf("%s", (stu->data)[ret].name);
		printf("请添加年龄:");
		scanf("%d", &((stu->data)[ret].age));
		printf("请添加电话:");
		scanf("%s", (stu->data)[ret].tele);
		printf("请添加性别:");
		scanf("%s", (stu->data)[ret].sex);
		printf("请添加地址:");
		scanf("%s", (stu->data)[ret].addres);
		printf("修改成功\n");
	}
}

8.排序信息

在排序这一模块,我们选择使用qsort函数来进行排序,对这个函数不清楚的朋友可以看一下我之前写的一篇关于qsort函数的博客。

int cmp_s(const void* elem1, const void* elem2)
{
	return strcmp((char*)elem1, (char*)elem2);
}

void SortContact(struct Contact* stu)
{
	qsort(stu, stu->size, sizeof(stu->data[0]), cmp_s);
	printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
	for (int i = 0; i < stu->size; i++)
	{
		printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
			stu->data[i].name,
			stu->data[i].age,
			stu->data[i].tele,
			stu->data[i].sex,
			stu->data[i].addres);
	}
}

三、源文件展示

1.test.c

#include "contact.h"


void menu()
{
	printf("************************************\n");
	printf("*******    通讯录管理系统     *******\n");
	printf("************************************\n");
	printf("*******       1.ADD          *******\n");
	printf("*******       2.DELETE       *******\n");
	printf("*******       3.UPDATE       *******\n");
	printf("*******       4.READ         *******\n");
	printf("*******       5.SHOW         *******\n");
	printf("*******       6.SORT         *******\n");
	printf("*******       0.EXIT         *******\n");
	printf("************************************\n");
}

enum option
{
	EXIT,
	ADD,
	DELETE,
	UPDATE,
	READ,
	SHOW,
	SORT
};

int main()
{
	int input = 0;
	struct Contact stu;
	InitContact(&stu);
	do
	{
		menu();
		printf("请选择操作:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&stu);
			break;
		case DELETE:
			DeleteContact(&stu);
			break;
		case UPDATE:
			UpdateContact(&stu);
			break;
		case READ:
			ReadContact(&stu);
			break;
		case SHOW:
			ShowContact(&stu);
			break;
		case SORT:
			SortContact(&stu);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请从新操作:\n");
			break;
		}
	} while (input);
	return 0;
}

2.contact.c

#include "contact.h"



void InitContact(struct Contact* stu)
{
	memset(stu->data, 0, sizeof(stu->data));
	stu->size = 0;
}


void AddContact(struct Contact* stu)
{
	if (stu->size == MAX)
	{
		printf("通讯录已满,无法添加信息!\n");
	}
	else
	{
		printf("请添加姓名:");
		scanf("%s", (stu->data)[stu->size].name);
		printf("请添加年龄:");
		scanf("%d", &((stu->data)[stu->size].age));
		printf("请添加电话:");
		scanf("%s", (stu->data)[stu->size].tele);
		printf("请添加性别:");
		scanf("%s", (stu->data)[stu->size].sex);
		printf("请添加地址:");
		scanf("%s", (stu->data)[stu->size].addres);
		stu->size++;
		printf("添加成功\n");
	}
}


void ShowContact(const struct Contact* stu)
{
	if (stu->size == 0)
	{
		printf("通讯录为空\n");
	}
	else
	{
		printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
		for (int i = 0; i < stu->size; i++)
		{
			printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
				stu->data[i].name,
				stu->data[i].age,
				stu->data[i].tele,
				stu->data[i].sex,
				stu->data[i].addres);
		}
	}
}


static int FindByName(const struct Contact* stu,char name[nlen] )
{
	int i = 0;
	for (i = 0; i < stu->size; i++)
	{
		if (0 == strcmp(stu->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

void DeleteContact(struct Contact* stu)
{
	if (stu->size == 0)
	{
		printf("通讯录为空,无法删除\n");
	}
	char name[nlen];
	printf("请输入要删除信息人的名字:");
	scanf("%s", name);	
	int ret = FindByName(stu, name);
	if (ret == -1)
	{
		printf("您要删除的信息不存在!\n");
	}
	else
	{
		for (int j = ret; j < stu->size - 1; j++)
		{
			stu->data[j] = stu->data[j + 1];
		}
		stu->size--;
		printf("删除成功\n");
	}
}


void ReadContact(const struct Contact* stu)
{
	printf("请输入要查找信息人的名字:");
	char name[nlen];
	scanf("%s", name);
	int ret = FindByName(stu, name);
	if (ret == -1)
	{
		printf("您要查找的信息不存在\n");
	}
	else
	{
		printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
		printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
			stu->data[ret].name,
			stu->data[ret].age,
			stu->data[ret].tele,
			stu->data[ret].sex,
			stu->data[ret].addres);
	}
}


void UpdateContact(struct Contact* stu)
{
	printf("请输入要该信息人的名字:");
	char name[nlen];
	scanf("%s", name);
	int ret = FindByName(stu, name);
	if (ret == -1)
	{
		printf("您要修改的信息不存在\n");
	}
	else
	{
		printf("请添加姓名:");
		scanf("%s", (stu->data)[ret].name);
		printf("请添加年龄:");
		scanf("%d", &((stu->data)[ret].age));
		printf("请添加电话:");
		scanf("%s", (stu->data)[ret].tele);
		printf("请添加性别:");
		scanf("%s", (stu->data)[ret].sex);
		printf("请添加地址:");
		scanf("%s", (stu->data)[ret].addres);
		printf("修改成功\n");
	}
}


int cmp_s(const void* elem1, const void* elem2)
{
	return strcmp((char*)elem1, (char*)elem2);
}

void SortContact(struct Contact* stu)
{
	qsort(stu, stu->size, sizeof(stu->data[0]), cmp_s);
	printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
	for (int i = 0; i < stu->size; i++)
	{
		printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
			stu->data[i].name,
			stu->data[i].age,
			stu->data[i].tele,
			stu->data[i].sex,
			stu->data[i].addres);
	}
}

3.contact.h

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1000
#define nlen 20
#define tlen 11
#define slen 10
#define alen 10


struct Infor
{
	char name[nlen];
	int age;
	char tele[tlen];
	char sex[slen];
	char addres[alen];
};


struct Contact
{
	struct Infor data[MAX];
	int size;
};


void InitContact(struct Contact* stu);

void AddContact(struct Contact* stu);

void ShowContact(const struct Contact* stu);

void DeleteContact(struct Contact* stu);

void ReadContact(const struct Contact* stu);

int FindByName(const struct Contact* stu, char name[nlen]);

void UpdateContact(struct Contact* stu);

void SortContact(struct Contact* stu);

注:此文章是一篇初级版的通讯录管理系统,后续还要对其进行优化处理。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:38:18  更:2022-09-24 20:40:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 12:42:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码