文件版实现通讯录

头文件

contact.c

#ifndef _CONOTACT_H_
#define  _CONOTACT_H_
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

#define MAX_NAME 20
#define MAX_TEL 11
#define MAX_ADDR 11
#define MAX_SEX 5
#define MAX_NUMBER 1000
#define DEFAULT_SIZE 5
enum option
{
	ADD = 1,
	SEARCH,
	DEL,
	SHOW,
	CLEAR,
	SORT,
	CHANGE,
	DESTROY,
	SAVE,
	LOAD,
	EXIT=0
}cont;
//个人信息
typedef struct person_info
{
	char name[MAX_NAME];
	short age;
	int tele[MAX_TEL];
	char addr[MAX_ADDR];
	char sex[MAX_SEX];
}personinfo;

typedef struct contact
{
	//personinfo per[MAX_NUMBER];
	//int usedsize;  //被使用的个数
	personinfo *per;
	int usedsize;  //被使用的个数
	int capticty;  //容量


}contact;

void ADDContact(contact* pcon);
void Initcontact(contact* pcon);
int Searchcontact(contact* pcon);
void Delcontact(contact* pcon);
void Showcontact(contact* pcon);
void Clearcontact(contact* pcon);
void Sortcontact(contact* pcon);
void Changecontact(contact* pcon);
void Destroycontact(contact* pcon);
void Loadcontact(contact *pcon);
void Savecontact(contact *pcon);

#endif // _CONOTACT_H_

contact.c

#include"contact.h"
//初始化结构体数组
void Initcontact(contact* pcon)
{
	assert(pcon != NULL);
	//memset(pcon->per, 0, sizeof(pcon->per));
	//pcon-> usedsize = 0 ;
	pcon->capticty = DEFAULT_SIZE;
	pcon->usedsize = 0;
	pcon->per = (personinfo*)malloc(sizeof(personinfo)*pcon->capticty);
	assert(pcon->per != NULL);
	memset(pcon->per, 0, sizeof(personinfo)*pcon->capticty);
	Loadcontact(pcon);
}
//加载联系人
void Loadcontact(contact *pcon) 
{
	int i = 0;
	personinfo con ;
	FILE *pf = fopen("program.txt","rb");
	if (pf == NULL)
	{
		printf("can not open file\n");
		return;
	}
	//while (fread(pcon->per+i, sizeof(personinfo),
	//	1, pf))
	//{
	//	i++;
	//}
	//pcon->usedsize = i;
	while (fread(&con, sizeof(personinfo),
		1, pf)>0)
	{
		checkfull(pcon);
		pcon->per[pcon->usedsize++] = con;
	}
	fclose(pf);
	pf = NULL;
}

//1.添加联系人到通讯录里
static int checkfull(contact* pcon)
{
	personinfo *ptr;
	assert(pcon != NULL);
	if (pcon->usedsize == pcon->capticty)
	{
		personinfo *ptr = (personinfo*)realloc
			(pcon->per,sizeof(personinfo)*pcon->capticty*2);
		if (ptr != NULL)
		{
			pcon->per = ptr;
			pcon->capticty *= 2;
			printf("增容成功!\n");
			return 1;
		}
		else
		{
			return 0;
		}
	}
	return 1;
}
void ADDContact(contact* pcon)
{
	int ret = checkfull(pcon);
	assert(pcon != NULL);
	if (ret == 0)
	{
		printf("增容失败!\n");
	}

	//1.往哪里放 ,数组,下标
	//2.姓名,年龄
	//if (pcon->usedsize == MAX_NUMBER)
	//{
	//	printf("添加满了\n");
	//	return;
	//}
	printf("请输入姓名:");
	scanf("%s", pcon->per[pcon->usedsize].name);
	printf("请输入年龄:");
	scanf("%d", &(pcon->per[pcon->usedsize].age));
	printf("请输入电话号码:");
	scanf("%s", pcon->per[pcon->usedsize].tele);
	printf("请输入性别:");
	scanf("%s", pcon->per[pcon->usedsize].sex);
	printf("请输入地址:");
	scanf("%s", pcon->per[pcon->usedsize].addr);
	pcon->usedsize++;
	printf("添加成功!\n");
}
//	2.根据姓名查找指定联系人信息
int Searchcontact(contact* pcon)
{
	char name[5];
	int i = 0;
	assert(pcon != NULL);
	if (pcon->usedsize == 0)
	{
		printf("通讯录为空\n");
		return -1;
	}
	printf("输入姓名\n");
	scanf("%s", name);
	for (i = 0; i < pcon->usedsize; i++)
	{
		if (strcmp(pcon->per[i].name
				, name) == 0)
			{
				printf("%-10s%-10s%-10s%-10s%-10s\n",
				"姓名", "年龄", "电话号码", "性别", "地址");
				printf("%-10s%-10d%-10s%-10s%-10s\n",
				pcon->per[i].name,
				pcon->per[i].age,
				pcon->per[i].tele,
				pcon->per[i].sex,
				pcon->per[i].addr
				);
				return i;
			}
	}
}
//3.删除指定联系人信息
void Delcontact(contact* pcon)
{
	int i = 0;
	assert(pcon != NULL);
	i = Searchcontact(pcon);
	if (i == -1)
	{
		printf("查无此人!\n");
		return;
	}
	for (i = Searchcontact(pcon);
		i < pcon->usedsize-1; i++)
	{
		pcon->per[i] = pcon->per[i+1];
	}
	pcon->usedsize --;
	printf("删除成功!\n");
}

