练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统

黑马程序员匠心之作|C++教程从0到1入门编程

关于P72~P83-练习-通讯录管理系统

  • 1、系统功能介绍
  • 2、创建项目
  • 3、菜单功能
  • 4、退出功能实现
  • 5、添加联系人-结构体设计
  • 6、添加联系人-功能实现
  • 7、显示联系人
  • 8、删除联系人-检测联系人是否存在
  • 9、删除联系人-功能实现
  • 10、查找联系人
  • 11、修改联系人
  • 12、清空联系人
  • 至此,通讯录管理系统完成,后面部分非课程内,是本人尝试所得
  • 13、项目发布、打包成可安装部署的应用程序
  • 14、通讯录管理系统Demo的安装
  • 15、项目资源及应用程序资源

1、系统功能介绍

系统需求
通讯录是一个可以记录亲人、好友信息的工具。本教程主要利用C++来实现一个通讯录管理系统系统中需实现的功能如下:
1、添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记 1000人
2、显示联系人:显示通讯录中所有联系人信息
3、删除联系人:按照姓名进行删除指定联系人
4、查找联系人:按照姓名查看指定联系人信息
5、修改联系人:按照姓名重新修改指定联系人
6、清空联系人:清空通讯录中所有信息
7、退出通讯录:退出当前使用的通讯录

2、创建项目

打开vs之后,点击创建新项目,创建新的c++项目。
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第1张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第2张图片练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第3张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第4张图片

练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第5张图片

3、菜单功能

菜单界面效果如下:
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第6张图片
步骤:
1、封装函数显示该界面,如:void showMenu()
2、在main函数中调用封装好的函数

#include
using namespace std;

//1、封装函数显示该界面,如:`void showMenu()`
//菜单界面
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()
{ 
	//2、在main函数中调用封装好的函数
	//菜单调用
	showMenu();

	system("pause");
	return 0;
}

4、退出功能实现

思路:根据用户不同的选择,进入不同功能,可以选择switch分支结构,将整个框架进行搭建。
当用户选择0的时候,执行退出,选择其他先不做操作,也不会退出程序。

#include
using namespace std;

//菜单界面
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()
{ 
	int select = 0;//创建用户选择输入的变量
	while (true)
	{
		//菜单调用
		showMenu();

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

	}
	
	system("pause");
	return 0;
}

while()的作用
没加之前,输入1~6都会显示“请按任意键继续……”,是由于最结尾处的system("pause");return 0;
加入后,只有在输入0时,才会显示“请按任意键继续……”,且按后退出;按其他键仍旧显示菜单目录。
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第7张图片

5、添加联系人-结构体设计

添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记 1000人
实现步骤
1、设计联系人结构体
2、设计通讯录结构体
3、main函数中创建通讯录
4、封装添加联系人函数
5、测试添加联系人功能

#define MAX 1000 //最大人数
//联系人结构体
//信息包括(姓名、性别、年龄、联系电话、家庭住址)
struct person
{
	string m_Name;//姓名
	int m_Sex;//性别:1男 2女
	int m_Age;//年龄
	string m_Phone;//联系电话
	string m_Addr;//
};

//通讯录结构体
struct Addressbooks
{
	struct person personArry[MAX]; //通讯录中保存的联系人数组
	int m_Size;//通讯录中人员个数
};

6、添加联系人-功能实现

实现步骤
1、设计联系人结构体
2、设计通讯录结构体

3、main函数中创建通讯录
4、封装添加联系人函数
5、测试添加联系人功能

//main函数起始位置添加:
    //创建通讯录结构体变量
	struct Addressbooks abs;
	//初始化通讯录中当前人员个数
	abs.m_Size = 0;

