实现通讯录

1.联系人信息:姓名、性别、年龄、电话、地址

2.通讯录功能列表:

(0).清空通讯录

(1)添加联系人信息

(2)删除指定联系人信息

(3)查找指定联系人信息

(4)修改指定联系人信息

(5)按照名字排序所有联系人信息

(6)显示所有联系人信息

(7)清空所有联系人信息

3.实现通讯录

(1)头文件contact.h(声明函数)

#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

//信息容量
#define MAX 1000
//名字
#define NAME_MAX 20
//性别
#define SEX_MAX 5
//电话
#define TELE_MAX 12
//地址
#define ADDR_MAX 30

//初始化前能够存放的数据空间个数
#define  DEEAULT_MAX 3

//每次开辟增加n个数据空间个数
#define SZ_MAX 2

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结构体类型的数组
//	peoinfo data[MAX];
//  记录当前通讯录中有效信息的个数
//	int count;
//};

//动态版
typedef struct contact
{
	//指向动态申请的空间,用来存放联系人的信息
	Peoinfo* data;
	//记录当前通讯录中有效信息的个数
	int count;
	//记录当前通讯录的最大容量
	int capacity;
}contact;

enum option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT,
	INIT
};

//声明控制间距
void distance();

//声明初始化通讯录
void INITcontact(contact* pc);

//声明增加信息
void ADDcontact(contact* pc);

//声明删除指定联系人
void DELcontact(contact* pc);

//声明查找指定人名字
int FINDBYname(const contact* pc, const char name[]);

//声明查找指定人的信息
void SEARCHcontact(const contact* pc);

//声明打印所有通讯录信息
void PRINTcontact(const contact* pc);

//声明修改指定人的信息
void MODIFYcontact(contact* pc);

//实现按照名字排序通讯录的信息
void SORTcontact(const contact* pc);

//销毁通讯录
void DESTORYcontact(contact* pc);

//保存通讯录
void SAVEcontact(const contact* pc);

(2)源文件contact.c(实现函数)

#include"contact.h"
//实现控制间距
void distance()
{
	printf("\n\n\n");
}

