C++通讯录管理系统

目录

系统需求

1、  创建项目

2、  菜单功能设计

3、  退出功能设计

4、  添加联系人功能设计

4.1  设计联系人结构体

4.2  设计通讯录结构体

4.3  在main函数中创建通讯录

4.4  封装添加联系人函数

4.5  添加联系人功能测试

5、  显示联系人功能设计

5.1  封装显示联系人函数

5.2  测试显示联系人功能

6、  删除联系人功能设计

6.1  封装检测联系人

6.2  联系人删除功能测试

7、 查找联系人功能设计

7.1  封装查找联系人函数

7.2  查找联系人功能测试

8、  修改联系人功能设计

8.1  封装修改联系人函数

8.2  修改联系人功能测试

9、  清空联系人

9.1  封装清空联系人函数

9.2  清空联系人功能测试

小结


系统需求

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

添加联系人:向通讯录中添加新人,信息包括(姓名、性别,年龄、联系电话、家庭住址)最多记录1000人

显示联系人:显示通讯录中所有联系人信息

删除联系人:按照姓名进行删除指定联系人

查找联系人:按照姓名查看指定联系人信息

修改联系人:按照姓名重新修改指定联系人

清空联系人:清空通讯录中所有信息

退出通讯录:退出当前使用的通讯录

1、  创建项目

创建一个“通信录管理系统.cpp”的项目文件,如下:

2、  菜单功能设计

封装函数显示菜单界面,如:void showMenu();

在main函数中调用封装好的函数

showMenu.h文件

#include<iostream>
using namespace std;

void showMenu();

showMenu.cpp文件

#include"showMenu.h"

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

运行结果:

3、  退出功能设计

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

通过switch语句进行菜单模式的选择,本步骤只完成退出功能的设计。

通过while()循环语句,进行菜单操作,只有当输入0时,执行退出操作。

main函数部分代码:

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

此时运行结果:

4、  添加联系人功能设计

功能描述:向通讯录中添加新人,信息包括(姓名、性别,年龄、联系电话、家庭住址)最多记录1000人

4.1  设计联系人结构体

//设计联系人结构体
struct Person
{
	//姓名
	string m_Name;
	//性别 1男 2女
	int m_Sex;
	//年龄
	int m_Age;
	//电话
	string m_Phone;
	//住址
	string m_Addr;
};

4.2  设计通讯录结构体

//设计通讯录结构体
struct Addressbooks
{
	//通讯录中保存的联系人
	struct Person personArray[MAX];
	//通讯录当前记录联系人个数
	int m_Size;
};

4.3  在main函数中创建通讯录

			//添加联系人
		case 1:
			addPerson(&abs);
//创建通讯录的结构体变量
	Addressbooks abs;
//初始化通讯录当前人员个数
	abs.m_Size = 0;
//创建用户输入的变量
	int select = 0;

4.4  封装添加联系人函数

addPerson.cpp:

#include"addPerson.h"

void addPerson(Addressbooks* abs)
{
	if (abs->m_Size == MAX)
	{
		cout << "通讯录已满,无法添加!" << endl;
		return;
	}
	else
	{
		//姓名
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs->personArray[abs->m_Size].m_Name = name;

		//性别 1男 2女
		cout << "请输入性别:" << endl;
		cout << "1---男" << endl;
		cout << "2---女" << endl;
		int sex = 0;

		while (true)
		{
			//当输入1或者2退出循环
			//如果输入错误,重新输入
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
			cout << "输入有误,请重新输入" << endl;
		}

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

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

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

		//更新通讯录的人数
		abs->m_Size++;
		cout << "该联系人添加成功" << endl;

	}
}

addPerson.h:

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

//设计联系人结构体
struct Person
{
	//姓名
	string m_Name;
	//性别 1男 2女
	int m_Sex;
	//年龄
	int m_Age;
	//电话
	string m_Phone;
	//住址
	string m_Addr;
};

//设计通讯录结构体
struct Addressbooks
{
	//通讯录中保存的联系人
	struct Person personArray[MAX];
	//通讯录当前记录联系人个数
	int m_Size;
};

void addPerson(Addressbooks* abs);

4.5  添加联系人功能测试

运行结果:

5、  显示联系人功能设计

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

5.1  封装显示联系人函数

        判断当前通讯录中有无添加联系人,若联系人未0,则提醒添加联系人,若不为零,则显示通讯录的信息。

main函数部分代码:

//显示联系人
		case 2:
			showPerson(&abs);
			break; 

addPerson.h中添加的代码:

void showPerson(Addressbooks* abs);

showPerson.cpp:

#include"addPerson.h"

