此代码可配合,b站c++黑马程序员p72理解
建议学习完函数,结构体,指针后再来学习通讯录系统也就是增删改查!
相关链接:
1.全部的代码
#include <iostream>
#include <stdio.h>
#include <string>
#define MAX 1000//最大人数
using namespace std;
//通讯录管理系统是一个可以记录亲人,好友信息的工具。
//需要实现的功能如下
//添加联系人:向通讯录中添加新人,信息包括(姓名,性别,年龄,联系电话,家庭住址)最多记录1000人
//显示联系人
//删除联系人
//查找联系人
//修改联系人
//清空联系人
//退出通讯录
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;
}
struct person//联系人结构体
{
string m_name;//名字
int m_sex;//性别 1 男,2 女
int m_age;//年龄
string m_phone;//电话
string m_addr;//住址
};
struct addresbooks//通讯录结构体
{
struct person array[MAX];//通讯录中保存的联系人数组
int m_size;//通讯录中人员个数
};
void addperson(addresbooks *abs)//添加联系人
{
//判断通讯录是否已满
if (abs->m_size == MAX)
{
cout << "通讯录已满,无法添加!" << endl;
return;
}
else
{
//添加具体联系人
//名字
string name;
cout << "请输入姓名:" << endl;
cin >> name;
abs->array[abs->m_size].m_name = name;
//性别
cout << "请输入性别:" << endl;
cout << "1----男" << endl;
cout << "2----女" << endl;
int sex = 0;
while (true)
{
//如果输入的是1或2可以退出循环,因为输入的是正确的
//如果输入有误,重新输入
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->array[abs->m_size].m_sex = sex;
break;
}
cout << "输入有误,请重新输入" << endl;
}
//年龄
cout << "请输入年龄:" << endl;
int age = 0;
cin >> age;
abs->array[abs->m_size].m_age = age;
//电话
cout << "请输入联系电话:" << endl;
string phone;
cin >> phone;
abs->array[abs->m_size].m_phone=phone;
//住址
cout << "请输入家庭地址:" << endl;
string addr;
cin >> addr;
abs->array[abs->m_size].m_addr=addr;
//更新通讯录人数
abs->m_size++;
cout << "添加成功" << endl;
system("pause");//按任意键继续
system("cls");//清屏
}
}
//显示联系人
void showoerson(addresbooks * abs)
{
if (abs->m_size == 0)
{
cout << "当前记录为空" << endl;
}
else
{
for (int i = 0; i < abs->m_size; i++)//m_size人数个数
{
cout << "姓名:" << abs->array[i].m_name << "\t";// "\t"代表空8格
cout << "性别:" << (abs->array[i].m_sex ==1?"男":"女" )<< "\t";//如果输入的是1则输出男,不是则输出女
cout << "年龄:" << abs->array[i].m_age << "\t";
cout << "电话:" << abs->array[i].m_phone << "\t";
cout << "家庭住址:" << abs->array[i].m_addr << endl;
}
}
system("pause");//按任意键继续
system("cls");//清屏
}
//检测联系人是否存在,如果存在,返回联系人所在数组中的具体位置,不存在返回-1
//参数1 通讯录 参数2 对比姓名
int isExist(addresbooks* abs,string name)
{
for (int i = 0; i < abs->m_size; i++)
{
//找到用户输入的姓名了
if (abs->array[i].m_name == name)
{
return i;//找到了,返回这个人在数组中的下表编号
}
}
return -1;//如果遍历结束都没有找到,返回-1
}
//删除指定联系人
void deletepersone(addresbooks * abs)
{
cout << "请输入您要删除的联系人" << endl;
string name;
cin >> name;
//ret==-1 未查到
//ret!=-1 查到了
int ret=isExist(abs, name);
if (ret != -1)
{
for (int i = ret; i < abs->m_size; i++)
{
//数据前移
abs->array[i] = abs->array[i + 1];
}
abs->m_size--;//更新通讯录中的人数
cout << "删除成功" << endl;
}
else
{
cout << "查无此人" << endl;
}
system("pause");//按任意键继续
system("cls");//清屏
}
//查找联系人
void findperson(addresbooks* abs)
{
cout << "请输入您要查找的联系人" << endl;
string name;
cin >> name;
//判断指定的联系人是否存在
int ret = isExist(abs, name);
if (ret != -1)
{
//找到了
cout << "姓名:" << abs->array[ret].m_name << "\t";
cout << "性别:" << abs->array[ret].m_sex << "\t";
cout << "年龄:" << abs->array[ret].m_age << "\t";
cout << "电话:" << abs->array[ret].m_phone << "\t";
cout << "住址:" << abs->array[ret].m_addr << endl;
}
else//未找到联系人
{
cout << "未找到此人" << endl;
}
system("pause");//按任意键继续
system("cls");//清屏
}
//修改联系人
void modifyperson(addresbooks* abs)
{
cout << "请输入您要修改的联系人" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret != -1)//找到指定联系人
{
//姓名
string name;
cout << "请输入姓名;" << endl;
cin >> name;
abs->array[ret].m_name = name;
//性别
cout << "请输入性别:" << endl;
cout << "1---男" << endl;
cout << "2---女" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
//输入正确 退出循环输入
abs->array[ret].m_sex = sex;
break;
}
cout << "输入有误,请重新输入" << endl;
}
//年龄
cout << "请输入年龄:" << endl;
int age = 0;
cin >> age;
abs->array[ret].m_age = age;
//电话
cout << "请输入联系电话:" << endl;
string phone;
cin >> phone;
abs->array[ret].m_phone = phone;
//住址
cout << "请输入家庭地址:" << endl;
string addr;
cin >> addr;
abs->array[ret].m_addr = addr;
cout << "修改成功" << endl;
}
else//未找到联系人
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
//清空联系人
void claenperson(addresbooks* abs)
{
abs->m_size = 0;
cout << "通讯录已清空" << endl;
system("pause");
system("cls");
}
int main()
{
//创建通讯录结构体变量
addresbooks abs;
//初始化通讯录中当前人员个数
abs.m_size = 0;
int a = 0;//创建用户选择输入的变量
while (true)
{
//菜单调用
showmenu();
cin >> a;
switch (a)
{
case 1: //1,添加联系人
addperson(&abs); //利用地址传递可以修饰实参
break;
case 2: //2,显示联系人
showoerson(&abs);
break;
case 3: //3,删除联系人
//{
// cout << "请输入删除联系人的姓名:" << endl;
// string name;
// cin >> name;
// if (isExist(&abs, name) == -1)
// {
// cout << "查无此人" << endl;
// }
// else
// {
// cout << "找到此人" << endl;
// }
//}
deletepersone(&abs);
break;
case 4: //4,查找联系人
findperson(&abs);
break;
case 5: //5,修改联系人
modifyperson(&abs);
break;
case 6: //6,清空联系人
claenperson(&abs);
break;
case 0: //0, 退出通讯录
{
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
}
}
}
return 0;
}
2.代码解析
2,1菜单模块解析
定义一个函数名showmenu(菜单)
一共是7个功能 添加联系人、显示联系人、删除联系人、查找联系人、修改联系人、清空联系人、以及退出通讯录系统,进行显示,让用户选择功能。
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;
}
2.2定义结构体
1.联系人结构体
定义一个结构体 person(联系人)变量
要求设置一个变量叫做person
要求联系人结构体中有以下要求:
string m_name;//名字要用·string字符串类型
int m_sex;//性别这里要求用户输入1或2(1代表男,2代表女)
int m_age;//年龄用整型int就行
string m_phone;//电话是字符串类型所以用string
string m_addr;//住址是字符串类型所以用string
struct person//联系人结构体
{
string m_name;//名字
int m_sex;//性别 1 男,2 女
int m_age;//年龄
string m_phone;//电话
string m_addr;//住址
};
2.通讯录结构体
定义一个结构体叫做addresbooks(通讯录结构体)
在这里可以定义一个数组用作通讯录中保存联系人
struct(结构体) person(联系人类型)array【max】;(max可以自定义人数,比如说1000人,那max就等于1000)
int m_size;用做保存通讯录人员的个数
创建完通讯录结构体后要在mian函数中初始化一下通讯录人数
//创建通讯录结构体变量
addresbooks abs;
//初始化通讯录中当前人员个数
abs.m_size = 0;
struct addresbooks//通讯录结构体
{
struct person array[MAX];//通讯录中保存的联系人数组
int m_size;//通讯录中人员个数
};
2.3添加联系人函数
1.相关代码如下
void addperson(addresbooks *abs)//添加联系人
{
//判断通讯录是否已满
if (abs->m_size == MAX)
{
cout << "通讯录已满,无法添加!" << endl;
return;
}
else
{
//添加具体联系人
//名字
string name;
cout << "请输入姓名:" << endl;
cin >> name;
abs->array[abs->m_size].m_name = name;
//性别
cout << "请输入性别:" << endl;
cout << "1----男" << endl;
cout << "2----女" << endl;
int sex = 0;
while (true)
{
//如果输入的是1或2可以退出循环,因为输入的是正确的
//如果输入有误,重新输入
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->array[abs->m_size].m_sex = sex;
break;
}
cout << "输入有误,请重新输入" << endl;
}
//年龄
cout << "请输入年龄:" << endl;
int age = 0;
cin >> age;
abs->array[abs->m_size].m_age = age;
//电话
cout << "请输入联系电话:" << endl;
string phone;
cin >> phone;
abs->array[abs->m_size].m_phone=phone;
//住址
cout << "请输入家庭地址:" << endl;
string addr;
cin >> addr;
abs->array[abs->m_size].m_addr=addr;
//更新通讯录人数
abs->m_size++;
cout << "添加成功" << endl;
system("pause");//按任意键继续
system("cls");//清屏
}
}
2定义函数
定义一个函数名addoerson,在参数中利用指针addresbooks * abs用于接收abs的地址
void addperson(addresbooks *abs)//添加联系人
3判断通讯录是否已满
用 if 语句进行判断,如果通讯录人数大于max(也就是自己定义的人数)输出通讯录已满,无法添加。如果通讯录人数小于MAX 则else进行下面的输出
//判断通讯录是否已满
if (abs->m_size == MAX)
{
cout << "通讯录已满,无法添加!" << endl;
return;
}
else
{
//添加具体联系人
4输入名字
string name 定义一个变量为name,然后提示用户输入姓名,然后将name变量存利用指针存放在array[abs->m_size].m_name中
//名字
string name;
cout << "请输入姓名:" << endl;
cin >> name;
abs->array[abs->m_size].m_name = name;
5输入性别
定义一个变量sex(性别)提示用户输入1----男 2-----女。利用while(true)死循环无限进行输入
如果用户输入除1和2以外的数,提示用户输入错误,这就是为什么用while(true)可以防止用户一直输错,后面的函数模块中也会运用到。如果输入对了则break跳出死循环。
如果用户输入1或者2,则将用户输入的数据存放在array【abs->m_size】.m_sex这个数组中,然后break跳出死循环
//性别
cout << "请输入性别:" << endl;
cout << "1----男" << endl;
cout << "2----女" << endl;
int sex = 0;
while (true)
{
//如果输入的是1或2可以退出循环,因为输入的是正确的
//如果输入有误,重新输入
cin >> sex;
if (sex == 1 || sex == 2)
{
abs->array[abs->m_size].m_sex = sex;
break;
}
cout << "输入有误,请重新输入" << endl;
}
6年龄
年龄输入方式和名字输入方式几乎一样所以不多赘述,代码如下
//年龄
cout << "请输入年龄:" << endl;
int age = 0;
cin >> age;
abs->array[abs->m_size].m_age = age;
7电话
电话用字符串类型,代码如下
//电话
cout << "请输入联系电话:" << endl;
string phone;
cin >> phone;
abs->array[abs->m_size].m_phone=phone;
8住址
家庭地址用字符串类型,代码如下
//住址
cout << "请输入家庭地址:" << endl;
string addr;
cin >> addr;
abs->array[abs->m_size].m_addr=addr;
9更新通讯录人数
size++代表通讯录人数加1,提示用户添加成功
system("pause");//按任意键继续
system("cls");//清屏
如上两段代码用于清屏。
//更新通讯录人数
abs->m_size++;
cout << "添加成功" << endl;
system("pause");//按任意键继续
system("cls");//清屏
2.4显示联系人
//显示联系人
void showoerson(addresbooks * abs)
{
if (abs->m_size == 0)
{
cout << "当前记录为空" << endl;
}
else
{
for (int i = 0; i < abs->m_size; i++)//m_size人数个数
{
cout << "姓名:" << abs->array[i].m_name << "\t";// "\t"代表空8格
cout << "性别:" << (abs->array[i].m_sex ==1?"男":"女" )<< "\t";//如果输入的是1则输出男,不是则输出女
cout << "年龄:" << abs->array[i].m_age << "\t";
cout << "电话:" << abs->array[i].m_phone << "\t";
cout << "家庭住址:" << abs->array[i].m_addr << endl;
}
}
system("pause");//按任意键继续
system("cls");//清屏
}
新建一个函数名叫showoerson(显示联系人)
在该函数中要完成的功能有以下:
1.判断通讯录是否有记录
(如果size=0,则提示用户当前用户为空)。
2.显示array数组中保存的通讯录信息
(可以用for循环来输出。for循环条件为循环次数要小于等于size人数)。
3.进行清屏操作。
system(“cls”);//清屏代码
2.5检测联系人是否存在
//检测联系人是否存在,如果存在,返回联系人所在数组中的具体位置,不存在返回-1
//参数1 通讯录 参数2 对比姓名
int isExist(addresbooks* abs,string name)
{
for (int i = 0; i < abs->m_size; i++)
{
//找到用户输入的姓名了
if (abs->array[i].m_name == name)
{
return i;//找到了,返回这个人在数组中的下表编号
}
}
return -1;//如果遍历结束都没有找到,返回-1
}
定义一个函数为isExist
在该函数中主要完成以下几点:
1.进行循环查找
用for循环进行查找用户输入的姓名如果找到了返回一个值为i(在这里任何整数类型的数字都行,只要不是-1就行。至于为什么不是-1就行下面会解释)。
2.未查到
如果循环结束还未查找到就return -1 返回。(这里 i 可以是任何值,只要不与for循环中的i相等就行,但还是推荐用-1)。
3.如果查找到了
if (abs->array[i]>m_size==name)
将循环值 i 的值return返回。
2.6删除指定联系人
在进行这个函数之前要明白所谓删除就是将array数组后一位往前移,覆盖用户要删除的数据。
//删除指定联系人
void deletepersone(addresbooks * abs)
{
cout << "请输入您要删除的联系人" << endl;
string name;
cin >> name;
//ret==-1 未查到
//ret!=-1 查到了
int ret=isExist(abs, name);
if (ret != -1)
{
for (int i = ret; i < abs->m_size; i++)
{
//数据前移
abs->array[i] = abs->array[i + 1];
}
abs->m_size--;//更新通讯录中的人数
cout << "删除成功" << endl;
}
else
{
cout << "查无此人" << endl;
}
system("pause");//按任意键继续
system("cls");//清屏
}
1.利用isExist(检测函数)
提示用户输入要删除的联系人,然后利用isExis函数查找通讯录中·有没有这个联系人名,
2.如果没有
(用if语句判断)则输出查无此人。
3.如果有则
利用循环将array数组中的数据往前一位(abs->array[i]=abs->array[i+1])具体代码如下:
for (int i=ret;i<abs->m_size;i++)
abs->array[i]=abs_array[i+1];
4.前移后
数组移动完之后更新一下size(人数)将size -1输出删除成功即可。
5.清屏
system("cls");
system("pause");
2.7查找指定联系人
//查找联系人
void findperson(addresbooks* abs)
{
cout << "请输入您要查找的联系人" << endl;
string name;
cin >> name;
//判断指定的联系人是否存在
int ret = isExist(abs, name);
if (ret != -1)
{
//找到了
cout << "姓名:" << abs->array[ret].m_name << "\t";
cout << "性别:" << abs->array[ret].m_sex << "\t";
cout << "年龄:" << abs->array[ret].m_age << "\t";
cout << "电话:" << abs->array[ret].m_phone << "\t";
cout << "住址:" << abs->array[ret].m_addr << endl;
}
else//未找到联系人
{
cout << "未找到此人" << endl;
}
system("pause");//按任意键继续
system("cls");//清屏
}
1.提示用户输入要查找的联系人
利用cout提示用户输入要查找的联系人
然后定义一个string (字符串类型)变量来接收用户输入的联系人名
cin>>将联系人输入就行了。
2.判断用户查找的联系人是否存在(isExist)
定义一个变量ret用来接收isExist函数的返回值。
如果ret!=-1也就是说找到了进行循环输出联系人相关的信息。
如果ret=-1也就是说未找到就提示用户输出“未查找”。
3.清屏
system("cls");
system("pause");
2.8修改联系人
完整代码如下:
//修改联系人
void modifyperson(addresbooks* abs)
{
cout << "请输入您要修改的联系人" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret != -1)//找到指定联系人
{
//姓名
string name;
cout << "请输入姓名;" << endl;
cin >> name;
abs->array[ret].m_name = name;
//性别
cout << "请输入性别:" << endl;
cout << "1---男" << endl;
cout << "2---女" << endl;
int sex = 0;
while (true)
{
cin >> sex;
if (sex == 1 || sex == 2)
{
//输入正确 退出循环输入
abs->array[ret].m_sex = sex;
break;
}
cout << "输入有误,请重新输入" << endl;
}
//年龄
cout << "请输入年龄:" << endl;
int age = 0;
cin >> age;
abs->array[ret].m_age = age;
//电话
cout << "请输入联系电话:" << endl;
string phone;
cin >> phone;
abs->array[ret].m_phone = phone;
//住址
cout << "请输入家庭地址:" << endl;
string addr;
cin >> addr;
abs->array[ret].m_addr = addr;
cout << "修改成功" << endl;
}
else//未找到联系人
{
cout << "查无此人" << endl;
}
system("pause");
system("cls");
}
1.判断要找到的联系人是否存在
利用isExist函数返回的值进行判断
cout << "请输入您要修改的联系人" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
如果返回值不是-1说明查找到了,然后进行下面的操作。
if (ret != -1)//找到指定联系人
{
}
如果返回值是-1说明未查找到则提示用户查无此人。
else//未找到联系人
{
cout << "查无此人" << endl;
}
2.修改指定联系人
修改指定联系人原理就是让用户输入一个新的联系人来替代原数组的联系人:
int ret = isExist(abs, name);
ret=isExis(ret相当于找到的那个联系人的位置)
接下来就是提示用户输入联系人相关信息(姓名,性别,年龄,电话,家庭住址)
(注意:在输入性别时是用1||2代替的,如果用户输入了1||2以外的数,可以用一个死循环来提示用户输入有误,请重新输入!因为是死循环所以用户一直出错也没关系。如果用户输入对后再跳出循环就行)
如何修改相关信息的代码大致相同,这里就拿修改姓名来做解释:
//姓名
string name;
cout << "请输入姓名;" << endl;
cin >> name;
abs->array[ret].m_name = name;
定义一个字符串类型的变量(姓名用字符串类型这里不过多解释)
提示用户输入新的姓名
输入完成后将name变量存放在数组中abs->array[ret].m_name=name
3.清屏
system("cls");
system("pause");
2.9清空联系人
这个功能看起来很厉害,实则做起来非常简单
//清空联系人
void claenperson(addresbooks* abs)
{
abs->m_size = 0;
cout << "通讯录已清空" << endl;
system("pause");
system("cls");
}
只要将数组人数定义为0(将数组初始化就行了)
3.主函数
int main()
{
//创建通讯录结构体变量
addresbooks abs;
//初始化通讯录中当前人员个数
abs.m_size = 0;
int a = 0;//创建用户选择输入的变量
while (true)
{
//菜单调用
showmenu();
cin >> a;
switch (a)
{
case 1: //1,添加联系人
addperson(&abs); //利用地址传递可以修饰实参
break;
case 2: //2,显示联系人
showoerson(&abs);
break;
case 3: //3,删除联系人
deletepersone(&abs);
break;
case 4: //4,查找联系人
findperson(&abs);
break;
case 5: //5,修改联系人
modifyperson(&abs);
break;
case 6: //6,清空联系人
claenperson(&abs);
break;
case 0: //0, 退出通讯录
{
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
}
}
}
return 0;
}
3.1初始化结构体变量
将人数定义为0就行
//创建通讯录结构体变量
addresbooks abs;
//初始化通讯录中当前人员个数
abs.m_size = 0;
3.2创建循环框架
while (true)
{
//菜单调用
showmenu();
cin >> a;
switch (a)
{
case 1: //1,添加联系人
break;
case 2: //2,显示联系人
break;
case 3: //3,删除联系人
break;
case 4: //4,查找联系人
break;
case 5: //5,修改联系人
break;
case 6: //6,清空联系人
break;
case 0: //0, 退出通讯录
{
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
}
}
}
首先调用菜单函数让用户选择功能
showmenu();
然后定义退出功能(该功能代码不复杂所以不用单独做一个函数):
当用户输入0时代表用户要退出程序
case 0: //0, 退出通讯录
{
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
}
3.3将框架定义完整
因为相关函数咱们已经定义完整,所以现在只需要引用函数就行。
(比如说用户输入1要添加联系人,那就将2.3添加联系人函数添加到case 1中就行)
添加完整后的框架如下:
case 1: //1,添加联系人
addperson(&abs); //利用地址传递可以修饰实参
break;
case 2: //2,显示联系人
showoerson(&abs);
break;
case 3: //3,删除联系人
deletepersone(&abs);
break;
case 4: //4,查找联系人
findperson(&abs);
break;
case 5: //5,修改联系人
modifyperson(&abs);
break;
case 6: //6,清空联系人
claenperson(&abs);
break;
4.结束
如果一步一步打到这说明,你已经完成了通讯录系统,希望你能完全理解这些代码的含义。
如果有不懂的可以去看我开头放的黑马程序员链接。这个程序到此结束,如果你们喜欢的话不妨点个赞。如果我这篇文章中有任何错误,可以私信或在文章下评论!
谢谢大家!