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++知识库 -> 【ONE·C || 模拟通讯录实现·简易版】 -> 正文阅读

[C++知识库]【ONE·C || 模拟通讯录实现·简易版】

总言

??简单通讯录实现,分静态版本和动态版本。
??现阶段各代码解释在动态版本内。


??
??

静态版

contact.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS

//头文件
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define Max 1000
#define NameMax 20
#define SexMax 5
#define TeleMax 12
#define AddrMax 25

//变量声明

//通讯录个人信息
typedef struct PeoInfo
{
	char name[NameMax];
	int age;
	char sex[SexMax];
	char tele[TeleMax];
	char addr[AddrMax];

}PeoInfo;


//通讯录
typedef struct Contact
{
	PeoInfo data[Max];//通讯录能够存放的数据总数
	int sz;//已记录的数据个数
}Contact;

//通讯录菜单栏
enum Option
{
	Exit,
	Add,
	Delete,
	Search,
	Modifly,
	Show,
	Clear,
	Sort
};

//函数声明
void InitContact(Contact* pho);//初始化通讯录
void AddContact(Contact* pho);//添加联系人
void ShowContact(const Contact* pho);//显示联系人
void DeleteContact(Contact* pho);//删除指定联系人
void SearchContact(const Contact* pho);//查找指定联系人
void ModiflyContact(Contact* pho);//修改指定联系人
void ClearContact(Contact* pho);//清除所有联系人
void SortContact(Contact* pho);//按名字排序

??
??

test.c

#include "contact.h"



void menu()
{
	printf("*****************************************\n");
	printf("********  1.Add       2.Delete  *********\n");
	printf("********  3.Search    4.Modify  *********\n");
	printf("********  5.Show      6.Clear   *********\n");
	printf("********  7.Sort      0.Exit    *********\n");
	printf("*****************************************\n");
}


