用c语言实现通讯录(含文件操作)

9 篇文章 1 订阅
2 篇文章 0 订阅

实现功能:

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

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人
    要求:可以读取和保存数据

源代码

contact.h

#ifndef _CONTACT_H_
#define _CONTACT_H_
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<Windows.h>
typedef struct Person
{
	char Name[8];
	char Sec[4];
	char Address[16];
	char Tel[11];
	int Age;
}Person;
typedef struct Contact
{
	Person* data;
	unsigned int cap;
	unsigned int used;
}Contact;
void Menu_Contact(Contact *p);//通讯录菜单
void Init_Contact(Contact *p);//初始化通讯录
void Add_Contact(Contact *p);//添加
void Show_Contact(Person *p);//显示
void Find_Contact(Contact *p);//查找
void Del_Contact(Contact *p);//删除
void Revise_Contact(Contact *p);//修改
void Show_All_Contact(Contact *p);//显示所有
void Empty_All_Contact(Contact *p);//清空所有
void Sort_Contact(Contact *p);//排序
void Load_Contact(Contact *p);//载入
void Save_Contact(Contact *p);//存储
void Destroy_Contact(Contact *p);//销毁通讯录
#endif // !_CONTACT_H_

contact.c

#include"contact.h"
void Menu_Contact(Contact *p)//通讯录菜单
{
	assert(p != NULL);
	printf("**************************************\n");
	printf("*************** 通讯录 ***************\n");
	printf("**************************************\n");
	printf("****** 【1】添加  || 【2】查找  ******\n");
	printf("****** 【3】删除  || 【4】修改  ******\n");
	printf("****** 【5】显示  || 【6】排序  ******\n");
	printf("****** 【7】清空  || 【0】退出  ******\n");
	printf("************ 总容量:%-4d *************\n",p->cap);
	printf("************ 已存入:%-4d *************\n",p->used);
	printf("**************************************\n");
}

