通讯录管理系统(C++)

2023-11-13

1. 菜单功能

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

步骤:

  • 封装函数showMenu()显示该界面
  • 在main函数中调用封装好的函数
//菜单界面
void showMenu()
{
	cout << "*****  1、添加联系人  *****" << endl;
	cout << "*****  2、显示联系人  *****" << endl;
	cout << "*****  3、删除联系人  *****" << endl;
	cout << "*****  4、查找联系人  *****" << endl;
	cout << "*****  5、修改联系人  *****" << endl;
	cout << "*****  6、清空联系人  *****" << endl;
	cout << "*****  0、退出通讯录  *****" << endl;
}

int main()
{
	showMenu();
	system("pause");
	return 0;
}

2. 退出功能

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

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

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

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

3. 添加联系人

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

实现步骤:

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

3.1 设计结构体

设计如下:

//设计联系人结构体
struct Person
{
	string m_Name;
	int m_Sex;
	int m_Age;
	string m_Phone;
	string m_Addr;
};

//设计通讯结构体
struct Addrbooks
{
	//通讯录中保存的联系人数组
	Person personArray[MAX];

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

3.2 封装添加联系人函数

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

		//性别
		int sex = 0;
		cout << "请输入性别:(1--男;0--女) ";
		while (1)
		{
			cin >> sex;
			if (sex == 0 || sex == 1)
			{
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
			else
			{
				cout << "输入性别非法,请重新输入" << endl;
			}
		}

		//年龄
		int age;
		cout << "请输入年龄:";
		cin >> age;
		abs->personArray[abs->m_Size].m_Age = age;

		//电话
		string phone;
		cout << "请输入联系电话:";
		cin >> phone;
		abs->personArray[abs->m_Size].m_Phone = phone;

		//家庭住址
		string add;
		cout << "请输入家庭住址:";
		cin >> add;
		abs->personArray[abs->m_Size].m_Addr = add;

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

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

		//调用系统函数进行清屏操作
		system("cls");	//任意键清屏
	}
}

4. 显示联系人

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

//2、显示联系人
void showPerson(Addrbooks * abs)
{
	//判断通讯录中人数是否为0,如果为0,提示通讯录为空
	if (abs->m_Size == 0)
		cout << "通讯录为空!" << endl;
	else
	{
		for (int i = 0; i < abs->m_Size; i++)
		{
			cout << "姓名:" << abs->personArray[i].m_Name <<"\t";
			/*if (abs->personArray[i].m_Sex == 1)
				cout << "性别:" << "男" << "\t";
			else if (abs->personArray[i].m_Sex == 0)
				cout << "性别:" << "女" << "\t";*/
			cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女" )<< "\t";
			cout << "年龄:" << abs->personArray[i].m_Age << "\t";
			cout << "电话:" << abs->personArray[i].m_Phone << "\t";
			cout << "住址:" << abs->personArray[i].m_Addr << endl;
		}
	}
	system("pause");
	system("cls");
}

5. 删除联系人

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

删除联系人实现步骤:

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

5.1 检测联系人是否存在

思路:删除联系人之前,先判断用户输入的联系人是否存在,如果存在则删除,否则提示用户没有要删除的联系人

所有可以把联系人是否存在封装在一个函数之中,如果存在,返回联系人在通讯录中的位置,不存在返回-1

//3.1 检测
/*
参数1:通讯录地址
参数2:人名
*/
int isExists(Addrbooks * abs,string name)
{
	for (int i = 0; i < abs->m_Size; i++)
	{
		if (abs->personArray[i].m_Name == name)
			return i;		//找到返回下标
	}
	return -1;		//没找到返回-1
}

5.2 删除联系人

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

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

查不到则显示查无此人

//3、删除指定联系人
void deletePerson(Addrbooks * abs)
{
	cout << "请输入要删除的联系人" << " ";
	string name;
	cin >> name;
	int ret = isExists(abs, name);
	if (ret == -1)
		cout << "查无此人" << endl;
	else
	{
		//数据前移进行覆盖,相当于删除
		for (int i = ret; i < abs->m_Size; i++)
			abs->personArray[i] = abs->personArray[i + 1];
		abs->m_Size--;	//更新通讯录中的人员数
		cout << "删除成功!" << endl;
	}
	system("pause");
	system("cls");
}

6. 查找联系人

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

