实现静态版本通讯录

今天我们来实现一个通讯录,里面可以记录需要统计的人的信息,下面是这个通讯录的要求:

我们创建3个文件,分别将测试功能和声明功能和通讯录的实现功能封装起来,这样可以使我们的代码条理更加清楚

先制作一个菜单将通讯录的功能展示

void menu()
{
	printf("\n********1.Add      2.Del********\n");
	printf("********3.Search   4.Modify*****\n");
	printf("********5.Show     6.sort*******\n");
	printf("********      0.Exit     *******\n");
	//打印菜单
}

通过输入值存入input之中来实现功能

为了使代码的可读性更高我们设计一个枚举常量,使输入可以与功能对应

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};//使用枚举使代码的可读性更高

下面是代码的测试功能框架:

int main()
{
	int input = 0;
	contact con;
	InitContact(&con);
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case EXIT:
			break;
		case ADD:
			Add(&con);//录入人的信息
			break;
		case DEL:
			Del(&con);//删除人的信息
			break;
		case SEARCH:
			Search(&con);//查找人的信息
			break;
		case MODIFY:
			Modify(&con);//修改人的信息
			break;
		case SHOW:
			Show(&con);//打印目前的通讯录
			break;
		case SORT:
			Sort(&con);//排列通讯录的内容
			break;

		}

	} while (input);

首先创建一个结构体用于存放被录入人的信息:

#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;//运用#define到时候可以更好地修改最大存储的内容大小

我们每次加入人的信息时我们还要统计录入人的数量,这样我们需要创建一个新的结构体,里面既可以存放人的信息,又可以存放统计了几个人。

#define  Max 100
typedef struct contact
{
	PeoInfo data[Max];//统计信息的数组
	int sz;//这个就是统计录入了几个人的变量
}contact

下面就是具体通讯的实现功能:

在开始之前我们先对通讯录进行初始化,设计函数InitContact

void InitContact(contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));//这里运用memset函数快速初始化
}

我们先实现添加联系人:

void Add(contact* pc)
{
	if (pc->sz >= Max)
	{
		printf("数据已经添加满\n");
	}
	else
	{
		printf("请输入姓名\n");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入住址\n");
		scanf("%s", pc->data[pc->sz].addr);
		pc->sz++;//添加完之后统计的人数要加1
		printf("添加成功\n");
	}
}

之后我们实现打印通讯录Show代码

void Show(contact* pc)
{
	int i = 0;
	printf("%-10s %-4s %-5s %-12s %-30s\n",
		"姓名", "年龄", "性别", "电话", "住址");//打印一个标题

	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s %-4d %-5s %-12s %-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

下面我们实现删除Del的代码,在删除之前我们先要查找该人名设计函数Find_name来实现这个功能

Find_name函数代码:

int Find_name(contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(name, pc->data[i].name))
		{
			return i;//这里是相同的情况就返回下标
		}
	}
	//若找不到就返回-1
	return -1;

}

Del函数的代码:

void Del(contact* pc)
{
	char Name[20];
	printf("请输入你要删除的人的姓名\n");
	scanf("%s", Name);
	//删除之前我们要先查找该名字,所以我们先写Find_name来查找该名字
	//找到了后返回下标
	if (-1 == Find_name(pc, Name))
	{
		printf("没有找到该联系人\n");
	}
	else//将删除元素后面的值往前覆盖
	{
		int i = 0;
		for (i = Find_name(pc, Name); i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
	}
}

之后写查找人名的代码Search:

void Search(contact* pc)
{
	char Name[20];
	printf("请输入你要查找的人\n");
	scanf("%s", Name);
	if (Find_name(pc, Name) >= 0)
	{
		int ret = Find_name(pc, Name);
		printf("找到了\n");
		printf("%-10s %-4s %-5s %-12s %-30s\n",
			"姓名", "年龄", "性别", "电话", "住址");
		printf("%-10s %-4d %-5s %-12s %-30s\n",
			pc->data[ret].name,
			pc->data[ret].age,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].addr);
	}
	else
	{
		printf("没有找到\n");
	}
}

下面写修改Modify函数:

