通讯录的实现

通讯录的实现,第1张

通讯录的实现

通讯录功能主要包括以下几点:

1.能够实现增、添、查、改

2.实现通讯录满的时候能够自动扩大通讯录容量

3.每次进入通讯录人员信息还存在

主要分为三个部分test.c来进行测试  contact.c进行功能实现 contact.h进行函数声明

代码如下:

test.c

#include "contact.h"
void menu()
{
	printf ("**********************************n");
	printf ("****1.增加联系人  2.删除联系人****n");
	printf ("****3.查找联系人  4.修改联系人****n");
	printf ("****5.展示联系人  6.保存联系人****n");
	printf ("*********0.退出通讯录*************n");
	printf ("**********************************n");
}

int main ()
{
	int input=0;
	struct Contact con;  //con为通讯录
	InitContact(&con);  //初始化通讯录
	do
	{
		menu();
		printf("请选择:》");
		scanf ("%d",&input);
		switch(input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MOD:
			ModifyContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SAVE:
			SaveContact(&con);
			break;
		case EXIT:
			SaveContact(&con);
			Free(&con);
			printf ("退出通信录n");
			break;
		default:
			printf("选择错误n");
			
		}

	}
	while(input);
	return 0;
}

contact.h

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#include 

#define CAPACITY 3    //暂定容量为3 加人自动扩大容量
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TALA 12
#define MAX_ADDR 30

enum Option   //枚举常量默认从0开始 
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MOD,
	SHOW,
	SAVE
};

