通讯录的实现

本文描述了一个C语言实现的通讯录项目,涉及文件准备、数据结构(PeoInfo和Contact)、菜单设计、关键函数(如AddContact,DelContact,qsortSortContact)及排序算法的应用。
摘要由CSDN通过智能技术生成

目录

设计思路

文件准备

test.c

contact.c

contact.h

通讯录的实现

基础定义

打印菜单

菜单效果

主函数

初始化通讯录

添加联系人

删除联系人

查找联系人

修改联系人

排序联系人

冒泡排序

qsort排序

通讯录最终效果


设计思路

文件准备

test.c

测试通讯录

contact.c

函数的实现

contact.h

函数的类型和声明

通讯录的实现

基础定义

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30


//人的信息
typedef struct PeoInfo
{

	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];

}PeoInfo;



//通讯录
typedef struct Contact
{


	PeoInfo date[MAX];
	int count;


}Contact;

代码开头使用了#define来定义需要用到的值   

这种方法只需修改一次值   不用在海量的代码中一次次修改 

是非常不错的代码设计技巧

Contact的元素有   存放练习人信息的结构体数组date  以及  联系人数量count

Peoinfo的元素则为  联系人的姓名  年龄  性别  电话  住址

打印菜单

//打印菜单

void menu()
{
	printf("********************************************************\n");
	printf("********     1.增加联系人      2.删除联系人     ********\n");
	printf("********     3.查找联系人      4.修改联系人     ********\n");
	printf("********     5.显示联系人      6.排序联系人     ********\n");
	printf("********     0.退出通讯录                       ********\n");
	printf("********************************************************\n");


}

菜单效果

主函数

设计分支选项   选择操作函数

int main()
{

	int input = 0;
	Contact con;   //通讯录
	InitContact(&con); //初始化通讯录
	
	do
	{
		menu();
		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:
			//SortContact(&con);
			QsortContact(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误请重新输入!!!\n");
			break;
		}
	} while (input);


	return 0;
}

我们可以看到 主函数运用了Switch分支语句对选项进行了分类   在这里运用了一个枚举的小技巧

将选择值赋予对应的选项  方便我们在代码调试快速找到对应的问题

初始化通讯录

//初始化通讯录函数
void InitContact(Contact* pc)
{
	assert(pc);   
	memset(pc->date,0,sizeof(pc->date));
	pc->count = 0;

}

memset   三个参数分别为       初始化空间的地址    初始化内容     初始化空间的字节大小

添加联系人

//添加联系人
void AddContact(Contact* pc)
{
	assert(pc);

	if (pc->count == MAX)
	{
		printf("通讯录已满无法添加\n");
	}


	printf("请输入需要添加人的信息\n");
	
	printf("请输入姓名:>");
	scanf("%s", pc->date[pc->count].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->date[pc->count].age));
	printf("请输入性别:>");
	scanf("%s", pc->date[pc->count].sex);
	printf("请输入电话:>");
	scanf("%s", pc->date[pc->count].tele);
	printf("请输入住址:>");
	scanf("%s", pc->date[pc->count].addr);

	pc->count++;

}

删除联系人

//删除指定联系人
void DelContact(Contact* pc)
{

	assert(pc);

	if (pc->count == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}

	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要删除人的名字:>");
	scanf("%s",name);

	找到要删除的联系人
	//int i = 0;
	//int del = 0;
	//int flag = 0;
	//for ( i = 0; i < pc->count; i++)
	//{
	//	if (strcmp(name,pc->date[i].name) == 0)     //字符比较用strcmp
	//	{
	//		del = i;
	//		flag = 1;
	//		break;
	//	}

	//}
	//if (flag == 0)
	//{
	//	printf("要删除的人不存在\n");
	//	return;
	//}
	 

	int del = FindByName(pc,name);
	if (del == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}

	//删除坐标为del的联系人
	int i = 0;
	for ( i = del; i < pc->count-1; i++)
	{
		pc->date[i] = pc->date[i + 1];

	}
	pc->count--;

	printf("成功删除联系人\n");

	
}

查找联系人

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

	char name[MAX_NAME] = { 0 };
	printf("请输入要查找联系人的名字:>");
	scanf("%s", name);
	int find = FindByName(pc, name);
	if (find == -1)
	{
		printf("要查找的人不存在\n");
	}
	else
	{

		printf("%-10s %-10s %-10s %-20s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%-10s %-10d %-10s %-20s %-20s\n",
			pc->date[find].name,
			pc->date[find].age,
			pc->date[find].sex,
			pc->date[find].tele,
			pc->date[find].addr);

	}



}

修改联系人

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

	char name[MAX_NAME] = { 0 };
	printf("请输入要修改联系人的名字:>");
	scanf("%s", name);
	int mod = FindByName(pc, name);
	if (mod == -1)
	{
		printf("要修改的人不存在\n");
	}
	else
	{
		
		printf("请输入需要修改的信息\n");

		printf("请输入姓名:>");
		scanf("%s", pc->date[mod].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->date[mod].age));
		printf("请输入性别:>");
		scanf("%s", pc->date[mod].sex);
		printf("请输入电话:>");
		scanf("%s", pc->date[mod].tele);
		printf("请输入住址:>");
		scanf("%s", pc->date[mod].addr);
		printf("修改成功\n");

	}



}

排序联系人

冒泡排序

//冒泡排序
void SortContact(Contact* pc)
{

	if (pc->count == 0)
	{
		printf("通讯录为空,无法排序!!!\n");
		return;
	}
	if(pc->count == 1)
	{
		printf("只有一位联系人,无需排序!!!\n");
		return;
	}


	int i = 0;
	int j = 0;
	PeoInfo temp = { 0 };

	for ( i = 0; i < pc->count-1; i++)
	{
		for (j = 0; j < pc->count-i-1; j++)
		{
			if (strcmp(pc->date[i].name, pc->date[i + 1].name) < 0)
			{

				PeoInfo temp = pc->date[i];
				pc->date[i] = pc->date[i + 1];
				pc->date[i + 1] = temp;

			}
		}
	

	}
	printf("排序成功\n");

}

qsort排序

//qsort调用

int compar(const void* p1, const void* p2)
{

	return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);

}



void QsortContact(Contact* pc)
{ 
	//   首元素地址   元素个数    元素大小            比较函数      
	qsort(pc->date, pc->count, sizeof(pc->date[0]), compar);
	printf("排序成功\n");

}

qsort四个参数分别是  首元素地址   元素个数    元素大小        比较函数

通过比较名字长度   从而对整个结构体进行交换

通讯录最终效果

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特大魔One

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值