void Modify(contact* pc)
{
	char Name[20];
	printf("请输入你要修改的人\n");
	scanf("%s", Name);
	int pos = Find_name(pc, Name);
	printf("请输入姓名\n");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄\n");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别\n");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话\n");
	scanf("%s", pc->data[pos].tele);
	printf("请输入住址\n");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功\n");
}

最后写排序函数Sort,这里我们使用qsort函数来辅助排序:

void cmp_name(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->name , ((PeoInfo*)p2)->name);
}
void Sort(contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);//这里我们按照姓名的首字母排序
}

到这里我们的代码大致均已实现,下面我们看看运行的结果:

Add添加元素

Show展示通讯录:

Del删除元素:

Search查找元素:

Modify修改元素:

Sort排序:

下面是函数的全部代码:

contact.h头文件

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.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 data[Max];
	int sz;
}contact;
void InitContact(contact* pc);
void Add(contact* pc);
void Show(contact* pc);
void Del(contact* pc);
void Search(contact* pc);
void Modify(contact* pc);
void Sort(contact* pc);

contact.c文件(通讯录实现文件)

#include"contact.h"
void InitContact(contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));//这里运用memset函数快速初始化
}
void Add(contact* pc)
{
	if (pc->sz >= Max)
	{
		printf("数据已经添加满\n");
	}
	else
	{
		printf("请输入姓名\n");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入住址\n");
		scanf("%s", pc->data[pc->sz].addr);
		pc->sz++;//添加完之后统计的人数要加1
		printf("添加成功\n");
	}
}
void Show(contact* pc)
{
	int i = 0;
	printf("%-10s %-4s %-5s %-12s %-30s\n",
		"姓名", "年龄", "性别", "电话", "住址");//打印一个标题

	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s %-4d %-5s %-12s %-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}
int Find_name(contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(name, pc->data[i].name))
		{
			return i;//这里是相同的情况就返回下标
		}
	}
	//若找不到就返回-1
	return -1;

}
void Del(contact* pc)
{
	char Name[20];
	printf("请输入你要删除的人的姓名\n");
	scanf("%s", Name);
	//删除之前我们要先查找该名字,所以我们先写Find_name来查找该名字
	//找到了后返回下标
	if (-1 == Find_name(pc, Name))
	{
		printf("没有找到该联系人\n");
	}
	else//将删除元素后面的值往前覆盖
	{
		int i = 0;
		for (i = Find_name(pc, Name); i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
	}
}
void Search(contact* pc)
{
	char Name[20];
	printf("请输入你要查找的人\n");
	scanf("%s", Name);
	if (Find_name(pc, Name) >= 0)
	{
		int ret = Find_name(pc, Name);
		printf("找到了\n");
		printf("%-10s %-4s %-5s %-12s %-30s\n",
			"姓名", "年龄", "性别", "电话", "住址");
		printf("%-10s %-4d %-5s %-12s %-30s\n",
			pc->data[ret].name,
			pc->data[ret].age,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].addr);
	}
	else
	{
		printf("没有找到\n");
	}
}
void Modify(contact* pc)
{
	char Name[20];
	printf("请输入你要修改的人\n");
	scanf("%s", Name);
	int pos = Find_name(pc, Name);
	printf("请输入姓名\n");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄\n");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别\n");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话\n");
	scanf("%s", pc->data[pos].tele);
	printf("请输入住址\n");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功\n");
}
void cmp_name(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->name , ((PeoInfo*)p2)->name);
}
void Sort(contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);//这里我们按照姓名的首字母排序
}

test.c测试文件

#include"contact.h"
void menu()
{
	printf("\n********1.Add      2.Del********\n");
	printf("********3.Search   4.Modify*****\n");
	printf("********5.Show     6.sort*******\n");
	printf("********      0.Exit     *******\n");
	//打印菜单
}
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};//使用枚举使代码的可读性更高

int main()
{
	int input = 0;
	contact con;
	InitContact(&con);
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case EXIT:
			break;
		case ADD:
			Add(&con);
			break;
		case DEL:
			Del(&con);
			break;
		case SEARCH:
			Search(&con);
			break;
		case MODIFY:
			Modify(&con);
			break;
		case SHOW:
			Show(&con);
			break;
		case SORT:
			Sort(&con);
			break;

		}

	} while (input);
}

以上就是全部内容,谢谢观看!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sugar_goat

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

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

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

打赏作者

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

抵扣说明:

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

余额充值