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语言进阶】简易通讯录的实现


一、成果展示

在这里插入图片描述

  • 添加联系人
    在这里插入图片描述
  • 修改联系人
    在这里插入图片描述
  • 删除联系人
    在这里插入图片描述
  • 查找联系人
    在这里插入图片描述
  • 排序通讯录
    按姓名排序:
    在这里插入图片描述
    按地址排序:
    在这里插入图片描述
    按年龄排序:
    在这里插入图片描述
  • 清空通讯录:
    在这里插入图片描述

二、思路

大致思路

  • 联系人是一个复杂的实体,包括:姓名,电话,地址等,不只一个变量,因此需要用结构体(struct Peoinfo)来定义联系人。
  • 通讯录是个联系人列表,通讯录就可以定义为struct Peoinfo类型的数组,但数组还需要包含下标(即联系人的个数),因此还需要定义一个整数。所以,我们也采用结构体(struct Contact)对其定义。
    在这里插入图片描述
  • 接下来通过switch-case语句实现通迅录的不同功能。

1. 添加联系人

  • 添加联系人的前提必须是通讯录还有空间,因此,首先判断通讯录的人数sz是否已经超过数组data的最大容量MAX_DATA。
  • 然后依次输入需要添加的联系人的信息。
  • 每添加一个联系人后要给sz加一。
    在这里插入图片描述

2. 查找联系人

  • 先输入需要查找的联系人姓名,通过遍历data数组,比较输入的联系人姓名与数组中的联系人姓名是否相等。
  • 此处可以将寻找联系人的函数分装起来,方便后面使用。
    在这里插入图片描述

3. 修改联系人

  • 要修改联系人,首先应该先找到该联系人,这里直接用上一步写好的find()函数。
  • 如果函数返回值不为-1时,再执行修改的步骤。
    在这里插入图片描述

4. 删除联系人

  • 删除联系人也需要先找到该联系人,这里依然使用find()函数。
  • 在找到该联系人的数组下标后,只需要使该改联系人后面的元素依次向前覆盖一个元素即可。
  • 图例:
    在这里插入图片描述

在这里插入图片描述

5. 展示通讯录

  • 对通讯录中的data数组依次遍历输出联系人信息即可。
    在这里插入图片描述

6. 排序通讯录

  • 排序通讯录利用qsort函数,排序后依次输出。
  • 此处编写了三种排序方法,分别按姓名(首字母大小),地址(首字母大小),年龄排序,由于采用qsort库函数,只需要编写三种比较方法即可。
    在这里插入图片描述

7. 清空通讯录

  • 清空通讯录,让联系人数sz为0即可达到目的。
    在这里插入图片描述

三、完整代码

contact.h

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_NUM 12
#define MAX_ADDR 30
#define MAX_DATA 100
//创建联系人结构体
struct Peoinfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	char num[MAX_NUM];
	int age;
	char addr[MAX_ADDR];
};

//创建通讯录结构体
struct Contact
{
	struct Peoinfo data[MAX_DATA];
	int sz;
	//int capcity;
};
//初始化通讯录
void init_contact(struct Contact* con);
//添加联系人
void addContact(struct Contact* con);
//删除联系人
void deleteContact(struct Contact* con);
//修改联系人
void modifyContact(struct Contact* con);
//查找联系人
void searchContact(struct Contact* con);
//展示通讯录
void showContact(struct Contact* con);
//排序通讯录
void sortContact(struct Contact con);
//清空联系人
void clearContact(struct Contact* con);

contact.c