//封装添加联系人函数
//判断通讯录是否已满,满了不再添加,未满情况将联系人信息逐个加入到通讯录
//添加联系人函数
void addPerson(struct Addressbooks  * abs)
{
	//判断通讯录是否已满,满了就不再添加
	if (abs->m_Size == MAX)
	{
		cout << "通讯录已满,无法添加!" << endl;
		return ;
	}
	else
	{
		//添加具体联系人
		//姓名
		string name;
		cout << "请输入姓名:"<< endl;
		cin >> name;
		abs->personArry[abs->m_Size].m_Name = name;
		//性别
		int sex = 0;
		cout << "请输入性别:" << endl;
		cout << "1 --- 男:" << endl;
		cout << "2 --- 女:" << endl;
		cin >> sex;
		//输入对了,退出循环
		//输入错了,一直输入
		while (true)
		{
			//cin >> sex;//错误位置,加在这里需要输入两次
			if (sex == 1 || sex == 2)
			{
				abs->personArry[abs->m_Size].m_Sex = sex;
				break; //输入对了,存后退出
			}
			cout << "输入错误,请重新输入性别" << endl;
			cin >> sex;//正确位置,输入的不对就一直输
		}
		//年龄
		int age = 0;
		cout << "请输入年龄:" << endl;
		cin >> age;
		while (true)
		{
			//cin >> sex;//错误位置,加在这里需要输入两次
			if (age > 0 && age < 150)
			{
				abs->personArry[abs->m_Size].m_Age = age;
				break; //输入对了,存后退出
			}
			cout << "输入错误,请重新输入年龄" << endl;
			cin >> age;//正确位置,输入的不对就一直输
		}
		
		//电话
		string phone;
		cout << "请输入电话:" << endl;
		cin >> phone;
		abs->personArry[abs->m_Size].m_Phone = phone;
		//住址
		string address;
		cout << "请输入住址:" << endl;
		cin >> address;
		abs->personArry[abs->m_Size].m_Addr = address;
		
		//更新通讯录人数
		abs->m_Size++;

		cout << "添加成功" << endl;
		system("pause");//请按任意键继续
		system("cls");//清屏操作
	}
}
//main函数switch (select)中case 1变为:
	case 1://1、添加联系人	
			//addPerson(abs); //值传递,不改变实参,无法增加
			addPerson(&abs);//利用地址传递,可以修改实参
			break;

练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第8张图片
清屏操作后,返回主菜单。
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第9张图片

7、显示联系人

步骤
1、封装显示联系人函数
2、测试显示联系人功能

//显示所有联系人函数
void showPerson(struct Addressbooks * abs)
{
	//判断通讯录中是否为0
	//如果为0,提示记录为空
	//如果不为0,显示记录的联系人信息
	if (abs->m_Size == 0)
	{
		cout << "当前的记录为空" << endl;
	}
	else
	{
		for (int i = 0;i < abs->m_Size;i++)
		{
			cout << "姓名:" << abs->personArry[i].m_Name << "\t"
				<< "性别:" << (abs->personArry[i].m_Sex == 1 ? "男":"女" )<< "\t"
				<< "年龄:" << abs->personArry[i].m_Age << "\t"
				<< "联系电话:" << abs->personArry[i].m_Phone << "\t"
				<< "家庭地址:" << abs->personArry[i].m_Addr << endl;
		}
	}
	system("pause");//请按任意键继续
	system("cls");//清屏操作
}

//main函数switch (select)中case 2变为:
	case 2://2、显示联系人
			showPerson(&abs);
			break;

练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第10张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第11张图片练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第12张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第13张图片

8、删除联系人-检测联系人是否存在

步骤
1、封装检测联系人是否存在
2、封装删除联系人函数
3、测试删除联系人功能

设计思路
删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人。因此,我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1。

//检测联系人是否存在
//如果存在,返回联系人所在数组具体位置;如果不存在,返回-1
int isExist(struct Addressbooks * abs,string name)
{
	for(int i=0;im_Size;i++)
	{
		//找到用户输入的姓名了
		if (abs->personArry[i].m_Name==name)
		{ 
			return i;//找到了,返回这个人在数组中的下标编号
		}
	}
	return -1;//如果遍历后,没找到用户输入的姓名,返回-1
	system("pause");//请按任意键继续
	system("cls");//清屏操作
}
//main函数switch (select)中case 3变为:
case 3://3、删除联系人
		{ //不加大括号,switch就会底下有红色波浪线
			cout << "请输入删除联系人姓名:" << endl;
			string name;
			cin >> name;
			if (isExist(&abs, name) == -1)
			{
				cout << "查无此人" << endl;
			}
			else
			{
				cout << "找到了" << endl;
			}
		}
			break;

练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第14张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第15张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第16张图片
注意:如果不把case3中break前代码用{}括起来,switch底下有红色波浪线,因为代码过长。

9、删除联系人-功能实现

步骤
1、封装检测联系人是否存在
2、封装删除联系人函数
3、测试删除联系人功能
根据用户输入的联系人判断通讯录中是否有人
查找到进行删除,并提示删除成功
查不到提示查无此人

