#include <iostream>
#define MAX 1000


//封装函数显示该界面  如 void showMenu()
//在main函数中掉哦那个封装好的函数


//1、菜单界面
void showMenu()
{
	std::cout << "***************************" << std::endl;
	std::cout << "*****  1、添加联系人  *****" << std::endl;
	std::cout << "*****  2、显示联系人  *****" << std::endl;
	std::cout << "*****  3、删除联系人  *****" << std::endl;
	std::cout << "*****  4、查找联系人  *****" << std::endl;
	std::cout << "*****  5、修改联系人  *****" << std::endl;
	std::cout << "*****  6、清空联系人  *****" << std::endl;
	std::cout << "*****  0、退出通讯录  *****" << std::endl;
	std::cout << "***************************" << std::endl;
}

//添加联系人
//功能描述:
//实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)
//添加联系人实现步骤
//⚪设计联系人结构体
//⚪设计通讯录结构体
//⚪main函数中创建通讯录
//⚪封装添加联系人函数
//⚪测试添加联系人功能

//设计联系人结构体
//联系人信息包括:姓名、性别、年龄、联系电话、家庭住址
//设计如下:
struct Person
{
	//姓名
	std::string m_Name;
	//性别       1  男   2  女
	int m_Sex;
	//年龄
	int m_Age;
	//电话
	std::string m_Phone;
	//地址
	std::string m_Addr;

};

//设计通讯录的结构体
struct Addressbooks
{
	//通讯录中保存的联系人数组
	struct Person personArray[MAX];

	//通讯录中当前记录的联系人个数
	int m_Size;

	//

};