void test()
{

	//创建与初始化通讯录
	Contact pho;
	InitContact(&pho);

	int input = 0;

	do {

		//菜单及选项
		menu();
		printf("请选择:");
		scanf("%d", &input);
		//选择
		switch (input)
		{
		case Add:
			AddContact(&pho);
			break;
		case Delete:
			DeleteContact(&pho);
			break;
		case Search:
			SearchContact(&pho);
			break;
		case Modifly:
			ModiflyContact(&pho);
			break;
		case Show:
			ShowContact(&pho);
			break;
		case Clear:
			ClearContact(&pho);
			break;
		case Sort:
			SortContact(&pho);
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);

}

int main(void)
{
	test();
	return 0;
}

??
??

contact.c

#include"contact.h"

//初始化通讯录
void InitContact(Contact* pho)
{
	assert(pho);
	pho->sz = 0;
	memset(pho->data, 0, sizeof(pho->data));
}



//1、新建联系人
void AddContact(Contact* pho) 
{
	printf("输入联系人姓名:");
	scanf("%s", pho->data[pho->sz].name);

	printf("输入联系人年龄:");
	scanf("%d", &(pho->data[pho->sz].age));//注意取地址

	printf("输入联系人性别:");
	scanf("%s", pho->data[pho->sz].sex);

	printf("输入联系人电话:");
	scanf("%s", pho->data[pho->sz].tele);

	printf("输入联系人地址:");
	scanf("%s", pho->data[pho->sz].addr);

	pho->sz++;//通讯录中数据个数加一
	printf("添加成功\n");//提示

}


//独立查找函数,辅助删除、查找、修改功能
int FindContact(const char* name,const Contact*pho)
{
	assert(name && pho);
	int i;
	for (i = 0; i < pho->sz; i++)
	{
		if (0 == strcmp(pho->data[i].name, name))
			return i;//需要注意此处name表示的含义
	}
	return -1;
}

//2、通过姓名删除指定联系人
void DeleteContact(Contact* pho)
{
	assert(pho);
	//通讯录为空时
	if (pho->sz == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
	//通讯录有联系人时
	char name[NameMax] = { 0 };
	printf("请输入需要删除的联系人姓名:");
	scanf("%s", name);
	int result = FindContact(name, pho);//注意此处name数字不需要&
	//联系人不存在时
	if (result == -1)
	{
		printf("删除失败,目标联系人不存在\n");
		return;
	}
	int i;
	//联系人存在,删除操作
	for (i = result; i < pho->sz; i++)
	{
		pho->data[i] = pho->data[i + 1];
	}
	pho->sz--;
	printf("删除成功\n");
}

//3、通过姓名查找指定联系人
void SearchContact(const Contact* pho)
{
	assert(pho);
	//通讯录中无联系人的情况
	if (pho->sz == 0)
	{
		printf("通讯录为空,查找失败\n");
		return;
	}
	//通讯录中有联系人
	char name[NameMax] = { 0 };
	printf("请输入目标联系人的姓名:");
	scanf("%s", name);
	int result = FindContact(name, pho);
	//目标人物不在通讯录中
	if (result == -1)
	{
		printf("查找失败,目标联系人不存在\n");
		return ;
	}
	//目标人物在通讯录中
	printf("%-20s %-5s %-5s %-12s %-25s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s %-5d %-5s %-12s %-25s\n", pho->data[result].name,
		pho->data[result].age, pho->data[result].sex,
		pho->data[result].tele, pho->data[result].addr);
}



//4、修改指定联系人
void ModiflyContact(Contact* pho)
{
	assert(pho);
	//通讯录中无联系人的情况
	if (pho->sz == 0)
	{
		printf("通讯录为空,修改失败\n");
		return;
	}
	//通讯录有联系人
	char name[NameMax] = { 0 };
	printf("请输入需要修改的联系人姓名:");
	scanf("%s", name);
	int result = FindContact(name, pho);
	//联系人不在通讯录中
	if (result == -1)
	{
		printf("查找失败,目标联系人不存在\n");
		return;
	}
	//联系人存在时
	int aim;
	printf("输入需要修改的信息:1、姓名,2、年龄,3、性别,4、电话,5、住址.");
	scanf("%d", &aim);
	switch (aim)
	{
	case 1:
		printf("请输入新的姓名:");
		scanf("%s", pho->data[result].name);
	case 2:
		printf("请输入新的年龄:");
		scanf("%s", &(pho->data[result].age));
	case 3:
		printf("请输入新的性别:");
		scanf("%s", pho->data[result].sex);
	case 4:
		printf("请输入新的电话:");
		scanf("%s", pho->data[result].tele);
	case 5:
		printf("请输入新的住址:");
		scanf("%s", pho->data[result].addr);	
	}
	printf("修改成功\n");
}



//5、显示通讯录
void ShowContact(const Contact* pho)
{
	assert(pho);

	//显示栏
	printf("%-20s %-5s %-5s %-12s %-25s\n", "姓名", "年龄", "性别", "电话", "地址");
	//通讯人
	int i;
	for (i = 0; i < pho->sz; i++)
	{
		printf("%-20s %-5d %-5s %-12s %-25s\n", pho->data[i].name,
			pho->data[i].age, pho->data[i].sex,
			pho->data[i].tele, pho->data[i].addr);
	}
}



//6、清除全部联系人
void ClearContact(Contact* pho)
{
	InitContact(pho);
	//清除全部联系人即初始化通讯录
	//需要注意此处传参
}

//7、按名字排序联系人
int IntCmp(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
}
void SortContact(Contact* pho)
{
	qsort(pho->data,pho->sz,sizeof(PeoInfo),IntCmp);
}

??
??

动态版

?? 动态版指通讯录总人数根据实际存入信息实时动态变化。例如,初始化通讯录人数容量为三人,后续该三个容量被使用后,按一定规律再为通讯录增加人数容量,比如从三人容量增加到五人容量,或者以倍数关系扩容等。
??需要用到动态空间的相关知识,在静态版本的基础上做一些小改动。

contact.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS

//头文件
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>

#define MaxName 20
#define MaxSex 5
#define MaxTele 12
#define MaxAddrs 25

#define CapaInit 3 

//变量声明

//通讯录个人信息
typedef struct PeoInfo
{
	char name[MaxName];
	int age;
	char sex[MaxSex];
	char tele[MaxTele];
	char addrs[MaxAddrs];

}PeoInfo;

//通讯录信息记录---与静态版不同之处
typedef struct Contact
{
	PeoInfo* data;
	int sz;//通讯录当前有效人数
	int capacity;//通讯录总容量
}Contact;

//通讯录菜单设置---枚举
enum Option
{
	Exit,
	Add,
	Delete,
	Search,
	Modifly,
	Show,
	Clear,
	Sort
};


//函数声明
void InitContact(Contact* pho);//初始化通讯录函数声明
void AddContact(Contact* pho);//添加联系人
void DeletContact(Contact* pho);//删除联系人
void SearchContact(Contact* pho);//查找联系人
void ModifyContact(Contact* pho);//修改联系人
void ShowContact(Contact* pho);//显示所有联系人
void ClearContact(Contact* pho);//清除全部联系人
void DestroyContact(Contact* pho);//Exit退出程序
void SortContact(Contact* pho);//排序联系人


??
??

test.c

#include "contact.h"


void menu(void)
{
	printf("*****************************************\n");
	printf("********  1.Add       2.Delete  *********\n");
	printf("********  3.Search    4.Modify  *********\n");
	printf("********  5.Show      6.Clear   *********\n");
	printf("********  7.Sort      0.Exit    *********\n");
	printf("*****************************************\n");

}
void test(void)
{
	//创建与初始化通讯录
	Contact pho;
	//用头文件中的通讯录结构体只是结构体声明,此处用创建一个该类型结构体的变量,
	//该变量是后续增删替补通讯录的基础
	InitContact(&pho);
	//初始化结构体,其目标在于方便动态开辟,以及为后续通讯录菜单做铺垫。
	//类似于手机在用户未安装各种运用时,都会有个初始化状态。


	//菜单选项
	int input = 0;
	do {

		menu();
		scanf("%d", &input);
		switch (input)
		{
		case Exit:
			DestroyContact(&pho);
			printf("退出程序\n");
			break;
		case Add:
			AddContact(&pho);
			break;
		case Delete:
			DeletContact(&pho);
			break;
		case Search:
			SearchContact(&pho);
			break;
		case Modifly:
			ModifyContact(&pho);
			break;
		case Show:
			ShowContact(&pho);
			break;
		case Clear:
			ClearContact(&pho);
			break;
		case Sort:
			SortContact(&pho);
			break;
		default:
			printf("输入出错误,请重新输入!\n");
		}
	} while (input);

}
int main(void)
{
	test();
	return 0;
}

??
??

contact.c

#include"contact.h"


//通讯录初始化
void InitContact(Contact* pho)
{
	assert(pho);
	pho->sz = 0;//初始通讯录实际记录人数为零
	pho->capacity = CapaInit;//初始默认通讯录总人数
	
	//使用malloc函数,申请一块动态内存空间,该空间大小取决于通讯录初始总人数以及单位人数所占空间大小
	//(malloc)统计的是总字节数,因此要计算“通讯录个人信息”该结构体的大小
	pho->data=(PeoInfo *)malloc(pho->capacity * sizeof(PeoInfo));
	if (pho->data == NULL)
	{
		perror("IntiContact::malloc");
		return;
	}
}


//大致项目:

//新建联系人---动态版与静态版不同之处

//-----------:删除、查找、修改都是通过查找姓名来解决的,对此可再创建一个函数实现该功能
//通过姓名删除联系人

//通过姓名查找联系人

//通过姓名修改联系人

//展示所有联系人

//按姓名为联系人排序

//清除所有联系人

//Exit退出程序---动态版与静态版不同之处



//----------------
//新建联系人
//part1:扩容检查
void CheckContact(Contact* pho)
{
	assert(pho);
	if (pho->sz == pho->capacity)//当实际人数与通讯录容量相等时,扩容
	{
		//此处扩容使用的是动态内存申请的realloc函数
		PeoInfo* pdata=realloc(pho->data, (pho->capacity + 2) * sizeof(PeoInfo));
		//此处需要用一个对应扩容类型的指针来接受realloc返回值,以便检查是否扩容成功,做后续相关操作
		if (pdata != NULL)
		{
			//由于扩容成功,因此对应的通讯录容量增加,此处需要对该数据进行修改
			pho->capacity += 2;
			//此外,只有在扩容成功时,才能把realloc返回值传递给PeoInfo对应的结构体指针,
			//扩容失败时realloc返回空指针,如果将此传递给原来的PoeInfo指针,那么指向通讯录个人信息的数据将丢失,且会造成内存泄漏的问题
			pho->data = pdata;
			printf("扩容成功\n");//提示
		}
		else
		{
			perror("CheckContact::realloc");
			return;
		}

	}
}

//part2:增加联系人
void AddContact(Contact* pho)
{
	assert(pho);
	//与静态版不同之处,由于人数实时变化,动态版通讯录需要在增加联系人前先检查当前通讯录实际人数和容量
	CheckContact(pho);

	//新建联系人,即将通讯录人物信息存储进对应结构体数组的过程,此处需要掌握结构体访问的相关知识
	printf("请输入联系人姓名:");
	scanf("%s", pho->data[pho->sz].name);
	printf("请输入联系人年龄:");
	scanf("%d", &(pho->data[pho->sz].age));//此处年龄是整型变量,使用scanf时需要&
	printf("请输入联系人性别:");
	scanf("%s", pho->data[pho->sz].sex);
	printf("请输入联系人电话:");
	scanf("%s", pho->data[pho->sz].tele);
	printf("请输入联系人地址:");
	scanf("%s", pho->data[pho->sz].addrs);

	pho->sz++;
	printf("添加成功\n");//提示
}
//------------------






//用于辅助删除、查找、修改联系人的独立函数---查找目标联系人
int FindContact(const char* name, const Contact* pho)
{
	//解释:通过姓名在结构体中查找到目标联系人,若找到,则返回该联系人在通讯录中的排序位置(相当于数组下标)
	assert(pho);
	int i;
	for (i = 0; i < pho->sz; i++)
	{
		//此处需要注意strcmp函数传参的类型
		if (strcmp(name, pho->data[i].name) == 0)
			return i;//找到目标人物,返回对应目标人物的排序
	}
	return -1;//如果未找到目标人物,则返回-1
}



//------------------
//通过姓名删除联系人
void DeletContact(Contact* pho)
{
	//解释:分情况处理,若通讯录为空,则有效人数为0,删除失败;若通讯录不为空时,还要注意目标联系人是否存在的问题
	assert(pho);
	//通讯录为空时:
	if (pho->sz == 0)
	{
		printf("删除失败,通讯录中无联系人\n");
		return ;//查找失败后就可退出该函数,不必再往下执行
	}
	//通讯录不为空时:
	char name[MaxName] = { 0 };//ps:此处为数组初始化为0有助于后续查找联系人(需要用到字符串比较函数)
	printf("请输入要删除的联系人姓名:");
	scanf("%s", name);
	int result = FindContact(name, pho);//数组名本身就是首元素地址,pho为形参此处是结构体指针因此也不需要&
	//联系人不存在时
	if (-1 == result)
	{
		printf("删除失败,目标联系人不存在\n");
		return;
	}
	//联系人存在时的删除操作:遍历循环,让数组后续元素往前挪动,覆盖需要删除的数组元素
	int i;
	for (i = result; i < pho->sz; i++)
	{
		pho->data[i] = pho->data[i + 1];//此处i并不会越界,因为FindContact返回值实际上是数组下标,从0开始,而pho->sz实际是从1统计。
	}
	pho->sz--;//删除联系人后,需要对通讯录实际人数做出调整
	printf("删除成功\n");//提示
}
//------------------



//------------------
//通过姓名查找联系人
void SearchContact(Contact* pho)
{
	//解释:分情况讨论,若通讯录为空,则查找失败;若通讯录不为空,则要判断目标联系人是否存在
	assert(pho);
	//通讯录为空时:
	if (0 == pho->sz)
	{
		printf("通讯录为空,查找失败\n");
		return;
	}
	//通讯录不为空时:
	char name[MaxName] = { 0 };
	printf("请输入需要查找的联系人姓名:");
	scanf("%s", name);
	int result = FindContact(name, pho);
	//联系人不存在时:
	if (-1 == result)
	{
		printf("查找失败,目标联系人不存在\n");
		return;
	}
	//联系人存在时:打印联系人的相关信息
	printf("%-20s %-5s %-5s %-12s %-25s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s %-5d %-5s %-12s %-25s\n", pho->data[result].name,
		pho->data[result].age, pho->data[result].sex,
		pho->data[result].tele, pho->data[result].addrs);
}
//--------------------



//--------------------
//通过姓名修改联系人
void ModifyContact(Contact* pho)
{
	assert(pho);
	if (0 == pho->sz)
	{
		printf("通讯录为空,修改失败\n");
		return 0;
	}

	char name[MaxName] = { 0 };
	printf("请输入需要修改的联系人的姓名:");
	scanf("%s", name);
	int result = FindContact(name, pho);
	if (-1 == result)
	{
		printf("修改失败,目标联系人不存在\n");
		return 0;
	}

	//修改内容:
	int aim = 0;
	do {
		printf("请输入需要修改的信息:1、姓名,2、年龄,3、性别,4、电话,5、地址,0、退出");
		scanf("%d", &aim);
		switch (aim)
		{
		case 0:
			return;
		case 1:
			printf("请输入新的姓名:");
			scanf("%s", pho->data[result].name);
			break;
		case 2:
			printf("请输入新的年龄:");
			scanf("%d", &(pho->data[result].age));
			break;
		case 3:
			printf("请输入新的性别:");
			scanf("%s", pho->data[result].sex);
			break;
		case 4:
			printf("请输入新的电话:");
			scanf("%s", pho->data[result].tele);
			break;
		case 5:
			printf("请输入新的地址:");
			scanf("%s", pho->data[result].addrs);
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (aim);
	printf("修改成功\n");

}
//------------------------





//------------------------
//显示通讯录中所有联系人
void ShowContact(Contact* pho)
{
	assert(pho);

	//显示栏
	printf("%-20s %-5s %-5s %-12s %-25s\n", "姓名", "年龄", "性别", "电话", "地址");
	//遍历全部联系人
	int i;
	for (i = 0; i < pho->sz; i++)
	{
		printf("%-20s %-5d %-5s %-12s %-25s\n", pho->data[i].name,
			pho->data[i].age, pho->data[i].sex,
			pho->data[i].tele, pho->data[i].addrs);
	}

}
//------------------------





//------------------------
//清除全部联系人
void ClearContact(Contact* pho)
{
	InitContact(pho);
}
//------------------------


//------------------------
//Exit退出程序,需要在此处释放动态内存空间
void DestroyContact(Contact *pho)
{
	free(pho->data);
	pho->data = NULL;//注意将该指针赋值为空
	pho->capacity = 0;
	pho->sz = 0;
}
//-------------------------




//-------------------------
//按名字对联系人排序
int CmpPho(const void *e1,const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pho)
{
	qsort(pho->data, pho->sz, sizeof(PeoInfo), CmpPho);
}

??
??

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:08:08  更:2022-04-01 23:08:21 
 
开发: 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年11日历 -2024/11/24 2:58:07-

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