c语言______通讯录

时间:2025-03-26 12:39:24

用c语言实现一个通讯录功能,包含增删查改这些功能其中创建了三个文件

用来创建出框架和创建函数,用来实现函数,用来声明这些函数;

好,那么接下来就开始实现:

:源文件创建函数和创建框架

#define _CRT_SECURE_NO_WARNINGS 
#include ""
void menu()
{
	printf("                                                                          \n");
	printf("      增加                            删除                    \n");
	printf("      查找                       修改                   \n");
	printf("      显示                           排序                      \n");
	printf("                        保存                                      \n");
	printf("                     退出                                           \n");
	printf("                                                                          \n");
}

int main()
{
	int input = 0;
	//创建通讯录
	struct contact con;//;里面包含存放信息和size,capacity
	//初始化通讯录
	initcontact(&con);
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch(input)
		{
			case add:
				addcontact(&con);
				break;
			case del:
				delecontact(&con);
				break;
			case search:
				searchcontact(&con);
				break;
			case modipy:
				modipyconntact(&con);
				break;
			case show:
				showcontact(&con);
				break;
			case sort:
				sortcontact(&con);
				break;
			case exita:
				savecontact(&con);
				destorycontact(&con);//因为是动态内存开辟的内存需要释放
				printf("退出通讯录\n");
				break;
			case save:
				savecontact(&con);
				break;
			default:
				printf("选择错误\n");
				break;
		}
	} while (input);
	return 0;
}

:源文件,实现函数功能,也是这个程序最主要的部分

#define _CRT_SECURE_NO_WARNINGS
#include""

//初始化通讯录
void initcontact(struct contact* ps)
{
	ps->data = (struct peoinof*)malloc(defaule*sizeof(struct peoinfo));
	if (ps->data == NULL)
	{
		return;
	}
	ps->size = 0;
	ps->capacity = defaule;

	//把文件中已经存放在通讯录中的信息加载到通讯录中
	loadcontact(ps);
}

//增容函数声明
void checkcapacity(struct contact* ps);//这个函数是在后面定义的,要在前面声明一下

void loadcontact(contact* ps)
{
	peoinfo tmp = { 0 };
	FILE* pfread = fopen("", "rb");//打开文件
		if (pfread == NULL)
		{
			printf("loadcontact:%s\n", strerror(errno));
			return;
		}
		//读取文件存放到通讯录中
		while (fread(&tmp, sizeof(peoinfo), 1, pfread))//返回值为0说明读取完了跳出
		{
			checkcapacity(ps);//当读取时内存不够,增容,因为前面给设置了3
			ps->data[ps->size] = tmp;//存放在size的下标处
			ps->size++;
		}

		//关闭文件
		fclose(pfread);
		pfread = NULL;
}

void checkcapacity(struct contact* ps)
{
	if (ps->size == ps->capacity)
	{
		//满了,增容
		struct pepoleinf*ptr=realloc(ps->data, (ps->capacity + 2) * sizeof(peoinfo));
		if (ptr != NULL)
		{
			ps->data = ptr;
			ps->capacity += 2;
			printf("增容成功\n");
		}
		else
		{
			printf("增容失败\n");
		}
	}
}
//添加信息
void addcontact(struct contact* ps)
{
	checkcapacity(ps);//检测当前容量
			printf("请输入名字:");
		scanf("%s", ps->data[ps->size].name);
		printf("请输入年龄:");
		scanf("%d", &(ps->data[ps->size].age));
		printf("请输入性别:");
		scanf("%s", ps->data[ps->size].sex);
		printf("请输入电话:");
		scanf("%s", ps->data[ps->size].tele);
		printf("请输入地址:");
		scanf("%s", ps->data[ps->size].addr);

		ps->size++;//录入一个结构之后,size加1
		printf("添加成功\n");
//	if (ps->size == max)
//	{
//		printf("通讯录已满,无法增加\n");
//	}
//	else
//	{
//		printf("请输入名字:");
//		scanf("%s", ps->data[ps->size].name);
//		printf("请输入年龄:");
//		scanf("%d", &(ps->data[ps->size].age));
//		printf("请输入性别:");
//		scanf("%s", ps->data[ps->size].sex);
//		printf("请输入电话:");
//		scanf("%s", ps->data[ps->size].tele);
//		printf("请输入地址:");
//		scanf("%s", ps->data[ps->size].addr);
//
//		ps->size++;//录入一个结构之后,size加1
//		printf("添加成功\n");
//	}
}

//打印显示出来通讯录内容
void showcontact(const struct contact* ps)
{
	if (ps->size == 0)
	{
		printf("通讯录为空\n");
	}
	else
	{
		int i = 0;
		//标题
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字","年龄","性别","电话","地址");
		//内容
		for (i = 0; i < ps->size; i++)
		{
			printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].tele,
				ps->data[i].addr);
		}
	}
}

