通讯录的不同版本

简介:

通过学习完结构体,那我们如何应用呢?这里我们将介绍结构体在通讯录里面的应用,并且可以实现联系人的增加、删除、修改、分类、显示、查找等功能。


目录:

1.创建通讯录

2.初始化通讯录

3.增加联系人

4.显示联系人

5.删除联系人

6.查找联系人

7.修改联系人

8.分类联系人


1.创建通讯录

创建通讯录,联系人的信息例如:姓名、性别、年龄、地址、电话。在一个结构体中都可以被包含,并且在后面一直在使用。

struct peoinfo
{
	char name[NAME];
	char sex[SEX];
	int age;
	char add[ADD];
	char tele[TELE];
};

2.初始化通讯录

在实现增加、删除联系人时,如何找到增加、删除联系人的信息呢?这时候需要在创建一个结构体,有两个内容,一个是存储联系人的信息的数据,另一个是指向的数据的地址。

struct contact
{
	struct peoinfo data[MAX];
	int sz;

};

将通讯录初始化进行后面的功能。用memset函数对结构体开辟空间并且初始化

 

void init_contact(struct contact* con)
{
	//void * memset ( void * ptr, int value, size_t num );
	memset(con->data,0, 100*sizeof(struct peoinfo));
	con->sz = 0;
}

3.增加联系人

这是一个静态通讯录,有一个最大储存空间。首先判断是否还有空间,如果有的话就开始添加联系人,通过结构体找到要输入的信息,每增加一个联系人sz就会增加

//增加联系人
void addcontact(struct contact* con)
{
	if (con->sz > 100)
	{
		printf("通讯录已满\n");
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s",con->data[con->sz].name );
		printf("请输入性别:>");
		scanf("%s", con->data[con->sz].sex );
		printf("请输入年龄:>");
		scanf("%d", &(con->data[con->sz].age));
		printf("请输入地址:>");
		scanf("%s", con->data[con->sz].add);
		printf("请输入电话:>");
		scanf("%s", con->data[con->sz].tele);
	}
	con->sz++;
	printf("成功添加联系人\n");
}

4.显示联系人

增加了联系人,可以在屏幕上显示出来,看是否增加成功。需要一个格式,不然就不知道信息是什么。

//显示联系人
void showcontact(struct contact con)
{
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
	int i = 0;
	for (i = 0; i < con.sz;i++)
	{
		printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n",con.data[i].name, con.data[i].sex, con.data[i].age, con.data[i].add, con.data[i].tele);

	}
}

5.删除联系人

首先需要输入要删除联系人的姓名,与在通讯录的联系人进行对比,如果一样就删除。删除之后需要将后面的联系人的地址都往前一个位置,这时sz-1,空间将会增加一个。

