C语言小项目 -- 通讯录(静态版+动态版+文件版)

本文通过C语言实现了通讯录的静态、动态和文件版本,涵盖结构体设计、内存管理、文件操作等功能。静态版包括联系人增删查改等操作;动态版解决空间不足问题,支持动态增容;文件版则持久化存储联系人信息。
摘要由CSDN通过智能技术生成

文章目录

一、总体设计思路

1、设计背景

在前面的文章中我们依次学习了结构体、动态内存管理以及文件操作的相关知识,所以我们今天可以分别来编写静态版、动态版和文件版的通讯录,用于对已学知识的应用与巩固,和对我们前面学习效果的检测。

2、设计框架

与正常的项目设计一样,我们把程序封装在三个文件中:

test.c:通讯录的总体逻辑,主要用于对通讯录各功能的测试;

contact.c:通讯录各种功能的具体实现;

contact.h:各种必要的声明,包括库函数头文件的声明、自定义结构的声明以及自定义函数的声明;

3、功能概述

我们这里设计的通讯录应包含如下功能:

静态版:通讯录内部联系人的增删查改、对联系人按姓名进行排序、显示通讯录中所有联系人、清空通讯录、退出通讯录;

动态版:动态版的通讯录与静态版通讯录功能一样,但是内部实现由固定大小改为动态增容;

文件版:文件版的通讯录与动态版功能与实现方式一样,但是会在程序退出时把联系人信息保存在文件中,在程序运行时把文件中的联系人信息加载到通讯录中;


二、通讯录(静态版)

1、结构体设计

这里我们设计两个结构体:一个用于管理联系人的各种属性,比如姓名、年龄、性别、电话号码、住址;另一个结构体用于管理通讯录,它由一个联系人结构体数组加上一个记录联系人数量的变量构成;由于我们这里设计的是静态版的通讯录,所以联系人结构体数组的大小是固定的。

#define MAX 100       //联系人的最大数量
#define MAX_NAME 20   //宏定义各种联系人信息变量的大小,方便以后修改
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30

//联系人信息结构体
typedef struct PeoInfo {
	char name[MAX_NAME];  //姓名
	char sex[MAX_SEX];    //性别
	int age;			  //年龄
	char tele[MAX_TELE];  //电话
	char addr[MAX_ADDR];  //住址
}PeoInfo;   //结构体重命名

//通讯录结构体
typedef struct Contact {
	PeoInfo date[MAX];  //储存联系人信息(固定大小)
	int count;          //记录实际联系人数量
}Contact;

2、初始化通讯录

我们可以使用前面学习的 memset 函数来吧通讯录中存放联系人信息的数组的内容全部初始化为0,然后再把用于记录实际联系人数量的变量置为0,完成通讯录得初始化。

void InitContact(Contact* pc)   //初始化通讯录
{
	assert(pc);
	memset(pc->date, 0, sizeof(pc->date));  //通讯录里面的信息全部初始化为0
	pc->count = 0;
}

3、添加联系人信息

这里由于通讯录大小是固定的,所以我们在添加联系人的时候要注意检查通讯录是否已满,如果没满才能正常添加,满了就打印提示信息并直接 return。

void AddPeoInfo(Contact* pc)       //添加联系人信息
{
	assert(pc);
	if (pc->count == MAX)  //检查通讯录是否满了
	{
		printf("通讯录已满,无法添加联系人
");
		return;
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s", pc->date[pc->count].name);
		printf("请输入性别:>");
		scanf("%s", pc->date[pc->count].sex);
		printf("请输入年龄:>");
		scanf("%d", &(pc->date[pc->count].age));
		printf("请输入电话:>");
		scanf("%s", pc->date[pc->count].tele);
		printf("请输入住址:>");
		scanf("%s", pc->date[pc->count].addr);

		pc->count++;  //联系人数量++
		printf("添加联系人成功
");
	}
}

4、删除联系人信息

这里有两个需要注意的地方:一是需要检查通讯录是否为空,如果为空提示后直接返回;二是我们要检查我们希望删除的这个人是否存在,所以我们需要设计一个find函数来查找联系人,根据find函数的结果来进行后续操作。

void DeletePeoInfo(Contact* pc)          //删除联系人信息
{
	assert(pc);
	if (pc->count == 0)  //通讯录为空直接返回
	{
		printf("通讯录为空
");
		return;
	}
	else
	{
		char name[MAX_NAME];
		printf("请输入要删除的联系人的姓名:>");
		scanf("%s", &name);
		int pos = find_by_name(pc, name);  //检查通讯录中是否有该联系人
		if (pos == -1)
		{
			printf("该联系人不存在
");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值