通讯录的实现

目录

设计思路

文件准备

test.c

contact.c

contact.h

通讯录的实现

基础定义

打印菜单

菜单效果

主函数

初始化通讯录

添加联系人

删除联系人

查找联系人

修改联系人

排序联系人

冒泡排序

qsort排序

通讯录最终效果


设计思路

通讯录的实现_第1张图片

文件准备

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");


}

菜单效果

通讯录的实现_第2张图片

主函数

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

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分支语句对选项进行了分类   在这里运用了一个枚举的小技巧

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

通讯录的实现_第3张图片

初始化通讯录

//初始化通讯录函数
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四个参数分别是  首元素地址   元素个数    元素大小        比较函数

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

通讯录最终效果

通讯录的实现_第4张图片

通讯录的实现_第5张图片

你可能感兴趣的:(c语言,开发语言,c++,数据结构)