动态+静态+文件操作 C语言实现通讯录

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

一.通讯录简介

二.分模块实现

1.添加联系人信息

1静态版本

2动态版本

(3)文件操作版本

2.删除指定联系人信息

3.查找指定联系人信息

4.修改指定联系人信息

5.显示所有联系人信息

6.清空所有联系人

1静态版本

2动态版本

7.以名字排序所有联系人

8.销毁通讯录释放

(1)非文件操作版本

(2)文件操作版本

三.菜单界面

四.头文件声明


一.通讯录简介

实现一个通讯录

通讯录可以用来存储1000个人的信息每个人的信息包括姓名、性别、年龄、电话、住址

提供方法

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

二.分模块实现

1.添加联系人信息

1静态版本

//添加联系人
void Addcontact(Contact* pc)
{
	assert(pc);
	if (pc->sz == Max)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入号码:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入住址:>");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加成功\n");
}

2动态版本

void Addcontact(Contact* pc)
{
	// 动态版本
	assert(pc);
	if (pc->sz == pc->Capacity)
	{
		PeoInfo* tmp = realloc(pc->data, (pc->Capacity + 2) * sizeof(PeoInfo));
		if (tmp != NULL)
		{
			pc->data = tmp;
		}
		else
		{
			perror("realloc:pc->data");
			return;
		}
		pc->Capacity += 2;
		printf("增容成功\n");
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入号码:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入住址:>");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加成功\n");
    }
}

(3)文件操作版本

//加载文件到通讯录中
void Loadcontact(Contact* pc)
{
	FILE* pf = fopen("contact.dat", "rb");
	if (pf == NULL)
	{
		perror("Loadcontact::fopen");
		return;
	}
	PeoInfo tmp = { 0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))
	{
		Checkcontact(pc); //增容
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}
	fclose(pf);
	pf = NULL;
}
//文件保存版本 初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	PeoInfo* tmp = (PeoInfo*)malloc(Default_Max * sizeof(PeoInfo));
	if (tmp != NULL)
	{
		pc->data = tmp;
	}
	else
	{
		perror("PeoInfo*)malloc:");
		return;
	}
	memset(pc->data, 0, Default_Max * sizeof(PeoInfo));
	pc->sz = 0;
	pc->Capacity = Default_Max;

	//加载文件信息到通讯录
	Loadcontact(pc);
}

void Addcontact(Contact* pc)
{

	Checkcontact(pc);
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入号码:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入住址:>");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加成功\n");
}

2.删除指定联系人信息

