先创建出初始界面:
void showmane()
{
cout<<"**欢迎使用凌风通讯录管理系统!***"<<endl;
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;
int m_age;
string m_phonenum;
string m_addstr;
};
struct addpersonbooks
{
struct person addpersonarr[max]; // 在通讯录结构体中定义一个联系人数组,数组中的每个元素都是person类型,最大容量为max
int m_size; //这是用来记录通讯录储存的人数的
};
具体功能实现
添加联系人
//添加联系人
void addperson(addpersonbooks *abs)
{
//先判断通讯录是否已满
if(abs->m_size==max)
{
cout<<"通讯录已满,无法输入!";
// break; 是用来跳出循环的,这里没有循环,就不能用break
return ;
}
else
{
// int name;//低级错误!
//输入姓名
string name;
cout<<"请输入姓名:"<<endl;
cin>>name;
abs->addpersonarr[abs->m_size].m_name=name;
//输入性别
int sex;
cout<<"请输入性别:"<<endl;
cout<<"1---男"<<endl;
cout<<"2---女"<<endl;
// cin>>sex; 如果放在外面,就会陷入死循环,因为输入一个三,执行else,然后循环,继续else..........
while (1)//因为性别是用1/2来表示的,所以要预防输入3及其他情况
{
cin>>sex;//放里面,else后又执行到输入就很ok
if(sex==1||sex==2)
{
abs->addpersonarr[abs->m_size].m_sex=sex;
break;
}
else {cout<<"输入错误,请重新输入!"<<endl;}
}
//输入年龄
int age;
cout<<"请输入年龄:"<<endl;
cin>>age;
abs->addpersonarr[abs->m_size].m_age=age;
//输入电话
string phonenum;
cout<<"请输入电话号码:"<<endl;
cin>>phonenum;
abs->addpersonarr[abs->m_size].m_phonenum=phonenum;
//输入家庭地址
string addstr;
cout<<"请输入家庭地址:"<<endl;
cin>>addstr;
abs->addpersonarr[abs->m_size].m_addstr=addstr;
cout<<"已成功添加!"<<endl;
}
abs->m_size++;
}
显示联系人
void showperson(addpersonbooks *abs)
{
if(abs->m_size==0)
{
cout<<"暂无联系人信息"<<endl;
}
else
{
for(int i=0;i<abs->m_size;i++)//如果限制条件用成了i<=abs->m_size,则最后会输出一个无信息的模板,数组下标从零开始,要记住
{
cout<<"姓名:"<<abs->addpersonarr[i].m_name;
cout<<"\t 性别:"<<(abs->addpersonarr[i].m_sex==1?"男":"女"); //学着点!!!
// if(abs->addpersonarr[i].m_sex==1) cout<<"男"<<; //似乎涉及了操作符重载......
//else cout<<"女";
cout<<"\t 年龄:"<<abs->addpersonarr[i].m_age;
cout<<"\t 电话:"<<abs->addpersonarr[i].m_phonenum;
cout<<"\t 家庭地址:"<<abs->addpersonarr[i].m_addstr<<endl;
}
}
}
此时单独封装一个函数用来检测输入的联系人是否存在于系统中,因为后面删除、查找、修改都会用到这一步,所以单独出来,提高代码复用性,说白了就是偷懒,少写点代码!
int isexist(addpersonbooks *abs, string name)
{
for(int i=0;i<abs->m_size;i++)
{
if(abs->addpersonarr[i].m_name==name)
{
return i;//返回这个元素在数组中的下标
}
// else {return -1;}
}
return -1;//如果把return -1 放在for循环里面,则无法返回-1,//那么请问,为什么无法返回-1 呢???
// 返回不了-1就会一直执行,后面也就不会进入ret=-1 的情况,就会一直是已成功删除.....
}
删除联系人
void deleteperson(addpersonbooks * abs)
{
cout<<"请输入要删除的联系人姓名:"<<endl;
string name;
cin>>name;
int ret = isexist(abs,name); //用一个变量ret去接受所得到的i,
if(ret != -1)
{
cout<<"是否确定从通讯录中删除"<<name<<endl;
cout<<"1---确定"<<endl;
cout<<"2---取消"<<endl;
int choice2=0;
cin>>choice2;
if(choice2==1)
{
for(int i=ret;i<abs->m_size;i++)
{
abs->addpersonarr[i]=abs->addpersonarr[i+1];
}
cout<<"已成功删除!"<<endl;
abs->m_size--;
}
else return;
}
else
{
cout<<"查无此人!"<<endl;
}
}
查找联系人
void findperson(addpersonbooks *abs)
{
cout<<"请输入要查找的联系人姓名:"<<endl;
string name ;
cin>>name;
int ret=isexist(abs,name);
if(ret!=-1)
{
cout<<"姓名:"<<abs->addpersonarr[ret].m_name;
cout<<"\t 性别:"<<(abs->addpersonarr[ret].m_sex==1?"男":"女");
cout<<"\t 年龄:"<<abs->addpersonarr[ret].m_age;
cout<<"\t 电话:"<<abs->addpersonarr[ret].m_phonenum;
cout<<"\t 家庭地址:"<<abs->addpersonarr[ret].m_addstr<<endl;
}
else {cout<<"查无此人!"<<endl;}
}
修改联系人
void changeperson(addpersonbooks *abs)
{
cout<<"请输入要修改的联系人姓名:"<<endl;
string name;
cin>>name;
int ret=isexist(abs,name);
if(ret!=-1)
{
cout<<"修改姓名为:"<<endl; //
string nname;
cin>>nname;
abs->addpersonarr[ret].m_name=nname;
cout<<"修改性别为:"<<endl;
cout<<"1---男"<<endl;
cout<<"2---女"<<endl;
int nsex;
while(1)
{
cin>>nsex;
if(nsex==1||nsex==2)
{
abs->addpersonarr[ret].m_sex=nsex;
break;
}
else cout<<"输入错误,请重新输入!"<<endl;
}
cout<<"修改年龄为:"<<endl;
int nage;
cin>>nage;
abs->addpersonarr[ret].m_age=nage;
cout<<"修改电话为:"<<endl;
string nphonenum;
cin>>nphonenum;
abs->addpersonarr[ret].m_phonenum=nphonenum;
cout<<"修改地址为:"<<endl;
string naddstr;
cin>>naddstr;
abs->addpersonarr[ret].m_addstr=naddstr;
}
else cout<<"查无此人!"<<endl;
}
清空联系人
void nullperson(addpersonbooks *abs)
{
int choice=0;
cout<<"是否确定要清空联系人?"<<endl;
cout<<"1---是!"<<endl;
cout<<"2---否!"<<endl;
cin>>choice;
if(abs->m_size==0)
{
cout<<"通讯录已为空!"<<endl;
return ;
}
if(choice==1)
{
abs->m_size=0;
cout<<"已全部清空!"<<endl;
}
}
最后汇总在main方法中实现
int main()
{
addpersonbooks abs;
abs.m_size=0;//对结构体里的计数器进行初始化,不然循环不会继续下去,为什么?
int choose;
while(1)
{
showmane();
cout<<"请选择您想实现的功能: "<<endl;
cin>>choose;
switch(choose)
{
case 1://添加联系人
{
addperson(&abs);
system("pause"); // 添加这个会使得每一次输入都有一句请按任意键继续,用户体验不好!如果不添加,则不会程序停留!
system("cls");
break;
}
case 2://显示联系人
{
showperson(&abs);
system("pause");
system("cls");
break;
}
case 3://删除联系人
{
deleteperson(&abs);
system ("pause");
system("cls");
break;
}
case 4://查找联系人
{
findperson(&abs);
system ("pause");
system("cls");
break;
}
case 5://修改联系人
{
changeperson(&abs);
system("pause");
system("cls");
break;
}
case 6://清空联系人
{
nullperson(&abs);
system("pause");
system("cls");
break;
}
case 0://退出系统
{
cout<<"已成功退出,欢迎下次使用!"<<endl;
// system("pause");//请按任意键继续
// system("cls");//清屏操作
//想一想为啥不要上面两步,如果要了是什么结果???
return 0;//当使用return 0,会退出整个函数,也就真正意义上实现了退出while循环,其他的都只是跳出了swtich
break;
}
default :
{
cout<<"选择错误,请重新选择!"<<endl;
system("pause");
system("cls");
}
}
}
}
以上是我在学习c++的过程中的代码实例,水平有限仅供大家参考