c语言 通讯录高级版

1,通讯录中能够存放个人信息

如:名字,性别,电话,地址等。

2,修改指定人的信息;

3,删除指定人的信息;

4,查找指定人的信息;

5,增加信息;

二 什么是高级版

所谓的高级版通讯录就是增加了动态内存开辟和通讯录内容的存储;

三 现在让我们来实现通讯录

首先把宏和头文件展示出来方便读者在阅读时容易理解

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_NAME 10
#define MAX_ADD 20
#define MAX_SEX 5
#define MAX_NUM 15


#define VALUE 2
#define DOUBLE_SZ 3

考虑到通讯录的的内容很多,现在我们用结构体把它们放在一起方便操作

#define MAX_NAME 10
#define MAX_ADD 20
#define MAX_SEX 5
#define MAX_NUM 15



typedef struct PeopleInfor
{
	char name[MAX_NAME];//名字
	char add[MAX_ADD];//住址
	char sex[MAX_SEX];//性别
	char num[MAX_NUM];//电话号码
	int  age;


}PeopleInfor;

考虑到通讯录的人数我们创建如下结构体

//合集
typedef struct PeopleColl
{
	PeopleInfor* date;//每个人的信息
	int sz;//以存储的联系人数量
	int capacity;//通讯录的容量
}PeopleColl;

c语言 通讯录高级版

 下面是主函数的创建:

函数名可以根据给人的喜好来设置

int main()
{
	int a = 0;
	PeopleColl con;
	Initial(&con);//初始化
	do {
		menu();
		printf("请选择:");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			ADDITION(&con);//增加联系人
			Check(con);
			break;
		case 2:
			Delete(&con);//删除信息
			break;
		case 3:
			SEEK(&con);//查找指定人的信息
			break;
		case 4:
			Revise(&con);//修改信息
			break;
		case 5:
			Check(con);//查看通讯录
			break;
		case 0: StoreIfor(&con);
			Freed(&con);//释放通讯录
			break;
		default:
			printf("选择错误,重新输入\n");
			break;
		}
	} while (a);
	return 0;

}

让我们从上到下来依次实现函数

1.初始化

c语言 通讯录高级版初始化我们要改变结构体所以用到&;

void Initial(PeopleColl* con)
{
	
	con->date = (PeopleInfor*)calloc(DOUBLE_SZ, sizeof(PeopleInfor));
	if (con->date == NULL)
	{
		perror("Initial");
		return;
	}
	con->sz = 0;
	con->capacity = DOUBLE_SZ;
    ReadIfor(con);
}

c语言 通讯录高级版

 ReadIfor();函数单独解释

很容易理解,在打开通讯录的时候需要读取之前存储的内容


//读取信息
void ReadIfor(PeopleColl* con)
{
	FILE* ptr = fopen("AddBook.dat", "rb");
	if (ptr == NULL)
	{
		perror("ReadIfor");
		printf("读取失败\n");
		return;
	}
	else {
		PeopleInfor mat = { 0 };
		while (fread(&mat, sizeof(PeopleInfor), 1, ptr))
		{
			Congestion(con);
			con->date[con->sz] = mat;
			con->sz++;

		}
	}

}

 c语言 通讯录高级版

 

2 增加联系人

void ADDITION(PeopleColl* con)
{
	Congestion(con);

	printf("请输入姓名:\n");
	scanf("%s", con->date[con->sz].name);
	printf("请输入性别:\n");
	scanf("%s", con->date[con->sz].sex);
	printf("请输入地址:\n");
	scanf("%s", con->date[con->sz].add);
	printf("请输入号码:\n");
	scanf("%s", &(con->date[con->sz].num));
	printf("请输入年龄:\n");
	scanf("%d", &(con->date[con->sz].age));
	con->sz++;
	printf("录入成功\n");
}

 在增加联系人前,要首先考虑通讯录是否为满;所以在这里创建了Congestion();增容函数;

Congestion()的实现如下:

void Congestion(PeopleColl* con)
{
	if (con->sz == con->capacity)
	{


		PeopleInfor* p = (PeopleInfor*)realloc(con->date, (con->capacity + VALUE) * sizeof(PeopleInfor));

		if (con->date == NULL)
		{
			perror("Congestion");
			printf("增容失败\n");
			return;
		}
		else
		{
			con->date = p;
			con->capacity += VALUE;
			printf("增容成功\n");
		}

	}

}

c语言 通讯录高级版

 3 删除联系人