//删除指定联系人
void delectPerson(struct Addressbooks * abs)
{
		cout << "请输入删除联系人姓名:" << endl;
		string name;
		cin >> name;
		int ret = isExist(abs, name);
		if (ret == -1)
		{
			cout << "查无此人" << endl;
		}
		else
		{   //查到此人,进行删除操作
			int i = ret;
			//要删除i,将i后所有数据进行前移,并让通讯录中人员个数-1
			for (;i < abs->m_Size;i++)
			{
				//数据前移
				abs->personArry[i].m_Name = abs->personArry[i + 1].m_Name;
				abs->personArry[i].m_Sex = abs->personArry[i + 1].m_Sex;
				abs->personArry[i].m_Age = abs->personArry[i + 1].m_Age;
				abs->personArry[i].m_Phone = abs->personArry[i + 1].m_Phone;
				abs->personArry[i].m_Addr = abs->personArry[i + 1].m_Addr;
			}
			abs->m_Size--;//更新通讯录中人员数
			cout << "删除成功" << endl;
		}
		system("pause");
		system("cls");
}
//main函数switch (select)中case 3变为:
case 3://3、删除联系人
		//{ //不加大括号,switch就会底下有红色波浪线
		//	cout << "请输入删除联系人姓名:" << endl;
		//	string name;
		//	cin >> name;
		//	if (isExist(&abs, name) == -1)
		//	{
		//		cout << "查无此人" << endl;
		//	}
		//	else
		//	{
		//		cout << "找到了" << endl;
		//	}
		//}
			delectPerson( &abs);
			break;

练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第17张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第18张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第19张图片

10、查找联系人

步骤:
1、封装查找联系人函数
2、测试查找指定联系人

//查找联系人
void findPerson(struct Addressbooks * abs)
{
	cout << "请输入您想要查找的联系人:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret == -1)
	{
		cout << "查无此人" << endl;
	}
	else
	{   //查到此人,进行显示操作
		int i = ret;
		cout << "姓名:"<< abs->personArry[i].m_Name <<"\t";
		cout << "性别:" << abs->personArry[i].m_Sex << "\t";
		cout << "年龄:" << abs->personArry[i].m_Age << "\t";
		cout << "联系方式:" << abs->personArry[i].m_Phone << "\t";
		cout << "地址:" << abs->personArry[i].m_Addr << endl;
	}
	system("pause");
	system("cls");
}
//main函数switch (select)中case 4变为:
case 4://4、查找联系人
			findPerson(&abs);
			break;

注意:功能2显示所有联系人,功能4只显示你查找的联系人

11、修改联系人

步骤:
1、封装修改联系人函数
2、测试修改指定联系人

//修改联系人
void modifyPerson(struct Addressbooks *abs)
{
	cout << "请输入您想要修改的联系人:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret == -1)
	{
		cout << "查无此人" << endl;
	}
	else
	{   //查到此人,进行修改操作
		//姓名
		int i = ret;
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs->personArry[i].m_Name = name;
		//性别
		int sex = 0;
		cout << "请输入性别:" << endl;
		cout << "1 --- 男:" << endl;
		cout << "2 --- 女:" << endl;
		cin >> sex;
		//输入对了,退出循环
		//输入错了,一直输入
		while (true)
		{
			//cin >> sex;//错误位置,加在这里需要输入两次
			if (sex == 1 || sex == 2)
			{
				abs->personArry[i].m_Sex = sex;
				break; //输入对了,存后退出
			}
			cout << "输入错误,请重新输入性别" << endl;
			cin >> sex;//正确位置,输入的不对就一直输
		}
		//年龄
		int age = 0;
		cout << "请输入年龄:" << endl;
		cin >> age;
		while (true)
		{
			//cin >> sex;//错误位置,加在这里需要输入两次
			if (age > 0 && age < 150)
			{
				abs->personArry[i].m_Age = age;
				break; //输入对了,存后退出
			}
			cout << "输入错误,请重新输入年龄" << endl;
			cin >> age;//正确位置,输入的不对就一直输
		}

		//电话
		string phone;
		cout << "请输入电话:" << endl;
		cin >> phone;
		abs->personArry[i].m_Phone = phone;
		//住址
		string address;
		cout << "请输入住址:" << endl;
		cin >> address;
		abs->personArry[i].m_Addr = address;

		cout << "修改成功" << endl;

	}
	system("pause");
	system("cls");

}
//main函数switch (select)中case 5变为:
case 5://5、修改联系人
			modifyPerson(&abs);
			break;

