C++基础项目实战之通讯录管理系统

news2024/11/25 3:03:11

赶时间的可以看改进版的通讯录管理系统

通讯录管理系统

文章目录

  • 通讯录管理系统
    • 1. 系统需求
    • 2. 菜单功能
    • 3. 退出功能
    • 4. 添加联系人
      • 4.1 设计联系人结构体
      • 4.2 设计通讯录结构体
    • 5. 显示联系人
      • 5.1 封装显示联系人函数
    • 6. 删除联系人
      • 6.1 封装检测联系人是否存在
      • 6.2 封装删除联系人函数
    • 7. 查找联系人
      • 7.1 封装查找联系人函数
    • 8. 修改联系人
      • 8.1 封装修改联系人函数
      • 8.2 测试修改联系人功能
    • 9. 清空联系人
      • 9.1 封装清空联系人函数
  • 通讯录管理系统改进版

1. 系统需求

通讯录是一个可以记录亲人,好友信息的工具

本教程主要利用 cpp 来实现一个最简单的通讯录管理系统

系统中需要实现的功能如下:

  • 添加联系人:向通讯录添加新人,信息包括(姓名,性别,年龄,联系电话,家庭住址)最多记录100人
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人信息
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有的信息
  • 退出通讯录:退出当前使用的通讯录

2. 菜单功能

功能描述:用户选择功能的界面

菜单界面效果如下图:
image-20210725233801883

步骤

  • 封装函数显示该界面 如 void showMenu()
  • 在 main 函数中调用封装好的函数

代码

#include <iostream>
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()
{
	//菜单的调用
	showMenu();
    
	system("pause");
	return 0;
}

3. 退出功能

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个框架进行搭建

当用户选择 0 的时候,执行退出,选择其他先不做操作,也不会退出程序

代码

//封装函数显示该界面 如 void showMenu()
//在 main 函数中调用封装好的函数
#include <iostream>
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;
}

效果图
image-20210726001853038

4. 添加联系人

功能描述:

实现添加联系人功能,联系人上限为1000人,联系人包括(姓名,性别,年龄,联系电话,家庭住址)

添加联系人实现步骤:

  • 设计联系人结构体
  • 设计通讯录结构体
  • main函数中创建通讯录
  • 封装添加联系人函数
  • 测试添加联系人功能

4.1 设计联系人结构体

联系人信息包括:姓名,性别,年龄,联系电话,家庭住址

设计如下:

//定义联系人结构体
struct person
{
    string name;	//姓名
    sting sex;		//性别
    int age;		//年龄
    string phonenum;	//电话号码
    string addr;	//家庭地址
};

电话号码的定义为什么不用 int

  • 原因是 电话号码是11位已经超过了 int 能表达的范围了,所以我们改string 来存放
  • 实例:excel 表格中身份证号码单元格常常用文本类型来存放

4.2 设计通讯录结构体

设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量

设计如下:

#define max 1000  //最大人数

//定义通讯录结构体
struct addressbooks
{
    struct person personarray[max];  //通讯录中保存的联系人数组
    int size;  //通讯录中人员个数
};

5. 显示联系人

功能描述:显示通讯录中已有的联系人信息

显示联系人实现步骤:

  • 封装显示联系人函数
  • 测试显示联系人功能

5.1 封装显示联系人函数

思路:判断如果当前通讯录没有人员,就提示记录为空,人数大于0,显示通讯录中的信息

显示联系人代码:

//显示联系人
void showperson(struct addressbooks * a)
{
	//判断通讯录中的人数是否为0,如果为0提示记录为空
	//如果不为0,显示记录的联系人信息
	if (a->size == 0)
	{
		cout << "目前通讯录中还没有联系人" << endl;
	}
	else
	{
		for (int i = 0; i < a->size; i++)
		{
			cout << "姓名:" << a->personarray[i].name << "\t";
			cout << "性别:" << (a->personarray[i].sex == 1 ? "男" : "女") << "\t";
			cout << "年龄:" << a->personarray[i].age << "\t";
			cout << "电话:" << a->personarray[i].phonenum << "\t";
			cout << "住址:" << a->personarray[i].addr << endl;
		}
	}
	system("pause");	//请按任意键继续
	system("cls");	//清屏
}

