【C语言】模拟实现通讯录管理系统(完整代码)

这里我将实现一个文件型通讯录,使得我们的通讯录能将信息保存在文件里。看起来更像一个通讯录管理系统。
主要实现的功能有以下几点:

void InitContact(Contact* pcon); //初始化通讯录
void DstoryContact(Contact* pcon); //销毁通讯录
void AddContact(Contact* pcon); //添加联系人
void ShowContact(Contact* pcon); // 查看联系人
void DelContact(Contact* pcon); //删除联系人
void SaveContact(Contact* pcon); //保存联系人
void LoaContact(Contact* pcon); //加载文件

代码主要分为三部分:Contact.h Contact.c main.c
废话不多说,完整代码奉上:

C语言完整代码:

Contact.h

#define _CRT_SECURE_NO_WARNINGS
#include`
#include
#include
#include
#ifndef __CONTACT_H__
#define __CONTACT_H__

#include
#define DEFAULT_SZ 2
#define INC_SZ 3
#define MAX 1000
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	EMPTY,
	SORT,
};
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDR_MAX 30
//定义一个结构体
typedef struct PeoInfo
{
	char Name[NAME_MAX];
	char Sex[SEX_MAX];
	short int Age;
	char Tele[TELE_MAX];
	char Addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact
{
	PeoInfo* data;
	int sz;//通讯录中有效信息的个数
	int capacity;//通讯录所能存放的最大容量
}Contact;

void InitContact(Contact* pcon);     //初始化通讯录
void DstoryContact(Contact* pcon);    //销毁通讯录
void AddContact(Contact* pcon);       //添加联系人
void ShowContact(Contact* pcon);      // 查看联系人
void DelContact(Contact* pcon);         //删除联系人
void SaveContact(Contact* pcon);        //保存联系人
void LoaContact(Contact* pcon);         //加载文件

#endif //__CONTACT_H__

Contact.c

#include"Contact.h"
void InitContact(Contact* pcon)       //初始化
{
	assert(pcon != NULL);
	pcon->sz = 0;
	pcon->capacity = DEFAULT_SZ;
	pcon->data = (PeoInfo*)malloc(pcon->capacity*sizeof(PeoInfo));
	memset(pcon->data, 0, pcon->capacity*sizeof(PeoInfo));

}
void DstoryContact(Contact* pcon)       //销毁
{
	assert(pcon != NULL);
	SaveContact(pcon);
	free(pcon->data);
	pcon->data = NULL;
	pcon->sz = 0;
	pcon->capacity = 0;
}
void LoaContact(Contact* pcon)//加载文件函数
{
	assert(pcon != NULL);
	int i = 0;
	PeoInfo temp = { 0 };
	FILE* pf = fopen("contact.dat", "rb");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return;
	}
	//读数据
	while (fread(&temp, sizeof(PeoInfo), 1, pf))
	{
		CheckCapacity(pcon);
		pcon->data[pcon->sz++] = temp;
	}
	fclose(pcon);
	pcon = NULL;
}

void SaveContact(Contact* pcon)//保存文件函数
{
	assert(pcon != NULL);
	int i = 0;
	FILE* pf = fopen("contact.dat", "wb");//创建并打开一个文件存储输入的通讯录信息
	if (pf == NULL)//判断文件是否创建成功
	{
		printf("%s\n", strerror(errno));
		return;
	}
	//向文件里写数据
	for (i = 0; i < pcon->sz; i++)
	{
		fwrite(pcon->data + i, sizeof(PeoInfo), 1, pf);
	}
	fclose(pf);
	pf = NULL;
}

int CheckCapacity(Contact* pcon)    //检查容量函数
{
	assert(pcon != NULL);
	if (pcon->capacity == pcon->sz)
	{
		//增容
		PeoInfo *ptr = (PeoInfo*)realloc(pcon->data, (pcon->capacity + INC_SZ)*sizeof(PeoInfo));
		if (ptr != NULL)
		{
			pcon->data = ptr;
			pcon->capacity += INC_SZ;
			printf("增容成功!\n");
			return 1;
		}
		else
		{
			return 0;
		}
	}
	return 1;
}

void AddContact(Contact* pcon)       //添加联系人
{
	assert(pcon != NULL);
	////增加容量函数
	if (CheckCapacity(pcon) == 0)
	{
		printf("通讯录已满,尝试增容失败,无法添加!");
		return;
	}
	else
	{
		printf("请输入名字:>");
		scanf("%s", pcon->data[pcon->sz].Name);
		printf("请输入性别:>");
		scanf("%s", pcon->data[pcon->sz].Sex);
		printf("请输入年龄:>");
		scanf("%d", &pcon->data[pcon->sz].Age);
		printf("请输入电话:>");
		scanf("%s", pcon->data[pcon->sz].Tele);
		printf("请输入地址:>");
		scanf("%s", pcon->data[pcon->sz].Addr);
	}
	pcon->sz++;
	printf("添加成功!\n");
}
void ShowContact(Contact* pcon)        //查看联系人
{
	assert(pcon != NULL);
	int i = 0;
	printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "地址");
	for (i = 0; i < pcon->sz; i++)
	{
		printf("%-15s\t%-5s\t%-5d\t%-12s\t%-20s\n",
			pcon->data[i].Name,
			pcon->data[i].Sex,
			pcon->data[i].Age,
			pcon->data[i].Tele,
			pcon->data[i].Addr
			);
	}
}
int FindEntry(Contact* pcon, char name[])      //查找联系人
{
	int i = 0;
	assert(pcon != NULL);
	for (i = 0; i < pcon->sz; i++)
	{
		if (strcmp(pcon->data[i].Name, name) == 0)
		{
			return i;//找到了
		}
	}
	return -1;//找不到
}
void DelContact(Contact* pcon)      //删除联系人
{
	assert(pcon != NULL);
	char name[NAME_MAX] = { 0 };
	int pos;
	if (pcon->sz == 0)//判断该通讯录是否为空
	{
		printf("通讯录为空,无法删除!");
	}
	else
	{
		printf("请输入要删除人的名字:>");
		scanf("%s", &name);
		pos = FindEntry(pcon, name);
		if (pos == -1)
		{
			printf("通讯录中无此人信息!\n");
		}
		else
		{
			//删除
			int i = 0;
			for (i = pos; i < pcon->sz - 1; i++)
			{
				pcon->data[i] = pcon->data[i + 1];
			}
			printf("删除成功!\n");
			pcon->sz--;
		}
	}
}

main.c

#include"Contact.h"
//菜单函数
void menu()
{
	printf("****************************************\n");
	printf("******1、add         2、del      *******\n");
	printf("******3、search      3、modify   *******\n");
	printf("******5、show        6、empty    *******\n");
	printf("******7、sort        0、exit     *******\n");
	printf("****************************************\n");
}
void test()
{
	int input = 0;
	Contact con;
	InitContact(&con);
	LoaContact(&con);
	do{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			break;
		case MODIFY:
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case EMPTY:
			break;
		case SORT:
			break;
		case EXIT:
			DstoryContact(&con);//利用free释放malloc开辟的空间
			printf("退出通讯录!\n");
			break;

		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	system("pause");
	return 0;
}

欢迎大家关注我的博客哟~

你可能感兴趣的:(完整项目)