int find_name(char* name,struct contact* con)
{
	int i = 0;
	for (i = 0; i < con->sz;i++)
	{
		if (strcmp(name, con->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//删除联系人
void delcontact(struct contact* con)
{
	char name[NAME];
	printf("请输入需要删除的联系人姓名:>");
	scanf("%s",name );
	int ret = find_name(name,con);
	if (-1 == ret)
	{
		printf("找不到要删除人的信息\n");
	}
	else
	{
		int i = 0;
		for (i = ret; i < con->sz-1; i++)
		{
			con->data[i] = con->data[i + 1];
		}
		con->sz--;
		printf("成功删除联系人\n");
	}
}

6.查找联系人

首先需要输入要查找联系人的姓名,与在通讯录的联系人进行对比,如果一样就将联系人显示出来

int find_name(char* name,struct contact* con)
{
	int i = 0;
	for (i = 0; i < con->sz;i++)
	{
		if (strcmp(name, con->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//搜索联系人
void searchcontact(struct contact* con)
{
	char name[NAME];
	printf("请输入要查找联系人的姓名:>");
	scanf("%s",name);
	int ret = find_name(name, con);
	if (-1 == ret)
	{
		printf("要查找的联系人不存在\n");
	}
	else
	{
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n",
			con->data[ret].name,
			con->data[ret].sex,
			con->data[ret].age,
			con->data[ret].tele,
			con->data[ret].add
		);

	}
}

7.修改联系人

首先需要输入要修改联系人的姓名,与在通讯录的联系人进行对比,如果一样就将将这个联系人的信息覆盖

int find_name(char* name,struct contact* con)
{
	int i = 0;
	for (i = 0; i < con->sz;i++)
	{
		if (strcmp(name, con->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//修改联系人信息
void modifycontact(struct contact* con)
{
	char name[NAME];
	printf("请输入要修改联系人的姓名:>");
	scanf("%s",name);
	int ret = find_name(name, con);
	if (-1 == ret)
	{
		printf("要修改的联系人不存在\n");
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s", con->data[ret].name);
		printf("请输入性别:>");
		scanf("%s", con->data[ret].sex);
		printf("请输入年龄:>");
		scanf("%d", &(con->data[ret].age));
		printf("请输入地址:>");
		scanf("%s", con->data[ret].add);
		printf("请输入电话:>");
		scanf("%s", con->data[ret].tele);
	}
}

8.分类联系人

可以通过姓名、年龄等不同的方法对通讯录分类。这里可以用qsort函数,可以实现不同类型的分类。

int cmp_name(const void* e1, const void* e2)
{
	return strcmp(((struct peoinfo*)e1)->name, ((struct peoinfo*)e2)->name);
}

int cmp_age(const void* e1, const void* e2)
{
	return ((struct peoinfo*)e1)->age - ((struct peoinfo*)e2)->age;
}

//通讯录分类
void sortcontact(struct contact* con)
{
	//void qsort(void* base, size_t num, size_t size,
	//int (*compar)(const void*, const void*));
	printf("************************1.名字分类******************\n");
	printf("************************2.年龄分类******************\n");
	int i = 0;
	printf("请选择>:");
	scanf("%d", &i);
	switch (i)
	{
	case 1:qsort(con->data,con->sz,sizeof(struct peoinfo),cmp_name);
		break;
	case 2:qsort(con->data, con->sz, sizeof(struct peoinfo), cmp_age);
		break;
	defaule:
		printf("选择错误\n");
		break;
	}	
}

完整代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
	printf("**************************************\n");
	printf("*****   1. add      2. del       *****\n");
	printf("*****   3. search   4. modify    *****\n");
	printf("*****   5. show     6. sort      *****\n");
	printf("*****   0. exit                  *****\n");
	printf("**************************************\n");
}
int main()
{
	int input = 0;
	//创建通讯录
	struct contact con;
	//初始化通讯录
	init_contact(&con);
	do
	{
		menu();
		printf("请根据菜单选择:>");
		scanf("%d",&input);
		switch (input)
		{
		case 0:
			printf("退出通讯录\n");
			break;
		case 1:
			addcontact(&con);
			break;
		case 2:
			delcontact(&con);
			break;
		case 3:
			searchcontact(&con);
			break;
		case 4:
			modifycontact(&con);
			break;
		case 5:
			showcontact(con);
			break;
		case 6:
			sortcontact(&con);
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	} while (input);
	return 0;
}

contact.h

#pragma once
#include <stdio.h>
#define MAX 100
#define NAME 20
#define SEX 5
#define ADD 20
#define TELE 20

#include <string.h>
#include <stdlib.h>
struct peoinfo
{
	char name[NAME];
	char sex[SEX];
	int age;
	char add[ADD];
	char tele[TELE];
};
struct contact
{
	struct peoinfo data[MAX];
	int sz;

};
//初始化通讯录
void init_contact(struct contact *con);

//增加联系人
void addcontact(struct contact* con);

//删除联系人
void delcontact(struct contact* con);

//显示联系人
void showcontact(struct contact con);

//搜索联系人
void searchcontact(struct contact* con);

//修改联系人信息
void modifycontact(struct contact* con);

//通讯录分类
void sortcontact(struct contact* con);

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//初始化通讯录
void init_contact(struct contact* con)
{
	//void * memset ( void * ptr, int value, size_t num );
	memset(con->data,0, 100*sizeof(struct peoinfo));
	con->sz = 0;
}

//增加联系人
void addcontact(struct contact* con)
{
	if (con->sz > 100)
	{
		printf("通讯录已满\n");
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s",con->data[con->sz].name );
		printf("请输入性别:>");
		scanf("%s", con->data[con->sz].sex );
		printf("请输入年龄:>");
		scanf("%d", &(con->data[con->sz].age));
		printf("请输入地址:>");
		scanf("%s", con->data[con->sz].add);
		printf("请输入电话:>");
		scanf("%s", con->data[con->sz].tele);
	}
	con->sz++;
	printf("成功添加联系人\n");
}

int find_name(char* name, struct contact* con)
{
	int i = 0;
	for (i = 0; i < con->sz;i++)
	{
		if (strcmp(name, con->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//删除联系人
void delcontact(struct contact* con)
{
	char name[NAME];
	printf("请输入需要删除的联系人姓名:>");
	scanf("%s", name);
	int ret = find_name(name, con);
	if (-1 == ret)
	{
		printf("找不到要删除人的信息\n");
	}
	else
	{
		int i = 0;
		for (i = ret; i < con->sz - 1; i++)
		{
			con->data[i] = con->data[i + 1];
		}
		con->sz--;
		printf("成功删除联系人\n");
	}
}

//显示联系人
void showcontact(struct contact con)
{
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
	int i = 0;
	for (i = 0; i < con.sz;i++)
	{
		printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", con.data[i].name, con.data[i].sex, con.data[i].age, con.data[i].add, con.data[i].tele);

	}
}

//搜索联系人
void searchcontact(struct contact* con)
{
	char name[NAME];
	printf("请输入要查找联系人的姓名:>");
	scanf("%s", name);
	int ret = find_name(name, con);
	if (-1 == ret)
	{
		printf("要查找的联系人不存在\n");
	}
	else
	{
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n",
			con->data[ret].name,
			con->data[ret].sex,
			con->data[ret].age,
			con->data[ret].tele,
			con->data[ret].add
		);

	}
}

//修改联系人信息
void modifycontact(struct contact* con)
{
	char name[NAME];
	printf("请输入要修改联系人的姓名:>");
	scanf("%s", name);
	int ret = find_name(name, con);
	if (-1 == ret)
	{
		printf("要修改的联系人不存在\n");
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s", con->data[ret].name);
		printf("请输入性别:>");
		scanf("%s", con->data[ret].sex);
		printf("请输入年龄:>");
		scanf("%d", &(con->data[ret].age));
		printf("请输入地址:>");
		scanf("%s", con->data[ret].add);
		printf("请输入电话:>");
		scanf("%s", con->data[ret].tele);
	}
}

int cmp_name(const void* e1, const void* e2)
{
	return strcmp(((struct peoinfo*)e1)->name, ((struct peoinfo*)e2)->name);
}

int cmp_age(const void* e1, const void* e2)
{
	return ((struct peoinfo*)e1)->age - ((struct peoinfo*)e2)->age;
}

//通讯录分类
void sortcontact(struct contact* con)
{
	//void qsort(void* base, size_t num, size_t size,
	//int (*compar)(const void*, const void*));
	printf("************************1.名字分类******************\n");
	printf("************************2.年龄分类******************\n");
	int i = 0;
	printf("请选择>:");
	scanf("%d", &i);
	switch (i)
	{
	case 1:qsort(con->data,con->sz,sizeof(struct peoinfo),cmp_name);
		break;
	case 2:qsort(con->data, con->sz, sizeof(struct peoinfo), cmp_age);
		break;
	defaule:
		printf("选择错误\n");
		break;
	}	
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值