6. 删除联系人

功能描述:按照姓名进行删除指定联系人

删除联系人实现步骤:

  • 封装检测联系人是否存在
  • 封装删除联系人函数
  • 测试删除联系人功能

6.1 封装检测联系人是否存在

设计思路:

  • 删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人

  • 因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1

检测联系人是否存在代码:

//检测联系人是否存在,如果存在,返回联系人所在数组中的具体位置,不存在返回-1
//参数1 通讯录  参数2 用户想查找联系人的名字
int isExist(addressbooks* a, string name)
{
	for (int i = 0; i < a->size; i++)
	{
		//找到用户输入的姓名了
		if (a->personarray[i].name == name)
		{
			return i; //找到了这个人,返回这个人所在的下标编号
		}
	}
	return -1;  //如果遍历结束都没找到这个人,返回-1
}

代码出现控制传输跳过的实例化是怎么回事呢?

  • 我们在使用switch 语句时,如果break前的代码行过长,则无法运行

解决方法:把长代码段再用一个大括号括起来

6.2 封装删除联系人函数

根据用户输入的联系人判断该通讯录中是否有此人

查找到进行删除,并提示删除成功

查找不到提示查无此人

删除操作图例:

image-20210728214944259
//删除指定联系人
void delper(addressbooks* a)
{
	cout << "请输入您要删除的联系人" << endl;
	string name;
	cin >> name;
	
	//如果ret == -1 说明没查到这个人,否则查到了
	int ret = isExist(a, name);  //用ret接收返回结果,也就是下标编号
	if (ret != -1)
	{
		//查到此人,进行删除操作
		for (int i = ret; i < a->size; i++)  //标记下标编号
		{
			//数据前移
			a->personarray[i] = a->personarray[i + 1];
		}
		a->size--;	//更新通讯录中的人员数量
		cout << "删除成功" << endl;
	}
	else
	{
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

7. 查找联系人

功能描述:按照姓名查看指定联系人信息

查找联系人实现步骤:

  • 封装查找联系人函数
  • 测试查找指定联系人

7.1 封装查找联系人函数

实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人

查找联系人代码:

//查找联系人
void findper(addressbooks* a)
{
	cout << "请输入需要查找的联系人" << endl;
	string name;
	cin >> name;

	//判断指定联系人是否存在通讯录中
	int ret = isExist(a, name);
	if(ret != -1)		//找到联系人
	{
		cout << "姓名:" << a->personarray[ret].name << "\t";
		cout << "性别:" << (a->personarray[ret].sex == 1 ? "男" : "女") << "\t";
		cout << "年龄:" << a->personarray[ret].age << "\t";
		cout << "电话:" << a->personarray[ret].phonenum << "\t";
		cout << "地址:" << a->personarray[ret].addr << endl;
	}
	else		//未找到联系人
	{
		cout << "查无此人" << endl;
	}
	//任意键按下后清屏
	system("pause");
	system("cls");
}

8. 修改联系人

功能描述:按照姓名重新修改指定联系人

修改联系人实现步骤

  • 封装修改联系人函数
  • 测试修改联系人功能

8.1 封装修改联系人函数

实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人

修改联系人代码:

//修改联系人
void modifyper(addressbooks* a)
{
	cout << "请输入要修改的联系人" << endl;
	string name;
	cin >> name;

	int ret = isExist(a, name);
	if (ret != -1)	//找到联系人
	{
		//修改姓名
		string name;
		cout << "请输入姓名" << endl;
		cin >> name;
		a->personarray[ret].name = name;

		//修改性别
		int sex = 0;
		cout << "请输入性别" << endl;
		while (true)
		{
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				//输入正确,退出循环输入
				a->personarray[ret].sex = sex;
				break;
			}
			cout << "请重新输入性别" << endl;
		}

		//修改年龄
		int age =0;
		cout << "请输入年龄" << endl;
		cin >> age;
		a->personarray[ret].age = age;

		//修改电话
		string phonenum;
		cout << "请输入电话" << endl;
		cin >> phonenum;
		a->personarray[ret].phonenum = phonenum;

		//修改住址
		string addr;
		cout << "请输入住址" << endl;
		cin >> addr;
		a->personarray[ret].addr = addr;

		cout << "修改成功" << endl;
	}
	else	//未找到联系人
	{
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

8.2 测试修改联系人功能

在switch case语句中,case 5里添加

case 5:				//5.修改联系人
		modifyper(&a);
		break;

9. 清空联系人

功能描述:清空通讯录中所有信息

清空联系人实现步骤

  • 封装清空联系人函数
  • 测试清空联系人

9.1 封装清空联系人函数

实现思路:将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量重置为0,做逻辑清空即可

清空联系人代码:

//清空联系人
void clean(addressbooks* a)
{
	a->size = 0;	//将当期记录联系人数量重置为0,做逻辑清空操作
	cout << "联系人已经清空" << endl;
	system("pause");
	system("cls");
}

至此完成通讯录的制作

通讯录管理系统的总代码:

//封装函数显示该界面 如 void showMenu()
//在 main 函数中调用封装好的函数
#include <iostream>
using namespace std;
#define max 1000

//设计联系人的结构体
struct person
{
	string name;	//姓名
	int sex;		//性别
	int age;		//年龄
	string phonenum;	//电话
	string addr;	//住址
};

//设计通讯录的结构体
struct addressbooks
{
	//通讯录中保存的联系人数组
	struct person personarray[max];

	//通讯录中当前记录联系人个数
	int size;
};

//添加联系人
void addperson(struct addressbooks * a)
{
	//判断通讯录是否已经满了,如果满了就不再添加
	if (a->size == max)
	{
		cout << "通讯录已经满了,无法添加" << endl;
		return;
	}
	else
	{
		//添加具体联系人
		
		//姓名
		string name;
		cout << "请输入姓名" << endl;
		cin >> name;
		a->personarray[a->size].name = name;	
		//指针a访问 数组personarray中的第size位中的name
		//并把cin的name赋值给 数组personarray中的第size位中的name

		//性别
		int sex = 0;
		cout << "请输入性别: 1----男 2-----女" << endl;
		while (true)
		{
			//如果输入的是1或2可以退出循环,如果输入其他数字则循环到输入正确数值为止
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				a->personarray[a->size].sex = sex;
				break;
			}
			cout << "请重新输入" << endl;
		}
		
		//年龄
		int age;
		cout << "请输入年龄" << endl;
		cin >> age;
		a->personarray[a->size].age = age;

		//电话
		string phonenum;
		cout << "请输入电话" << endl;
		cin >> phonenum;
		a->personarray[a->size].phonenum = phonenum;

		//住址
		string addr;
		cout << "请输入地址" << endl;
		cin >> addr;
		a->personarray[a->size].addr = addr;

		//更新通讯录的人数
		a->size++;
		cout << "添加成功" << endl;
		system("pause");  //请按任意键继续
		system("cls");	  //清屏
	}
}

//显示联系人
void showperson(struct addressbooks * a)
{
	//判断通讯录中的人数是否为0,如果为0提示记录为空
	//如果不为0,显示记录的联系人信息
	if (a->size == 0)
	{
		cout << "目前通讯录中还没有联系人" << endl;
	}
	else
	{
		for (int i = 0; i < a->size; i++)
		{
			cout << "姓名:" << a->personarray[i].name << "\t";
			cout << "性别:" << (a->personarray[i].sex == 1 ? "男" : "女") << "\t";
			cout << "年龄:" << a->personarray[i].age << "\t";
			cout << "电话:" << a->personarray[i].phonenum << "\t";
			cout << "住址:" << a->personarray[i].addr << endl;
		}
	}
	system("pause");
	system("cls");
}

//检测联系人是否存在,如果存在,返回联系人所在数组中的具体位置,不存在返回-1
//参数1 通讯录  参数2 用户想查找联系人的名字
int isExist(addressbooks* a, string name)
{
	for (int i = 0; i < a->size; i++)
	{
		//找到用户输入的姓名了
		if (a->personarray[i].name == name)
		{
			return i; //找到了这个人,返回这个所在的下标编号
		}
	}
	return -1;
}

//删除指定联系人
void delper(addressbooks* a)
{
	cout << "请输入您要删除的联系人" << endl;
	string name;
	cin >> name;
	
	//如果ret == -1 说明没查到这个人,否则查到了
	int ret = isExist(a, name);  //用ret接收返回结果,也就是下标编号
	if (ret != -1)
	{
		//查到此人,进行删除操作
		for (int i = ret; i < a->size; i++)  //标记下标编号
		{
			//数据前移
			a->personarray[i] = a->personarray[i + 1];
		}
		a->size--;	//更新通讯录中的人员数量
		cout << "删除成功" << endl;
	}
	else
	{
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

//查找联系人
void findper(addressbooks* a)
{
	cout << "请输入需要查找的联系人" << endl;
	string name;
	cin >> name;

	//判断指定联系人是否存在通讯录中
	int ret = isExist(a, name);
	if(ret != -1)		//找到联系人
	{
		cout << "姓名:" << a->personarray[ret].name << "\t";
		cout << "性别:" << (a->personarray[ret].sex == 1 ? "男" : "女") << "\t";
		cout << "年龄:" << a->personarray[ret].age << "\t";
		cout << "电话:" << a->personarray[ret].phonenum << "\t";
		cout << "地址:" << a->personarray[ret].addr << endl;
	}
	else		//未找到联系人
	{
		cout << "查无此人" << endl;
	}
	//任意键按下后清屏
	system("pause");
	system("cls");
}

//修改联系人
void modifyper(addressbooks* a)
{
	cout << "请输入要修改的联系人" << endl;
	string name;
	cin >> name;

	int ret = isExist(a, name);
	if (ret != -1)	//找到联系人
	{
		//修改姓名
		string name;
		cout << "请输入姓名" << endl;
		cin >> name;
		a->personarray[ret].name = name;

		//修改性别
		int sex = 0;
		cout << "请输入性别" << endl;
		while (true)
		{
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				//输入正确,退出循环输入
				a->personarray[ret].sex = sex;
				break;
			}
			cout << "请重新输入性别" << endl;
		}

		//修改年龄
		int age =0;
		cout << "请输入年龄" << endl;
		cin >> age;
		a->personarray[ret].age = age;

		//修改电话
		string phonenum;
		cout << "请输入电话" << endl;
		cin >> phonenum;
		a->personarray[ret].phonenum = phonenum;

		//修改住址
		string addr;
		cout << "请输入住址" << endl;
		cin >> addr;
		a->personarray[ret].addr = addr;

		cout << "修改成功" << endl;
	}
	else	//未找到联系人
	{
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

//清空联系人
void clean(addressbooks* a)
{
	a->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 a;	//创建通讯录结构体变量
	a.size = 0;	//初始化通讯录中当前的人员个数
	int select = 0;  //创建用户选择输入的变量

	while (true)
	{
		showMenu();		 //菜单的调用
		cin >> select;   //用户输入变量

		switch (select)
		{
		case 1:				//1.添加联系人
			addperson(&a);	//利用地址传递,可以修饰形参
			break;
		case 2:				//2.显示联系人
			showperson(&a);
			break;
		case 3:				//3.删除联系人
			delper(&a);
		/*{
			cout << "请输入想要删除的联系人姓名" << endl;
			string name;
			cin >> name;
			if (isExist(&a, name) == -1)
			{
				cout << "查无此人" << endl;
			}
			else
			{
				cout << "找到此人了" << endl;
			}
		}*/ //测试代码
			break;
		case 4:				//4.查找联系人
			findper(&a);
			break;
		case 5:				//5.修改联系人
			modifyper(&a);
			break;
		case 6:				//6.清空联系人
			clean(&a);
			break;
		case 0:				//0.退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

通讯录管理系统改进版

上面的代码是我三年前做的笔记了,那个时候初学C++,好多地方都是不怎么规范的写法,而且都是照着视频敲代码,不是自己独立完成的

今天心血来潮想考验一下自己能不能在两年没学的情况下不借助任何参考敲出来,结论是还不错哈哈哈(大佬勿喷),用的语法也不是很高级,很多地方可以用STL和容器来优化,但是考虑到这是我初学C++时写的,那个时候还没学后面的高级语法,所以就用最基本的语法来完成这个小项目

对比了一下之前的代码,现在感叹 “少时不知函数好,错把main函数当块宝”,函数解决了代码复用的问题。比如下面的这四个函数,很多地方都能用的到,就可以直接提出
来单独作为一个函数,体验还是很不错的

//计算长度
int bookSize(const ContactsBook* con)

//判断通讯录是否为满
bool isFull(const ContactsBook* con)

//判断通讯录是否为空
bool isEmpty(const ContactsBook* con)

//判断性别
std::string ifGender(const ContactsBook* con, int locate)
#include <iostream>
#define MAXSIZE 1000

//联系人结构体
struct Contacts
{
	std::string m_contactName;
	int m_contactGender;
	int m_contactAge;
	std::string m_contactPhoNum;
	std::string m_contactAddr;
};

//通讯录结构体
struct ContactsBook
{
	Contacts* contactArray;
	int m_bookSize;
};

//计算长度
int bookSize(const ContactsBook* con)
{
	return con->m_bookSize;
}

//判断通讯录是否为满
bool isFull(const ContactsBook* con)
{
	if (bookSize(con) == MAXSIZE)
	{
		std::cout << "通讯录已满,无法添加联系人" << std::endl;
		system("pause");
		system("cls");
		return true;
	}
	return false;
}

//判断通讯录是否为空
bool isEmpty(const ContactsBook* con)
{
	if (bookSize(con) == 0)
	{
		std::cout << "通讯录为空,无法删除联系人" << std::endl;
		system("pause");
		system("cls");
		return true;
	}
	return false;
}

//判断性别
std::string ifGender(const ContactsBook* con, int locate)
{
	int gender = con->contactArray[locate].m_contactGender;
	if (gender == 1)
	{
		return "男";
	}
	return "女";
}

//显示菜单界面
void showMenu()
{
	std::cout << "==========================" << std::endl;
	std::cout << "====== 1.添加联系人:======" << std::endl;
	std::cout << "====== 2.显示联系人:======" << std::endl;
	std::cout << "====== 3.删除联系人:======" << std::endl;
	std::cout << "====== 4.查找联系人:======" << std::endl;
	std::cout << "====== 5.修改联系人:======" << std::endl;
	std::cout << "====== 6.清空联系人:======" << std::endl;
	std::cout << "====== 0.退出通讯录:======" << std::endl;
	std::cout << "==========================" << std::endl;
}

//添加联系人函数
void addContacts(ContactsBook* con)
{
	int size = bookSize(con);
	if (isFull(con))
	{
		return;
	}

	//姓名
	std::string name;
	std::cout << "请输入姓名: ";
	std::cin >> name;
	con->contactArray[size].m_contactName = name;

	//性别
	int gender;
	std::cout << "请输入性别(输入1代表男,输入2代表女): ";
	std::cin >> gender;
	while (gender != 1 && gender != 2)
	{
		std::cout << "您输入的数字不符合要求(输入1代表男,输入2代表女): ";
		std::cin >> gender;
	}
	con->contactArray[size].m_contactGender = gender;

	//年龄
	int age;
	std::cout << "请输入年龄(1~100): ";
	std::cin >> age;
	while (age <= 0 || age >= 100)
	{
		std::cout << "您输入的数字不符合要求,年龄应在1~100之间: ";
		std::cin >> age;
	}
	con->contactArray[size].m_contactAge = age;

	//联系电话
	std::string phoNum;
	std::cout << "请输入联系电话: ";
	std::cin >> phoNum;
	con->contactArray[size].m_contactPhoNum = phoNum;

	//家庭住址
	std::string addr;
	std::cout << "请输入家庭住址: ";
	std::cin >> addr;
	con->contactArray[size].m_contactAddr = addr;

	con->m_bookSize++;
	std::cout << "添加成功" << std::endl;

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

//显示联系人
void printContacts(const ContactsBook* con)
{
	int size = bookSize(con);

	std::cout
		<< " 姓名 \t" << " 性别 \t" << " 年龄 \t"
		<< " 联系电话 \t" << " 家庭住址" << std::endl;
	for (int i = 0; i < size; i++)
	{
		std::cout
			<< " " << con->contactArray[i].m_contactName << "\t"
			<< " " << ifGender(con, i) << "\t"
			<< " " << con->contactArray[i].m_contactAge << "\t"
			<< " " << con->contactArray[i].m_contactPhoNum << "\t"
			<< " " << con->contactArray[i].m_contactAddr
			<< " " << std::endl;
	}

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

//查找对应的人
int isContact(const ContactsBook* con)
{
	std::string name;
	std::cout << "请输入你需要查找的名字: ";
	std::cin >> name;

	for (int i = 0; i < bookSize(con); i++)
	{
		if (name == con->contactArray[i].m_contactName)
		{
			std::cout
				<< " 姓名 \t" << " 性别 \t" << " 年龄 \t"
				<< " 联系电话 \t" << " 家庭住址" << std::endl;
			std::cout
				<< " " << con->contactArray[i].m_contactName << "\t"
				<< " " << ifGender(con, i) << "\t"
				<< " " << con->contactArray[i].m_contactAge << "\t"
				<< " " << con->contactArray[i].m_contactPhoNum << "\t"
				<< " " << con->contactArray[i].m_contactAddr
				<< " " << std::endl;

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

	std::cout << "===未找到名字为 " << name << " 的联系人===" << std::endl;
	system("pause");
	system("cls");
	return -1;
}

//删除联系人
void deleteContacts(ContactsBook* con)
{
	if (isEmpty(con))
	{
		return;
	}

	int result = isContact(con);
	if (result == -1)
	{
		return;
	}

	int select = 2;
	std::cout << "要删除这个联系人吗?(1.要, 2.不要)" << std::endl;
	std::cin >> select;
	if (select == 1)
	{
		for (int i = result; i < bookSize(con); i++)
		{
			con->contactArray[i] = con->contactArray[i + 1];
		}
		std::cout << "删除成功" << std::endl;
		con->m_bookSize--;
	}
	
	system("pause");
	system("cls");
}

//修改联系人
void modifyContacts(ContactsBook* con)
{
	int result = isContact(con);
	if (result)
	{
		return;
	}

	int select = 2;
	std::cout << "要修改这个联系人吗?(1.要, 2.不要)" << std::endl;
	std::cin >> select;
	if (select == 1)
	{
		//姓名
		std::string name;
		std::cout << "请输入姓名: ";
		std::cin >> name;
		con->contactArray[result].m_contactName = name;

		//性别
		int gender;
		std::cout << "请输入性别(输入1代表男,输入2代表女): ";
		std::cin >> gender;
		while (gender != 1 && gender != 2)
		{
			std::cout << "您输入的数字不符合要求(输入1代表男,输入2代表女): ";
			std::cin >> gender;
		}
		con->contactArray[result].m_contactGender = gender;

		//年龄
		int age;
		std::cout << "请输入年龄(1~100): ";
		std::cin >> age;
		while (age <= 0 || age >= 100)
		{
			std::cout << "您输入的数字不符合要求,年龄应在1~100之间: ";
			std::cin >> age;
		}
		con->contactArray[result].m_contactAge = age;

		//联系电话
		std::string phoNum;
		std::cout << "请输入联系电话: ";
		std::cin >> phoNum;
		con->contactArray[result].m_contactPhoNum = phoNum;

		//家庭住址
		std::string addr;
		std::cout << "请输入家庭住址: ";
		std::cin >> addr;
		con->contactArray[result].m_contactAddr = addr;

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

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

//清空联系人
void clearContacts(ContactsBook* con)
{
	//释放空间
	int select = 2;
	std::cout << "要清空联系人吗?(1.要, 2.不要)" << std::endl;
	std::cin >> select;
	if (select == 1)
	{
		con->m_bookSize = 0;
	}

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

int main()
{
	//创建通讯录,动态分配空间
	ContactsBook con;
	con.contactArray = new Contacts[MAXSIZE];
	con.m_bookSize = 0;

	//自己的选项
	int choose = 0;
	while (true)
	{
		showMenu();
		std::cin >> choose;

		switch (choose)
		{
		case 1:
			addContacts(&con);
			break;
		case 2:
			printContacts(&con);
			break;
		case 3:
			deleteContacts(&con);
			break;
		case 4:
			isContact(&con);
			break;
		case 5:
			modifyContacts(&con);
			break;
		case 6:
			clearContacts(&con);
			break;
		case 0:
			std::cout << "~~~~欢迎下次使用~~~~" << std::endl;
			system("pause");
			return 0;
			break;
		default:
			break;
		}
	}

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

再度合作|极智嘉(Geek+) P系列拣选机器人进驻CEVA欧洲物流中心

近日&#xff0c;3PL巨头CEVA Logistics首度在社交媒体展示其与极智嘉(Geek)合作打造的全新欧洲物流中心&#xff0c;并在推文中对极智嘉(Geek)给予了高度赞扬。CEVA表示&#xff0c;极智嘉不仅彻底颠覆了CEVA的工作环境&#xff0c;还充分保障了敬业员工的安全和人体工程学效率…

2.6 线性表的逆置

逆置: 将表中的元素调整成与原来相反的顺序. 1. 顺序表的逆置 图1. 顺序表的逆置 用temp存储要交换的元素, temp arr[ i ]; arr[ i ] arr[ j ]; arr[ j ] temp; 然后i, j--. 若数组长度为偶数, 则i > j时结束循环; 若数组长度为奇数, 则i > j时结束循环. 也即不管数…

ABAP W CVI_EI 047 对供应商,不支持初始的 OBJECT_TASK

调BAPI:cl_md_bp_maintain>maintain修改供应商失败&#xff0c;提示 W CVI_EI 047 对供应商&#xff0c;不支持初始的 OBJECT_TASK 很可能是vendor-header中的object_task没有赋值 ls_data-vendor-header-object_task ‘U’.

C进阶:指针的进阶(3)

函数指针 首先来看一段代码&#xff1a; #include <stdio.h>void test() {printf("hehe\n"); }int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 让我们来看一下执行结果吧&#xff1a; 从上述结果得出&#x…

OCR-字符识别笔记

安装 环境依赖 Linux | Windows | macOSPython 3.7PyTorch 1.6 或更高版本torchvision 0.7.0CUDA 10.1NCCL 2GCC 5.4.0 或更高版本准备环境 注解 如果你已经在本地安装了 PyTorch,请直接跳转到安装步骤。 第一步 下载并安装 Miniconda. 第二步 创建并激活一个 conda 环境…

[PCIE体系结构导读]PCI和PCI中断

PCI PCI总桥由HOST主桥和PCI桥推出&#xff0c;HOST主桥与主存储器控制器在同一级总线上&#xff0c;因此PCI设备可以方便地通过HOST主桥访问主存储器&#xff0c;即进行DMA操作。 PCI设备的DMA操作需要与处理器系统的Cache进行一致性操作&#xff0c;当PCI设备通过HOST主桥访…

guava限流器RateLimiter使用简介(Springboot实现)

在大型分布式系统中&#xff0c;限流是一种重要的防护机制&#xff0c;可以帮助我们控制流量并减轻系统的负担。Google的Guava库提供了一种方便的限流器实现&#xff0c;可以帮助我们轻松地实现限流功能。本文将介绍Guava中限流器的基本概念和使用方法。 一、什么是限流器&…

二层交换机和三层交换机区别

一、指代不同 1、两层交换机&#xff1a;工作于OSI模型的第2层&#xff08;数据链路层&#xff09;&#xff0c;故而称为二层交换机。 2、三层交换机&#xff1a;具有部分路由器功能的交换机&#xff0c;工作在OSI网络标准模型的第三层。 二、功能不同 1、两层交换机&#xff1…

企业数字化转型需要解决哪些问题?

企业的数字化转型及利用技术和数字解决方案来改进业务流程、增强客户体验并推动整体增长。尽管每个企业的数字化转型之旅都是独特的&#xff0c;但仍需要解决几个常见问题以确保转型成功。其中一些问题包括&#xff1a; 1.抵制变革&#xff1a;数字化转型中最大的挑战之一是员…

国赛线下开赛!全国智能车百度智慧交通创意组区域赛今日正式拉开帷幕!

“全国大学生智能汽车竞赛”是教育部倡导的大学生科技A类竞赛&#xff0c;中国高等教育学会将其列为含金量最高的大学生竞赛之一&#xff0c;为《全国普通高校大学生竞赛排行榜》榜单内赛事。飞桨共承办了百度完全模型组和百度智慧交通组两大赛道。全国大学生智能汽车竞赛百度智…

ptmalloc底层原理剖析

目录 一、概述 二、基础了解 2.1 32位进程默认内存布局 2.2 brk & sbrk & mmap 三、内存管理 2.1 结构 2.1.1 main_arena 与 non_main_arena 2.1.2 malloc_chunk 2.1.3 空闲链表bins 2.1.4 初始化 2.2 内存分配与释放 三、ptmalloc、tcmalloc与jemalloc实现…

阿里云安装宝塔面板

阿里云安装宝塔面板 1.安装步骤2.需要加入安全组&#xff0c;打开端口3.安装宝塔 1.安装步骤 1.这里主要以阿里云的服务器 ECS为例子,需要安装纯净的系统 创建过程: 这边先用的是免费的: 2.需要加入安全组&#xff0c;打开端口 进入实例选项卡&#xff1a; 快速添加&…

一种利用旋转中心进行手眼标定的原理性介绍

首先,我们要了解一下常规的手眼标定流程是怎么样的。 (一)如果吸嘴中心就是法兰盘的中心则 是下面这样的: 按九宫格走九个点,取得九组吸嘴的像素坐标与法兰盘的机械坐标 (图1) 进行标定 (二)如果吸嘴位置不在法兰盘中心 则标定流程要复杂些: …

Redis定时的值莫名其妙丢失了(被删除),问题记录

首先是有效期为三天的值&#xff0c;莫名其妙的时间就没了&#xff0c;无效了。登录查看所有Redis的key&#xff0c;如下 发现存在四个未知的key&#xff0c;backup1 2 3 4。百度后发现可能是由于没有修改默认端口号加上未设置连接密码&#xff0c;所以准备修改这两处改完后的登…

如何平衡薪酬水平和组织目标?

在组织中&#xff0c;薪酬水平是一个非常重要的因素&#xff0c;因为它涉及到员工的生活质量和组织的运营。然而&#xff0c;如何平衡薪酬水平和组织目标却是一个复杂的问题&#xff0c;需要考虑多个因素。 首先&#xff0c;组织的目标应该是明确的&#xff0c;这将有助于确定…

如何在Linux系统中安装ActiveMQ

1、环境 ActiveMQ是一个纯Java程序&#xff0c;这里安装5.18.2版ActiveMQ&#xff0c;该版MQ运行在JDK 11环境内&#xff0c;为此需要先搭建JDK 11环境&#xff0c;这里安装JDK 15。 1.1、卸载 卸载开源JDK软件包&#xff0c;如下所示&#xff1a; [rootlocalhost ~]# rpm -…

地理信息领域最佳摄影测量软件

摄影测量软件是想要构建对象或环境的3D模型的土地测量师、工程和法医团队的必备软件。 特别是如果你对练习测绘或测量感兴趣&#xff0c;摄影测量在两个不同有利位置的照片中使用视差和浮雕位移。 摄影测量软件不仅可以构建3D模型&#xff0c;还可以执行测量尺寸、构建虚拟原…

《Kubernetes入门实战课》课程学习笔记(一)

迎难而上&#xff0c;做云原生时代的弄潮儿 现在 Kubernetes 已经没有了实际意义上的竞争对手&#xff0c;它的地位就如同 Linux 一样&#xff0c;成为了事实上的云原生操作系统&#xff0c;是构建现代应用的基石。现代应用是什么&#xff1f; 是微服务&#xff0c;是服务网格…

聊聊Spring注解@Transactional失效的那些事 | 京东云技术团队

一、前言 emm&#xff0c;又又又踩坑啦。这次的需求主要是对逾期计算的需求任务进行优化&#xff0c;现有的计算任务运行时间太长了。简单描述下此次的问题&#xff1a;在项目中进行多个数据库执行操作时&#xff0c;我们期望的是将其整个封装成一个事务&#xff0c;要么全部成…

Spring源码学习-后置处理器,Autowired实现原理

目录 Autowired实现原理populateBeanInstantiationAwareBeanPostProcessorAutowiredAnnotationBeanPostProcessor 后置处理器BeanFactory的后置处理器BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessoConfigurationClassPostProcessor Bean的后置处理器BeanProcess…