设计菜单界面
1.通讯录实现多个功能,并且用户可以通过输入功能序号可以进入相应功能.--Switch语句
2.在使用完一个功能后可继续使用其他功能,保持系统不退出--while循环
菜单功能
int select = 0;//创建用户选择输入的变量
while (true)
{
showMenu();//调用菜单函数
cin >> select;
switch (select)
{
case 1://1.添加联系人
addperson(&abooks);
break;
case 2://2.显示联系人
showPerson(&abooks);
break;
case 3://3.删除联系人
deletePerson(&abooks);
break;
case 4://4.查找联系人
findPerson(&abooks);
break;
case 5://5.修改联系人
modifyPerson(&abooks);
break;
case 6://6.清空联系人
cleanPerson(&abooks);
break;
case 0://0.退出通讯录
cout << "欢迎下次使用" << endl;
return 0;
break;
default:
break;
}
菜单页面函数
void showMenu()
{
cout << "\t**************************" << endl;
cout << "\t***** 1.添加联系人 *****" << endl
<< "\t***** 2.显示联系人 *****" << endl
<< "\t***** 3.删除联系人 *****" << endl
<< "\t***** 4.查找联系人 *****" << endl
<< "\t***** 5.修改联系人 *****" << endl
<< "\t***** 6.清空联系人 *****" << endl
<< "\t***** 0.退出通讯录 *****" << endl;
cout << "\t**************************" << endl;
}
添加联系人
1.联系人是自定义的数据类型--使用结构体
2.联系人存在通讯录里--还需要定义通讯录结构体
3.定义添加联系人函数,将结构体作为参数传入函数
4.设置通讯录联系人上限,是否能添加联系人,要判断当前联系人个数是否超过上限
5.将输入的信息存放到通讯录中
以姓名为例
abooks->p[abooks->size].name = name;
解释:
将name赋值给 通讯录结构体变量访问联系人属性的地址(abooks->p[].name = name;);
通讯录结构体中的size属性是记录通讯录中联系人个数的,所以abooks->size可以知道当前赋值的是第几个联系人;
6.添加一个联系人后清屏再进行下一步
//定义联系人结构体
struct person
{
string name;
int sex;
int age;
string phone;
string addr;
};
//定义通讯录结构体
struct addressbooks
{
struct person p[MAX];
int size;
};
//1.添加联系人
void addperson(addressbooks *abooks )
{
if (abooks->size == MAX)
{
cout << "通讯录已满,无法添加!" << endl;
return;
}
else {
string name;
cout << "请输入姓名: " << endl;
cin >> name;
abooks->p[abooks->size].name = name;//将输入的信息放回通讯录里
cout << "请输入性别" << endl;
cout << "1-男" << endl;
cout << "2-女" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abooks->p[abooks->size].sex = sex;
break;
}
cout << "输入有误,请重新输入" << endl;
}
cout << "请输入年龄: " << endl;
int age = 0;
cin >> age;
abooks->p[abooks->size].age = age;
cout << "请输入电话: " << endl;
string phone;
cin >> phone;
abooks->p[abooks->size].phone = phone;
cout << "请输入家庭住址: " << endl;
string address;
cin >> address;
abooks->p[abooks->size].addr = address;
abooks->size++;
cout << "已添加成功" << endl;
system("pause");
system("cls");//清屏
}
}
显示联系人
1.定义显示联系人函数,将结构体作为参数传入函数
2.输出性别时,使用三目运算符
void showPerson(addressbooks* abooks)
{
if (abooks->size == 0)
{
cout << "当前记录为空" << endl;
}
else {
for (int i = 0; i < abooks->size; i++)
{
cout << "姓名: " << abooks->p[i].name << "\t";
cout << "性别: " << (abooks->p[i].sex == 1 ? "男" : "女") << "\t";
cout << "年龄: " << abooks->p[i].age << "\t";
cout << "电话: " << abooks->p[i].phone << "\t";
cout << "住址: " << abooks->p[i].addr << "\t" << endl;
}
}
system("pause");
system("cls");
}
删除联系人
查找到联系人
1.定义查找联系人函数,将通讯录结构体和联系人姓名作为参数传入函数
2.遍历通讯录结构体,如果找到此联系人返回此联系人的序号
int isExist(addressbooks* abooks, string name)
{
for (int i = 0; i < abooks->size; i++)
{
if (abooks->p[i].name == name)
{
return i;
}
}
return -1;
}
删除联系人
1.先通过查找联系人函数中的返回值,判断此联系人是否存在
2.遍历此联系人之后的所有联系人,把此联系人后一位的联系人信息覆盖到此联系人信息的位置,以此类推,将数据前移.
3.删除一位联系人之后,size--.
void deletePerson(addressbooks* abooks)
{
cout << "请输入您要删除的联系人" << endl;
string name;
cin >> name;
int ret = isExist(abooks, name);
if (ret != -1)
{
for (int i = ret; i < abooks->size; i++)
{
abooks->p[i] = abooks->p[i + 1];//数据前移
}
abooks->size--;
cout << "删除成功" << endl;
}
else
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
查找联系人
1.调用前面定义的查找联系人函数isExist,找到联系人
2.输出此联系人信息
3.ret是函数isExist的返回值即要查找的联系人序号
void findPerson(addressbooks* abooks)
{
cout << "请输入您要查找的联系人" << endl;
string name;
cin >> name;
int ret = isExist(abooks, name);
if (ret != -1)
{
cout << "姓名: " << abooks->p[ret].name << "\t";
cout << "性别: " << abooks->p[ret].sex << "\t";
cout << "年龄: " << abooks->p[ret].age << "\t";
cout << "电话: " << abooks->p[ret].phone << "\t";
cout << "住址: " << abooks->p[ret].addr << "\t" << endl;
}
else
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
修改联系人
1.将查找函数和添加联系人的操作结合
2.注意:赋值的时候数组p的下标是查找联系人时得到的返回值ret
void modifyPerson(addressbooks* abooks)
{
cout << "请输入您要修改的联系人" << endl;
string name;
cin >> name;
int ret = isExist(abooks, name);
if (ret != -1)
{
string name;
cout << "请输入姓名: " << endl;
cin >> name;
abooks->p[ret].name = name;
cout << "请输入性别" << endl;
cout << "1-男" << endl;
cout << "2-女" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abooks->p[ret].sex = sex;
break;
}
cout << "输入有误,请重新输入" << endl;
}
cout << "请输入年龄: " << endl;
int age = 0;
cin >> age;
abooks->p[ret].age = age;
cout << "请输入电话: " << endl;
string phone;
cin >> phone;
abooks->p[ret].phone = phone;
cout << "请输入家庭住址: " << endl;
string address;
cin >> address;
abooks->p[ret].addr = address;
cout << "已修改成功" << endl;
}
else
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
清空联系人
1.逻辑上的清空,即将联系人个数赋值为0.
void cleanPerson(addressbooks* abooks)
{
abooks->size = 0;
cout << "通讯录已清空" << endl;
system("pause");
system("cls");
}
main函数
1.设定通讯录最大容量1000人
2.在main函数里调用通讯录结构体
#include<iostream>
#include<string>
#define MAX 1000
using namespace std;
int main()
{
struct addressbooks abooks;//调用结构体
abooks.size = 0;//初始化联系人个数
int select = 0;//创建用户选择输入的变量
while (true)
{
showMenu();//调用菜单函数
cin >> select;
switch (select)
{
case 1://1.添加联系人
addperson(&abooks);
break;
case 2://2.显示联系人
showPerson(&abooks);
break;
case 3://3.删除联系人
deletePerson(&abooks);
break;
case 4://4.查找联系人
findPerson(&abooks);
break;
case 5://5.修改联系人
modifyPerson(&abooks);
break;
case 6://6.清空联系人
cleanPerson(&abooks);
break;
case 0://0.退出通讯录
cout << "欢迎下次使用" << endl;
return 0;
break;
default:
break;
}
}
return 0;
}