struct PeopleInformation  //通讯录信息
{
	char name [MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tale[MAX_TALA];
	char addr[MAX_ADDR];
};

struct Contact  //通讯录包括基本信息  元素大小  容量
{
	struct PeopleInformation *date;
	int size;
	int capacity;
};

void InitContact(struct Contact* ps);  //初始化通讯录
void AddContact(struct Contact* ps);   //增添联系人
void ShowContact(const struct Contact* ps);//展示通讯录
void DelContact(struct Contact* ps);//删除联系人
void SearchContact(const struct Contact* ps);//查找联系人
void ModifyContact(struct Contact* ps);//修改联系人
void Free(struct Contact* ps);//释放动态开辟空间
void SaveContact(struct Contact* ps);//保存联系人
void LocadFile(struct Contact* ps);//加载联系人

contact.c

#include "contact.h"

//实现加载信息到通讯录
void CheckCapacity(struct Contact* ps);  //这里声明检查容量并扩容的函数 因为加载信息到通讯录需要用到
void LocadFile(struct Contact* ps)
{
	struct PeopleInformation tmp={0};
	FILE* pfRead=fopen("contact.date","rb");
	if (pfRead==NULL)
	{
		printf("%sn",strerror(errno));
		return ;
	}
	//将文件存在通讯录中
	while(fread(&tmp,sizeof(struct PeopleInformation),1,pfRead))  //一次录入一个人员
	{
		CheckCapacity(ps);
		ps->date[ps->size]=tmp;  
		ps->size++;
	}
	fclose(pfRead);
	pfRead=NULL; 
}

//实现初始化通讯录
void InitContact(struct Contact* ps)
{
	ps->date=(struct PeopleInformation*)malloc(CAPACITY*sizeof (struct PeopleInformation));  //为通讯录date开辟空间
	if (ps->date==NULL)  //判断date是否为空指针
	{
		return ;
	}
	ps->size=0;  //刚开始没有联系人 置0
	ps->capacity=CAPACITY; //将原始容量设置为CAPACITY=3 宏定义便于修改
	LocadFile(ps);  //避免每次退出后再进通讯录人员消失
}

//检查容量 不够则增
void CheckCapacity(struct Contact* ps)
{
	if (ps->size==ps->capacity) //元素个数等于容量则说明通讯录已满  需扩容
	{
		//防扩容失败 将date这块空间先交给ptr这个指针
		struct PeopleInformation* ptr=realloc(ps->date,(ps->capacity+2)*sizeof(struct PeopleInformation));
		if (ptr!=NULL)  
		{
			ps->date=ptr; 
			ps->capacity+=2;  //一次扩两个人
			printf("扩容成功n");
		}
		else 
		{
			printf("扩容失败n");
		}
	}
	

}

//实现增加联系人
void AddContact(struct Contact* ps)
{
	CheckCapacity(ps);
	printf("请输入名字:》");
	scanf("%s",ps->date[ps->size].name);
	printf("请输入性别:》");
	scanf("%s",ps->date[ps->size].sex);
	printf("请输入年龄:》");
	scanf("%d",&(ps->date[ps->size].age));
	printf("请输入地址:》");
	scanf("%s",ps->date[ps->size].addr);
	printf("请输入电话:》");
	scanf("%s",ps->date[ps->size].tale);
	ps->size++;  //录入一个size++ 表明元素多一个人
	printf("录入成功n");
}

//实现展示通讯录
void ShowContact(const struct Contact* ps)
{
	if (ps->size==0) //元素为0 说明通讯录无人
	{
		printf("通讯录为空n");
	}
	else
	{
		int i=0;
		printf("%-2st%-5st%-4st%-20st%-12sn","名字","性别","年龄","地址","电话");  //-代表左对齐
		for (i=0;isize;i++)
		{
			printf("%-2st%-5st%-4dt%-20st%-12sn",ps->date[i].name,   //访问成员
				                                 ps->date[i].sex,
												 ps->date[i].age,
												 ps->date[i].addr,
												 ps->date[i].tale);
		}
	}
}
//实现查找联系人  此接口不对外开放 用static静态变量修饰
static int FindPeople(const struct Contact* ps,char name[MAX_NAME])
{
	int i=0;
	for (i=0;isize;i++)
	{
		if(0==strcmp(ps->date[i].name,name)) //比较两个名字是否一样 一样strcmp函数自动返回0 
		{
			return i;   //查找到返回下标
		}
	}
	return -1;  //找不到
}
//实现删除联系人

void DelContact(struct Contact* ps)
{
	int pos=0;  //将被删除人的下标位置初始化
	char name[MAX_NAME];
	printf("请输入被删除者的名字n");
	scanf("%s",name);
	pos=FindPeople(ps,name);  //删除人之前 先查找人员是否存在 调用查找函数
	if (pos==-1) //break跳出有两种情况:1.元素找完了还没找到即i=size;2.找到跳出来了 应执行删除
	{
		printf("找不到要删除的人n");
	}
	else
	{
		int j=0;
		for (j=pos;jsize-1;j++)
		{
			ps->date[j]=ps->date[j+1];  //若扎到则实现删除 删除方法为将要被删除元素后边元素往前移动覆盖
		}
		ps->size--;  //删除一个size要自减
		printf("删除成功n");
	}
}
//实现查找联系人  
void SearchContact(const struct Contact* ps)
{
	int pos=0;
	char name[MAX_NAME];
	printf("请输入要查找的人名:》");
	scanf("%s",name);
	pos=FindPeople(ps,name);  //直接调用上述查找函数
	if (pos==-1)
	{
		printf("找不到n");
	}
	else
	{
		printf("%-2st%-5st%-4st%-20st%-12sn","名字","性别","年龄","地址","电话");
		printf("%-2st%-5st%-4dt%-20st%-12sn",ps->date[pos].name,
				                                 ps->date[pos].sex,
												 ps->date[pos].age,
												 ps->date[pos].addr,
												 ps->date[pos].tale);
	}
}
//实现修改联系人
void ModifyContact(struct Contact* ps)
{
	int pos=0;
	char name[MAX_NAME];
	printf("请输入要修改的人名:》");
	scanf("%s",name);
	pos=FindPeople(ps,name);
	if (pos==-1)
	{
		printf("找不到n");
	}
	else
	{
		printf("请输入名字:》");
		scanf("%s",ps->date[pos].name);
		printf("请输入性别:》");
		scanf("%s",ps->date[pos].sex);
		printf("请输入年龄:》");
		scanf("%d",&(ps->date[pos].age));
		printf("请输入地址:》");
		scanf("%s",ps->date[pos].addr);
		printf("请输入电话:》");
		scanf("%s",ps->date[pos].tale);
		printf("修改完成n");
	}

}
//释放动态开辟内存函数开辟的空间
void Free(struct Contact* ps)
{
	free(ps->date);
	ps->date=NULL;
}
//保存通讯录成为一个文件
void SaveContact(struct Contact* ps)
{
	int i=0;
	FILE* pfWrite=fopen("contact.date","wb");
	if (pfWrite==NULL)
	{
		printf("%sn",strerror(errno));
		return ;
	}
	//写通讯录数据到文件中
	for (i=0;isize;i++)
	{
		fwrite(&(ps->date[i]),sizeof(struct PeopleInformation),1,pfWrite);
	}
	fclose(pfWrite);
	pfWrite=NULL;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5650880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存