从0到1入门C++编程——02 通讯录管理系统

发布时间:2024年01月01日


本文通过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入门编程,学习编程不再难

文章来源:https://blog.csdn.net/weixin_42570192/article/details/135317752
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。