本文通过C++实现一个通讯录管理系统,系统要实现的功能如下。
1、添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人;
2、显示联系人:显示通讯录中所有联系人信息;
3、删除联系人:按照姓名进行删除指定联系人;
4、查找联系人:按照姓名查看指定联系人信息;
5、修改联系人:按照姓名重新修改指定联系人;
6、清空联系人:清空通讯录中所有信息;
7、退出通讯录:退出当前使用的通讯录。
在实现这个管理系统时,需要创建结构体存放不同类型的数据。
每个联系人的结构体中存放姓名、性别、年龄、联系电话和家庭住址信息,结构体如下。
struct users //用户结构体
{
string name;
int sex; //1--男 0--女
int age;
string number;
string address;
};
通讯录结构体就是所有用户的集合,此外还要加上一个计数的整型变量,用于计算目前存放的联系人数量。
struct ContactBook //通讯录结构体
{
struct users user[MAX];
int user_num;
};
菜单显示功能在程序运行后就打印菜单,以供用户输入选择进行某项操作。
菜单显示的函数如下,只在里面完成打印即可。
void show_menu()
{
cout <<"*****************************"<<endl;
cout <<"****** 1、添加联系人 ******"<<endl;
cout <<"****** 2、显示联系人 ******"<<endl;
cout <<"****** 3、删除联系人 ******"<<endl;
cout <<"****** 4、查找联系人 ******"<<endl;
cout <<"****** 5、修改联系人 ******"<<endl;
cout <<"****** 6、清空联系人 ******"<<endl;
cout <<"****** 7、退出通讯录 ******"<<endl;
cout <<"*****************************"<<endl;
}
在主函数中调用菜单显示函数,运行程序之后如下所示,这会让执行的操作更加清楚。
在程序运行之后,用户输入1按下回车就要进行添加联系人的操作,添加联系人之前首先要判断通讯录是否已经存满,如果没有存满,就根据通讯录结构体中user_num作为数组下标开始添加联系人,并在添加完成之后将user_num加1,更新存放的联系人数量。
添加联系人的函数实现如下,注意函数参数的传递是通讯录结构体的地址传递,这样在函数中做的修改才能得以体现,后面的函数也是这样。
void add_user(ContactBook *p)
{
if(p->user_num == MAX)
cout<<"通讯录已满,无法添加新联系人!"<<endl;
else
{
cout<<"输入联系人姓名:";
cin>>p->user[p->user_num].name;
int sex = 0;
while(1)
{
cout<<"输入联系人性别(1--男 0--女):";
cin>>sex;
if(sex == 0 || sex == 1)
{
p->user[p->user_num].sex = sex;
break;
}
cout<<"格式输入有误,重新输入(1--男 0--女)"<<endl;
}
int age = 0;
while(1)
{
cout<<"输入联系人年龄:";
cin>>age;
if(age >= 0 && age <= 150)
{
p->user[p->user_num].age = age;
break;
}
cout<<"年龄输入有误,重新输入!"<<endl;
}
cout<<"输入联系人电话:";
cin>>p->user[p->user_num].number;
cout<<"输入联系人地址:";
cin>>p->user[p->user_num].address;
p->user_num ++;
}
cout<<"添加联系人成功!"<<endl;
system("pause"); //按任意键继续
system("cls"); //清屏
}
程序运行后添加联系人的过程如下图所示。
在程序运行之后,用户输入2按下回车就要进行显示联系人的操作,显示联系人的过程比较简单,首先判断通讯录的user_num成员是否为0,为0表示通讯录为空,打印提示信息,否则就将存放的所有联系人信息打印。
显示联系人的函数实现如下。
void show_user(ContactBook *p)
{
if(p->user_num == 0)
cout<<"通讯录为空!"<<endl;
else
{
cout<<"姓名\t"<<"性别\t"<<"年龄\t"<<"电话\t"<<"\t地址\t"<<endl;
for(int i=0;i<p->user_num;i++)
{
cout<<p->user[i].name<<"\t";
/*if(p->user[i].sex == 1)
cout<<"男\t";
else
cout<<"女\t";*/
cout<<(p->user[i].sex == 1 ? "男":"女")<<"\t";
cout<<p->user[i].age<<"\t";
cout<<p->user[i].number<<"\t";
cout<<p->user[i].address<<"\t"<<endl;
}
}
system("pause"); //按任意键继续
system("cls"); //清屏
}
显示所有联系人的信息如下图所示。
如果没有联系人就提示通讯录为空。
删除、查找、修改都要用到存放联系人的数组下标,因此单独写一个函数用来得到这个索引。
user_index函数根据用户名进行查找,如果找到则返回存放的数组下标,没有找到就返回-1。
int user_index(ContactBook *p,string name)
{
if(p->user_num == 0)
cout<<"通讯录为空!"<<endl;
else
{
for(int i=0;i<p->user_num;i++)
{
if(p->user[i].name == name)
return i;
}
return -1;
}
}
在程序运行之后,用户输入3按下回车就要进行删除联系人的操作,删除联系人的函数如下,在里面调用user_index()函数返回下标值,根据下标值判断删除的用户是否存在,删除之后,当前位置之后的数据都要向前移动一位。
void delete_user(ContactBook *p)
{
string name;
int index = -1;
cout <<"请输入要删除的联系人姓名:";
cin >> name;
index = user_index(p,name);
if(index == -1)
cout<<"要删除的联系人不存在!"<<endl;
else
{
for(int i=index;i<p->user_num-1;i++)
{
p->user[i] = p->user[i+1]; //通讯录中存放的数据前移
}
p->user_num--; //通讯录中人数减1
cout<<"删除联系人成功!"<<endl;
}
system("pause"); //按任意键继续
system("cls"); //清屏
}
已经添加了a和b两个联系人,下面删除掉用户名为b的联系人。
删除之后再显示联系人,发现联系人b已经被删除了。
在程序运行之后,用户输入4按下回车就要进行查找联系人的操作,根据要查找的联系人姓名查找,如果要查找的信息存在就进行打印,不存在就打印提示信息。
void find_user(ContactBook *p)
{
string name;
int index = -1;
cout <<"请输入要查找的联系人姓名:";
cin >> name;
index = user_index(p,name);
if(index == -1)
cout<<"要查找的联系人不存在!"<<endl;
else
{
cout<<"姓名:"<<p->user[index].name<<"\t";
cout<<"性别:"<<(p->user[index].sex == 1 ? "男":"女")<<"\t";
cout<<"年龄:"<<p->user[index].age<<"\t";
cout<<"电话:"<<p->user[index].number<<"\t";
cout<<"地址:"<<p->user[index].address<<"\t"<<endl;
}
system("pause"); //按任意键继续
system("cls"); //清屏
}
联系人存在打印的信息如下。
联系人不存在的情况打印如下。
在程序运行之后,用户输入5按下回车就要进行修改联系人的操作,修改联系人这里先写了一个函数用来显示需要修改的项,根据用户的输入决定要修改的条目。
void show_item()
{
cout <<"*****************************"<<endl;
cout <<"******* 1、修改姓名 *******"<<endl;
cout <<"******* 2、修改性别 *******"<<endl;
cout <<"******* 3、修改年龄 *******"<<endl;
cout <<"******* 4、修改电话 *******"<<endl;
cout <<"******* 5、修改地址 *******"<<endl;
cout <<"******* 6、修改完成 *******"<<endl;
cout <<"*****************************"<<endl;
}
修改联系人的函数如下,同样根据联系人的用户名判断要修改的用户是否存在,如果存在就选择要修改的项目,根据选择的项目修改对应的内容。
void modify_user(ContactBook *p)
{
string name;
int index = -1;
cout <<"请输入要修改的联系人姓名:";
cin >> name;
index = user_index(p,name);
if(index == -1)
cout<<"要修改的联系人不存在!"<<endl;
else
{
int item = -1;
while(1)
{
show_item();
cout<<"输入要操作的条目编号:";
cin>>item;
switch(item)
{
case 1:
cout<<"输入修改后联系人姓名:";
cin>>p->user[index].name;
break;
case 2:
{
cout<<"输入修改后联系人性别(1--男 0--女):";
int sex = -1;
while(1)
{
cin>>sex;
if(sex == 0 || sex == 1)
{
p->user[index].sex = sex;
break;
}
cout<<"格式输入有误,重新输入(1--男 0--女)"<<endl;
}
break;
}
case 3:
{
cout<<"输入修改后联系人年龄:";
int age = 0;
while(1)
{
cin>>age;
if(age >= 0 && age <= 150)
{
p->user[index].age = age;
break;
}
cout<<"年龄输入有误,重新输入!"<<endl;
}
break;
}
case 4:
cout<<"输入修改后联系人电话:"<<endl;
cin>>p->user[index].number;
break;
case 5:
cout<<"输入修改后联系人地址:"<<endl;
cin>>p->user[index].address;
break;
case 6:
cout<<"修改联系人信息成功!"<<endl;
break;
default:
cout<<"请正确的输入要操作的条目编号!"<<endl;
}
if(item == 6)
break;
}
}
system("pause"); //按任意键继续
system("cls"); //清屏
}
修改的过程如下图所示。
修改后再显示联系人如下,信息就被修改成功了。
在程序运行之后,用户输入6按下回车就要进行清空联系人的操作,清空联系人的操作没必要将所有的数据清空,只需要将通讯录结构体中的计数成员user_num清零即可。
void clear_user(ContactBook *p)
{
int x;
cout<<"是否要清空通讯录?(1--是,0--否)";
cin>>x;
if(x == 1)
{
p->user_num = 0; //作逻辑清空即可,没必要删除所有数据
cout<<"通讯录已清空!"<<endl;
}
system("pause"); //按任意键继续
system("cls"); //清屏
}
清空的过程中还会询问是否清空,如下图所示。
再次显示联系人,显示通讯录为空!
退出通讯录在主函数中实现,主函数及头文件的内容如下。
#include <iostream>
#include <string>
using namespace std;
#define MAX 1000
int main()
{
ContactBook book;
book.user_num = 0; //初始化通讯录人数为0
while(1)
{
show_menu();
int select;
cout <<"输入要操作的项目编号:";
cin >> select;
switch(select)
{
case 1:
add_user(&book);
break;
case 2:
show_user(&book);
break;
case 3:
delete_user(&book);
break;
case 4:
find_user(&book);
break;
case 5:
modify_user(&book);
break;
case 6:
clear_user(&book);
break;
case 7:
system("pause"); //按任意键继续
return 0;
default:
system("cls"); //清屏
cout <<"请正确的输入要操作的项目编号!"<<endl;
}
}
system("pause");
return 0;
}
当输入7的时候就return 0,按下回车后就退出了程序。
本文参考视频:
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难