void Init_Contact(Contact *p)//初始化通讯录
{
	assert(p != NULL);
	int size;
	printf("请输入通讯录的总容量:> ");
	scanf("%d", &size);
	p->cap = size;
	p->data = (Person*)calloc(p->cap,sizeof(Person));
	assert(p->data != NULL);
	p->used = 0;
	Load_Contact(p);
	printf("初始化成功!\n");
	system("pause");
	system("cls");
}
void Add_Contact(Contact *p)//添加
{
	assert(p != NULL);
	if (p->cap == p->used)
	{
		printf("已存满\n");
		return;
	}
	else
	{
		printf("请输入姓名:>");
		scanf("%s", p->data[p->used].Name);
		printf("请输入性别:>");
		scanf("%s", p->data[p->used].Sec);
		printf("请输入年龄:>");
		scanf("%d", &p->data[p->used].Age);
		printf("请输入地址:>");
		scanf("%s", p->data[p->used].Address);
		printf("请输入电话:>");
		scanf("%s", p->data[p->used].Tel);
		p->used++;
		printf("添加成功!\n");
	}
	system("pause");
	system("cls");
}
void Show_Contact(Person *p)//显示
{
	assert(p != NULL);
	printf("%-12s\t", p->Name);
	printf("%-8s\t", p->Sec);
	printf("%-6d\t", p->Age);
	printf("%-20s\t", p->Address);
	printf("%-15s\n", p->Tel);
}
void Find_Contact(Contact *p)//查找
{
	assert(p != NULL);
	printf("请输入要查找的用户名:>");
	char name[32];
	int num=0;
	scanf("%s", name);
	for (unsigned int i = 0; i < p->used; i++)
	{
		if (strcmp(p->data[i].Name, name)==0)
		{
			Show_Contact(&p->data[i]);
			num++;
		}
	}
	if (num == 0)
		printf("没有找到!\n");
	else
		printf("共找到%d个\n",num);
	system("pause");
	system("cls");
}
void Del_Contact(Contact *p)//删除
{
	assert(p != NULL);
	printf("请输入要删除的用户名:>");
	char name[32];
	int num = 0;
	scanf("%s", name);
	for (unsigned int i = 0; i < p->used; i++)
	{
		if (strcmp(p->data[i].Name, name) == 0)
		{
			unsigned int j;
			for ( j = i; j < p->used - 1; j++)
			{
				strcpy(p->data[j].Name, p->data[j + 1].Name);
				strcpy(p->data[j].Sec, p->data[j + 1].Sec);
				p->data[j].Age = p->data[j + 1].Age;
				strcpy(p->data[j].Address, p->data[j + 1].Address);
				strcpy(p->data[j].Tel, p->data[j + 1].Tel);
			}
			p->used--;
			memset(&p->data[j], 0, sizeof(p->data[j]));/************/
			num++;
		}
	}
	num == 0 ? printf("删除失败,没有找到!\n") : ("删除成功,共删除%d个!\n", num);
	system("pause");
	system("cls");
}
void Revise_Contact(Contact *p)//修改
{
	assert(p != NULL);
	printf("请输入要修改的用户名:>");
	char name[32];
	int num = 0;
	int n = 0;
	scanf("%s", name);
	for (unsigned int i = 0; i < p->used; i++)
	{
		if (strcmp(p->data[i].Name, name) == 0)
		{

			int opt;
			Show_Contact(&p->data[i]);
			printf("是否修改这个用户(0/1):>");
			scanf("%d", &opt);
			if (opt == 1)
			{
				int s;
				//printf("请选择你想修改的内容:>\n①姓名 ②性别 ③年龄 ④地址 ⑤电话 〇退出\n");
				while (printf("请选择你想修改的内容:>\n①姓名 ②性别 ③年龄 ④地址 ⑤电话 〇退出\n"),scanf("%d", &s))
				{
					if (s == 0)
						break;
					switch (s)
					{
					case 1:
						printf("请输入姓名:>");
						scanf("%s", p->data[i].Name);
						break;
					case 2:
						printf("请输入性别:>");
						scanf("%s", p->data[i].Sec);
						break;
					case 3:
						printf("请输入年龄:>");
						scanf("%d", &p->data[i].Age);
						break;
					case 4:
						printf("请输入地址:>");
						scanf("%s", p->data[i].Address);
						break;
					case 5:
						printf("请输入电话:>");
						scanf("%s", p->data[i].Tel);
						break;
					default:
						printf("选择错误!\n");
						break;
					}
				}
				printf("\n修改成功!\n");
				n++;

			}
			num++;
		}
	}
	printf("共找到%d个,修改%d个!\n", num, n);
	system("pause");
	system("cls");
}
void Show_All_Contact(Contact *p)//显示所有
{
	assert(p != NULL);
	for (unsigned int i = 0; i < p->used; i++)
	{
		Show_Contact(&p->data[i]);
	}
	system("pause");
	system("cls");
}
void Empty_All_Contact(Contact *p)//清空所有
{
	assert(p != NULL);
	printf("确定要清空通讯录吗?<0/1> :>");
	int opt;
	scanf("%d", &opt);
	if (opt==0)
		return;
	p->used = 0;
	memset(p->data, 0, sizeof(p->data));
	printf("清空成功!\n");
	system("pause");
	system("cls");
}
void Sort_Contact(Contact *p)//排序
{
	assert(p != NULL);
	for (unsigned int i = 0; i < p->used; i++)
	{
		for (unsigned int j = 0; j < p->used - i - 1; i++)
		{
			if (strcmp(p->data[j].Name, p->data[j + 1].Name) > 0)
			{
				Person temp = p->data[j];
				p->data[j] = p->data[j + 1];
				p->data[j + 1] = temp;
			}
		}
	}
	printf("排序成功!\n");
	system("pause");
	system("cls");
}
void Load_Contact(Contact *p)//载入
{
	assert(p != NULL);
	FILE *fp = fopen("contact.dat","r");
	assert(fp != NULL);
	while (!feof(fp))
	{
		if (p->cap == p->used)
		{
			printf("已存满\n");
			return;
		}
		int res = fscanf(fp, "%s%s%d%s%s", p->data[p->used].Name,
										   p->data[p->used].Sec,
										   &p->data[p->used].Age,
										   p->data[p->used].Address,
			                               p->data[p->used].Tel);
		if (res == EOF)//判断是否达到文件尾
			break;
		p->used++;
	}
	fclose(fp);
	printf("加载成功!\n");
}
void Save_Contact(Contact *p)//存储
{
	assert(p != NULL);
	FILE *fp = fopen("contact.dat", "w");
	assert(fp != NULL);
	for (unsigned int i = 0; i < p->used; i++)
	{
		fprintf(fp, "%-12s", p->data[i].Name);
		fprintf(fp, "%-8s", p->data[i].Sec);
		fprintf(fp, "%-6d", p->data[i].Age);
		fprintf(fp, "%-20s", p->data[i].Address);
		fprintf(fp, "%-15s", p->data[i].Tel);
	}
	fclose(fp);
	printf("保存成功!\n");
}
void Destroy_Contact(Contact *p)//销毁通讯录
{
	assert(p != NULL);
	free(p->data);
	p->data = NULL;
	p->cap = p->used = 0;
	printf("清理成功!\n");
}

contact_main.c

#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
void(*func[8])(Contact *) = { 0,
							  Add_Contact,
							  Find_Contact,
							  Del_Contact,
							  Revise_Contact,
							  Show_All_Contact,
							  Sort_Contact,
							  Empty_All_Contact };
int main()
{
	int n;
	Contact contact;
	Init_Contact(&contact);
	Menu_Contact(&contact);
	while (scanf("%d", &n))
	{
		if (n == 0)
			break;
		if (n < 0 || n>7)
		{
			printf("选择错误,请重新选择。");
			continue;
		}
		(*func[n])(&contact);
		Menu_Contact(&contact);
	}
	Save_Contact(&contact);
	Destroy_Contact(&contact);
	return 0;
}

用了一下午时间弄出来的,其中遇到很多难以想象的错误,最后都被依依解决了,觉得有用的老铁给个三连哈!❤❤❤

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RONIN_WZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值