C语言静态通讯录实现

1.通讯录主逻辑

1.1框架思路

1.我们定义一个结构体用来存放联系人信息,再定义一个结构体用来存放联系人信息(结构体嵌套)和记录通讯录大小
2.再来打印一个菜单,让用户选择功能,用do while循环实现主逻辑保证可以反复操作
3.功能包括:初始化通讯录,添加联系人,展示通讯录,删除联系人,查找联系人,修改联系人,排序联系人,我们将其一一实现,并加入清屏效果使用户使用时更美观
4.采用多文件实现,分别是头文件contact.h用来存放函数声明和库函数,test.c用来编写通讯录主逻辑,contact.c用来编写是实现整个通讯录的函数

1.2通讯录功能代码实现

1.2.1创建通讯录

定义一个结构体用来存放联系人信息,再定义一个结构体用来存放联系人信息(结构体嵌套)和记录通讯录大小

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

//联系人信息
struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	int age;
	char addr[MAX_ADDR];
};

//创建通讯录
struct Contact
{
	//联系人信息
	struct PeoInfo data[MAX];
	//记录通讯录大小
	int sz;
};

1.2.2初始化通讯录

对整体通讯录实现初始化以及对通讯录中每个人的信息进行初始化

//初始化通讯录
void InitContact(struct Contact* pc)
{
	assert(pc);
	//全部初始化为0
	pc->sz = 0;
	memset(pc->data, 0, MAX * sizeof(struct PeoInfo));
}

1.2.3创建菜单

打印菜单让用户进行功能选择,使用枚举来定义方便我们函数编写

//打印菜单
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");
}

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};

1.2.4添加联系人

将联系人的信息添加到通讯录中,同时通讯录大小加一

//添加联系人
void AddContact(struct Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加数据\n");
		return;
	}
	//输入联系人信息
	//姓名、性别、电话、年龄、家庭住址
	printf("请输入姓名:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	//通讯录大小+1
	pc->sz++;
	printf("成功添加联系人\n");
	Sleep(800);
}

1.2.5展示通讯录

将通讯录中的信息打印展示出来

//展示通讯录
void ShowContact(const struct Contact* pc)
{
	int i = 0;
	printf("%-15s\t%-5s\t%-12s\t%-5s\t%-20s\n", "姓名","性别","电话","年龄","地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-15s\t%-5s\t%-12s\t%-5d\t%-20s\n",pc->data[i].name,
		    pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].age,
			pc->data[i].addr);
	}
	Sleep(2000);
}

1.2.6遍历查找联系人

为了实现删除和查找联系人的功能,我们需要写一个遍历通讯录的函数(通过姓名)

//遍历查找
static int FindByName(const struct Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

1.2.7删除联系人

输入名字遍历查找到指定联系人,存在的话就从此人开始让后面的联系人信息依次向前覆盖一个,同时通讯录大小减一

//删除联系人
void DelContact(struct Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入要删除的联系人的姓名:>");
	scanf("%s", name);
	//检查指定的联系人是否存在
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("要删除的联系人不存在\n");
	}
	else
	{
		//删除
		int j = 0;
		for (j = ret; j < pc->sz-1; j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		//通讯录大小-1
		pc->sz--;
		printf("成功删除指定联系人\n");
	}
	Sleep(800);
}

1.2.8查找联系人

输入名字遍历查找到指定联系人,存在的话将其信息打印出来

//查找联系人
void SearchContact(const struct Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入要查找的联系人的姓名:>");
	scanf("%s", name);
	//检查指定联系人是否存在
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("要查找的联系人不存在\n");
	}
	else
	{
		printf("%-15s\t%-5s\t%-12s\t%-5s\t%-20s\n", "姓名", "性别", "电话", "年龄", "地址");
		printf("%-15s\t%-5s\t%-12s\t%-5d\t%-20s\n", pc->data[ret].name,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].age,
			pc->data[ret].addr);
	}
	Sleep(2000);
}

1.2.9修改联系人

通过名字遍历查找到指定联系人,存在的话就将其信息重新输入一遍对原信息进行覆盖

//修改联系人
void ModifyContact(struct Contact* pc)
{
	printf("请输入要修改的联系人的姓名:>");
	char name[MAX_NAME];
	scanf("%s", name);
	//检查指定联系人是否存在
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("要修改的联系人不存在\n");
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s", pc->data[ret].name);
		printf("请输入性别:>");
		scanf("%s", pc->data[ret].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[ret].tele);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[ret].age));
		printf("请输入地址:>");
		scanf("%s", pc->data[ret].addr);
		printf("成功修改联系人\n");
	}
	Sleep(800);
}

1.2.10排序联系人

我们可以使用qsort库函数来对联系人进行按名字或者按年龄的排序

int CmpByAge(const void* e1, const void* e2)
{
	return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;
}
//排序联系人
void SortContact(struct Contact* pc)
{
	//按照年龄排序
	qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByAge);
	printf("成功按年龄排序联系人\n");
	Sleep(800);
}

//int CmpByName(const void* e1, const void* e2)
//{
//	return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);
//}
排序联系人
//void SortContact(struct Contact* pc)
//{
//	//按姓名排序
//	qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName);
//	printf("成功按姓名排序联系人\n");
//}