//删除信息
void Delete(PeopleColl* con)
{
	if (con->sz == 0) {
		printf("通讯录为空\n");
		return;
	}
	char arr[MAX_NAME] = { 0 };
	printf("请输入要删除人的名字:\n");
	scanf("%s", arr);
	int p = Seek(con, arr);
	if (p == -1) {
		printf("删除的人不存在\n");

	}
	else
	{
		int i = 0;
		for (i = p; i < con->sz - 1; i++) {
			con->date[i] = con->date[i + 1];
		}
		con->sz--;
		printf("删除成功\n");
	}


}

c语言 通讯录高级版

 

在删除联系人时,使用了一个函数Seek;该函数为查找函数,根据该函数的返回值来判断是否找到指定联系人(该函数也会在后续函数实现中使用);

int  Seek(const PeopleColl* con, char arr[MAX_NAME])
{
	int i = 0;
	for (i = 0; i < con->sz; i++)
	{
		if (strcmp(con->date[i].name, arr) == 0)
			return i;
	}
	return -1;

}

 

4 查找信息

该·函数是查找函数的拓展,增加了一个显示信息的功能


//查找指定人的信息
void SEEK(PeopleColl* con)
{

	if (con->sz == 0) {
		printf("通讯录为空\n");
		return;
	}
	char arr[MAX_NAME] = { 0 };
	printf("请输入要查找人的名字:\n");
	scanf("%s", arr);
	int p = Seek(con, arr);
	if (p == -1) {
		printf("查找的人不存在\n");

	}
	else
	{
		printf("查找人的信息为:\n");
		printf("%-10s %-10s %-20s %-20s %-10s\n", "姓名", "性别", "地址", "号码", "年龄");
		printf("%-10s %-10s %-20s %-20s %-10d\n", con->date[p].name,
			con->date[p].sex,
			con->date[p].add,
			con->date[p].num,
			con->date[p].age);
	}

}

5 修改信息

//修改信息
void Revise(PeopleColl* con)
{
	if (con->sz == 0) {
		printf("通讯录为空\n");
		return;
	}
	char arr[MAX_NAME] = { 0 };
	printf("请输入要修改人的名字:\n");
	scanf("%s", arr);
	int p = Seek(con, arr);
	if (p == -1) {
		printf("修改的人不存在\n");

	}
	else {
		printf("请输入姓名:\n");
		scanf("%s", con->date[p].name);
		printf("请输入性别:\n");
		scanf("%s", con->date[p].sex);
		printf("请输入地址:\n");
		scanf("%s", con->date[p].add);
		printf("请输入号码:\n");
		scanf("%s", &(con->date[p].num));
		printf("请输入年龄:\n");
		scanf("%d", &(con->date[p].age));
		printf("修改成功\n");

	}
}

修改信息的内容就是增加信息的缩减版

6 查看通讯录 

该函数可以添加到每个选项的后面,达到显示效果

//查看信息
void Check(PeopleColl con)
{
	if (con.sz == 0) {
		printf("请先录入信息\n");
	}

	int i = 0;
	printf("%-10s %-10s %-20s %-20s %-10s\n", "姓名", "性别", "地址", "号码", "年龄");
	for (i = 0; i < con.sz; i++)
	{
		printf("%-10s %-10s %-20s %-20s %-10d\n", con.date[i].name,
			con.date[i].sex,
			con.date[i].add,
			con.date[i].num,
			con.date[i].age);


	}
}

7 退出和存储信息

在我们退出之前要做到存储通讯录信息和销毁通讯录

//储存信息到文件
void StoreIfor(PeopleColl* con)
{
	FILE* p = fopen("AddBook.dat", "wb");
	if (p == NULL)
	{
		perror("StoreIfor");
		printf("存储失败\n");
		return;
	}
	//存储文件
	int i = 0;
	for (i = 0; i < con->sz; i++)
	{
		fwrite(con->date + i, sizeof(PeopleInfor), 1, p);

	}

	printf("存储成功\n");
	//关闭文件
	//释放指针避免内存泄露
	fclose(p);
	p = NULL;
}

c语言 通讯录高级版

 销毁通讯录

void Freed(PeopleColl* con)
{
	free(con->date);
	con->date = NULL;
	con->capacity = 0;
	con->sz = 0;
}

 

本篇文章就再次结束了,不完善的地方可以指出或者自行修改,谢谢大家;

上一篇:python连接数据库的操作


下一篇:Java课程设计