#include "contact.h"
//初始化通讯录
void init_contact(struct Contact* con)
{
	assert(con);
	con->sz = 0;
	memset(con->data, 0, MAX_DATA*sizeof(struct Peoinfo));
}
//添加联系人
void addContact(struct Contact *con)
{
	assert(con);
	if ((con->sz) > MAX_DATA)
	{
		printf("通讯录已满!\n");
	}
	printf("请输入姓名:");
	scanf("%s", con->data[con->sz].name);
	printf("请输入性别:");
	scanf("%s", con->data[con->sz].sex);
	printf("请输入电话:");
	scanf("%s", con->data[con->sz].num);
	printf("请输入年龄:");
	scanf("%d", &(con->data[con->sz].age));
	printf("请输入地址:");
	scanf("%s", con->data[con->sz].addr);
	con->sz++;
	printf("添加联系人成功!\n");
}
//删除联系人
void deleteContact(struct Contact* con)
{
	char name[MAX_NAME];
	printf("请输入要删除的联系人:");
	scanf("%s", name);
	int ret = find(con, name);
	if (ret == -1)
		printf("未找到该联系人!\n");
	else
	{
		int i = 0;
		for (i = 0; i < con->sz - ret; i++)
		{
			con->data[ret+i] = con->data[ret + i+1];
		}
		con->sz--;
		printf("删除联系人成功!\n");
	}
}
//修改联系人
void modifyContact(struct Contact* con)
{
	char name[MAX_NAME];
	printf("请输入要修改的联系人:");
	scanf("%s", name);
	int ret = find(con, name);
	if (ret == -1)
		printf("未找到该联系人!\n");
	else
	{
		printf("请输入姓名:");
		scanf("%s", con->data[ret].name);
		printf("请输入性别:");
		scanf("%s", con->data[ret].sex);
		printf("请输入电话:");
		scanf("%s", con->data[ret].num);
		printf("请输入年龄:");
		scanf("%d", &(con->data[ret].age));
		printf("请输入地址:");
		scanf("%s", con->data[ret].addr);
		printf("修改联系人成功!\n");
	}

}
//寻找联系人
static int find(const struct Contact* con,char* name)
{
	int i = 0;
	for (i = 0; i < con->sz; i++)
	{
		if (0==strcmp(con->data[i].name,name))
			return i;
	}
	return -1;
}
//查找联系人
void searchContact(struct Contact* con)
{
	assert(con);
	char name[20]={0};
	printf("请输入要查找的联系人:");
	scanf("%s", &name);
	int ret=find(con, name);
	if (ret == -1)
		printf("未找到该联系人!\n");
	else
	{
		printf("%-20s\t%-10s\t%-12s\t%-5s\t%-30s\n", "姓名", "性别", "电话", "年龄", "地址");
		printf("%-20s\t%-10s\t%-12s\t%-5d\t%-30s\n", con->data[ret].name, con->data[ret].sex,
			con->data[ret].num, con->data[ret].age, con->data[ret].addr);
	}
}
//展示通讯录
void showContact(struct Contact* con)
{
	assert(con);
	int i = 0;
	printf("%-20s\t%-10s\t%-12s\t%-5s\t%-30s\n", "姓名", "性别", "电话", "年龄", "地址");
	for (i = 0; i < con->sz; i++)
	{

		printf("%-20s\t%-10s\t%-12s\t%-5d\t%-30s\n", con->data[i].name,con->data[i].sex,
			con->data[i].num,con->data[i].age,con->data[i].addr);
	}

}
//按姓名排序
int name_cmp(const void* e1, const void* e2)
{
	return strcmp(((struct Peoinfo*)e1)->name, ((struct Peoinfo*)e2)->name);
}
//按地址排序
int addr_cmp(const void* e1, const void* e2)
{
	return strcmp(((struct Peoinfo*)e1)->addr, ((struct Peoinfo*)e2)->addr);
}
//按年龄排序
int age_cmp(const void* e1, const void* e2)
{
	return ((struct Peoinfo*)e1)->age- ((struct Peoinfo*)e2)->age;
}
//排序通讯录
void sortContact(struct Contact con)
{
	printf("********* 请选择排序方式:**********\n");
	printf("********* 1.姓名   2.地址 **********\n");
	printf("********* 3.年龄         ***********\n");
	printf("************************************\n");
	int a = 0;
	scanf("%d", &a);
	switch(a)
	{
	case 1:
		qsort(con.data, con.sz, sizeof(con.data[0]), name_cmp);
		break;
	case 2:
		qsort(con.data, con.sz, sizeof(con.data[0]), addr_cmp);
		break;
	case 3:
		qsort(con.data, con.sz, sizeof(con.data[0]), age_cmp);
		break;
	default:
		printf("输入错误\n");
		break;
	}
	int i = 0;
	printf("%-20s\t%-10s\t%-12s\t%-5s\t%-30s\n", "姓名", "性别", "电话", "年龄", "地址");
	for (i = 0; i < con.sz; i++)
	{

		printf("%-20s\t%-10s\t%-12s\t%-5d\t%-30s\n", con.data[i].name, con.data[i].sex,
			con.data[i].num, con.data[i].age, con.data[i].addr);
	}
}
//清空联系人
void clearContact(struct Contact* con)
{
	con->sz = 0;
	printf("清空联系人成功!\n");
}

test.c

#include "contact.h"
void Meue()
{
	printf("************************************\n");
	printf("*****   1.add       2.delete   *****\n");
	printf("*****   3.modify    4.search   *****\n");
	printf("*****   5.show      6.sort     *****\n");
	printf("*****   7.clear     0.exit     *****\n");
	printf("************************************\n");
}
int main()
{
	int a = 0;
	enum number
	{
		EXIT,
		ADD,
		DELETE,
		MODIFY,
		SEARCH,
		SHOW,
		SORT,
		CLEAR
	};
	struct Contact con;
	init_contact(&con);
	do
	{
		Meue();
		scanf("%d", &a);
		switch (a)
		{
		case EXIT:
			printf("成功退出!\n");
			break;
		case ADD:
			addContact(&con);
			break;
		case DELETE:
			deleteContact(&con);
			break;
		case MODIFY:
			modifyContact(&con);
			break;
		case SEARCH:
			searchContact(&con);
			break;
		case SHOW:
			showContact(&con);
			break;
		case SORT:
			sortContact(con);
			break;
		case CLEAR:
			clearContact(&con);
			break;
		default:
			printf("输入错误!\n");
			break;
		}
	}
	while (a);
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:13:43  更:2022-10-17 12:16:25 
 
开发: 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 7:07:11-

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