#include <iostream>
#include <string>
#include "ShowMenu.h"
using namespace std;

#define PERMAX 20
#define FILENAME "file.txt"

struct Person
{
string m_Name;
int m_Age;
int m_Sex;
string m_Phone;
string m_Addr;
};

class Addressbooks
{
public:
Person personaddr[PERMAX];
int m_Size;

public:
bool AddrPerson(Addressbooks* addr);
bool ShowPerson(Addressbooks* addr);
int isExits(Addressbooks* addr, string name);
//int isExits(Addressbooks* addr, string phone);
bool DelPerson(Addressbooks* addr);
bool FindPerson(Addressbooks* addr);
bool ModifiPerson(Addressbooks* addr);
bool ClearPerson(Addressbooks* addr);
};



//1、添加联系人
bool Addressbooks::AddrPerson(Addressbooks *addr)
{
//判断通讯录是否已满,如果满了就不再添加
if (addr->m_Size == PERMAX)
{
cout << "通讯录满了,无法添加" << endl;
return false;
}
else
{
//添加联系人
string name;
cout << "请输入姓名>";
cin >> name;
addr->personaddr[addr->m_Size].m_Name = name;
//姓名
int sex = 0;
while (true)
{
cout << "请输入性别(1 -- 男 2 -- 女)>";
//如果输入1或者2可以退出循环,如果有误就重新输入
cin >> sex;
if (sex == 1 || sex == 2)
{
addr->personaddr[addr->m_Size].m_Sex = sex;
break;
}
cout << "输入有误,请从新输入!" << endl;
}
//年龄
cout << "请输入年龄>";
int age;
cin >> age;
addr->personaddr[addr->m_Size].m_Age = age;
//电话
string phone;
while (true)
{
cout << "请输入电话>";
cin >> phone;
if (phone.length() != NULL)
{
addr->personaddr[addr->m_Size].m_Phone = phone;
break;
}
cout << "输入有误,请从新输入!" << endl;
}
//住址
cout << "请输入联系地址>";
string m_Addr;
cin >> m_Addr;
addr->personaddr[addr->m_Size].m_Addr = m_Addr;
addr->m_Size++;
cout << "添加成功" << endl;
}
return true;
}

//显示联系人
bool Addressbooks::ShowPerson(Addressbooks* addr)
{
if (addr->m_Size!=0)
{
for (int i = 0;i<addr->m_Size;i++)
{
addr->personaddr[i];
cout << "姓名:" << addr->personaddr[i].m_Name << "\t";
cout << "年龄:" << addr->personaddr[i].m_Age << "\t";
cout << "性别:" << (addr->personaddr[i].m_Sex == 1 ? "男" : "女") << "\t";
cout << "电话:" << addr->personaddr[i].m_Phone << "\t";
cout << "地址:" << addr->personaddr[i].m_Addr << "\n";
}
return true;
}
cout << "联系人为空" << endl;
return false;
}

//判断人员是否存在
int Addressbooks::isExits(Addressbooks* addr ,string name)
{
for (int i = 0; i < addr->m_Size; i++)
{
if (addr->personaddr[i].m_Name == name)
{
return i;
}
}
return -1;
}


//删除联系人
bool Addressbooks::DelPerson(Addressbooks* addr)
{
if (addr == 0)
{
cout << "联系人为空" << endl;
return false;
}
else
{
string name;
cout << "请输入联系人>";
cin >> name;
int ret = isExits(addr, name);
if (ret == -1)
{
cout << "查无此人,删除失败" << endl;
return false;
}
else
{
for (int i = ret; i < addr->m_Size; i++)
{
addr->personaddr[i] = addr->personaddr[i + 1];
}
addr->m_Size--;
cout << "删除成功" << endl;
}
return true;
}
}

//查找联系人
bool Addressbooks::FindPerson(Addressbooks* addr)
{
string name;
cout << "请输入联系人>";
cin >> name;
int ret = isExits(addr, name);
if (ret == -1)
{
cout << "查无此人,删除失败" << endl;
return false;
}
else
{
cout << "姓名:" << addr->personaddr[ret].m_Name << "\t";
cout << "年龄:" << addr->personaddr[ret].m_Age << "\t";
cout << "性别:" << (addr->personaddr[ret].m_Sex == 1 ? "男" : "女") << "\t";
cout << "电话:" << addr->personaddr[ret].m_Phone << "\t";
cout << "地址:" << addr->personaddr[ret].m_Addr << "\n";
}
return false;
}

//修改联系人
bool Addressbooks::ModifiPerson(Addressbooks* addr)
{
string name;
cout << "请输入联系人>";
cin >> name;
int ret = isExits(addr, name);
if (ret == -1)
{
cout << "查无此人,删除失败" << endl;
return false;
}
else
{
cout << "请选项修改联系人信息>" << endl;
ShowMenu::ShowPerMenu();
int num;
cin >> num;
switch (num)
{
case 1:
cout << "输入新的姓名>";
cin >> addr->personaddr[ret].m_Name;
break;
case 2:
cout << "输入新的年龄>";
cin >> addr->personaddr[ret].m_Age;
break;
case 3:
cout << "输入新的性别(1 -- 男 2 -- 女)>";
cin >> addr->personaddr[ret].m_Sex;
break;
case 4:
cout << "输入新的电话>";
cin >> addr->personaddr[ret].m_Phone;
break;
case 5:
cout << "输入新的住址>";
cin >> addr->personaddr[ret].m_Addr;
break;
case 0:
cout << "输入新的姓名>";
cin >> addr->personaddr[ret].m_Name;
cout << "输入新的年龄>";
cin >> addr->personaddr[ret].m_Age;
cout << "输入新的性别(1 -- 男 2 -- 女)>";
cin >> addr->personaddr[ret].m_Sex;
cout << "输入新的电话>";
cin >> addr->personaddr[ret].m_Phone;
cout << "输入新的住址>";
cin >> addr->personaddr[ret].m_Addr;
break;
default:
cout << "错误的输入" << endl;
break;
}
cout << "修改成功!" << endl;
}
return true;
}

bool Addressbooks::ClearPerson(Addressbooks* addr)
{
if (addr->m_Size != 0)
{
addr->m_Size = 0;
cout << "通讯录已清空" << endl;
return true;
}
else
{
cout << "通讯录为空" << endl;
return false;
}
}

int main()
{
int num;
Addressbooks addr;
addr.m_Size = 0;
do
{
ShowMenu();
cout << "请输入选项>";
cin >> num;
switch (num)
{
case MY_ADD:
addr.AddrPerson(&addr);//利用地址传递可以修饰实参
break;
case MY_SHOW:
addr.ShowPerson(&addr);
break;
case MY_DEL:
addr.DelPerson(&addr);
break;
case MY_FIND:
addr.FindPerson(&addr);
break;
case MY_MODIFI:
addr.ModifiPerson(&addr);
break;
case MY_CLEAR:
addr.ClearPerson(&addr);
break;
case MY_EXIT:
cout << "成功退出!欢迎下次使用" << endl;
break;
default:
cout << "功能未录入请重新确认选择!" << endl;
break;
}
} while (num!=0);
return 0;
}