好了到这儿通讯录所有的内容就介绍完毕了,下面奉上源代码

2.通讯录整体代码

2.1 contact.h函数声明和库函数

#pragma once
//包含头文件,函数声明,变量定义
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<Windows.h>

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

//联系人信息
struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	int age;
	char addr[MAX_ADDR];
};

//创建通讯录
struct Contact
{
	//联系人信息
	struct PeoInfo data[MAX];
	//记录通讯录大小
	int sz;
};

//初始化通讯录
void InitContact(struct Contact* pc);

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

//展示通讯录
void ShowContact(const struct Contact* pc);

//删除联系人
void DelContact(struct Contact* pc);

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

//修改联系人
void ModifyContact(struct Contact* pc);

//排序联系人
void SortContact(struct Contact* pc);

2.2 test.c通讯录主逻辑

#define _CRT_SECURE_NO_WARNINGS
#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");
}

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};

int main()
{
	int input = 0;
	//创建通讯录
	struct Contact con;//通讯录
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			//添加联系人
			AddContact(&con);
			system("cls");
			break;
		case DEL:
			//删除联系人
			DelContact(&con);
			system("cls");
			break;
		case SEARCH:
			//查找联系人
			SearchContact(&con);
			system("cls");
			break;
		case MODIFY:
			//修改联系人信息
			ModifyContact(&con);
			system("cls");
			break;
		case SHOW:
			//展示通讯录
			ShowContact(&con);
			system("cls");
			break;
		case SORT:
			//排序联系人
			SortContact(&con);
			system("cls");
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入:>\n");
			break;
		}
	} while (input);
	system("pause");
	return 0;
}

2.3 contact.c通讯录函数实现

#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
//初始化通讯录
void InitContact(struct Contact* pc)
{
	assert(pc);
	//全部初始化为0
	pc->sz = 0;
	memset(pc->data, 0, MAX * sizeof(struct PeoInfo));
}

//添加联系人
void AddContact(struct Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加数据\n");
		return;
	}
	//输入联系人信息
	//姓名、性别、电话、年龄、家庭住址
	printf("请输入姓名:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	//通讯录大小+1
	pc->sz++;
	printf("成功添加联系人\n");
	Sleep(800);
}

//展示通讯录
void ShowContact(const struct Contact* pc)
{
	int i = 0;
	printf("%-15s\t%-5s\t%-12s\t%-5s\t%-20s\n", "姓名","性别","电话","年龄","地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-15s\t%-5s\t%-12s\t%-5d\t%-20s\n",pc->data[i].name,
		    pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].age,
			pc->data[i].addr);
	}
	Sleep(2000);
}

//遍历查找
static int FindByName(const struct Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

//删除联系人
void DelContact(struct Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入要删除的联系人的姓名:>");
	scanf("%s", name);
	//检查指定的联系人是否存在
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("要删除的联系人不存在\n");
	}
	else
	{
		//删除
		int j = 0;
		for (j = ret; j < pc->sz-1; j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		//通讯录大小-1
		pc->sz--;
		printf("成功删除指定联系人\n");
	}
	Sleep(800);
}

//查找联系人
void SearchContact(const struct Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入要查找的联系人的姓名:>");
	scanf("%s", name);
	//检查指定联系人是否存在
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("要查找的联系人不存在\n");
	}
	else
	{
		printf("%-15s\t%-5s\t%-12s\t%-5s\t%-20s\n", "姓名", "性别", "电话", "年龄", "地址");
		printf("%-15s\t%-5s\t%-12s\t%-5d\t%-20s\n", pc->data[ret].name,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].age,
			pc->data[ret].addr);
	}
	Sleep(2000);
}

//修改联系人
void ModifyContact(struct Contact* pc)
{
	printf("请输入要修改的联系人的姓名:>");
	char name[MAX_NAME];
	scanf("%s", name);
	//检查指定联系人是否存在
	int ret = FindByName(pc, name);
	if (-1 == ret)
	{
		printf("要修改的联系人不存在\n");
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s", pc->data[ret].name);
		printf("请输入性别:>");
		scanf("%s", pc->data[ret].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[ret].tele);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[ret].age));
		printf("请输入地址:>");
		scanf("%s", pc->data[ret].addr);
		printf("成功修改联系人\n");
	}
	Sleep(800);
}

int CmpByAge(const void* e1, const void* e2)
{
	return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;
}
//排序联系人
void SortContact(struct Contact* pc)
{
	//按照年龄排序
	qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByAge);
	printf("成功按年龄排序联系人\n");
	Sleep(800);
}

//int CmpByName(const void* e1, const void* e2)
//{
//	return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);
//}
排序联系人
//void SortContact(struct Contact* pc)
//{
//	//按姓名排序
//	qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName);
//	printf("成功按姓名排序联系人\n");
//}

好了以上就是静态通讯录的实现过程了,对友友们有帮助的话不妨来个三连加关注支持一下,后期会持续更新C语言干货!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

茉莉蜜茶v

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

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

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

打赏作者

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

抵扣说明:

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

余额充值