【C语言】通讯录的简易实现-CSDN博客

217 阅读5分钟

通讯录的简易实现


对于一个通讯录 我们需要它实现以下功能
1.增加联系人
2.删除联系人
3.查找联系人
4.修改联系人
5.对联系人进行排序

接下来我们就根据这个要求来完成一个简易版的通讯录

分文件处理

文件介绍

Contact.h 保存项目所有的头文件和函数的声明
Contact.h 项目所有函数的实现
test.c 项目运行的逻辑

目录

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");
}//打印一个简易的目录

test.c

我们要储存的联系人应该包含姓名 电话 性别 地址 年龄这些内容
创建结构体变量储存这些内容

#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12


typedef struct PeoInfo//储存人的信息
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;


typedef struct contact//将人的信息和通讯录中的人数再创建一个结构体类型
{
	PeoInfo data[MAX];
	int sz;//通讯录中人的个数
}contact;

接下来就实现基本逻辑

int main()
{
	int input = 0;
	contact con;创建结构体变量contact储存信息
	InitContact(&con);
	do
	{
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		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;
		case 0:
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);//当input=0跳出循环 程序终止
	return 0;
}

现在基本逻辑已经实现
我们就需要实现其中出现的函数

Contact.c

这个文件中保存了函数的实现

AddContact - 增加联系人

void AddContact(contact* pc)
{
	assert(pc);//断言指针的有效性
	if (pc->sz == MAX)//如果通讯录超过最大人数 函数终止
	{
		printf("通讯录已满,添加失败\n");
		return;
	}
	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].addr);
	printf("增加人的电话\n");
	scanf("%s", pc->data[pc->sz].tele);

	pc->sz++;//每录入一个 通讯录人数+1;
}

DelContact - 删除联系人


int SearchByName(contact* pc, char* name)//通过名字在数组中查找到下标的函数
//因为这个功能在程序中多次使用 所以单独封装成一个函数
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		int ret = strcmp(name, pc->data[i].name);
		if (ret == 0)
		{
			return i;//如果找到返回下标
		}
	}
	return -1;//如果找不到 返回-1
}

void DelContact(contact* pc)
{
	if (pc->sz == 0)//如果通讯录为空 函数终止
	{
		printf("通讯录为空\n");
		return;
	}
	printf("输入要删除人的名字\n");
	char name[NAME_MAX];
	scanf("%s", name);
	int i = 0;
	int ret = SearchByName(pc, name);
	if (ret == -1)
	{
		printf("找不到\n");
		return;
	}
	for (i = ret; i < pc->sz - 1; i++)//将后一个元素覆盖前一个元素 达到删除的目的
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

SearchContact - 查找联系人

int SearchByName(contact* pc, char* name)//通过名字在数组中查找到下标的函数
//因为这个功能在程序中多次使用 所以单独封装成一个函数
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		int ret = strcmp(name, pc->data[i].name);
		if (ret == 0)
		{
			return i;//如果找到返回下标
		}
	}
	return -1;//如果找不到 返回-1
}
void SearchContact(contact* pc)
{
	assert(pc);
	printf("输入要查找的人:>");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = SearchByName(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
		return;
	}
	printf("%-20s\t%s\t%-5s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%d\t%-5s\t%-10s\t%-10s\n", pc->data[ret].name,//格式化打印
		pc->data[ret].age,
		pc->data[ret].sex,
		pc->data[ret].addr,
		pc->data[ret].tele);
}

ModifyContact - 修改联系人

int SearchByName(contact* pc, char* name)//通过名字在数组中查找到下标的函数
//因为这个功能在程序中多次使用 所以单独封装成一个函数
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		int ret = strcmp(name, pc->data[i].name);
		if (ret == 0)
		{
			return i;//如果找到返回下标
		}
	}
	return -1;//如果找不到 返回-1
}
void ModifyContact(contact* pc)
{
	assert(pc);
	printf("输入需要修改的人的姓名\n");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = SearchByName(pc, name);//查找到要修改的元素下标
	if (ret == -1)
	{
		printf("查无此人\n");
	}
	printf("修改人的名字\n");
	scanf("%s", pc->data[ret].name);
	printf("修改人的年龄\n");
	scanf("%d", &pc->data[ret].age);
	printf("修改人的性别\n");
	scanf("%s", pc->data[ret].sex);
	printf("修改人的地址\n");
	scanf("%s", pc->data[ret].addr);
	printf("修改人的电话\n");
	scanf("%s", pc->data[ret].tele);
}

ShowContact - 打印出所有的联系人

void ShowContact(contact* pc)
{
	int i = 0;
	printf("%-20s\t%s\t%-5s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "地址", "电话");
	for (i = 0; i < pc->sz; i++)//遍历数组打印
	{
		printf("%-20s\t%d\t%-5s\t%-10s\t%-10s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].tele);
	}
}

SortContact - 通过名字排序

void SortContact(contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	int i = 0;
	int j = 0;
	for (i = 0; i < pc->sz - 1; i++)//冒泡排序的方法
	{
		for (j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				PeoInfo temp = pc->data[j + 1];
				pc->data[j + 1] = pc->data[j];
				pc->data[j] = temp;
			}
		}
	}
}

Contact.h

这个头文件包含所有函数的声明和库函数

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12


typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;


typedef struct contact
{
	PeoInfo data[MAX];
	int sz;
}contact;
//打印菜单
void menu();



//初始化
void InitContact(contact* pc);

//增加
void AddContact(contact* pc);

//展示通讯录
void ShowContact(contact* pc);

//删除
void DelContact(contact* pc);

//查找
void SearchContact(contact* pc);

//修改
void ModifyContact(contact* pc);

//排序by name
void SortContact(contact* pc);

到此一个简易版的通讯录就实现成功了