//1、添加联系人
void addPerson(Addressbooks * abs)
{
	//判断通讯录是否已满,如果满了就不再添加
	if (abs->m_Size == MAX)
	{
		std::cout << "通讯录容量已满!" << std::endl;
		return;
	}
	else
	{
		//添加具体联系人

		//姓名
		std::string name;
		std::cout << "请输入姓名:" << std::endl;
		std::cin >> name;
		abs->personArray[abs->m_Size].m_Name = name;

		//性别
		std::cout << "请输入性别:" << std::endl;
		std::cout << "1 --- 男" << std::endl;
		std::cout << "2 --- 女" << std::endl;
		int sex = 0;
		while (true)
		{
			//如果输入的是1 或 2 可以退出循环,因为输入的是正确值;
			//如果输入的有误就重新输入。
			std::cin >> sex;
			if (sex == 1 || sex == 2)
			{
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
			std::cout << "输入有误,请重新输入" << std::endl;
		}
		
		//年龄
		std::cout << "请输入年龄:" << std::endl;
		int age = 0;
		std::cin >> age;
		abs->personArray[abs->m_Size].m_Age = age;

		//电话
		std::cout << "请输入联系电话:" << std::endl;
		std::string phone;
		std::cin >> phone;
		abs->personArray[abs->m_Size].m_Phone;

		//地址
		std::cout << "请输入家庭住址:" << std::endl;
		std::string address;
		std::cin >> address;
		abs->personArray[abs->m_Size].m_Addr = address;

		//更新通讯录人数
		abs->m_Size++;

		std::cout << "添加成功" << std::endl;
	}

}

//2、显示所有联系人
//思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息
void showPerson(Addressbooks* abs)
{
	//判断通讯录中人数是否为0;如果为0,提示记录为空
	//如果不为0;显示记录的联系人信息
	if (abs->m_Size == 0)
	{
		std::cout << "当前记录为空" << std::endl;
	}
	else
	{
		for (int i = 0; i < abs->m_Size; i++)
		{
			std::cout << "姓名: " << abs->personArray[i].m_Name << "\t";
			std::cout << "性别: " << ( abs->personArray[i].m_Sex == 1 ?"男":"女" ) << "\t";
			std::cout << "年龄: " << abs->personArray[i].m_Age << "\t";
			std::cout << "电话: " << abs->personArray[i].m_Phone << "\t";
			std::cout << "地址: " << abs->personArray[i].m_Addr << std::endl;
		}
	}

	system("pause");   //按任意键继续
	system("cls");     //清屏

}


//删除联系人
//功能描述:按照姓名进行删除指定联系人
//删除联系人实现步骤:
//封装检测联系人是否存在
//封装删除联系人函数
//测试删除联系人功能


//检测联系人是否存在,如果存在,返回联系人所在通讯录数组中的具体位置,不存在返回 -1
//参数1 : 通讯录    参数2 : 对比姓名
int isExist(Addressbooks * abs, std::string name)
{
	for (int i = 0; i < abs->m_Size; i++)             //创建一查找遍历
	{
		if (abs->personArray[i].m_Name == name)       //查找到用户输入的姓名
		{
			return i;                                 //找到,返回这个人在数组中的下标
		}
	}

	return -1;                                        //如果遍历结束都没有找到,返回 -1

}

//3、删除指定的联系人
void deletePerson(Addressbooks* abs)
{
	std::cout << "请输入您要删除的联系人" << std::endl;

	std::string name;
	std::cin >> name;

	//ret == -1   没查到
	//ret != -1   查到了
	int ret = isExist(abs, name);

	if (ret != -1)
	{
		//查找到这个人要进行删除操作
		for (int i = ret; i < abs->m_Size; i++)
		{
			//数据迁移
			abs->personArray[i] = abs->personArray[i + 1];

		}
		abs->m_Size--;    //更新通讯录中的人员数
		std::cout << "删除成功" << std::endl;
	}
	else
	{
		std::cout << "没有找到该联系人" << std::endl;
	}

	system("pause");
	system("cls");
}


//4、查找指定的联系人信息
//功能描述:按照姓名查看指定联系人的信息
//查找联系人实现步骤
//⚪封装查找联系人函数
//⚪测试查找指定联系人
//

void findPerson(Addressbooks * abs)
{
	std::cout << "请输入您要查找的联系人" << std::endl;
	std::string name;
	std::cin >> name;

	//判断指定的联系人是否存在通讯录中

	int ret = isExist(abs, name);

	if (ret != -1)      //找到联系人
	{
		std::cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
		std::cout << "性别:" << abs->personArray[ret].m_Sex << "\t";
		std::cout << "年龄:" << abs->personArray[ret].m_Age << "\t";
		std::cout << "电话:" << abs->personArray[ret].m_Phone << "\t";
		std::cout << "地址:" << abs->personArray[ret].m_Addr << "\t";
	}
	else
	{
		std::cout << "没有找到该联系人" << std::endl;
	}

	system("pause");
	system("cls");
}


//5、修改联系人
//功能描述:按照姓名重新修改指定联系人
//修改联系人实现步骤:
//⚪封装修改联系人函数
//⚪测试修改联系人功能

void modifyPerson(Addressbooks* abs)
{
	std::cout << "请输入您要修改的联系人" << std::endl;
	std:: string name;
	std::cin >> name;

	int ret = isExist(abs, name);
	if (ret != -1)     //找到联系人
	{
		//姓名
		std::string name;
		std::cout << "请输入姓名" << std::endl;
		std::cin >> name;
		abs->personArray[ret].m_Name = name;
		//性别
		std::cout << "请输入性别" << std::endl;
		std::cout << "1 --- 男" << std::endl;
		std::cout << "2 --- 女" << std::endl;

		int sex = 0;

		while (true)
		{
			std::cin >> sex;

			if (sex == 1 || sex == 2)
			{
				//输入正确  退出循环
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			std::cout << "输入有误,请重新输入" << std::endl;
		}

		//年龄
		std::cout << "请输入年龄" << std::endl;
		int age = 0;
		std::cin >> age;
		abs->personArray[ret].m_Age = age;

		//电话
		std::cout << "请输入电话:" << std::endl;
		std::string phone;
		std::cin >> phone;
		abs->personArray[ret].m_Phone = phone;

		//住址
		std::cout << "请输入家庭住址" << std::endl;
		std::string address;
		std::cin >> address;
		abs->personArray[ret].m_Addr = address;

		std::cout << "修改成功" << std::endl;
		
	}
	else               //未找到联系人
	{
		std::cout << "未找到该联系人" << std::endl;
	}

	//按任意键后继续
	system("pause");
	system("cls");

}


//6、清空联系人
//功能描述:清空通讯录中所有信息
//清空联系人实现步骤
//⚪封装联系人函数
//⚪测试清空联系人
//实现思路:将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,做逻辑清空即可
void cleanPerson(Addressbooks* abs)
{
	abs->m_Size = 0;
	std::cout << "通讯录已清空" << std::endl;
	system("pause");
	system("cls");
}




int main()
{
	//创建通讯录结构体变量
	Addressbooks abs;
	//初始化通讯录中当前的人员个数
	abs.m_Size = 0;



	int select = 0;              //创建用户选择的变量

	while (true)
	{
		//菜单的调用
		showMenu();

		std::cin >> select;

		switch (select)
		{
		case 1:                  //添加联系人
			addPerson(&abs);     //利用地址传递可以修饰实参
			break;
		case 2:                  //显示联系人
			showPerson(&abs);
			break;
		case 3:                  //删除联系人
		//{
		//	std::cout << "请输入删除联系人姓名:" << std::endl;
		//	std::string name;
		//	std::cin >> name;

		//	if (isExist(&abs, name) == -1)
		//	{
		//		std::cout << "没有该联系人" << std::endl;
		//	}
		//	else
		//	{
		//		std::cout << "找到该联系人" << std::endl;
		//	}
		//}

			deletePerson(&abs);

			break;
		case 4:                  //查找联系人
			findPerson(&abs);
			break;
		case 5:                  //修改联系人
			modifyPerson(&abs);
			break;
		case 6:                  //清空联系人
			cleanPerson(&abs);
			break;
		case 0:                  //退出通讯录
			std::cout << "欢迎下次使用" << std::endl;
			system("pause");
			return 0;
			break;

		default:
			break;
		}



	}


	

	system("pause");
	system("cls");

	return 0;
}