查找联系人实现步骤

  • 封装查找联系人函数

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

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

	//判断指定联系人是否存在
	int ret = isExists(abs, name);
	if (ret != -1)
	{
		cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
		cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
		cout << "年龄:" << abs->personArray[ret].m_Age << "\t";
		cout << "电话:" << abs->personArray[ret].m_Phone << "\t";
		cout << "住址:" << abs->personArray[ret].m_Addr << endl;
	}
	else
		cout << "查无此人!" << endl;

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

7. 修改联系人

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

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

//5、修改联系人
void modifyPerson(Addrbooks * abs)
{
	cout << "请输入要修改的联系人:";
	string name;
	cin >> name;

	int ret = isExists(abs, name);
	if (ret != -1)
	{
		//姓名
		string name;
		cout << "请输入姓名:";
		cin >> name;
		abs->personArray[ret].m_Name = name;

		//性别
		int sex = 0;
		cout << "请输入性别:(1--男;0--女) ";
		while (1)
		{
			cin >> sex;
			if (sex == 0 || sex == 1)
			{
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			else
				cout << "输入性别非法,请重新输入" << endl;
		}

		//年龄
		int age;
		cout << "请输入年龄:";
		cin >> age;
		abs->personArray[ret].m_Age = age;

		//电话
		string phone;
		cout << "请输入联系电话:";
		cin >> phone;
		abs->personArray[ret].m_Phone = phone;

		//家庭住址
		string add;
		cout << "请输入家庭住址:";
		cin >> add;
		abs->personArray[ret].m_Addr = add;

	}
	else
		cout << "查无此人!" << endl;

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

8. 清空联系人

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

实现思路:将通讯录所有联系人信息清除,只将通讯录记录的联系人数清0即可

//6、清空联系人
void cleanPerson(Addrbooks * abs)
{
	abs->m_Size = 0;	//作逻辑清空
	cout << "通讯录已清空" << endl;

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

完整代码

#include<iostream>
#include<string>
using namespace std;
#define MAX 1000

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

//设计联系人结构体
struct Person
{
	string m_Name;
	int m_Sex;
	int m_Age;
	string m_Phone;
	string m_Addr;
};

//设计通讯结构体
struct Addrbooks
{
	//通讯录中保存的联系人数组
	Person personArray[MAX];

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

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

		//性别
		int sex = 0;
		cout << "请输入性别:(1--男;0--女) ";
		while (1)
		{
			cin >> sex;
			if (sex == 0 || sex == 1)
			{
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
			else
			{
				cout << "输入性别非法,请重新输入" << endl;
			}
		}

		//年龄
		int age;
		cout << "请输入年龄:";
		cin >> age;
		abs->personArray[abs->m_Size].m_Age = age;

		//电话
		string phone;
		cout << "请输入联系电话:";
		cin >> phone;
		abs->personArray[abs->m_Size].m_Phone = phone;

		//家庭住址
		string add;
		cout << "请输入家庭住址:";
		cin >> add;
		abs->personArray[abs->m_Size].m_Addr = add;

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

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

		//调用系统函数进行清屏操作
		system("pause");	//任意键继续
		system("cls");	//任意键清屏
	}
}

//2、显示联系人
void showPerson(Addrbooks * abs)
{
	//判断通讯录中人数是否为0,如果为0,提示通讯录为空
	if (abs->m_Size == 0)
		cout << "通讯录为空!" << endl;
	else
	{
		for (int i = 0; i < abs->m_Size; i++)
		{
			cout << "姓名:" << abs->personArray[i].m_Name <<"\t";
			/*if (abs->personArray[i].m_Sex == 1)
				cout << "性别:" << "男" << "\t";
			else if (abs->personArray[i].m_Sex == 0)
				cout << "性别:" << "女" << "\t";*/
			cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女" )<< "\t";
			cout << "年龄:" << abs->personArray[i].m_Age << "\t";
			cout << "电话:" << abs->personArray[i].m_Phone << "\t";
			cout << "住址:" << abs->personArray[i].m_Addr << endl;
		}
	}
	system("pause");
	system("cls");
}

//3.1 检测
/*
参数1:通讯录地址
参数2:人名
*/
int isExists(Addrbooks * abs,string name)
{
	for (int i = 0; i < abs->m_Size; i++)
	{
		if (abs->personArray[i].m_Name == name)
			return i;		//找到返回下标
	}
	return -1;		//没找到返回-1
}

//3、删除指定联系人
void deletePerson(Addrbooks * abs)
{
	cout << "请输入要删除的联系人" << " ";
	string name;
	cin >> name;
	int ret = isExists(abs, name);
	if (ret == -1)
		cout << "查无此人" << endl;
	else
	{
		//数据前移进行覆盖,相当于删除
		for (int i = ret; i < abs->m_Size; i++)
			abs->personArray[i] = abs->personArray[i + 1];
		abs->m_Size--;	//更新通讯录中的人员数
		cout << "删除成功!" << endl;
	}
	system("pause");
	system("cls");
}

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

	//判断指定联系人是否存在
	int ret = isExists(abs, name);
	if (ret != -1)
	{
		cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
		cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
		cout << "年龄:" << abs->personArray[ret].m_Age << "\t";
		cout << "电话:" << abs->personArray[ret].m_Phone << "\t";
		cout << "住址:" << abs->personArray[ret].m_Addr << endl;
	}
	else
		cout << "查无此人!" << endl;


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

//5、修改联系人
void modifyPerson(Addrbooks * abs)
{
	cout << "请输入要修改的联系人:";
	string name;
	cin >> name;

	int ret = isExists(abs, name);
	if (ret != -1)
	{
		//姓名
		string name;
		cout << "请输入姓名:";
		cin >> name;
		abs->personArray[ret].m_Name = name;

		//性别
		int sex = 0;
		cout << "请输入性别:(1--男;0--女) ";
		while (1)
		{
			cin >> sex;
			if (sex == 0 || sex == 1)
			{
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			else
				cout << "输入性别非法,请重新输入" << endl;
		}

		//年龄
		int age;
		cout << "请输入年龄:";
		cin >> age;
		abs->personArray[ret].m_Age = age;

		//电话
		string phone;
		cout << "请输入联系电话:";
		cin >> phone;
		abs->personArray[ret].m_Phone = phone;

		//家庭住址
		string add;
		cout << "请输入家庭住址:";
		cin >> add;
		abs->personArray[ret].m_Addr = add;

	}
	else
		cout << "查无此人!" << endl;

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

//6、清空联系人
void cleanPerson(Addrbooks * abs)
{
	abs->m_Size = 0;	//作逻辑清空
	cout << "通讯录已清空" << endl;

	system("pause");
	system("cls");
}
int main()
{
	//创建通讯录结构体变量
	Addrbooks abs;
	//初始化通讯录中当前人员个数
	abs.m_Size = 0;

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

		cin >> select;

		switch (select)
		{
		case 1:		//1、添加联系人
			//调用添加联系人函数
			addPerson(&abs);	//因为值传递不修饰实参,所以一定要使用地址传递
			break;

		case 2:		//2、显示联系人
			showPerson(&abs);
			break;
		case 3:		//3、删除联系人
			deletePerson(&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;
		}
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通讯录管理系统(C++) 的相关文章

随机推荐

  • Wireshark抓包分析交换机工作原理

    实验名称 交换机工作原理 实验目的 1 熟悉Linux虚拟网络环境 2 熟悉Linux中network namespace的基本操作 3 熟悉Linux中虚拟以太网设备Tap和veth pair的基本操作 4 熟悉Linux中Bridge设
  • 【Pytorch】循环神经网络实现手写体识别

    Pytorch 循环神经网络实现手写体识别 1 数据集加载 2 搭建RNN模型 3 训练模型 4 模型保存和加载 模型测试 1 数据集加载 import seaborn as sns sns set font scale 1 5 style
  • 如何在智星云平台发挥GPU的最大性能

    在租用智星云服务器后 如果发现训练速度很慢 可以参考下面的方式进行调优 查看gpu利用率 命令 watch nvidia smi 如果发现 nvidia smi显示gpu利用率很低 可以尝试以下操作 a 如果显存还有非常多空余 尝试增大ba
  • Neural Natural Language Processing for Long Texts: A Survey of the State-of-the-Art

    本文是针对NLP处理长文本的一个综述 针对 Neural Natural Languag Processing for Long Texts A Survey of the State of the Art 的翻译 长文本的神经自然语言处理
  • 【转载】[特征向量在线提取工具Pse-in-One 2.0

    1 Pse In One 简单介绍 机器学习分类算法方法主要依赖于根据蛋白质的结构以及功能特性构建的特征集合 通过构造具有辨别性的特征集合来达到令人满意的分类结果 但是使用一个能够反映序列模式信息并能够保持关键序列信息的离散模型或向量是一个
  • HTTPS、UDP/TCP、三次握手、四次挥手

    HTTPS协议 其实就是加密后的HTTP协议 自定制协议 HTTP协议 https到底是如何进行加密传输的 通过ssl加密实现 非对称加密算法 对称加密算法 签名证书 数据直接在网络中传输 很容易被劫持 有很大的安全隐患 对传输过程进行加密
  • HLA仿真中的多联邦

    经常有人问我HLA仿真中的多联邦问题 本讲对此进行解答 1 HLA标准中的联邦指单个联邦 在HLA标准中 联邦定义如下 简单地说 一个联邦用于完成一定的仿真功能 包含一组仿真成员和一个FOM文件 在HLA1 3中 FOM文件的后缀为 fed
  • 安装Vmware workstations 16 Microsoft Visual C++ 2019 x86 Minimum Runtime报错解决办法

    由于电脑更新到了win11系统 之前的Vmware不在被系统支持 需要重新下载新版本的Vmware 在安装Vmware workstations 16时 系统报错界面如下 我们点击OK 会弹出如下提示框 根据这个提示框 可以判断出是电脑中的
  • oracle 11g rac手册(第2版) 高清,Oracle Database11g RAC手册(第2版)_IT教程网

    资源名称 Oracle Database11g RAC手册 第2版 内容简介 根据Oracle ACE提供的专家指导来管理动态的企业级计算基础设施 戈帕拉克里希南所著的 Oracle Database 11g RAC手册 第2版 进行了全面
  • web前端面试题(全)

    近来看到网上格式各样的web前端求职的面试题 接下来我用我的经验总结了一套在面试过程中高频率问到的面试题 希望能帮助各位求职者在求职的过程中顺利通过 废话不多说 直接说题 一 HTML5部分 1 说一下对css盒模型的理解 答 css盒子模
  • 【总结一】现代密码学

    目录 1 密码学概述 1 1 密码学的基本概念 1 1 1 为什么要学密码学 1 1 2 什么是密码学 1 1 2 密码算法的基本模型 1 1 3 密码算法的分类 1 2 密码分析学 1 3 古典密码算法 1 3 1 置换密码 1 3 2
  • 对表的复杂查询

    1 连接查询 数据库中的各个表中存放着不同的数据 用户往往需要用多个表中的数据来组合 提炼出所需要的信息 如果一个查询需要对多个表进行操作 就称为连接查询 例 对student sno clno sname ssex sage course
  • Windows上安装Hadoop 3.x

    目录 0 安装Java 1 安装Hadoop 1 1 下载Hadoop 1 2 下载winutils 2 配置Hadoop 1 hadoop env cmd 2 创建数据目录 3 core site xml 4 hdfs site xml
  • 解决textarea文字不顶头显示/点击textarea 不是第一行

    问题描述 表单提交后发现内容前多了很多空格 而且每次更新表单提交都会有空格增加 后来发现 每次文字从数据库读到textarea后文字都不居左 在排出样式 转义字符等问题后 baidu google了一会始终没找到答案 后来发现原来问题处在H
  • 网络--正向代理和反向代理

    正向代理的概念 正向代理 也就是传说中的代理 他的工作原理就像一个跳板 简单的说 我是一个用户 我访问不了某网站 但是我能访问一个代理服务器 这个代理服务器呢 他能访问那个我不能访问的网站 于是我先连上代理服务器 告诉他我需要那个无法访问网
  • 如何将VS Code扩展插件迁移出系统盘

    背景 Windows的C盘 系统盘 容量经常不够用 经过排查发现VSCode的扩展插件所在目录占用了很大空间 为了节省系统盘的空间 需要将VSCode扩展插件迁移到D盘 环境 Windows VS Code 全称是Visual Studio
  • MySQL的JSON数据类型介绍以及JSON的解析查询

    文章目录 概述 JSON 数据类型的意义 JSON相关函数 测试 创建测试表 插入数据 查询数据 条件查询 优化JSON查询 解决方案 总结 概述 MySQL从5 7后引入了json数据类型以及json函数 可以有效的访问json格式的数据
  • iOS音视频—FFmepg:iOS平台下集成和应用

    1 在iOS平台下集成和应用FFmpeg Mac配置FFmpeg环境 1 安装homebrew ruby e curl fsSL https raw githubusercontent com Homebrew install master
  • Maven中测试插件(surefire)的相关配置及常用方法

    原创文章 版权所有 允许转载 标明出处 http blog csdn net wanghantong 1 在Maven中配置测试插件surefire html view plain copy
  • 通讯录管理系统(C++)

    1 菜单功能 功能描述 用户选择功能的界面 步骤 封装函数showMenu 显示该界面 在main函数中调用封装好的函数 菜单界面 void showMenu cout lt lt 1 添加联系人 lt lt endl cout lt lt