通讯录(含文件操作)

目录

1.通讯录要求

2.通讯录的实现

2.1 test.c的实现

菜单函数 menu()

枚举类型

主函数 main()

2.2 头文件 contacts.h的实现

2.3 contacts.c 函数模块的实现

初始化通讯录列表函数(读取文件)

保存函数

初始化通讯录

成员添加函数

检查列表函数

成员内存分配函数(动态分配)

成员显示函数

归还内存函数

成员查找函数

成员删除函数

成员修改函数

成员排序函数


1.通讯录要求

实现一个通讯录;

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

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 以名字排序所有联系人
  7. 实现数据保存(进行文件操作)

2.通讯录的实现

2.1 test.c的实现

完成一个通讯录首先就要做一个菜单。

菜单函数 menu()

void menu()
{
	printf("************通讯录***********\n");
	printf("******1.Add     2.Dele  *****\n");
	printf("******3.Search  4.Modify*****\n");
	printf("******5.Show    6.Sort  *****\n");
	printf("******0.Exit            *****\n");
	printf("*****************************\n");
}

我们可以使用一个枚举类型来定义我们的选项,以此来增加我们代码的可读性。

枚举类型

enum option
{
	Exit,
	Add,
	Dele,
	Search,
	Modify,
	Show,
	Sort
};

接着是我们的主函数。

主函数 main()

int main()
{
	int input,ret=0;
	Contact PeoList;//创建通讯录列表
	Init_Contacts(&PeoList);//通讯录初始化
	do {
	menu();
	printf("请做出选择:");
	scanf("%d", &input);
	switch (input)
	{
	case Add://增加
		List_Add(&PeoList);
		break;
	case Dele://删除
		List_Dele(&PeoList);
		break;
	case Search://查找
		ret=List_Search(&PeoList);
		if (ret == -1)
		{
			printf("查找失败\n");
		}
		else
		{
           printf("查找成功,是否查看详细信息(1.是   0.否)\n");
		   int temp;
		   do {
			   printf("请输入:");
			   scanf("%d", &temp);
			   if (temp == 1)
			   {
				   printf("%-10s %-4s %-5s %-20s %-20s\n", "姓名", "年龄", "性别", "电话号码", "住址");
				   printf("%-10s %-4d %-5s %-20s %-20s\n", PeoList.data[ret].name, PeoList.data[ret].age, PeoList.data[ret].sex, PeoList.data[ret].Tele, PeoList.data[ret].address);
			   }
			   else if (temp != 0)
			   {
				   printf("选择错误,请重新选择\n");
			   }
		   } while (!(temp == 1 || temp == 0));
		}	
		break;
	case Modify://修改
		List_Modify(&PeoList);
		break;
	case Show://展示
		List_Show(&PeoList);
		break;
	case Sort://排序
		List_Sort(&PeoList);
		break;
	case Exit://退出
		Stor_Contact(&PeoList);
		List_Destroy(&PeoList);
		printf("退出成功\n");
		break;
	default:
		printf("选择无效,请重新选择\n");
		break;
	}
	} while (input);
	return 0;
}

2.2 头文件 contacts.h的实现

这个模块主要是储存一些函数声明和一些宏定义

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <windows.h>

#define Init_ListLen 3//初始通讯录长度
#define Add_Len 2//每次通讯录增加的长度
#define Max_NameLen 50//姓名长度
#define Max_SexLen 5//性别长度
#define Max_TeleLen 50//电话长度
#define Max_AddressLen 50//地址长度

typedef struct Peo
{
	char name[Max_NameLen];//姓名
	int age;//年龄
	char sex[Max_SexLen];//性别
	char Tele[Max_TeleLen];//电话
	char address[Max_AddressLen];//地址
}Peo;

typedef struct Contact
{
	Peo* data;//指向一个存储通讯录数据的空间
	int sz;//表示当前存储的有效数据个数
	int capacity;//表示当前通讯录的容量
}Contact;

void Init_Contacts(Contact* p);//初始化通讯录函数申明
void List_Add(Contact* p);//通讯录数据增加函数声明
int Check_List(Contact* p);
int Peo_ListLenAdd(Contact* p);
void List_Show(Contact* p);
void List_Destroy(Contact* p);
void List_Dele(Contact* p);
int List_Search(Contact* p);
void List_Modify(Contact* p);
void List_Sort(Contact* p);
void Init_ContactsAdd(Contact* p);//加载数据
void Stor_Contact(Contact* p);

2.3 contacts.c 函数模块的实现

初始化通讯录列表函数(读取文件)

void Init_ContactsAdd(Contact* p)
{
	FILE* fp = fopen("contact.txt", "rb");
	if (fp == NULL)
	{
		perror("Init_ContactAdd::fopen");
		return;
	}
	Peo temp = { 0 };
	while (fread(&temp,sizeof(Peo),1,fp))
	{
		if (Check_List(p) == 1)
		{
			if (Peo_ListLenAdd(p) == 0)
			{
				return;
			}
		}
		p->data[p->sz] = temp;
		p->sz++;
	}
	fclose(fp);
	fp = NULL;
}

