结构体应用---通讯录管理系统(C语言实现)

本文介绍了如何使用C语言的结构体知识实现一个简单的通讯录管理系统,包括创建通讯录、增加、删除、修改、查找联系人以及排序等功能。虽然没有涉及动态内存管理,但已实现了保存1000个联系人的静态通讯录,并提供了完整代码示例。
摘要由CSDN通过智能技术生成


前言

学习完C语言的结构体之后,用结构体的相关知识来实现一个简易的通讯录管理系统,因为目前还没学习到动态内存管理,所以实现的通讯录管理系统是静态的,同时,代码也还有很多可以改进的地方。

一、通讯录功能介绍

1、通讯录应当有以下功能

(1)保存1000个联系人的信息
(2)增加联系人
(3)删除联系人
(4)修改联系人
(5)查找联系人
(6)打印联系人信息
(7)对录入的联系人进行排序

2、联系人的信息组成

(1)名字
(2)性别
(3)年龄
(4)电话
(5)住址

二、通讯录前期准备

1、打印一个菜单,选择要进行的功能操作

void menu()
{
   
	printf("             通讯录\n");
	printf("*************************************\n");
	printf("****** 1、Add     2、Del    *********\n");
	printf("****** 3、Modify  4、Search *********\n");
	printf("****** 5、Print   6、Sort   *********\n");
	printf("****** 0、Exit              *********\n");
	printf("*************************************\n");

}

2、创建通讯录

struct Peoinfo//每个人的信息
{
   
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
};

typedef struct Contact
{
   
	struct Peoinfo p[People_MAX];
	int sz;//记录存放在通讯录中的人数
}Con;

3、初始化通讯录

void InitContact(Con* pc) 
{
   
	assert(pc);
	pc->sz = 0;
	memset(pc->p,0,sizeof(pc->p));
}

三、通讯录功能的具体实现

用switch语句来实现功能的选择

printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
   
		case add:
			AddContact(&con);
			break;
		case del:
			DelContact(&con);
			break;
		case modify:
			Modify(&con);
			break;
		case search:
			Search(&con);
			break;
		case print:
			Print(&con);
			break;
		case sort:
			Sort(&con);
			break;
		case Exit:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

case 的值使用了枚举常量,这样提高了代码的可读性,所以,我创建了两个枚举变量,一个是表示选择的功能,一个是修改信息时,要修改的选项。

//通讯录功能
enum fun
{
   
	Exit,
	add,
	del,
	modify,
	search,
	print,
	sort
};

enum modifyoption//修改信息选项
{
   
	Name = 1,
	Sex,
	Age,
	Tele,
	Addr
};

1、增加联系人

void AddContact(Con* pc)
{
   
	assert(pc);
	if (pc->sz == People_MAX)
	{
   
		printf("通讯录已满,无法增加\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", pc->p[pc->sz].name);
	printf("请输入性别:");
	scanf("%s", pc->p[pc->sz].sex);
	printf("请输入年龄:");
	scanf("%d", &(pc->p[pc->sz].age));
	printf("请输入电话:");
	scanf("%s", pc->p[pc->sz].tele);
	printf("请输入住址:");
	scanf("%s", pc->p[pc->sz].addr);

	pc->sz++;
	printf("添加成功\n");
}

2、打印联系人

这里先接着实现打印的功能,也便于调试验证增加联系人的函数是否能正确实现。


void Print(const Con* pc)
{
   
	assert(pc);
	//打印
	int i = 0;
	printf("%-20s %-5s %-10s %-13s %-30s\n", "名字", "性别", "年龄", "电话", "住址");
	for (i = 0; i < pc->sz; i++)
	{
   
		printf("%-20s %-5s %-10d %-13s %-30s\n", pc->p[i].name, pc->p[i].sex, pc->p[i].age, pc->p[i].tele, pc->p[i].addr);
	}

}

3、删除联系人

void DelContact(Con* pc)
{
   
	assert(pc);
	if (pc->sz == 0)
	{
   
		printf("通讯录已空,无法删除\n");
		return;
	}
	//要删除,首先要找到删除的对象
	char name[NAME_MAX] = {
    0 };
	printf("请输入要查找的名字:");
	scanf("%s", name);
	int ret = FindByName(pc,name);//找到返回下标,找不到返回-1
	if (ret == -1)
	{
   
		printf("找不到\n");
		return;
	}
	else
	{
   
		//删除-->把后面的数据覆盖到要删除的地方
		int i = 0;
		for (i = ret; i < pc->sz-1; i++)
		{
   
			pc->p[i] = pc->p[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
		return;
	}
}

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

4、查找联系人

在删除联系人的功能模块中已经实现了查找的功能,所以可以调用对应的查找的函数

void Search(const Con* pc)
{
   
	assert(pc);
	if (pc->sz == 0)
	{
   
		printf("通讯录是空的,找不到\n");
		return;
	}
	//找
	char name[NAME_MAX] &#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值