//定义的一个查找通讯录指定姓名的人的信息
//查找函数
//stctic加上这个代表这个函数只可以在这个源文件内部使用,外面不会显示,不暴露出去内部才能看见
static int findbyname(const struct contact* ps,char name[max_name])
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{

		if (0 == strcmp(ps->data[i].name, name))//字符串比较相等
		{
			return i;//找到返回1
		}
	}
	return -1;//找不到返回-1
}

//删除
void delecontact(struct contact* ps)
{
	char name[max_name];
	printf("请输入要删除人的名字:");
	scanf("%s", &name);
	//1.查找要删除人的位置
	int pos = findbyname(ps,name);//查找函数

	//删除
	if (pos==-1)
	{
		printf("要删除的人不存在\n");
	}
	else
	{
		//删除数据
		int j = 0;
		for (j = pos; j < ps->size - 1; j++)
		{
			ps->data[j] = ps->data[j + 1];//将后一个人的信息覆盖掉前面这个人++
		}
		ps->size--;//通讯录人数--
		printf("删除成功\n");
	}
}

//查找显示指定人姓名的信息内容
void searchcontact(const struct contact* ps)
{
	char name[max_name];
	printf("请输入要查找人的姓名:");
	scanf("%s", &name);
	int pos = findbyname(ps, name);//查找函数
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
	}
	else
		//打印显示出来
	{
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
			printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
				ps->data[pos].name,
				ps->data[pos].age,
				ps->data[pos].sex,
				ps->data[pos].tele,
				ps->data[pos].addr);
	}
}

//修改联系人
void modipyconntact(struct contact* ps)
{
	char name[max_name];
	printf("请输入你要修改的联系人姓名:");
	scanf("%s", &name);
	int pos=findbyname(ps, name);
	if (pos == -1)
	{
		printf("要修改人的信息不存在\n");
	}
	else
	{
		//修改代表重新输入一个人的信息
		printf("请输入名字:");
		scanf("%s", ps->data[pos].name);//替换
		printf("请输入年龄:");
		scanf("%d", &(ps->data[pos].age));
		printf("请输入性别:");
		scanf("%s", ps->data[pos].sex);
		printf("请输入电话:");
		scanf("%s", ps->data[pos].tele);
		printf("请输入地址:");
		scanf("%s", ps->data[pos].addr);

		printf("修改完成\n");
	}
}


//释放空间
void destorycontact(contact* ps)
{
	free(ps->data);
	ps->data = NULL;
}

//保存文件
void savecontact(contact* ps)
{
	FILE* pfwrite = fopen("", "wb");//打开文件
	if (pfwrite == NULL)
	{
		printf("savecontact:%s ", strerror(errno));
		return;//因为是void返回无返回值
	}
	//写通讯录中的数据到文件中
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		//写文件函数,地址         //元素大小,一次写几个 ,流
		fwrite(&(ps->data[i]), sizeof(peoinfo), 1, pfwrite);
	}
	printf("保存成功\n");

	//关闭文件
	fclose(pfwrite);
	pfwrite = NULL;
}
//排序
void sortcontact(struct contact* ps)
{
	int i = 0; 
	for (i = 0; i < ps->size - 1; i++)
	{
		for (int j = 0; j < ps->size - i-1; j++)
		{
			if (ps->data[j].age > ps->data[j+1].age)
			{
				//交换
				peoinfo tmp;
				 tmp = ps->data[j];
				ps->data[j] = ps->data[j + 1];
				ps->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功");
}

:头文件,函数的声明以及结构体的创建

#define _CRT_SECURE_NO_WARNINGS
#include<>
#include<>
#include<>
#include<>

enum option//枚举
{
	exita,//0
	add,//1
	del,
	search,
	modipy,
	show,
	sort,
	save
};

//#define max  1000

#define defaule 3

#define max_name 20
#define max_sex  5
#define max_tele 16
#define max_addr 40


typedef struct peoinfo
{
	char name[max_name];//名字
	int age;//年龄
	char sex[max_sex];//性别
	char tele[max_tele];//电话
	char addr[max_addr];//住址
}peoinfo;//typedef将类型名单独变成peoinfo

typedef struct contact
{
	struct peoinfo *data;//存放信息
	int size;//记录当前已经有的元素个数
	int capacity;
}contact;


//声明函数

//初始化通讯录
void initcontact(struct contact* ps);

//添加一个信息到通讯录
void addcontact(struct contact* ps);

//打印通讯录中的信息
void showcontact(const struct contact* ps);

//删除指定的联系人
void delecontact(struct contact* ps);

//查找指定人的信息
void searchcontact(struct contact* ps);

//修改指定联系人
void modipyconntact(struct contact* ps);

//释放空间
void destorycontact(contact* ps);

//保存文件
void savecontact(contact* ps);

//加载文件中的信息到通讯录
void loadcontact(contact* ps);

//排序
void sortcontact(struct contact* ps);

以上便是这个程序的实现