练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第20张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第21张图片练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第22张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第23张图片

12、清空联系人

步骤
1、封装清空联系人函数
2、测试清空指定联系人
思路
将通讯录中所有联系人信息删除,只要将通讯录记录人数置为0,做逻辑清空即可。

//删除所有联系人
void cleanPerson(struct Addressbooks *abs)
{
	cout << "是否确认清空?" << endl;
	cout << "1 --- 是" << endl;
	cout << "2 --- 否" << endl;
	int a;
	cin >> a;
	if (a == 1)
	{
		abs->m_Size = 0;//将当前记录联系人数量置为0,做逻辑上的清空操作
		cout << "通讯录已清空" << endl;
	}
	system("pause");
	system("cls");
}
//main函数switch (select)中case 6变为:
case 6://6、清空联系人
			cleanPerson(&abs);
			break;

练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第24张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第25张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第26张图片

至此,通讯录管理系统完成,后面部分非课程内,是本人尝试所得

13、项目发布、打包成可安装部署的应用程序

1、在要通讯录管理系统项目的解决方案 右键→添加→ 新建项目
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第27张图片
2、安装Visual Studio Installer (如果已经存在 Visual Studio Installer,直接跳往第3步)
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第28张图片
左侧安装和部署底下没有Visual Studio Installer 说明没有安装打包插件,如果按确定的话会弹出以下界面
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第29张图片
安装打包插件:Microsoft Visual Studio 2015 Installer Projects
方法1:点击链接Microsoft Visual Studio 2015 Installer Projects,进行下载
方法2:工具 --> 扩展和更新 --> 联机,搜索Microsoft Visual Studio 2017 Installer Projects

下载并安装,安装过程简单,不再详述

安装好以后,重启vs2017
3、回到我们的新建项目,选择其他项目类型 --> Visual Studio Installer --> Setup Project --> 输入Setup --> 确定
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第30张图片
4、在出现的界面中,右键Application Folder → Add → 项目输出然后选择 主输出 点击确定
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第31张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第32张图片
5、右键【主输出from 通讯录管理系统】 选择 Create Shortcut to… 生成快捷方式。
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第33张图片
7、修改快捷方式的名称为通讯录管理系统Demo,并拖入 User‘s Desktop
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第34张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第35张图片
8、右键 setup project,选择生成

练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第36张图片
9、生成成功后,打开所在文件夹就可以看到生成后的安装文件

练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第37张图片
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第38张图片
10、在通讯录管理系统Demo\Debug中可以看到
一个exe,一个msi。

msi是重点,可直接安装在Windows中。

exe是需要调用msi文件的。
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第39张图片

14、通讯录管理系统Demo的安装

1、在通讯录管理系统Demo\Debug中可以看到,一个exe,一个msi。双击.msi文件进行安装
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第40张图片
2、点击下一步
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第41张图片
3、选择安装位置
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第42张图片
4、确认安装练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第43张图片
5、安装成功后桌面显示图标
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第44张图片
6、双击图标可进行操作
练习 ~黑马程序员匠心之作-第二阶段实战-P72~P83-通讯录管理系统_第45张图片

15、项目资源及应用程序资源

1、通讯录管理系统-项目资源
链接:https://pan.baidu.com/s/19HNO7kWwXEjjG5zzxbXSpA
提取码:bm2e
2、通讯录管理系统Demo-可安装部署的应用程序
链接:https://pan.baidu.com/s/1S44-1Ujl_2D1MmFclKILaA
提取码:v1zm
3、通讯录管理系统-源码

#include
#include
using namespace std;

#define MAX 1000 //最大人数
//联系人结构体
//信息包括(姓名、性别、年龄、联系电话、家庭住址)
struct person
{
	string m_Name;//姓名
	int m_Sex;//性别:1男 2女
	int m_Age;//年龄
	string m_Phone;//联系电话
	string m_Addr;//
};

//通讯录结构体
struct Addressbooks
{
	struct person personArry[MAX]; //通讯录中保存的联系人数组
	int m_Size;//通讯录中人员个数
};