//实现增加信息(静态版)
//void ADDcontact(contact *pc)
//{
//	assert(pc);
//	if (pc->count == MAX)
//	{
//		printf("通讯录已满,添加失败\n");
//		return;
//	}
//	printf("请输入联系人的名字:");
//	scanf("%s", pc->data[pc->count].name);
//	printf("请输入年龄:");
//	scanf("%d", &(pc->data[pc->count].age));
//	printf("请输入性别:");
//	scanf("%s", pc->data[pc->count].sex);
//	printf("请输入电话:");
//	scanf("%s", pc->data[pc->count].tele);
//	printf("请输入地址:");
//	scanf("%s", pc->data[pc->count].addr);
//	pc->count++;
//	printf("添加成功\n");
//	distance();
//}
//增容
void LINcontact(contact* pc)
{
	assert(pc);
	if (pc->count == pc->capacity)
	{
		Peoinfo* ptr = realloc(pc->data, (pc->capacity + SZ_MAX) * sizeof(Peoinfo));
		if (!ptr)
		{
			perror("ADDcontact");
			printf("增容失败\n");
			return;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += SZ_MAX;
			printf("增容成功\n");
		}
	}
}
//实现增加信息(动态版)
void ADDcontact(contact* pc)
{
	assert(pc);
	//空间已满,考虑增容
	LINcontact(pc);
	printf("请输入联系人的名字:");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->count].age));
	printf("请输入性别:");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->count].addr);
	pc->count++;
	printf("添加成功\n");
	distance();
}
//实现初始化通讯录(静态版)
//void INITcontact(contact *pc)
//{
//	assert(pc);
//	memset(pc->data,0,sizeof(pc->data));
//	pc->count = 0;
//}
//实现初始化通讯录(动态版)
//void INITcontact(contact* pc)
//{
//	assert(pc);
//	pc->data = (Peoinfo*)malloc(DEEAULT_MAX * sizeof(Peoinfo));
//	if (!(pc->data))
//	{
//		perror("Initcotact");
//		return;
//	}
//	pc->count = 0;
//	pc->capacity = DEEAULT_MAX;
//}
void LOADcontact(contact* pc)
{
	assert(pc);
	//打开文件
	FILE* pf = fopen("contact.lin", "rb");
	if (!pf)
	{
		perror("LOADcontact");
		return;
	}
	//读取文件
	Peoinfo tmp = { 0 };
	while (fread(&tmp, sizeof(Peoinfo),1,  pf))
	{
		LINcontact(pc);
		pc->data[pc->count++] = tmp;
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}
//初始化通讯录(文件版)
void INITcontact(contact* pc)
{
	assert(pc);
	pc->data = (Peoinfo*)malloc(DEEAULT_MAX * sizeof(Peoinfo));
	if (!(pc->data))
	{
		perror("Initcotact");
		return;
	}
	pc->count = 0;
	pc->capacity = DEEAULT_MAX;
	memset(pc->data, 0, pc->capacity*sizeof(pc->data));
	//信息存放至文件中
	LOADcontact(pc);
}

//实现打印所有通讯录信息
void PRINTcontact(const contact* pc)
{
	assert(pc);
	printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (int i = 0; i < pc->count; i++)
	{
		printf("%-20s %-20d %-20s %-20s %-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}
//实现查找指定名字
int FINDBYname(const contact* pc,const char name[])
{
	assert(pc);
	for (int i = 0; i < pc ->count; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//实现删除指定联系人
void DELcontact(contact* pc)
{
	assert(pc);
	if (pc->count == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入删除人的名字:");
	scanf("%s", name);
	//查找名字
	int pos=FINDBYname(pc, name);
	if (pos == -1)
	{
		printf("要删除的信息不存在\n");
		return;
	}
	else
	{
		for (int j = pos; j < pc->count-1 ; j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->count--;
		printf("删除成功");
	}
}

//实现查找指定人的信息
void SEARCHcontact(const contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入查找人的名字:");
	scanf("%s", name);
	distance();
	//查找名字
	int pos = FINDBYname(pc, name);
	if (pos == -1)
	{
		printf("要查找的信息不存在\n");
		return;
	}
	printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s %-20d %-20s %-20s %-20s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}

//实现修改指定人的信息
void MODIFYcontact(contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入修改人的名字:");
	scanf("%s", name);
	distance();
	//查找名字
	int pos = FINDBYname(pc, name);
	if (pos == -1)
	{
		printf("要修改的信息不存在\n");
		return;
	}
	printf("请输入联系人的名字:");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别:");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功\n");
	distance();
}

//实现按照名字排序通讯录的信息
void SORTcontact(const contact* pc)
{
	assert(pc);
	if (pc->count ==0)
	{
		printf("通讯录中没有联系人,排序失败\n");
		return;
	}
	for (int i = 0; i < pc->count-1; i++)
	{
		for (int j = 0; j < pc->count - 1; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name)>0)
			{
				Peoinfo tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}

//销毁通讯录
void DESTORYcontact(contact* pc)
{
	assert(pc);
	free(pc->data);
	pc->data = NULL;
	pc->count = 0;
	pc->capacity = 0;
}

//保存通讯录信息
void SAVEcontact(const contact* pc)
{
	FILE*pf=fopen("contact.lin", "wb");
	if (!pf)
	{
		perror("SAVEcontact");
		return;
	}
	for (int i = 0; i < pc->count; i++)
	{
		fwrite(pc->data + i, sizeof(Peoinfo), 1, pf);
	}
	fclose(pf);
}

(3)源文件lin.c(主函数)

#include"contact.h"
void menu()
{
	//控制间距
	distance();
	printf("          0.exit       1.add\n");
	printf("          2.del        3.search\n");
	printf("          4.modify     5.sort\n");
	printf("          6.print      7.init\n");

	//控制间距
	distance();
}
void test()
{
	int input = 0;
	//创建通讯录
	contact con;
	//初始化通讯录
	INITcontact(&con);
	do
	{
		menu();
		printf("请输入选项:");
		scanf("%d", &input);
		//控制间距
		distance();
		switch (input)
		{
			case EXIT:
				//保存信息至文件中
				SAVEcontact(&con);
				//销毁通讯录
				DESTORYcontact(&con);
				printf("退出通讯录");
				//控制间距
				distance();
				break;
			case ADD:
				//添加信息
				ADDcontact(&con);
				break;
			case DEL:
				//删除指定联系人
				DELcontact(&con);
				break;
			case SEARCH:
				//查找指定人的信息
				SEARCHcontact(&con);
				break;
			case MODIFY:
				//修改指定人的信息
				MODIFYcontact(&con);
				break;
			case SORT:
				//按照名字排序通讯录的信息
				SORTcontact(&con);
				break;
			case PRINT:
				//打印所有通讯录信息函数
				PRINTcontact(&con);
				break;
			case INIT:
				INITcontact(&con);
				printf("清空成功");
				break;
			default:
				printf("选择无效,请重新选择\n");
				break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值