C语言实现简单通讯录


实现一个通讯录


通讯录中保存人的信息:
名字
年龄
性别
电话
住址

1.通讯录可以存放100个人的信息
2.增加联系人
3.删除指定联系人
4.修改指定联系人
5.查找指定联系人
6.显示所有联系人的信息
7.排序功能

test.c测试通讯录
contact.h函数和类型的声明
contact.c函数的实现

首先呢,我们需要写一个人的信息的结构体,之后一个通讯录不就是一个人信息的数组嘛,但是我们还是要记住通讯录中有几个人方便一些,所以再在数组的下面加上目前联系人的个数。

//个人的基本信息
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;

我们这里用了typedef,让结构体的名字更加简单一些。
之后呢,我们是不是要初始化结构体,把里边的数据都初始化为0,可以用memset,也可以用循环,就可以这样实现。

void InitContact(Contact* pc) {
	//memset(pc->data, 0, sizeof(pc->data));
	for (int i = 0; i < 100; i++) {
		pc->data[i] = (PeoInfo){ 0 };
	}
	pc->sz = 0;
}

如果内存函数又不熟悉的可以看我的这篇博客
链接: 内存函数的介绍

这样之后我们就可以实现通讯录的基本功能了,
增加联系人:

void AddContact(Contact* pc) {
	if (pc->sz == MAX) {
		printf("表满,无法增加\n");
		return;
	}
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;
	printf("成功增加联系人\n");
}

这个需要注意的是需要提前判断通讯录是否为满,如果添加成功的话,通讯录中人的个数要增加。

删除联系人:

void DelContact(Contact* pc)
{
	if (pc->sz == 0) {
		printf("通讯录为空,无法删除\n");
		return;
	}
	char name1[MAX_NAME] = { 0 };
	printf("请输入要删除人的名字:");
	scanf("%s", name1);
	int pos = Findbyname(pc, name1);
	if (pos == -1)
	{
		printf("查找的人不存在\n");
		return;
	}
	for (int i = pos; i < pc->sz - 1; i++) {
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人\n");
}

这个需要注意通讯录是否为空,并且按照名字查找到话要看看能不能找到对应联系人。其实查找这个功能我们可以另写一个函数,因为不只是删除功能需要查找,包括我们后边的查找功能,只不过这里还需要打印,所以是不同的。

查找函数如下:

int Findbyname(const Contact* pc, char name[]) {
	for (int i = 0; i < pc->sz; i++) {
		if ((strcmp(pc->data[i].name, name)) == 0) {
			return i;
		}
	}
	return -1;
}

并且我们这个函数只需要写在contact.c文件中就可以了,不需要在contact.h文件中声明,因为我们这个函数是内部使用。

显示所有联系人信息:

void ShowContact(const Contact* pc)
{//打印列标题
	printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "住址");
	//打印数据
	for (int i = 0; i < pc->sz; i++) {
		printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

查找联系人:

void SearchContact(const Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找的人的名字:>");
	scanf("%s", name);
	int pos = Findbyname(pc, name);
	if (pos == -1) {
		printf("查找的人不存在\n");
	}
	else {
		printf("查找成功\n");
		printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "住址");
		printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
	}
}

修改联系人:

void ModifyContact(Contact* pc) {
	char name1[MAX_NAME] = { 0 };
	printf("请输入要修改人的名字:");
	scanf("%s", name1);
	int pos = Findbyname(pc, name1);
	if (pos == -1)
	{
		printf("修改的人不存在\n");
	}
	else {
		printf("请输入名字:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入地址:>");
		scanf("%s", pc->data[pos].addr);
		printf("请输入电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("修改成功\n");
	}
}

对联系人进行排序:

int cmp_by_name(const void* e1, const void* e2) {
	return 	strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
int cmp_by_age(const void* e1, const void* e2) {
	return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}

void SortContact(Contact* pc) {
	int tmp = 0;
	do {
		printf("根据名字排序请按1,根据年龄排序请按2\n");
		scanf("%d", &tmp);
		switch (tmp) {
		case 1:
			qsort(pc, pc->sz, sizeof(PeoInfo), cmp_by_name);
			printf("排序成功\n");
			break;
		case 2:
			qsort(pc, pc->sz, sizeof(PeoInfo), cmp_by_age);
			printf("排序成功\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
		if (tmp == 1 || tmp == 2)
			break;
	} while (tmp);
	
}

排序的话我就举了两种例子,按名字和按年龄,我们用的是qsort 函数,还需要另外写两个比较函数来支持qsort函数的使用。

qsort函数有不熟悉的可以看我的这篇博客
链接: qsort函数

最后是所有函数的呈现
contact.h

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
enum OPTION {
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};


//个人的基本信息
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 AddContact(Contact* pc);
//显示所有联系人信息
void ShowContact(const Contact* pc);
//删除指定联系人
void DelContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//对联系人进行排序
void SortContact(Contact* pc);

contact.c

#include"contact.h"

int Findbyname(const Contact* pc, char name[]) {
	for (int i = 0; i < pc->sz; i++) {
		if ((strcmp(pc->data[i].name, name)) == 0) {
			return i;
		}
	}
	return -1;
}



void InitContact(Contact* pc) {
	//memset(pc->data, 0, sizeof(pc->data));
	for (int i = 0; i < 100; i++) {
		pc->data[i] = (PeoInfo){ 0 };
	}
	pc->sz = 0;
}

void AddContact(Contact* pc) {
	if (pc->sz == MAX) {
		printf("表满,无法增加\n");
		return;
	}
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;
	printf("成功增加联系人\n");
}

void ShowContact(const Contact* pc)
{//打印列标题
	printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "住址");
	//打印数据
	for (int i = 0; i < pc->sz; i++) {
		printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

void DelContact(Contact* pc)
{
	if (pc->sz == 0) {
		printf("通讯录为空,无法删除\n");
		return;
	}
	char name1[MAX_NAME] = { 0 };
	printf("请输入要删除人的名字:");
	scanf("%s", name1);
	int pos = Findbyname(pc, name1);
	if (pos == -1)
	{
		printf("查找的人不存在\n");
		return;
	}
	for (int i = pos; i < pc->sz - 1; i++) {
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人\n");
}


void SearchContact(const Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找的人的名字:>");
	scanf("%s", name);
	int pos = Findbyname(pc, name);
	if (pos == -1) {
		printf("查找的人不存在\n");
	}
	else {
		printf("查找成功\n");
		printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "住址");
		printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
	}
}


void ModifyContact(Contact* pc) {
	char name1[MAX_NAME] = { 0 };
	printf("请输入要修改人的名字:");
	scanf("%s", name1);
	int pos = Findbyname(pc, name1);
	if (pos == -1)
	{
		printf("修改的人不存在\n");
	}
	else {
		printf("请输入名字:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入地址:>");
		scanf("%s", pc->data[pos].addr);
		printf("请输入电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("修改成功\n");
	}
}
int cmp_by_name(const void* e1, const void* e2) {
	return 	strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
int cmp_by_age(const void* e1, const void* e2) {
	return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}

void SortContact(Contact* pc) {
	int tmp = 0;
	do {
		printf("根据名字排序请按1,根据年龄排序请按2\n");
		scanf("%d", &tmp);
		switch (tmp) {
		case 1:
			qsort(pc, pc->sz, sizeof(PeoInfo), cmp_by_name);
			printf("排序成功\n");
			break;
		case 2:
			qsort(pc, pc->sz, sizeof(PeoInfo), cmp_by_age);
			printf("排序成功\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
		if (tmp == 1 || tmp == 2)
			break;
	} while (tmp);
	
}

test.c

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

}
void test() {
	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);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
}
int main() {
	test();
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值