保存函数

void Stor_Contact(Contact* p)
{
	FILE* fp = fopen("contact.txt", "wb");
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		fwrite(p->data+i, sizeof(Peo), 1, fp);
	}
	fclose(fp);
}

初始化通讯录

void Init_Contacts(Contact*p)
{
	p->data = (Peo*)malloc(sizeof(Peo) * Init_ListLen);
	p->capacity = Init_ListLen;
	p->sz = 0;
	if (p->data == NULL)
	{
		printf("通讯录初始化失败\n");
		printf("%s", strerror(errno));
	}
	Init_ContactsAdd(p);
	return;
}

成员添加函数

void List_Add(Contact* p)
{
	if (Check_List(p) == 1)
	{
		if (Peo_ListLenAdd(p) == 0)
		{
			return;
		}
	}
		printf("请输入姓名\n");
		scanf("%s", p->data[p->sz].name);
		printf("请输入性别\n");
		scanf("%s", p->data[p->sz].sex);
		printf("请输入年龄\n");
		scanf("%d", &(p->data[p->sz].age));
		printf("请输入电话\n");
		scanf("%s", p->data[p->sz].Tele);
		printf("请输入住址\n");
		scanf("%s", p->data[p->sz].address);
		printf("增加完成\n");
		p->sz += 1;
}

检查列表函数

int Check_List(Contact* p)
{
	if (p->sz == p->capacity)
	{
		return 1;
	}
	return 0;
}

成员内存分配函数(动态分配)

int Peo_ListLenAdd(Contact* p)
{
	Peo* str=NULL;
	str = (Peo*)realloc(p->data,(p->capacity+Add_Len)*sizeof(Peo));
	p->capacity += Add_Len;
	if (str == NULL)
	{
		printf("分配内存失败\n");
		printf("%s", strerror(errno));
		return 0;
	}
	else
	{
		p->data = str;
		return 1;
	}
}

成员显示函数

void List_Show(Contact*p)
{
	printf("%-10s %-4s %-5s %-20s %-20s\n", "姓名", "年龄", "性别", "电话号码", "住址");
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		printf("%-10s %-4d %-5s %-20s %-20s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].Tele, p->data[i].address);
	}
}

归还内存函数

void List_Destroy(Contact* p)
{
	free(p->data);
	p->data = NULL;
}

成员查找函数

int List_Search(Contact* p)
{
	printf("请输入要查找人的姓名\n");
	char name[Max_NameLen];
	scanf("%s", name);
	int i = 0, flag = 0;
	for (i = 0; i < p->sz; i++)
	{
		if (strcmp(p->data[i].name, name) == 0)
		{
			flag = 1;
			break;
		}
	}
	if (flag == 1)
		return i;
	else
		return -1;
}

成员删除函数

void List_Dele(Contact* p)
{
	char name[Max_NameLen] = { 0 };
	printf("请输入要删除的信息人的姓名\n");
	scanf("%s", name);
	int i = 0, flag = 0;
	for (i = 0; i < p->sz; i++)
	{
		if (strcmp(p->data[i].name, name) == 0)
		{
			flag = 1;
			break;
		}
	}
	if (flag==1)
	{
		for (; i < p->sz-1; i++)
		{
			p->data[i] = p->data[i + 1];
		}
		printf("删除成功\n");
		p->sz -= 1;
	}
	else
	{
		printf("未查找到被删除人信息,删除失败\n");
	}
}

成员修改函数

void List_Modify(Contact*p)
{
	char name[Max_NameLen];
	int ret = -1;
	printf("请输入要修改人的姓名\n");
	scanf("%s", name);
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		if (strcmp(p->data[i].name, name) == 0)
		{
			ret = i;
			break;
		}
	}
	if (ret == -1)
	{
		printf("修改失败,未找到修改人信息\n");
		return;
	}
	else
	{
		printf("开始修改\n");
		printf("请输入姓名\n");
		scanf("%s", p->data[ret].name);
		printf("请输入性别\n");
		scanf("%s", p->data[ret].sex);
		printf("请输入年龄\n");
		scanf("%d", &(p->data[ret].age));
		printf("请输入电话\n");
		scanf("%s", p->data[ret].Tele);
		printf("请输入住址\n");
		scanf("%s", p->data[ret].address);
		printf("修改完成\n");
	}
	return;
}
int cmp(const void* p1,const void* p2)
{
	return(strcmp((*(Peo*)p1).name, (*(Peo*)p2).name));
}

成员排序函数

void List_Sort(Contact* p)
{
	qsort(p->data, p->sz, sizeof(Peo), cmp);//按名字进行排序
	printf("排序成功\n");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值