//1、添加联系人
void addPerson(struct Addressbooks  * abs)
{
	//判断通讯录是否已满,满了就不再添加
	if (abs->m_Size == MAX)
	{
		cout << "通讯录已满,无法添加!" << endl;
		return ;
	}
	else
	{
		//添加具体联系人
		//姓名
		string name;
		cout << "请输入姓名:"<< endl;
		cin >> name;
		abs->personArry[abs->m_Size].m_Name = name;
		//性别
		int sex = 0;
		cout << "请输入性别:" << endl;
		cout << "1 --- 男:" << endl;
		cout << "2 --- 女:" << endl;
		cin >> sex;
		//输入对了,退出循环
		//输入错了,一直输入
		while (true)
		{
			//cin >> sex;//错误位置,加在这里需要输入两次
			if (sex == 1 || sex == 2)
			{
				abs->personArry[abs->m_Size].m_Sex = sex;
				break; //输入对了,存后退出
			}
			cout << "输入错误,请重新输入性别" << endl;
			cin >> sex;//正确位置,输入的不对就一直输
		}
		//年龄
		int age = 0;
		cout << "请输入年龄:" << endl;
		cin >> age;
		while (true)
		{
			//cin >> sex;//错误位置,加在这里需要输入两次
			if (age > 0 && age < 150)
			{
				abs->personArry[abs->m_Size].m_Age = age;
				break; //输入对了,存后退出
			}
			cout << "输入错误,请重新输入年龄" << endl;
			cin >> age;//正确位置,输入的不对就一直输
		}
		
		//电话
		string phone;
		cout << "请输入电话:" << endl;
		cin >> phone;
		abs->personArry[abs->m_Size].m_Phone = phone;
		//住址
		string address;
		cout << "请输入住址:" << endl;
		cin >> address;
		abs->personArry[abs->m_Size].m_Addr = address;
		
		//更新通讯录人数
		abs->m_Size++;

		cout << "添加成功" << endl;
		
	}
	system("pause");//请按任意键继续
	system("cls");//清屏操作
}
//2、显示所有联系人
void showPerson(struct Addressbooks * abs)
{
	//判断通讯录中是否为0
	//如果为0,提示记录为空
	//如果不为0,显示记录的联系人信息
	if (abs->m_Size == 0)
	{
		cout << "当前的记录为空" << endl;
	}
	else
	{
		for (int i = 0;i < abs->m_Size;i++)
		{
			cout << "姓名:" << abs->personArry[i].m_Name << "\t"
				<< "性别:" << (abs->personArry[i].m_Sex == 1 ? "男":"女" )<< "\t"
				<< "年龄:" << abs->personArry[i].m_Age << "\t"
				<< "联系电话:" << abs->personArry[i].m_Phone << "\t"
				<< "家庭地址:" << abs->personArry[i].m_Addr << endl;
		}
	}
	system("pause");//请按任意键继续
	system("cls");//清屏操作
}
//检测联系人是否存在
//如果存在,返回联系人所在数组具体位置;如果不存在,返回-1
int isExist(struct Addressbooks * abs,string name)
{
	for(int i=0;im_Size;i++)
	{
		//找到用户输入的姓名了
		if (abs->personArry[i].m_Name==name)
		{ 
			return i;//找到了,返回这个人在数组中的下标编号
		}
	}
	return -1;//如果遍历后,没找到用户输入的姓名,返回-1
	system("pause");//请按任意键继续
	system("cls");//清屏操作
}
//3、删除指定联系人
void delectPerson(struct Addressbooks * abs)
{
		cout << "请输入删除联系人姓名:" << endl;
		string name;
		cin >> name;
		int ret = isExist(abs, name);
		if (ret == -1)
		{
			cout << "查无此人" << endl;
		}
		else
		{   //查到此人,进行删除操作
			int i = ret;
			//要删除i,将i后所有数据进行前移,并让通讯录中人员个数-1
			for (;i < abs->m_Size;i++)
			{
				//数据前移
				abs->personArry[i].m_Name = abs->personArry[i + 1].m_Name;
				abs->personArry[i].m_Sex = abs->personArry[i + 1].m_Sex;
				abs->personArry[i].m_Age = abs->personArry[i + 1].m_Age;
				abs->personArry[i].m_Phone = abs->personArry[i + 1].m_Phone;
				abs->personArry[i].m_Addr = abs->personArry[i + 1].m_Addr;
			}
			abs->m_Size--;//更新通讯录中人员数
			cout << "删除成功" << endl;
		}
		system("pause");
		system("cls");
}
//4、查找联系人
void findPerson(struct Addressbooks * abs)
{
	cout << "请输入您想要查找的联系人:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret == -1)
	{
		cout << "查无此人" << endl;
	}
	else
	{   //查到此人,进行显示操作
		int i = ret;
		cout << "姓名:"<< abs->personArry[i].m_Name <<"\t";
		cout << "性别:" << abs->personArry[i].m_Sex << "\t";
		cout << "年龄:" << abs->personArry[i].m_Age << "\t";
		cout << "联系方式:" << abs->personArry[i].m_Phone << "\t";
		cout << "地址:" << abs->personArry[i].m_Addr << endl;
	}
	//按任意键清屏
	system("pause");
	system("cls");
}
//5、修改联系人
void modifyPerson(struct Addressbooks *abs)
{
	cout << "请输入您想要修改的联系人:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret == -1)
	{
		cout << "查无此人" << endl;
	}
	else
	{   //查到此人,进行修改操作
		//姓名
		int i = ret;
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs->personArry[i].m_Name = name;
		//性别
		int sex = 0;
		cout << "请输入性别:" << endl;
		cout << "1 --- 男:" << endl;
		cout << "2 --- 女:" << endl;
		cin >> sex;
		//输入对了,退出循环
		//输入错了,一直输入
		while (true)
		{
			//cin >> sex;//错误位置,加在这里需要输入两次
			if (sex == 1 || sex == 2)
			{
				abs->personArry[i].m_Sex = sex;
				break; //输入对了,存后退出
			}
			cout << "输入错误,请重新输入性别" << endl;
			cin >> sex;//正确位置,输入的不对就一直输
		}
		//年龄
		int age = 0;
		cout << "请输入年龄:" << endl;
		cin >> age;
		while (true)
		{
			//cin >> sex;//错误位置,加在这里需要输入两次
			if (age > 0 && age < 150)
			{
				abs->personArry[i].m_Age = age;
				break; //输入对了,存后退出
			}
			cout << "输入错误,请重新输入年龄" << endl;
			cin >> age;//正确位置,输入的不对就一直输
		}

		//电话
		string phone;
		cout << "请输入电话:" << endl;
		cin >> phone;
		abs->personArry[i].m_Phone = phone;
		//住址
		string address;
		cout << "请输入住址:" << endl;
		cin >> address;
		abs->personArry[i].m_Addr = address;

		cout << "修改成功" << endl;

	}
	system("pause");
	system("cls");

}
//6、删除所有联系人
void cleanPerson(struct Addressbooks *abs)
{
	cout << "是否确认清空?" << endl;
	cout << "1 --- 是" << endl;
	cout << "2 --- 否" << endl;
	int a;
	cin >> a;
	if (a == 1)
	{
		abs->m_Size = 0;//将当前记录联系人数量置为0,做逻辑上的清空操作
		cout << "通讯录已清空" << endl;
	}
	system("pause");
	system("cls");
}