void showPerson(Addressbooks* abs)
{
	//判断通讯录人数是否为0,如果为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";
			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.2  测试显示联系人功能

运行结果:

6、  删除联系人功能设计

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

6.1  封装检测联系人

        在进行联系人删除前,我们应当先检测到所要删除的联系人是否存在,若存在则删除,不存在提示用户没有要删除的联系人。

main函数部分代码:

			//删除联系人	
		case 3:
			deletePerson(&abs);
			break;

addPerson.h中添加的代码:

void deletePerson(Addressbooks* abs);

deletePerson.cpp:

#include"addPerson.h"

int isExist(Addressbooks* abs, string name)
{
	for (int i = 0; i < abs->m_Size; i++)
	{
		if (abs->personArray[i].m_Name == name)
		{
			return i;
		}
	}
	return -1;//如果遍历结束都没有找到。返回-1
}

void deletePerson(Addressbooks* abs)
{
	cout << "请输入您要删除的联系人" << endl;
	string name;
	cin >> name;

	int ret = isExist(abs, name);
	if (ret != -1)
	{
		for (int i = ret; i < abs->m_Size; i++)
		{
			abs->personArray[i] = abs->personArray[i + 1];
		}
		abs->m_Size--;
		cout << "删除成功" << endl;
	}
	else
	{
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

6.2  联系人删除功能测试

添加一个联系人,对其进行显示:

对查找的联系人,进行删除操作:

在此删除显示:

7、 查找联系人功能设计

功能描述:按照姓名查找制定联系人姓名

7.1  封装查找联系人函数

思路:判断用户联系人是否存在。如果存在显示信息,不存在提示查无此人。

main函数部分代码:

			//查找联系人
		case 4:
			findPerson(&abs);
			break;

addPerson.h中添加的代码:

void findPerson(Addressbooks* abs);

findPerson.cpp:

#include"addPerson.h"

//查找联系人
int isExist2(Addressbooks* abs, string name)
{
	for (int i = 0; i < abs->m_Size; i++)
	{
		if (abs->personArray[i].m_Name == name)
		{
			return i;
		}
	}
	return -1;//如果遍历结束都没有找到。返回-1
}

void findPerson(Addressbooks* abs)
{

	
		cout << "请输入您要查找的联系人" << endl;
		string name;
		cin >> name;

		int ret = isExist2(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.2  查找联系人功能测试

代码示例:

        需要注意一点是,查找和显示不相同,查找功能是对所输入的姓名进行显示,而显示功能是对所有联系人信息进行显示,如下:

8、  修改联系人功能设计

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

8.1  封装修改联系人函数

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

main函数部分代码:

			//修改联系人 
		case 5:
			modifyPerson(&abs);
			break;
			

addPerson.h中添加的代码:

//修改联系人
int modifyPerson(Addressbooks* abs);

findPerson.cpp:

#include"addPerson.h"

int isExist3(Addressbooks* abs, string name)
{
	for (int i = 0; i < abs->m_Size; i++)
	{
		if (abs->personArray[i].m_Name == name)
		{
			return i;
		}
	}
	return -1;//如果遍历结束都没有找到。返回-1
}

//修改联系人
int modifyPerson(Addressbooks* abs)
{
	cout << "请输入您要修改的联系人" << endl;
	string name;
	cin >> name;

	int ret = isExist3(abs, name);
	if (ret != -1)
	{

		int cz = 0;
		while (true)
		{
			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;
			cout << "请输入您要修改的内容:" << endl
				<< "1代表姓名" << endl
				<< "2代表性别" << endl
				<< "3代表年龄" << endl
				<< "4代表电话" << endl
				<< "5代表住址" << endl
				<< "0代表退出" << endl;
			cin >> cz;

			switch (cz)
			{
			case 1:
			{
				//姓名
				string nam;
				cout << "请输入姓名:" << endl;
				cin >> nam;
				abs->personArray[ret].m_Name = nam;
				break;
			}
			case 2:
			{
				cout << "请输入性别:" << endl;
				cout << "1 -- 男" << endl;
				cout << "2 -- 女" << endl;

				//性别
				int sex = 0;
				while (true)
				{
					cin >> sex;
					if (sex == 1 || sex == 2)
					{
						abs->personArray[ret].m_Sex = sex;
						break;
					}
					cout << "输入有误,请重新输入";
				}
				break;
			}
			case 3://删除联系人
			{
				//年龄
				cout << "请输入年龄:" << endl;
				int age = 0;
				cin >> age;
				abs->personArray[ret].m_Age = age;
				break;
			}
			case 4://查找联系人
			{
				//联系电话
				cout << "请输入联系电话:" << endl;
				string phone = "";
				cin >> phone;
				abs->personArray[ret].m_Phone = phone;
				break;
			}
			case 5:
			{
				//家庭住址
				cout << "请输入家庭住址:" << endl;
				string address;
				cin >> address;
				abs->personArray[ret].m_Addr = address;
				break;
			}

			case 0:
				cout << "退出修改" << endl;
				system("pause");
				system("cls");
				return 0;
				break;
			default:
				break;
			}
		}
	}
	else
	{
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

8.2  修改联系人功能测试

运行结果:

先添加一个联系人,进行显示,如下:

对其进行修改,本次修改的为性别,修改后“张三”性别已经修改,如下:

9、  清空联系人

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

9.1  封装清空联系人函数

只要将通讯录记录的联系人数量置为0,即可。

main函数部分代码:

//清空联系人
		case 6:
			cleanPerson(&abs);
			break;
			

addPerson.h中添加的代码:

//清空联系人信息
void cleanPerson(Addressbooks* abs);

cleanPerson.cpp:

#include"addPerson.h"

//清空联系人信息
void cleanPerson(Addressbooks* abs)
{
	abs->m_Size = 0;
	//将通讯录中数量大小直接置为0,我们便无法访问,
	//不用繁琐的挨个删除,也方便恢复数据
	cout << "通讯录已清空" << endl;
	system("pause");
	system("cls");

}

9.2  清空联系人功能测试

运行结果:

先创建两个联系人,如下:

对其进行删除:

在此查看:

小结

        终于做完了,上面由于一步步添加main.cpp函数和addPerson.h函数,所以都是代码片段,下面把main.cpp函数和addPerson.h函数,完整版代码发出来。

main.cpp:

#include<iostream>
using namespace std;
#include"showMenu.h"
#include<string>
#include"addPerson.h"


int main()
{
	//创建通讯录的结构体变量
	Addressbooks abs;
	//初始化通讯录当前人员个数
	abs.m_Size = 0;
	//创建用户输入的变量
	int select = 0;
	
	while (true)
	{
		//菜单
		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;
		}
	}	

	system("pause");
	return 0;
}

addPerson.h:

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

//设计联系人结构体
struct Person
{
	//姓名
	string m_Name;
	//性别 1男 2女
	int m_Sex;
	//年龄
	int m_Age;
	//电话
	string m_Phone;
	//住址
	string m_Addr;
};

//设计通讯录结构体
struct Addressbooks
{
	//通讯录中保存的联系人
	struct Person personArray[MAX];
	//通讯录当前记录联系人个数
	int m_Size;
};

//添加联系人信息
void addPerson(Addressbooks* abs);

//添加联系人
void showPerson(Addressbooks* abs);

//删除联系人
void deletePerson(Addressbooks* abs);

//查找联系人
void findPerson(Addressbooks* abs);

//修改联系人
int modifyPerson(Addressbooks* abs);

//清空联系人信息
void cleanPerson(Addressbooks* abs);

        运行结果就是每一步的运行结果,在这里就不进行重复演示了。

整个压缩包放在最下面了

C++通讯录管理系统设计资源-CSDN文库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于JAVA的高校学院网站

项目编号&#xff1a; S 020 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S020&#xff0c;文末获取源码。} 项目编号&#xff1a;S020&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教…

FilterChain攻击解析及利用

文章目录 BASE64解码和编码原理浅析EncodingDecoding Filterchain构造&#xff08;原理阐述&#xff09;回顾死亡代码特性一&#xff08;双重去杂&#xff09;特性二&#xff08;粘合性&#xff09; 任意字符构造工具一工具二 实战例题[NSSRound#7 Team]brokenFilterChain&…

jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) 学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程 目录 1、下载jdk17 2、安装jdk17 3、配置环境变量 -> 电脑无其他jdk 4、…

Elasticsearch集群部署,配置head监控插件

Elasticsearch是一个开源搜索引擎&#xff0c;基于Lucene搜索库构建&#xff0c;被广泛应用于全文搜索、地理位置搜索、日志处理、商业分析等领域。它采用分布式架构&#xff0c;可以处理大规模数据集和支持高并发访问。Elasticsearch提供了一个简单而强大的API&#xff0c;可以…

python基础练习题库实验4

文章目录 题目1代码实验结果 题目2代码实验结果 题目3代码实验结果 题目4代码实验结果 题目5代码实验结果 题目6代码实验结果 题目总结 题目1 编写一个程序&#xff0c;使用for循环语句和字符串格式显示以下精确输出。 例如&#xff1a; 代码 for i in range(1, 11):result…

基于xml配置的AOP

目录 xml方式AOP快速入门 xml方式AOP配置详解 xml方式AOP快速入门 xml方式配置AOP的步骤 导入AOP相关坐标 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.13</version></de…

代码随想录算法训练营 ---第四十五天

前言&#xff1a; 昨天的题做过之后&#xff0c;今天的题基本上都很简单&#xff0c;但是要注重一下细节。 第一题&#xff1a; 简介&#xff1a; 动态规划五部曲&#xff1a; 1.确定dp数组的含义 dp[i]&#xff1a;爬到有i个台阶的楼顶&#xff0c;有dp[i]种方法 2.确定dp…

王者荣耀java版

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮二&#xff1a;控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造…

模拟电子技术Ⅲ-场效应管的分析

场效应管的定义 场效应管是单极性管&#xff1a;参与导电的是多数载流子&#xff0c;要么是自由电子&#xff0c;要么是空穴&#xff0c; 场效应管有三个极&#xff1a;源极&#xff08;s&#xff09;、栅极&#xff08;g&#xff09;、漏极&#xff08;d&#xff09;&#xf…

【古诗生成AI实战】之二——项目架构设计

[1] 项目架构 在我们深入古诗生成AI项目的具体实践之前&#xff0c;让我们首先理解整个项目的架构。本项目的代码流程主要分为三个关键阶段&#xff1a; 1、数据处理阶段&#xff1b;   2、模型训练阶段&#xff1b;   3、文本生成阶段。 第一步&#xff1a;在数据处理阶段…

C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

分析&#xff1a; 在程序中&#xff0c;定义一个函数 fix&#xff0c;该函数使用指针变量来访问字符串中的每个字符&#xff0c;并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p&#xff0c;表示需要计算长度的字符串。 在主函数 main 中&#xff0c;定义一…

ssh管理

openssh包 [rootitzfl ~]# ls /mnt/cdrom/Packages/ |grep openssh openssh-7.4p1-11.el7.x86_64.rpm 包含openssh服务器及客户端的核心文件 openssh-askpass-7.4p1-11.el7.x86_64.rpm 支持对话框窗口的提示&#xff0c;是一个基于x系统的密码诊断 openssh-clients-7.4p…

手把手教会你--渗透实战--Hack The Box-Starting Point-Meow--持续更新

有什么问题&#xff0c;请尽情问博主&#xff0c;QQ群796141573 前言 前言 请务必跟着博主复现一遍 参考&#xff1a; Hack The Box-Starting Point-Meow

静态路由配置过程

静态路由 静态路由简介 路由器在转发数据时&#xff0c;要先在路由表&#xff08;Routing Table&#xff09;中在找相应的路由&#xff0c;才能知道数据包应该从哪个端口转发出去。路由器建立路由表基本上有以下三种途径。 &#xff08;1&#xff09;直连路由&#xff1a;路由…

【JavaWeb】Servlet

Servlet 文章目录 Servlet一、简介二、开发流程三、生命周期四、ServletConfig和ServletContext五、HttpServletRequest常见API六、HttpServletResponse常见API七、请求转发和响应重定向7.1 概述7.2 请求转发7.3 响应重定向 八、请求与响应乱码问题8.1 GET与POST请求乱码8.2 响…

[leetCode]257. 二叉树的所有路径(两种方法)

257. 二叉树的所有路径 题目描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例&#xff1a; 输入&#xff1a;root [1,2,3,null,5]输出&#xff1a;["1-&g…

计算机视觉面试题-02

图像处理和计算机视觉基础 什么是图像滤波&#xff1f;有哪些常见的图像滤波器&#xff1f; 图像滤波是一种通过在图像上应用滤波器&#xff08;卷积核&#xff09;来改变图像外观或提取图像特征的图像处理技术。滤波器通常是一个小的矩阵&#xff0c;通过在图像上进行卷积…

mysql从库设置为只读

直奔主题&#xff0c;mysql设置为只读后&#xff0c;无法增删改。 设置命令&#xff1a; mysql> set global read_only1; #1是只读&#xff0c;0是读写 mysql> show global variables like %read_only%; 以下是相关说明&#xff1a; 1、对于数据库读写状态&#xf…

Rust语言入门教程(八) - 引用与借用

上一章的内容中我们讨论了Rust的所有权系统&#xff0c;当我们不想移动值的所有权时&#xff0c;我们可以使用引用和借用&#xff0c;而这正是本章想要讨论的问题。 引用&#xff08;References&#xff09; 引用允许你访问或修改数据而无需获取数据的所有权。在 Rust 中&…

CSS清除浮动的八种方法

我们为什么需要清除浮动&#xff0c;如果我们不清除浮动会发生什么呢&#xff1f; 基础样式&#xff0c;没清除浮动之前代码&#xff1a; 可复制也可以自己手动布局&#xff0c;后可尝试使用下面介绍的方法练习清除浮动 <!DOCTYPE html> <html lang"en">…