通讯录

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

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人
  8. 保存联系人到文件
  9. 加载联系人
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define MAX_PERSON_SIZE 1024
#define MAX_NAME_SIZE 1024
#define MAX_PHONE_SIZE 1024

typedef struct PersonInfo
{
	char name[MAX_NAME_SIZE];
	char phone[MAX_PHONE_SIZE];
	//char sex[1024];
	//char age[1024];
	//char address[1024];
} PersonInfo;

typedef struct AddrBook
{
	PersonInfo persons[MAX_PERSON_SIZE];
	int size;  //数组中有效元素
} AddrBook;

void Init(AddrBook* addr_book)
{
	assert(addr_book != NULL);   //参数校验
	addr_book->size = 0;         //结构体指针访问内部成员
	for (int i = 0; i < MAX_PERSON_SIZE; ++i)
	{
		addr_book->persons[i].name[0] = '\0';
		addr_book->persons[i].phone[0] = '\0';
	}
}

void Add(AddrBook* addr_book)
{
	assert(addr_book != NULL);
	printf("新增联系人!\n");
	if (addr_book->size >= MAX_PERSON_SIZE)
	{
		printf("通讯录已满!\n");
		return;
	}
	PersonInfo* p = &addr_book->persons[addr_book->size];   //添加的联系人所放的位置,size为几就放在第几个位置上
	printf("请输入新增联系人姓名:\n");
	scanf("%s", p->name);
	printf("请输入联系人电话:\n");
	scanf("%s", p->phone);
	++addr_book->size;
	printf("新增联系人成功!\n");
}

void Remove(AddrBook* addr_book)
{
	assert(addr_book != NULL);
	printf("删除联系人!\n");
	if (addr_book->size == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("请输入要删除的联系人的序号:\n");
	int index = 0;
	scanf("%d", index);
	if (index < 0 || index >= addr_book->size)
	{
		printf("输入的序号有误![0-%d]\n", addr_book->size);
		return;
	}
	//删除过程
	//1.删除最后一个元素
	if (index == addr_book->size - 1)
	{
		--addr_book->size;
	}
	else
	{
		//2.删除中间元素,先把最后一个元素放到要删除的位置,再删除最后䘝元素
		PersonInfo* mid = &addr_book->persons[index];
		PersonInfo* last = &addr_book->persons[addr_book->size - 1];
		strcpy(mid->name, last->name);
		strcpy(mid->phone, last->phone);
		--addr_book->size;
	}
	printf("删除成功!当前还有%d条记录!\n", addr_book->size);
}

void PrintAll(AddrBook* addr_book)
{
	assert(addr_book != NULL);
	printf("======================\n");
	for (int i = 0; i < addr_book->size; ++i)
	{
		printf("[%d] %s: %s\n", i, addr_book->persons[i].name, addr_book->persons[i].phone);
	}
	printf("当前共有%d条记录!\n", addr_book->size);
	printf("======================\n");
}

void Update(AddrBook* addr_book)
{
	assert(addr_book != NULL);
	printf("更新联系人!\n");
	if (addr_book->size == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("请输入需要修改的联系人的序号:\n");
	int index = 0;
	scanf("%d", &index);
	if (index < 0 || index > addr_book->size)   //边界条件需要考虑
	{
		printf("输入有误![0-%d]\n", addr_book->size - 1);
		return;
	}
	PersonInfo* p = &addr_book->persons[index];
	printf("当前名字为:%s\n请输入修改后的名字(*表示不修改):\n", p->name);
	char name[MAX_NAME_SIZE] = { 0 };
	scanf("%s", name);
	if (strcmp(name, "*") != 0)
	{
		strcpy(p->name, name);
	}
	printf("当前电话为:%s\n请输入修改后的电话(*表示不修改):\n", p->phone);
	char phone[MAX_PHONE_SIZE] = { 0 };
	scanf("%s", phone);
	if (strcmp(phone, "*") != 0)
	{
		strcpy(p->phone, phone);
	}
	printf("修改完成!\n");
}

int Menu()
{
	printf("======================\n");
	printf("欢迎使用通讯录!\n");
	printf("1.显示所有联系人信息\n");
	printf("2.新增联系人\n");
	printf("3.修改联系人信息\n");
	printf("4.删除联系人\n");
	printf("0.退出通讯录\n");
	printf("======================\n");
	printf("请输入您的选择:\n");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}

AddrBook addr_book;

typedef void(*Func)(AddrBook*);

int main()
{
	Init(&addr_book);
	Func func_table[] = { PrintAll, Add, Update, Remove };   //利用转移表  不是调用,写函数指针
	while (1)
	{
		int choice = Menu();
		if (choice < 0 || choice > 4)
		{
			printf("您的输入有误!请重新输入!\n");
			continue;
		}
		if (choice == 0)
		{
			printf("goodbye!\n");
			break;
		}
		system("cls");
		func_table[choice - 1](&addr_book);
	}
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值