1.写头文件和main框架
#include<iostream>
#include<string>
using namespace std;
int main()
{
system("pause");
return 0;
}
2.搭建大体框架,显示菜单和根据用户输入的选项执行对应命令,为了语言的简洁,此处选用了switch...case,也可以用if...else
先来创建一个显示菜单的函数,showmenu,无返回值用void
void showmenu()
{
cout << "*******************************" << endl;
cout << "***** 1.添加联系人 *****" << endl;
cout << "***** 2.显示联系人 *****" << endl;
cout << "***** 3.删除联系人 *****" << endl;
cout << "***** 4.查找联系人 *****" << endl;
cout << "***** 5.修改联系人 *****" << endl;
cout << "***** 6.清空联系人 *****" << endl;
cout << "***** 0.退出通讯录 *****" << endl;
cout << "*******************************" << endl;
}
main函数里的选择,因为要反复在屏幕中出现,所以创建了只有break能解开的死循环while(true),或者while(1)//正数 也是可以的
switch...case 限制用户输出功能范围超出范围则返回default内容,提示用户
顺便实现退出通讯录的功能
int main()
{
int select = 0;//创建用户选择输入的量
//创建通讯录结构体变量
while (true)
{
showmenu();//调用展示菜单的函数
cin >> select;//用户输入的选项
switch (select)
{
case 1://01.添加联系人
break;
case 2://02.显示联系人
break;
case 3://03.删除联系人
{
break;
}
case 4://04.查找联系人
break;
case 5:// 05.修改联系人
break;
case 6://06.清空联系人
break;
case 0://0.退出通讯录
system("pause");
return 0;//实现真正的退出
default:
cout << "超出范围啦!" << endl;
cout << "请重新输入0——6的整数哦" << endl;
break;
}
}
}
2.创建通讯录人员和通讯录整个大框架的结构体,我们拟创建一个容量为1000个人的通讯录
#define MAX 1000//宏定义通讯里容量
//添加联系人
//1.设计联系人结构体
struct person
{
string p_name;//联系人姓名
int p_sex{};//性别,1,男,2,女
int p_age{};//年龄
string p_phone;//电话号码为一个11位数的数组
string p_address;//联系人住址
};
//2.设计通讯录结构体
struct adressbooks
{
//通讯录中保存的联系人的数组
struct person personArr[MAX];
//通讯录中当前联系人的个数
int p_size;//而不是struct person p_size; 只是单纯地记录整数
};
3.在main中创建相应变量,方便以后访问,并且将当前通讯录人数初始化为0
//创建通讯录结构体变量
struct adressbooks abs;//不用值传递,要用地址改实参
abs.p_size = 0;//初始化当前人数为0
4.思考一下,我们应该使用函数的值传递还是地址传递,值传递是不会改变实参的,也就是说,如果使用值传递,则我们switch...case中的后续输出以及abs不会的到改变,相当于白忙活,所以我们在创建接下来的需要用到的函数的时候要使用值传递
第一个功能,添加联系人函数封装及代码如下,带注释,这里不做过多赘述
void addPerson(adressbooks * abs)
{
if (abs->p_size < MAX)
{
string name;
cout << "请输入联系人姓名:" << endl;
cin >> name;
abs->personArr[abs->p_size].p_name = name;
int sex;
cout << "请输入联系人性别:1---男,2---女" << endl;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArr[abs->p_size].p_sex = sex;
break;
}
else
{
cout << "性别输入有误,请重新输入" << endl;
}
}
int age;
cout << "请输入联系人年龄" << endl;
cin >> age;
abs->personArr[abs->p_size].p_age = age;
string phoneArr;
cout << "请输入联系人电话" << endl;
cin >> phoneArr;
abs->personArr[abs->p_size].p_phone = phoneArr;
//用循环限制用户输入的数组长度,出现左值错误,故注释掉
//int p_len = end(phoneArr) - begin(phoneArr);
//while (true)//限制用户输入
//{
// cin >> phoneArr[phoneMAX];
// if(p_len ==3||p_len==11)
// {
// abs->personArr[abs->p_size].p_phone[phoneMAX] = phoneArr[phoneMAX];
// break;
// }
// else
// {
// cout << "输入有误,请重新输入!" << endl;
// }
//}
string address;
cout << "请输入联系人地址" << endl;
cin >> address;
abs->personArr[abs->p_size].p_address = address;
abs->p_size++;
cout << "添加成功" << endl;
}
else
{
cout << "联系人已满,请删除部分联系人后再执行此操作!" << endl;
}
system("pause");
system("cls");
//注意语句,不要包含在while里面否则会陷入死循环,这种还不容易被发现
}
调用
case 1://01.添加联系人
addPerson(&abs);//利用地址传递在函数的形参中修饰实参
break;
5.显示联系人功能函数封装及调用
void showPerson(adressbooks*abs)
{
if (abs->p_size == 0)
{
cout << "联系人为空,要先添加联系人才能执行此操作哦" << endl;
}
else
{
for (int i = 0; i < abs->p_size; i++)
{
cout << "姓名:" << abs->personArr[i].p_name << endl;
cout << "性别:" << (abs->personArr[i].p_sex == 1 ? "男" : "女") << endl;
cout << "年龄:" << abs->personArr[i].p_age << endl;
cout << "电话:" << abs->personArr[i].p_phone << endl;
cout << "地址:" << abs->personArr[i].p_address << endl;
}
}
system("pause");
system("cls");
}
case 2://02.显示联系人
showPerson(&abs);
break;
6.接下来的查找,删除,修改功能,都有一个基础,就是是不是能找到这个人,如果能找到,就返回被查找人所在的位置,否则就要返回一个值,一般用-1
因为有返回值所以,封装此函数的时候不能用无返回值的void
//判断联系人,中转函数
int isExist(adressbooks*person, string name)
{
for (int i = 0; i < person->p_size; i++)
{
if (person->personArr[i].p_name == name)
{
return i;//返回被检索的人所在位置
}
}
return -1;//否则返回-1
}
7.删除联系人函数封装及调用
//删除联系人
void deletePerson(adressbooks*person)
{
string name;
cout << "请输入您要删除的联系人的姓名!" << endl;
cin >> name;
int exist = isExist(person, name);
if (exist != -1)//如果isExit返回值不是-1,也就是能找到该联系人
{
for (int i = exist; i < person->p_size; i++)
{
{
person->personArr[i] = person->personArr[i + 1];
}
}
(person->p_size)--;//内存减一
cout << "删除成功!" << endl;
}
else
{
cout << "没有这个人!" << endl;
}
system("pause");
system("cls");
}
调用
case 3://03.删除联系人
deletePerson(&abs);
break;
8.查找联系人
void findPerson(adressbooks*abs)
{
string name;
cout << "请输入您要查找的联系人姓名:" << endl;
cin >> name;
int exist = isExist(abs,name);
if (exist != -1)
{
cout << "该联系人信息如下:" << endl;
cout << "姓名:" << abs->personArr[exist].p_name << " "
<< "性别:" << (abs->personArr[exist].p_sex==1?"男":"女")<< " "
<< "年龄:" << abs->personArr[exist].p_age << " "
<< "电话:" << abs->personArr[exist].p_phone<<" "
<< "地址:" << abs->personArr[exist].p_address << endl;
}
else
{
cout << "没有找到该联系人!" << endl;
}
system("pause");
system("cls");
}
调用
case 4://04.查找联系人
findPerson(&abs);
break;
9.修改联系人
函数
void mosifyPerson(adressbooks*abs)
{
string name;
cout << "请输入您要修改的联系人的姓名: ";
cin >> name;
int exist = isExist(abs, name);
if (exist != -1)
{
string mosifyName;
cout << "请输入您修改后的联系人姓名:";
cin >> mosifyName;
abs->personArr[abs->p_size].p_name = mosifyName;
while (true)//性别输入,循环,限制用户输入,1,2,男女
{
int mosifySex;
cout << "请输入您修改后的联系人性别" << "1--男,2--女" << " ";
cin >> mosifySex;
if (mosifySex == 1 || mosifySex == 2)
{
abs->personArr[abs->p_size].p_sex = mosifySex;
}
else
{
cout << "输入有误,请重新输入!" << endl;
}
}
int mosifyAge;
cout << "请输入您修改后的联系人年龄:" << " ";
cin >> mosifyAge;
abs->personArr[abs->p_size].p_age = mosifyAge;
string mosifyPhone;
cout << "请输入您修改后的联系人电话:" << " ";
cin >> mosifyPhone;
abs->personArr[abs->p_size].p_phone = mosifyPhone;
string mosifyAddress;
cout << "请输入您修改后的联系人地址:" << " ";
cin >> mosifyAddress;
abs->personArr[abs->p_size].p_address = mosifyAddress;
}
else
{
cout << "未找到需要修改的联系人" << endl;
}
system("pause");
system("cls");
}
调用
case 5:// 05.修改联系人
mosifyPerson(&abs);
break;
10.清空通讯录
函数封装
//清空联系人
void emptyPerson(adressbooks*abs)
{
string ensure;
cout << "您确定要清空所有联系人么,此操作不可逆,如需清空,请输入“我同意”三个字执行" << endl;
cin >> ensure;
if (ensure == "我同意")
{
abs->p_size = 0;
cout << "联系人已清空!" << endl;
}
else
{
cout << "您撤销了清空联系人操作!" << endl;
}
system("pause");
system("cls");//清空子选项内容,main菜单不清空
}
调用
case 6://06.清空联系人
emptyPerson(&abs);
break;
至此,通讯录管理系统所有功能已封装完毕,最后一步就是执行啦,执行结果如下
所有代码如下,当然也可以把所有函数放在一个.h的头文件里,这样主程序就会非常清爽
#include<iostream>
#include<string>
using namespace std;
#define MAX 1000//宏定义一个最大添加人数为1000的通讯录内存量,不用分号,否则报错
#define phoneMAX 12//宏定义电话号码最大长度
//菜单界面
void showmenu()
{
cout << "*******************************" << endl;
cout << "***** 1.添加联系人 *****" << endl;
cout << "***** 2.显示联系人 *****" << endl;
cout << "***** 3.删除联系人 *****" << endl;
cout << "***** 4.查找联系人 *****" << endl;
cout << "***** 5.修改联系人 *****" << endl;
cout << "***** 6.清空联系人 *****" << endl;
cout << "***** 0.退出通讯录 *****" << endl;
cout << "*******************************" << endl;
}
//添加联系人
//1.设计联系人结构体
struct person
{
string p_name;//联系人姓名
int p_sex{};//性别,1,男,2,女
int p_age{};//年龄
string p_phone;//电话号码为一个11位数的数组
string p_address;//联系人住址
};
//2.设计通讯录结构体
struct adressbooks
{
//通讯录中保存的联系人的数组
struct person personArr[MAX];
//通讯录中当前联系人的个数
int p_size;//而不是struct person p_size; 只是单纯地记录整数
};
//3.main函数中创建通讯录
//4.封装添加联系人函数
void addPerson(adressbooks * abs)
{
if (abs->p_size < MAX)
{
string name;
cout << "请输入联系人姓名:" << endl;
cin >> name;
abs->personArr[abs->p_size].p_name = name;
int sex;
cout << "请输入联系人性别:1---男,2---女" << endl;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArr[abs->p_size].p_sex = sex;
break;
}
else
{
cout << "性别输入有误,请重新输入" << endl;
}
}
int age;
cout << "请输入联系人年龄" << endl;
cin >> age;
abs->personArr[abs->p_size].p_age = age;
string phoneArr;
cout << "请输入联系人电话" << endl;
cin >> phoneArr;
abs->personArr[abs->p_size].p_phone = phoneArr;
//用循环限制用户输入的数组长度,出现左值错误,故注释掉
//int p_len = end(phoneArr) - begin(phoneArr);
//while (true)//限制用户输入
//{
// cin >> phoneArr[phoneMAX];
// if(p_len ==3||p_len==11)
// {
// abs->personArr[abs->p_size].p_phone[phoneMAX] = phoneArr[phoneMAX];
// break;
// }
// else
// {
// cout << "输入有误,请重新输入!" << endl;
// }
//}
string address;
cout << "请输入联系人地址" << endl;
cin >> address;
abs->personArr[abs->p_size].p_address = address;
abs->p_size++;
cout << "添加成功" << endl;
}
else
{
cout << "联系人已满,请删除部分联系人后再执行此操作!" << endl;
}
system("pause");
system("cls");
//注意语句,不要包含在while里面否则会陷入死循环,这种还不容易被发现
}
//显示联系人
void showPerson(adressbooks*abs)
{
if (abs->p_size == 0)
{
cout << "联系人为空,要先添加联系人才能执行此操作哦" << endl;
}
else
{
for (int i = 0; i < abs->p_size; i++)
{
cout << "姓名:" << abs->personArr[i].p_name << endl;
cout << "性别:" << (abs->personArr[i].p_sex == 1 ? "男" : "女") << endl;
cout << "年龄:" << abs->personArr[i].p_age << endl;
cout << "电话:" << abs->personArr[i].p_phone << endl;
cout << "地址:" << abs->personArr[i].p_address << endl;
}
}
system("pause");
system("cls");
}
//判断联系人,中转函数
int isExist(adressbooks*person, string name)
{
for (int i = 0; i < person->p_size; i++)
{
if (person->personArr[i].p_name == name)
{
return i;//返回被检索的人所在位置
}
}
return -1;//否则返回-1
}
//删除联系人
void deletePerson(adressbooks*person)
{
string name;
cout << "请输入您要删除的联系人的姓名!" << endl;
cin >> name;
int exist = isExist(person, name);
if (exist != -1)//如果isExit返回值不是-1,也就是能找到该联系人
{
for (int i = exist; i < person->p_size; i++)
{
{
person->personArr[i] = person->personArr[i + 1];
}
}
(person->p_size)--;//内存减一
cout << "删除成功!" << endl;
}
else
{
cout << "没有这个人!" << endl;
}
system("pause");
system("cls");
}
//查找联系人
void findPerson(adressbooks*abs)
{
string name;
cout << "请输入您要查找的联系人姓名:" << endl;
cin >> name;
int exist = isExist(abs,name);
if (exist != -1)
{
cout << "该联系人信息如下:" << endl;
cout << "姓名:" << abs->personArr[exist].p_name << " "
<< "性别:" << (abs->personArr[exist].p_sex==1?"男":"女")<< " "
<< "年龄:" << abs->personArr[exist].p_age << " "
<< "电话:" << abs->personArr[exist].p_phone<<" "
<< "地址:" << abs->personArr[exist].p_address << endl;
}
else
{
cout << "没有找到该联系人!" << endl;
}
system("pause");
system("cls");
}
//修改联系人功能函数封装
void mosifyPerson(adressbooks*abs)
{
string name;
cout << "请输入您要修改的联系人的姓名: ";
cin >> name;
int exist = isExist(abs, name);
if (exist != -1)
{
string mosifyName;
cout << "请输入您修改后的联系人姓名:";
cin >> mosifyName;
abs->personArr[abs->p_size].p_name = mosifyName;
while (true)//性别输入,循环,限制用户输入,1,2,男女
{
int mosifySex;
cout << "请输入您修改后的联系人性别" << "1--男,2--女" << " ";
cin >> mosifySex;
if (mosifySex == 1 || mosifySex == 2)
{
abs->personArr[abs->p_size].p_sex = mosifySex;
}
else
{
cout << "输入有误,请重新输入!" << endl;
}
}
int mosifyAge;
cout << "请输入您修改后的联系人年龄:" << " ";
cin >> mosifyAge;
abs->personArr[abs->p_size].p_age = mosifyAge;
string mosifyPhone;
cout << "请输入您修改后的联系人电话:" << " ";
cin >> mosifyPhone;
abs->personArr[abs->p_size].p_phone = mosifyPhone;
string mosifyAddress;
cout << "请输入您修改后的联系人地址:" << " ";
cin >> mosifyAddress;
abs->personArr[abs->p_size].p_address = mosifyAddress;
}
else
{
cout << "未找到需要修改的联系人" << endl;
}
system("pause");
system("cls");
}
//清空联系人
void emptyPerson(adressbooks*abs)
{
string ensure;
cout << "您确定要清空所有联系人么,此操作不可逆,如需清空,请输入“我同意”三个字执行" << endl;
cin >> ensure;
if (ensure == "我同意")
{
abs->p_size = 0;
cout << "联系人已清空!" << endl;
}
else
{
cout << "您撤销了清空联系人操作!" << endl;
}
system("pause");
system("cls");//清空子选项内容,main菜单不清空
}
int main()
{
int select = 0;//创建用户选择输入的量
//创建通讯录结构体变量
struct adressbooks abs;//不用值传递,要用地址改实参
abs.p_size = 0;//初始化当前人数为0
while (true)
{
showmenu();//调用展示菜单的函数
cin >> select;//用户输入的选项
switch (select)
{
case 1://01.添加联系人
addPerson(&abs);//利用地址传递在函数的形参中修饰实参
break;
case 2://02.显示联系人
showPerson(&abs);
break;
case 3://03.删除联系人
deletePerson(&abs);
break;
case 4://04.查找联系人
findPerson(&abs);
break;
case 5:// 05.修改联系人
mosifyPerson(&abs);
break;
case 6://06.清空联系人
emptyPerson(&abs);
break;
case 0://0.退出通讯录
cout << "欢迎下次使用!" << endl;
system("pause");
return 0;//实现真正的退出
default:
cout << "超出范围啦!" << endl;
cout << "请重新输入0——6的整数哦" << endl;
break;
}
}
}