本文已参与「新人创作礼」活动,一起开启掘金创作之路。
老规矩,先上代码
#include <iostream>
using namespace std;
//添加联系人
#include <string> //string头文件
//联系人结构体
struct Person
{
string p_Name;
int P_Sex; //1-男、2-女
int P_Age;
string p_Phone;
string p_Address;
};
//通讯录结构体
#define MAX 1000 //方便维护(宏定义)
struct addressBooks
{
struct Person personArray[MAX];//通讯录中保存联系人的数组
int p_Size;//通讯录中人员个数
};
//菜单界面
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;
}
//添加联系人
void addPerson(addressBooks *abs) {
//判断通讯录是否满了
if (abs->p_Size == MAX) {
cout << "通讯录已满,无法添加" << endl;
return;
}
else {
//添加联系人
string name;
cout << "请输入姓名:" << endl;
cin >> name;
abs->personArray[abs->p_Size].p_Name = name;
int sex = 0;
cout << "请输入性别:" << endl;
cout << "1 --- 男" << endl;
cout << "2 --- 女" << endl;
while (true)
{//通过while循环让他无法输入错误值
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->personArray[abs->p_Size].P_Sex = sex;
break;
}
cout << "输入有误,请重新输入!" << endl;
}
int age = 0;
cout << "请输入年龄:" << endl;
while (true)
{
cin >> age;
if (age > 0 && age < 150)
{
abs->personArray[abs->p_Size].P_Age = age;
break;
}
cout << "输入有误,请重新输入!" << endl;
}
string phone;
cout << "请输入联系人电话:" << endl;
while (true)
{
cin >> phone;
if (phone.length() == 11) {
abs->personArray[abs->p_Size].p_Phone = phone;
break;
}
cout << "电话号码输入有误,请重新输入!" << endl;
}
string address;
cout << "请输入家庭住址:" << endl;
cin >> address;
abs->personArray[abs->p_Size].p_Address = address;
//更新通讯录人数
abs->p_Size++;
cout << "添加成功!" << endl;
system("pause");//按任意键继续
system("cls");//清屏操作
}
}
//显示联系人
void showPerson(addressBooks *abs) {
//判断通讯录是否为空
if (abs->p_Size == 0)
{
cout << "通讯录为空,无联系人记录!" << endl;
}
else
{
for (int i = 0; i < abs->p_Size; i++) {
//遍历数组
cout << "姓名:" << abs->personArray[i].p_Name << "\t";
cout << "性别:" << (abs->personArray[i].P_Sex == 1 ? "男" : "女")<< "\t";//三目运算
cout << "年龄:" << abs->personArray[i].P_Age << "\t";
cout << "电话号码:" << abs->personArray[i].p_Phone << "\t";
cout << "家庭住址:" << abs->personArray[i].p_Address << endl;
}
}
system("pause");//按任意键继续
system("cls");//清屏操作
}
//判断联系人是否存在
int isExist(addressBooks *abs, string name) {
//遍历通讯录数组中的所有人名是否和你输入的人名相同
for (int i = 0; i < abs->p_Size; i++) {
if (abs->personArray[i].p_Name == name) {
return i;//返回数组中的下标
}
}
return -1;//没找到
}
void deletePerson(addressBooks *abs) {
cout << "请输入你要删除的联系人:" << endl;
string name;
cin >> name;
int num = isExist(abs, name);//num != -1 --> 查到了
if (num != -1)
{
cout << "找到此人,进行删除操作!" << endl;
for (int i = num; i < abs->p_Size; i++)
{
//通过数据前移将要删除的数据进行覆盖来达到删除的目的(逻辑删除)
abs->personArray[i] = abs->personArray[i + 1];
}
//更新通讯录中的人员数
abs->p_Size--;
cout << "删除成功!" << endl;
}
else {
cout << "查无此人!" << endl;
}
system("pause");
system("cls");
}
//查找联系人
void findPerson(addressBooks *abs) {
string name;
cout << "请输入你要查找的联系人:" << endl;
cin >> name;
//判断它是否存在
int res = isExist(abs, name);
if (res != -1)
{
cout << "姓名:" << abs->personArray[res].p_Name << "\t";
cout << "性别:" << abs->personArray[res].P_Sex << "\t";
cout << "年龄:" << abs->personArray[res].P_Age << "\t";
cout << "电话号码:" << abs->personArray[res].p_Phone << "\t";
cout << "家庭住址:" << abs->personArray[res].p_Address << endl;
}
else
{
cout << "未找到此联系人!" << endl;
}
system("pause");
system("cls");
}
void modifyPerson(addressBooks *abs) {
cout << "请输入你要修改的联系人名字:" << endl;
string name;
cin >> name;
int num = isExist(abs, name);
if (num != -1) {
//找到此联系人
string name;
cout << "请输入姓名:" << endl;
cin >> name;
abs->personArray[num].p_Name = name;
int sex = 0;
cout << "请输入联系人性别:" << endl;
cout << "1->男" << endl;
cout << "2->女" << endl;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2) {
abs->personArray[num].P_Sex = sex;
break;
}
cout << "输入有误,请重新输入!" << endl;
}
int age = 0;
cout << "请输入联系人年龄:" << endl;
while (true)
{
cin >> age;
if (age > 0 && age < 150)
{
abs->personArray[num].P_Age = age;
break;
}
cout << "输入年龄有误,请重新输入!" << endl;
}
string phone;
cout << "请输入联系人电话号码:" << endl;
while (true)
{
cin >> phone;
if (phone.length() == 11)
{
abs->personArray[num].p_Phone = phone;
break;
}
cout << "电话号码输入有误!" << endl;
}
string address;
cout << "请输入联系人家庭住址!" << endl;
cin >> address;
abs->personArray[num].p_Address = address;
//修改成功!
cout << "修改成功!" << endl;
}
else
{
cout << "查无此人!" << endl;
}
system("pause");
system("cls");
}
//清空联系人
void cleanPerson(addressBooks *abs) {
cout << "你确定要清空所有联系人吗?" << endl;
int num = 0;
while (true)
{
cin >> num;
if (num == 1)
{
abs->p_Size = 0;
cout << "通讯录已清空!" << endl;
break;
}
else
break;
}
system("pause");
system("cls");
}
//退出通讯录系统
int main() {
//创建通讯录结构体变量
addressBooks abs;
abs.p_Size = 0;//初始化通讯录当前人员个数
int select = 0;//创建用户选择需要输入的变量
while (true)//通过while循环让它一直在我们的菜单里运行
{
//调用菜单
showMenu();
cin >> select;//用户输入
switch (select)
{
case 1://添加联系人
addPerson(&abs);//利用地址传递
break;
case 2://显示联系人
showPerson(&abs);
break;
case 3://删除联系人
deletePerson(&abs);
break;
case 4://查找联系人
findPerson(&abs);
break;
case 5://修改联系人
modifyPerson(&abs);
break;
case 6://删除所有联系人
cleanPerson(&abs);
break;
case 0://退出通讯录
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
system("pause");
return 0;
}
说说思路 我们的通讯录管理系统所需要的功能有7个,分别是增删改查,显示、清空和退出通讯录。 首先我们把菜单界面和退出功能给整出来 界面用cout/printf写就可以,退出功能我们使用switch语句将它表示出来
//菜单界面
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;
}
int main() {
//创建通讯录结构体变量
addressBooks abs;
abs.p_Size = 0;//初始化通讯录当前人员个数
int select = 0;//创建用户选择需要输入的变量
while (true)//通过while循环让它一直在我们的菜单里运行
{
//调用菜单
showMenu();
cin >> select;//用户输入
switch (select)
{
case 1://添加联系人
break;
case 2://显示联系人
break;
case 3://删除联系人
break;
case 4://查找联系人
break;
case 5://修改联系人
break;
case 6://删除所有联系人
break;
case 0://退出通讯录
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
system("pause");
return 0;
}
如何实现添加联系人进入通讯录的功能,这里我们用到的是结构体,我们创建了两个结构体(联系人结构体和通讯录结构体)
#include <string> //string头文件
//联系人结构体
struct Person
{
string p_Name;
int P_Sex; //1-男、2-女
int P_Age;
string p_Phone;
string p_Address;
};
//通讯录结构体
#define MAX 1000 //方便维护(宏定义)
struct addressBooks
{
struct Person personArray[MAX];//通讯录中保存联系人的数组
int p_Size;//通讯录中人员个数
};
1、添加联系人 联系人里面有五个元素,分别将它们加入通讯录的联系人中 首先要判断通讯录是否已经满了,如果满了,则输出通讯录已满,无法添加,然后返回到菜单;否则开始添加姓名,性别等五个元素。 这里面比较难搞的就是性别,我们用1代表男,2代表女,其他的任何字符我们都输出输入错误,并重新输入(用的while循环嵌套if语句),直到输入正确为止,搞定了性别,其他的元素依葫芦画瓢就可以完成了。 ==需要注意的是==这里的电话号码使用了一个函数:length 来确保电话号码为11位数字 最后不要忘记让size++;更新通讯录人数。 2、显示联系人 先判断通讯录是否为空,为空则输出通讯录为空,并范围菜单;若不为空则通过for循环遍历数组,来输出数组中所有元素内容。 值得一提的是,这里用到了三目运算符来输出性别,由于运算符优先级关系,我们需要用到括号(==不记得优先级的小伙伴最好还是都打上括号==) 3、删除、查看和修改联系人都需要先判断联系人是否在通讯录存在,所以我们可以用一个函数来判断通讯录中是否存在该联系人用for循环来遍历数组,判断数组中是否有该联系人的名字,若有则输出该联系人的数组下标,否则返回-1,回到菜单 4、==来到了这个项目中最关键的位置==
//通过数据前移将要删除的数据进行覆盖来达到删除的目的(逻辑删除)
abs->personArray[i] = abs->personArray[i + 1];
你需要理解它是如何达到删除数据的功能(其他的都挺好解决的) 5、清空联系人 这个功能好解决,但是嘞,我们多添加了一个功能,比较人性化,使用if语句来最后询问通讯录所有者最后一次,是否需要全部清空,选1则确定清空,其他的就返回菜单
这里用到的 system("pause"); system("cls"); 是为了这个面板看起来会简洁一点,不用一直用鼠标上下滑动。
这就是所有我认为需要全部讲清楚的位置了,其他不理解的可以多思考一下,注释全部摆在上面了,希望能对大家起到部分作用。
下面是一些运行的界面