C/C++通讯录管理系统

198 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

老规矩,先上代码

#include <iostream>
using namespace std;

//添加联系人
#include <string>	//string头文件
//联系人结构体
struct Person
{
	string p_Name;
	int P_Sex;	//1-男、2-女
	int P_Age;
	string p_Phone;
	string p_Address;
};

//通讯录结构体
#define MAX 1000	//方便维护(宏定义)
struct addressBooks
{
	struct Person personArray[MAX];//通讯录中保存联系人的数组
	int p_Size;//通讯录中人员个数
};


//菜单界面
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;
}

//添加联系人
void addPerson(addressBooks *abs) {
	//判断通讯录是否满了
	if (abs->p_Size == MAX) {
		cout << "通讯录已满,无法添加" << endl;
		return;
	}
	else {
		//添加联系人
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs->personArray[abs->p_Size].p_Name = name;

		int sex = 0;
		cout << "请输入性别:" << endl;
		cout << "1 --- 男" << endl;
		cout << "2 --- 女" << endl;
		while (true)
		{//通过while循环让他无法输入错误值
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				abs->personArray[abs->p_Size].P_Sex = sex;
				break;
			}
			cout << "输入有误,请重新输入!" << endl;
		}

		int age = 0;
		cout << "请输入年龄:" << endl;
		while (true)
		{
			cin >> age;
			if (age > 0 && age < 150)
			{
				abs->personArray[abs->p_Size].P_Age = age;
				break;
			}
			cout << "输入有误,请重新输入!" << endl;
		}

		string phone;
		cout << "请输入联系人电话:" << endl;
		while (true)
		{
			cin >> phone;
			if (phone.length() == 11) {
				abs->personArray[abs->p_Size].p_Phone = phone;
				break;
			}
			cout << "电话号码输入有误,请重新输入!" << endl;
		}

		string address;
		cout << "请输入家庭住址:" << endl;
		cin >> address;
		abs->personArray[abs->p_Size].p_Address = address;

		//更新通讯录人数
		abs->p_Size++;

		cout << "添加成功!" << endl;

		system("pause");//按任意键继续
		system("cls");//清屏操作
	}
}

//显示联系人
void showPerson(addressBooks *abs) {
	//判断通讯录是否为空
	if (abs->p_Size == 0)
	{
		cout << "通讯录为空,无联系人记录!" << endl;
	}
	else
	{
		for (int i = 0; i < abs->p_Size; i++) {
			//遍历数组
			cout << "姓名:" << abs->personArray[i].p_Name << "\t";
			cout << "性别:" << (abs->personArray[i].P_Sex == 1 ? "男" : "女")<< "\t";//三目运算
			cout << "年龄:" << abs->personArray[i].P_Age << "\t";
			cout << "电话号码:" << abs->personArray[i].p_Phone << "\t";
			cout << "家庭住址:" << abs->personArray[i].p_Address << endl;
		}
	}
	system("pause");//按任意键继续
	system("cls");//清屏操作
}

//判断联系人是否存在
int isExist(addressBooks *abs, string name) {
	//遍历通讯录数组中的所有人名是否和你输入的人名相同
	for (int i = 0; i < abs->p_Size; i++) {
		if (abs->personArray[i].p_Name == name) {
			return i;//返回数组中的下标
		}
	}
	return -1;//没找到
}

void deletePerson(addressBooks *abs) {
	cout << "请输入你要删除的联系人:" << endl;

	string name;
	cin >> name;

	int num =  isExist(abs, name);//num != -1 --> 查到了

	if (num != -1)
	{
		cout << "找到此人,进行删除操作!" << endl;

		for (int i = num; i < abs->p_Size; i++)
		{
			//通过数据前移将要删除的数据进行覆盖来达到删除的目的(逻辑删除)
			abs->personArray[i] = abs->personArray[i + 1];
		}
		//更新通讯录中的人员数
		abs->p_Size--;
		cout << "删除成功!" << endl;
	}
	else {
		cout << "查无此人!" << endl;
	}
	system("pause");
	system("cls");
}

//查找联系人
void findPerson(addressBooks *abs) {
	string name;
	cout << "请输入你要查找的联系人:" << endl;
	cin >> name;

	//判断它是否存在
	int res = isExist(abs, name);
	if (res != -1)
	{
		cout << "姓名:" << abs->personArray[res].p_Name << "\t";
		cout << "性别:" << abs->personArray[res].P_Sex << "\t";
		cout << "年龄:" << abs->personArray[res].P_Age << "\t";
		cout << "电话号码:" << abs->personArray[res].p_Phone << "\t";
		cout << "家庭住址:" << abs->personArray[res].p_Address << endl;
	}
	else
	{
		cout << "未找到此联系人!" << endl;
	}
	system("pause");
	system("cls");
}

void modifyPerson(addressBooks *abs) {
	cout << "请输入你要修改的联系人名字:" << endl;
	string name;
	cin >> name;

	int num = isExist(abs, name);

	if (num != -1) {
		//找到此联系人
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs->personArray[num].p_Name = name;

		int sex = 0;
		cout << "请输入联系人性别:" << endl;
		cout << "1->男" << endl;
		cout << "2->女" << endl;
		
		while (true)
		{
			cin >> sex;

			if (sex == 1 || sex == 2) {
				abs->personArray[num].P_Sex = sex;
				break;
			}
			cout << "输入有误,请重新输入!" << endl;
		}

		int age = 0;
		cout << "请输入联系人年龄:" << endl;
		while (true)
		{
			cin >> age;

			if (age > 0 && age < 150)
			{
				abs->personArray[num].P_Age = age;
				break;
			}
			cout << "输入年龄有误,请重新输入!" << endl;
		}

		string phone;
		cout << "请输入联系人电话号码:" << endl;
		while (true)
		{
			cin >> phone;
			if (phone.length() == 11)
			{
				abs->personArray[num].p_Phone = phone;
				break;
			}
			cout << "电话号码输入有误!" << endl;
		}

		string address;
		cout << "请输入联系人家庭住址!" << endl;
		cin >> address;
		abs->personArray[num].p_Address = address;

		//修改成功!
		cout << "修改成功!" << endl;
	}
	else
	{
		cout << "查无此人!" << endl;
	}
	system("pause");
	system("cls");
}