//删除联系人
void Deletecontact(Contact* pc)
{
	assert(pc);
	char name[Name_Max];
	if (pc->sz == 0)
	{
		printf("通讯录已空无法删除\n");
	}
	printf("请输入要删除联系人的名字:>");
	scanf("%s", name);
	int pos = FindByname(pc, name);
	if (pos == -1)
	{
		printf("未找到指定联系人\n");
		return;
	}
	else
	{
		int i = pos;
		for (i = pos; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
}

3.查找指定联系人信息

//查找联系人
void Searchcontact(Contact* pc)
{
	assert(pc);
	char name[Name_Max];
	printf("请输入要查找的联系人名字:>");
	scanf("%s", name);
	int pos = FindByname(pc, name);
	if (pos == -1)
	{
		printf("未找到指定联系人\n");
		return;
	}
	printf("%-20s %-5s %-5s %-12s  %-30s\n", "姓名", "性别", "年龄", "号码", "住址");
	printf("%-20s %-5s %-5d %-12s  %-30s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
}

4.修改指定联系人信息

//修改菜单
void menu1()
{
	printf("***********************\n");
	printf("****1.姓名  2.性别 ****\n");
	printf("****3.年龄  4.号码 ****\n");
	printf("****5.住址  0.返回 ****\n");
	printf("***********************\n");
}

//修改联系人
void Modifycontact(Contact* pc)
{
	assert(pc);
	char name[Name_Max];
	int input = 0;
	printf("请输入修改联系人的名字:>");
	scanf("%s", name);
	int pos = FindByname(pc, name);
	if (pos == -1)
	{
		printf("未找到指定联系人\n");
		return;
	}
	printf("%-20s %-5s %-5s %-12s  %-30s\n", "姓名", "性别", "年龄", "号码", "住址");
	printf("%-20s %-5s %-5d %-12s  %-30s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
	do
	{
		menu1();
		printf("请选择要修改的内容:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入名字:>");
			scanf("%s", pc->data[pos].name);
			printf("修改成功\n");
			break;
		case 2:
			printf("请输入性别:>");
			scanf("%s", pc->data[pos].sex);
			printf("修改成功\n");
			break;
		case 3:
			printf("请输入年龄:>");
			scanf("%d", &pc->data[pos].age);
			printf("修改成功\n");
			break;
		case 4:
			printf("请输入号码:>");
			scanf("%s", pc->data[pos].tele);
			printf("修改成功\n");
			break;
		case 5:
			printf("请输入住址:>");
			scanf("%s", pc->data[pos].addr);
			printf("修改成功\n");
			break;
		case 0:
			printf("退出修改\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

5.显示所有联系人信息

//打印通讯录
void Printcontact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	int i = 0;
	printf("%-20s %-5s %-5s %-12s  %-30s\n", "姓名", "性别", "年龄", "号码", "住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s %-5s %-5d %-12s  %-30s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
	}
}

6.清空所有联系人

1静态版本

​
//通讯录初始化
void InitContact(Contact* pc)
{
	assert(pc);
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

//清空联系人
void Emptycontact(Contact* pc, void(*p)(Contact*))
{
	InitContact(pc);
	printf("清空成功\n");
}

​

2动态版本

void InitContact(Contact* pc)
{
	assert(pc);
	PeoInfo* tmp = (PeoInfo*)malloc(Default_Max * sizeof(PeoInfo));
	if (tmp != NULL)
	{
		pc->data = tmp;
	}
	else
	{
		perror("PeoInfo*)malloc:");
		return;
	}
	memset(pc->data, 0, Default_Max * sizeof(PeoInfo));
	pc->sz = 0;
	pc->Capacity = Default_Max;
}
//清空联系人
void Emptycontact(Contact* pc, void(*p)(Contact*))
{
	InitContact(pc);
	printf("清空成功\n");
}

7.以名字排序所有联系人

//排序联系人

int cmp_name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sortcontact(Contact* pc)
{
	int sz = pc->sz;
	qsort(pc->data, sz, sizeof(pc->data[0]), cmp_name);
	printf("排序成功\n");
}

8.销毁通讯录释放

(1)非文件操作版本

void Freecontact(Contact* pc)
{
	free(pc->data);
	pc->Capacity = 0;
	pc->sz = 0;
	printf("销毁成功\n");
}

(2)文件操作版本

//保存文件
void Savecontact(Contact* pc)
{
	//打开文件
	FILE* pf = fopen("contact.dat", "wb");
	if (pf == NULL)
	{
		perror("Savecontact::contact.dat");
		return;
	}
	//写入文件
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}

void Freecontact(Contact* pc)
{
	free(pc->data);
	pc->Capacity = 0;
	pc->sz = 0;
	printf("销毁成功\n");
}

三.菜单界面

#define _CRT_SECURE_NO_WARNINGS  1
#include"contact.h"

void menu()
{
	printf("*****************************\n");
	printf("****  1.add     2.delete ****\n");
	printf("****  3.search  4.modify ****\n");
	printf("****  5.print   6.empty  ****\n");
	printf("****  7.sort    0.exit   ****\n");
	printf("*****************************\n");
}
void test()
{
	Contact Con;//通讯录
	InitContact(&Con); //初始化通讯录
	int input = 0;
	do 
	{
		input = 0;
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case add:
			Addcontact(&Con);
			break;
		case delete:
			Deletecontact(&Con);
			break;
		case search:
			Searchcontact(&Con);
			break;
		case modify:
			Modifycontact(&Con);
			break;
		case print:
			Printcontact(&Con);
			break;
		case empty:
			Emptycontact(&Con, InitContact);
			break;
		case sort:
			Sortcontact(&Con);
			break;
		case 0:
			Savecontact(&Con);
			Freecontact(&Con);
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

四.头文件声明

#define _CRT_SECURE_NO_WARNINGS  1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
//常量定义
enum Option
{
	//exit,
	add=1,
	delete,
	search,
	modify,
	print,
	empty,
	sort
};

#define Max 1000
#define Name_Max 20
#define Sex_Max 5
#define Tele_Max 12
#define Addr_Max 30
#define Default_Max 3

//类型声明

//联系人结构体
typedef struct PeoInfo
{
	char name[Name_Max];
	char sex[Sex_Max];
	int age;
	char tele[Tele_Max];
	char addr[Addr_Max];
}PeoInfo;

//动态版本
typedef struct Contact
{
	PeoInfo* data;
	int sz;
	int Capacity;
}Contact;

//静态版本
//1000个联系人 与已存个数结构体
//typedef struct Contact
//{
//	PeoInfo data[Max];
//	int sz;
//}Contact;

//函数声明

//初始化通讯录
void InitContact(Contact* pc);

//添加联系人
void Addcontact(Contact* pc);

//打印通讯录
void Printcontact(Contact* pc);

//删除联系人
void Deletecontact(Contact* pc);

//查找联系人
void Searchcontact(Contact* pc);

//修改联系人
void Modifycontact(Contact* pc);

//清空联系人
void Emptycontact(Contact* pc,void(*p)(Contact*));

//排序联系人
void Sortcontact(Contact* pc);

//销毁通讯录
void Freecontact(Contact* pc);

//保存文件
void Savecontact(Contact* pc);

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6