我是一个c++小白,最近在b站跟着黑马程序员学习,我感觉老师讲的特别仔细,为了复习巩固,我把在学习结构体和指针的时候一个关于通讯录的案例写在这里,方便我以为的复习,也希望能和大家一起学习c++!
视频链接:https://www.bilibili.com/video/BV1et411b73Z?p=83&spm_id_from=pageDriver
#include<iostream>
#include<string>
using namespace std;
#define max 1000
struct person //通讯录联系人结构体
{
string name;
int age;
int sex;
string phone;
string address;
};
struct tongxunlu //定义一个通讯录结构体,最多可以容纳一千人
{
struct person personarray[max];
int size;
};
void showMenu() //展示通讯录的功能菜单
{
cout << "1.添加对象" << endl;
cout << "2.显示对象" << endl;
cout << "3.删除对象" << endl;
cout << "4.查找对象" << endl;
cout << "5.修改对象" << endl;
cout << "6.清空对象" << endl;
cout << "0.退出系统" << endl;
}
//添加功能。在进行参数传递的时候可以使用值传递和地址传递两种方式,但是值传递只能改变形参而无法改变实参,所以这里选用地址传递
void add(struct tongxunlu * txl)
//切记结构体地址传递形式,struct可以省略
{
//使用指针的时候用 ->获取所含数据
//使用普通值传递的时候用 . 获取所含数据
//添加的时候首先需要对通讯录内存进行判断,如果>=最大值则不能再进行添加
if (txl->size==max)
{
cout << "t通讯录人员已满" << endl;
return;
}
else
{
cout << "请输入用户名:" ;
string name;
cin >> name;
//将用户输入的name传递给通讯录结构体的人员name,这里定义输入的时候最后区分一下,类似a_name用于和结构体name区分
txl->personarray[txl->size].name = name;
cout << "请输入用户年龄:";
int age;
cin >> age;
txl->personarray[txl->size].age = age;
cout << "请输入用户性别:";
int sex = 0;
while (true)
//当while为true的时候执行if里的语句
{
cin >> sex;
if (sex == 1 || sex == 2)//1代表 男 2代表 女
{
txl->personarray[txl->size].sex = sex;
break;
}
cout << "输入有误,请重新输入用户性别:";
}
cout << "请输入用电话号:";
string phone;
cin >> phone;
txl->personarray[txl->size].phone = phone;
cout << "请输入用户地址:";
string address;
cin >> address;
txl->personarray[txl->size].address = address;
//最后添加完成之后将通讯录的内存数加1
txl->size++;
cout << "添加成功" << endl;
system("pause");
system("cls");
//为了不每点一次功能键就显示一次功能菜单,所以这里系统进行清空操作,只显示showmenue的功能菜单
}
}
void showuser(struct tongxunlu * txl)
{
//首先进行判断,如果size为0则表示通讯录为空,无内容展示
if (txl->size==0)
{
cout << "当前记录为空!" << endl;
}
else
{
for (int i = 0; i < txl->size; i++)
{
cout << "姓名:" << txl->personarray[i].name << "\t"; // \t表示水平跳至
cout << "年龄:" << txl->personarray[i].age << "\t";
cout << "性别:" << (txl->personarray[i].sex ==1 ?"男":"女") << "\t";
//使用三目运算,如果sex为1则显示为男,sex为2则显示为女
cout << "电话:" << txl->personarray[i].phone << "\t";
cout << "住址:" << txl->personarray[i].address << endl;;
}
cout << "当前用户的个数为:" << txl->size << endl;
}
system("pause");
system("cls");
}
//封装一个查询人员是否存在的函数
int checkuser(struct tongxunlu * txl, string name)
{
for (int i = 0; i < txl->size; i++)
{
if (txl->personarray[i].name ==name)
{
return i;
//如果查询的人员存在的话就返回人员所在的记录数
}
}
return -1;
//如果查无此人就返回-1
}
void deleteuser(struct tongxunlu*txl)
{
cout << "请输出您要进行查询的人员姓名: ";
string name;
cin >> name;
int ret = checkuser(txl, name);//将查询结果返回到ret
if (ret==-1)
{
cout << "查无此人!";
}
else
{
for (int i = ret; i < txl->size; i++)
{
//进行删除操作的时候,就是从所要删除人员的位置往后的人员信息都往前移一位,注意循环是从所要删除的对象所在位置开始的
txl->personarray[i] = txl->personarray[i + 1];
}
txl->size--;
//删除之后注意要把内存-1
cout << "删除成功!";
}
system("pause");
system("cls");
}
void finduser(struct tongxunlu*txl)
{
cout << "请输出您要进行查询的人员姓名: ";
string name;
cin >> name;
int ret = checkuser(txl, name);
if (ret == -1)
{
cout << "查无此人!";
}
else
{
cout << "姓名:" << txl->personarray[ret].name << "\t";
cout << "年龄:" << txl->personarray[ret].age << "\t";
cout << "性别:" << (txl->personarray[ret].sex == 1 ? "男" : "女") << "\t";
cout << "电话:" << txl->personarray[ret].phone << "\t";
cout << "住址:" << txl->personarray[ret].address << endl;;
}
system("pause");
system("cls");
}
void updateuser(struct tongxunlu*txl)
{
cout << "请输出您要进行修改的人员姓名: ";
string name;
cin >> name;
int ret = checkuser(txl, name);
if (ret == -1)
{
cout << "查无此人!";
}
else
{
cout << "修改后的姓名:";
string x_name;
cin >> x_name;
txl->personarray[ret].name = x_name;
cout << "修改后的年龄:";
int x_age;
cin >> x_age;
txl->personarray[ret].age = x_age;
cout << "修改后的性别:";
int x_sex = 0;
while (true)
{
cin >> x_sex;
if (x_sex==1||x_sex==2)
{
txl->personarray[ret].sex = x_sex;
break;
//记得输入正确执行结束后要退出循环
}
cout << "输入有误,请重新输入";
}
cout << "修改后的电话号:";
string x_phone;
cin >> x_phone;
txl->personarray[ret].phone = x_phone;
cout << "修改后的地址:";
string x_address;
cin >> x_address;
txl->personarray[ret].address = x_address;
}
cout << "修改成功!";
system("pause");
system("cls");
}
void emptyuser(struct tongxunlu*txl)
//清空操作其实就把通讯录的内存置为0这样通讯录就为空了
{
if (txl->size==0)
{
cout << "当前通讯录为空!";
}
else
{
txl->size = 0;
}
cout << "清空成功!";
system("pause");
system("cls");
}
int main()
{
//初始化通讯录结构体
struct tongxunlu txl;
txl.size = 0;
int select = 0;
while (true) //创建一个假的死循环,将一直可以展示功能菜单
{
showMenu(); //显示通讯录功能菜单
//通过用户选择的按钮指令响应对应的功能
cout << "您的选择为:";
cin >> select;
switch (select)
{
case 1: //当选择为1的时候执行添加功能
add(&txl);
break;
case 2: //当选择为2的时候执行显示功能
showuser(&txl);
break;
case 3: //当选择为3的时候执行删除功能,其中功能3456都是基于选择的用户姓名进行操作的,所以我们在这之前进行了一个查询人员姓名的函数封装,如果这个人存在,再进行相应的操作
deleteuser(&txl);
break;
case 4: //当选择为4的时候,根据查询的人员姓名将其所有信息都展示出来
finduser(&txl);
break;
case 5: //当选择为5的时候,将输入用户的所有信息进行更改
updateuser(&txl);
break;
case 6: //当选为为6的时候,将通讯录清空
emptyuser(&txl);
break;
case 0: //当选择0的时候推出系统,return 0跳出死循环
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
system("pause");
return 0;
}