//清空联系人
void cleanPerson(addressBooks *abs) {
	cout << "你确定要清空所有联系人吗?" << endl;
	int num = 0;
	while (true)
	{
		cin >> num;
		if (num == 1)
		{
			abs->p_Size = 0;
			cout << "通讯录已清空!" << endl;
			break;
		}
		else
			break;
	}
	system("pause");
	system("cls");
}

//退出通讯录系统

int main() {

	//创建通讯录结构体变量
	addressBooks abs;
	abs.p_Size = 0;//初始化通讯录当前人员个数


	int select = 0;//创建用户选择需要输入的变量

	while (true)//通过while循环让它一直在我们的菜单里运行
	{
		//调用菜单
		showMenu();

		cin >> select;//用户输入

		switch (select)
		{
		case 1://添加联系人
			addPerson(&abs);//利用地址传递
			break;
		case 2://显示联系人
			showPerson(&abs);
			break;
		case 3://删除联系人
			deletePerson(&abs);
			break;
		case 4://查找联系人
			findPerson(&abs);
			break;
		case 5://修改联系人
			modifyPerson(&abs);
			break;
		case 6://删除所有联系人
			cleanPerson(&abs);
			break;
		case 0://退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		default:
			break;
		}
	}

	system("pause");
	return 0;
}

说说思路 我们的通讯录管理系统所需要的功能有7个,分别是增删改查,显示、清空和退出通讯录。 首先我们把菜单界面和退出功能给整出来 界面用cout/printf写就可以,退出功能我们使用switch语句将它表示出来

//菜单界面
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;
}

int main() {

	//创建通讯录结构体变量
	addressBooks abs;
	abs.p_Size = 0;//初始化通讯录当前人员个数
	int select = 0;//创建用户选择需要输入的变量

	while (true)//通过while循环让它一直在我们的菜单里运行
	{
		//调用菜单
		showMenu();

		cin >> select;//用户输入

		switch (select)
		{
		case 1://添加联系人
			break;
		case 2://显示联系人
			break;
		case 3://删除联系人
			break;
		case 4://查找联系人
			break;
		case 5://修改联系人
			break;
		case 6://删除所有联系人
			break;
		case 0://退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		default:
			break;
		}
	}

	system("pause");
	return 0;
}

如何实现添加联系人进入通讯录的功能,这里我们用到的是结构体,我们创建了两个结构体(联系人结构体和通讯录结构体)

#include <string>	//string头文件
//联系人结构体
struct Person
{
	string p_Name;
	int P_Sex;	//1-男、2-女
	int P_Age;
	string p_Phone;
	string p_Address;
};
//通讯录结构体
#define MAX 1000	//方便维护(宏定义)
struct addressBooks
{
	struct Person personArray[MAX];//通讯录中保存联系人的数组
	int p_Size;//通讯录中人员个数
};

1、添加联系人 联系人里面有五个元素,分别将它们加入通讯录的联系人中 首先要判断通讯录是否已经满了,如果满了,则输出通讯录已满,无法添加,然后返回到菜单;否则开始添加姓名,性别等五个元素。 这里面比较难搞的就是性别,我们用1代表男,2代表女,其他的任何字符我们都输出输入错误,并重新输入(用的while循环嵌套if语句),直到输入正确为止,搞定了性别,其他的元素依葫芦画瓢就可以完成了。 ==需要注意的是==这里的电话号码使用了一个函数:length 来确保电话号码为11位数字 最后不要忘记让size++;更新通讯录人数。 2、显示联系人 先判断通讯录是否为空,为空则输出通讯录为空,并范围菜单;若不为空则通过for循环遍历数组,来输出数组中所有元素内容。 值得一提的是,这里用到了三目运算符来输出性别,由于运算符优先级关系,我们需要用到括号(==不记得优先级的小伙伴最好还是都打上括号==) 3、删除、查看和修改联系人都需要先判断联系人是否在通讯录存在,所以我们可以用一个函数来判断通讯录中是否存在该联系人用for循环来遍历数组,判断数组中是否有该联系人的名字,若有则输出该联系人的数组下标,否则返回-1,回到菜单 4、==来到了这个项目中最关键的位置==

//通过数据前移将要删除的数据进行覆盖来达到删除的目的(逻辑删除)
abs->personArray[i] = abs->personArray[i + 1];

你需要理解它是如何达到删除数据的功能(其他的都挺好解决的) 5、清空联系人 这个功能好解决,但是嘞,我们多添加了一个功能,比较人性化,使用if语句来最后询问通讯录所有者最后一次,是否需要全部清空,选1则确定清空,其他的就返回菜单

这里用到的 system("pause"); system("cls"); 是为了这个面板看起来会简洁一点,不用一直用鼠标上下滑动。

这就是所有我认为需要全部讲清楚的位置了,其他不理解的可以多思考一下,注释全部摆在上面了,希望能对大家起到部分作用。 下面是一些运行的界面 请添加图片描述 请添加图片描述

请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述