//菜单界面
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()
{ 
	//创建通讯录结构体变量
	struct Addressbooks abs;
	//初始化通讯录中当前人员个数
	abs.m_Size = 0;

	int select = 0;//创建用户选择输入的变量
	while (true)
	{
		//菜单调用
		showMenu();

		cin >> select;
		switch (select)
		{
		case 1://1、添加联系人	
			//addPerson(abs); //值传递,不改变实参,无法增加
			addPerson(&abs);//利用地址传递,可以修改实参
			break;
		case 2://2、显示联系人
			showPerson(&abs);
			break;
		case 3://3、删除联系人
		//{ //不加大括号,switch就会底下有红色波浪线
		//	cout << "请输入删除联系人姓名:" << endl;
		//	string name;
		//	cin >> name;
		//	if (isExist(&abs, name) == -1)
		//	{
		//		cout << "查无此人" << endl;
		//	}
		//	else
		//	{
		//		cout << "找到了" << endl;
		//	}
		//}
			delectPerson( &abs);
			break;
		case 4://4、查找联系人
			findPerson(&abs);
			break;
		case 5://5、修改联系人
			modifyPerson(&abs);
			break;
		case 6://6、清空联系人
			cleanPerson(&abs);
			break;
		case 0://0、退出通讯录
			cout << "欢迎下次使用!" << endl;
			system("pause");
			return 0;
			break;
		default:
			break;
		}

	}
	

	system("pause");
	return 0;
}



你可能感兴趣的:(c++)