// 4.显示所有联系人
void Showcontact(contact* pcon)
{
	int i = 0;
	assert(pcon != NULL);
	printf("%-10s%-10s%-10s%-10s%-10s\n",
		"姓名", "性别", "电话号码","年龄","地址" );
	for (i = 0; i < pcon->usedsize; i++)
	{
		printf("%-10s%-10s%-10s%-10d%-10s\n",
			pcon->per[i].name,
			pcon->per[i].sex,
			pcon->per[i].tele,
			pcon->per[i].age,
			pcon->per[i].addr
			);
	}
}
//5.清空所有联系人   
void Clearcontact(contact* pcon)
{
	assert(pcon != NULL);
	pcon->usedsize = 0;
}

//6.以名字排序所有联系人
void Sortcontact(contact* pcon)
{
	int i = 0;
	int j = 0;
	int flag = 1;
	assert(pcon != NULL);
	personinfo per;
	for (i = 0; i < pcon->usedsize-1; i++)
	{
		flag = 1;
		for (j = 0; j<pcon->usedsize - 1 - i; j++)
		{
			if (strcmp(pcon->per[j].name
				, pcon->per[j + 1].name) > 0)
			{
				flag = 0;
				per = pcon->per[j];
				pcon->per[j] = pcon->per[j + 1];
				pcon->per[j + 1] = per;
			}
		}
		if (flag == 1)
			break;
	}
}
// 7.修改指定联系人 
void Changecontact(contact* pcon)
{
	int i = 0;
	char name[10];
	assert(pcon != NULL);
	printf("输入姓名\n");
	scanf("%s", name);
	for (i = 0; i < pcon->usedsize; i++)
	{
		if (strcmp(pcon->per[i].name
			, name) == 0)
		{
			printf("请输入修改的年龄:");
			scanf("%d", &(pcon->per[i].age));
			printf("请输入修改的电话号码:");
			scanf("%s", pcon->per[i].tele);
			printf("请输入修改的性别:");
			scanf("%s", pcon->per[i].sex);
			printf("请输入修改的地址:");
			scanf("%s", pcon->per[i].addr);
			printf("修改成功!\n");
			break;
		}
	}
	for (i = 0; i < pcon->usedsize; i++)
	{
		if (strcmp(pcon->per[i].name
			, name) != 0)
		{
			printf("无此人!\n");
			break  ;
		}
	}
}

//8.摧毁指定联系人 
void Destroycontact(contact* pcon)
{
	assert(pcon != NULL);
	Savecontact(pcon);
	free(pcon->per);
	pcon->per = NULL;
	pcon->capticty = 0;
	pcon->usedsize = 0;

}
//保存联系人到文件   fwirte()
void Savecontact(contact *pcon)
{
	int i = 0;
	assert(pcon != NULL);
	FILE *pw = fopen("program.txt", "wb");
	/*if (pw == NULL)
	{
		printf("未保存成功!\n");
		return;
	}*/
	for (i = 0; i < pcon->usedsize; i++)
	{
		fwrite(pcon->per + i, sizeof(personinfo),
			1, pw);
	}
	fclose(pw);
	pw = NULL;

}

test.c

#include"contact.h"
void menu()
{
	printf("*******************************\n");
	printf("**** 1.添加联系人信息      ****\n");
	printf("**** 2.查找指定联系人信息  ****\n");
	printf("**** 3.删除指定联系人信息  ****\n");
	printf("**** 4.显示所有联系人信息  ****\n");
	printf("**** 5.清空所有联系人      ****\n");
	printf("**** 6.以名字排序所有联系人****\n");
	printf("**** 7.修改指定联系人      ****\n");
	printf("**** 8.摧毁指定联系人      ****\n");
	printf("**** 9.保存联系人到文件    ****\n");
	printf("**** 10.加载联系人信息     ****\n");
	printf("**** 0.退出                ****\n");
	printf("*******************************\n");
}
void start()
{
	int input = 0;
	//初始化通讯录  数组  usedsize
	contact pcon;
	Initcontact(&pcon);
	do
	{
		menu();
		printf("请输入操作->>\n");
		scanf("%d",&input);
		switch (input)
		{
		   case ADD:
			   ADDContact(&pcon);
			   break;
		   case  SEARCH:  
			   Searchcontact(&pcon);
			   break;
		   case DEL:
			   Delcontact(&pcon);
			   break;
		   case SHOW:
			   Showcontact(&pcon);
			   break;
		   case CLEAR:
			   Clearcontact(&pcon);
			   break;
		   case SORT:
			   Sortcontact(&pcon);
			   break;
		   case CHANGE:
			   Changecontact(&pcon);
			   break;
		   case DESTROY:
			   Destroycontact(&pcon);
			   break;			 
		   case SAVE:
			   Savecontact(&pcon);
			   break;
		   case LOAD:
			   Loadcontact(&pcon);
			   break;
		   default:
			   printf("请正确输入选项!\n");
		}
	} while (input);
}
int main()
{
	start();
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值