【 C++项目:通讯录管理系统】

C++通讯录实现

  • 通讯录功能介绍:
  • C++案例:通讯录管理系统
    • 步骤一:创建新项目,添加源文件文件
    • 步骤二:菜单功能实现
    • 步骤三:退出功能
    • 步骤四:添加联系人功能
      • 每次添加联系人后进行任意键清屏操作:
    • 步骤五:显示所有已存的联系人信息
    • 步骤六:删除联系人
    • 步骤七:查找指定联系人实现
    • 步骤八:修改指定联系人实现
    • 步骤九:清空通讯录所有联系人
    • 其他:

通讯录功能介绍:

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

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

C++案例:通讯录管理系统

步骤一:创建新项目,添加源文件文件

步骤二:菜单功能实现

封装在函数showmeau种,在main函数中进行调用

步骤三:退出功能

相对简单

使用多选择的分支结构

//(1)菜单调用
		showMeau();

		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;//结束main函数,退出程序
			break;
		default:
			break;
		}

为了能使用户可以进行多轮操作,可以使用一个循环while(true):

while (true)
	{
		//(1)菜单调用
		showMeau();

		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;//结束main函数
			break;
		default:
			break;
		}
	}

步骤四:添加联系人功能

联系人上限使1000人,包含信息有:姓名,性别,年龄,电话,家庭住址

(1)设置联系人结构体

//人结构体
struct person
{
	string name;//联系人姓名
	int sex;//性别:1 男 2 女
	int age;
	string phone;
	string addr;
};

(2)设置通讯录结构体,存放联系人(用结构体数组存放)和当前通讯录的人数:

//通讯录结构体
struct addrbooks
{
	struct person personarr[MAX];//定义一个结构体数组,用于存放联系人
	int size;
};

(3)main函数创建一个真实的通讯录

//创建一个通讯录的结构体变量

struct addrbooks txl;
//初始化当前通讯录中的人员个数为0
txl.size = 0;

(4)封装添加联系人的函数实现

添加联系人函数要先进行判断通讯录中存放的人数是否已经达到上限,判断之后再进行逻辑添加联系人的信息:

void addperson(struct addrbooks *txl)
{
	//判断通讯录是否已经满了
	if (txl->size==MAX)
	{
		cout << "通讯录已满,无法添加" << endl;
		return;
	}
	else
	{
		//添加具体的联系人
		//姓名
		cout << "请输入一个姓名:"<<endl;
		string name;
		cin >> name;
		txl->personarr[txl->size].name = name;

		//性别
		cout << "请输入性别:" << endl;
		cout <<"1------男" << endl;
		cout << "2------女" << endl;
		int sex = 0;//
		while (true)
		{
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				txl->personarr[txl->size].sex = sex;
				break;//如果输入的是1/2(输入正确),可以退出循环,有误,重新输入
			}
			cout << "输入有误,请重新输入:" << endl;
		}

		//年龄
		cout << "请输入年龄:" << endl;
		int age = 0;
		while (true)
		{
			//如果输入的比0小或者比150大,重新输入
			cin >> age;
			if (age > 0 && age<150)
			{
				txl->personarr[txl->size].age = age;
				break;
			}
			cout << "输入有误,请检查重新输入年龄:" << endl;
		}


		//电话
		cout << "请输入一个电话号码: " << endl;
		string phone;
		cin >> phone;
		txl->personarr[txl->size].phone = phone;
	
		//家庭住址
		cout << "请输入家庭住址:" << endl;
		string address;
		cin >> address;
		txl->personarr[txl->size].addr = address;
	}
	}

(5)测试

每次添加联系人后进行任意键清屏操作:

system(“pause”);按任意键继续
system(“cls”);//清屏

步骤五:显示所有已存的联系人信息

(1)封装一个函数,显示联系人信息:

判断通讯录有没有人,人数大于0,显示所有人的信息

void showperson(struct addrbooks* txl)
{
	//先进行判断通讯录中是否有人
	if (txl->size == 0)
	{
		cout << "当前通讯录为空!" << endl;
	}
	else
	{
		for (int i = 0; i < txl->size; i++)
		{
			cout << "姓名:" << txl->personarr[i].name<<'\t';
			cout << "性别:" << (txl->personarr[i].sex == 1? "男":"女") << '\t';//使用一个三木运算符进行实现
			cout << "年龄:" << txl->personarr[i].age<<'\t';
			cout << "电话:" << txl->personarr[i].phone<<"\t";
			cout << "住址:" << txl->personarr[i].addr<< endl;
		}
	}
	system("pause");
	system("cls");
}

(2)测试

步骤六:删除联系人

(1)封装先检测联系人是否存在函数:多个功能要根据联系人姓名来进行操作:如果存在,返回联系人在通讯录所处的位置:

int isExist(struct addrbooks* txl,string name)//参数1是通讯录,和要查找的人名
{
	for (int i = 0; i < txl->size; i++)
	{
		if (txl->personarr[i].name == name)
		{
			//找到用户输入的姓名了,返回一个具体的位置
			return i;
		}
	}
	return -1;//遍历结束都没有找到
}

使用代码检测测试这个函数:

{
			cout << "请输入要删除联系人的姓名:" << endl;
			string name;
			cin >> name;
			if (isExist(&txl, name) == -1)
			{
				cout << "查无此人" << endl;
			}
			else
			{
				cout << "存在这个联系人" << endl;
			}
		}

(2)封装删除联系人函数:

先判断通讯录中是否有这个人,有就删除并提示删除成功,否则就是找不到

void deletePerson(struct addrbooks* txl)
{
	cout << "请输入你要删除的联系人姓名:" << endl;
	string name;
	cin >> name;
	int ret = isExist(txl, name);
	//ret==-1:没有找到
	//ret==1:找到了
	if(ret==-1)
	{
		cout << "查无此人" << endl;
	}
	else
	{
		//找到了这个人,进行删除(逻辑上的删除,这个人后的数据逐个往前覆盖,并且通讯录中的人数最后减去1)
		for (int i = ret; i < txl->size; i++)
		{
			//数据前移操作
			txl->personarr[i] = txl->personarr[i + 1];
		}
		//通讯录人数更新
		txl->size--;
				cout << "删除成功" << endl;
	}
	system("pause");
	system("cls");
}

(3)测试

步骤七:查找指定联系人实现

根据姓名查找指定联系人

(1)封装查找指定联系人函数:

判断用户输入的指定联系人是否存在,如果存在,就显示这名联系人的信息,否则打印查无此人:

void findPerson(struct addrbooks* txl)
{
	cout << "请输入要查找的联系人姓名:" << endl;
	//结构用户的输入
	string name;
	cin >> name;

	int ret = isExist(txl, name);
	if (ret != -1)//找到了这个人
	{
		cout << "姓名:" << txl->personarr[ret].name << '\t';
		cout << "性别:" << (txl->personarr[ret].sex == 1 ? "男" : "女") << '\t';//使用一个三木运算符进行实现
		cout << "年龄:" << txl->personarr[ret].age << '\t';
		cout << "电话:" << txl->personarr[ret].phone << "\t";
		cout << "住址:" << txl->personarr[ret].addr << endl;
	}
	else
	{
		cout << "查无此人!";
	}
	system("pause");
	system("cls");//清屏


}

(2)测试

步骤八:修改指定联系人实现

(1)封装修改联系人函数:

查找用户输入的来向你人,查找成功就进行修改操作,查找失败打印查无此人

void updatePerson(struct addrbooks* txl)
{
	cout << "输入要修改的联系人姓名:" << endl;

	string name;//接受用户输入的姓名
	cin >> name;
	int ret = isExist(txl, name);
	
	if (ret != -1)
	{
		//找到了这个人
		//更新姓名
		string name;
		cout << "输入新的姓名:" << endl;
		cin >> name;
		txl->personarr[ret].name = name;
		//更新性别
		cout << "请输入性别:" << endl;
		cout << "1----男" << endl;
		cout << "2-----女" << endl;
		while (true)
		{
			int sex = 0;
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				txl->personarr[ret].sex = sex;
				break;//输入正确,才退出循环
			}
			cout << "输入错误,请重新输入性别:" << endl;
		}
		//更新年龄
		cout << "请输入年龄:" << endl;
		int age;
		cin >> age;
		while (true)
		{
			if (age > 0 && age < 150)
			{
				txl->personarr[ret].age = age;//输入正确,更新年龄并退出循环
				break;
			}
			cout << "输入错误,请重新输入年龄:" << endl;
		}
		//更新联系电话
		cout << "请输入新的联系电话:" << endl;
		string newphone;
		cin>>newphone;
		txl->personarr[ret].phone = newphone;
	
		//更新家庭住址
		cout << "请输入新的家庭住址:" << endl;
		string newadd;
		cin >> newadd;
		txl->personarr[ret].addr = newadd;
	
		cout << "修改成功" << endl;
	
	}
	else//不存在这个人
	{
		cout << "查无此人!" << endl;
	}
	system("pause");
	system("cls");

}

(2)测试

步骤九:清空通讯录所有联系人

(1)封装清空联系人函数:

逻辑清空(将通讯录中的人员数组个数置为0)

实际存在,但是访问不到

void clean(struct addrbooks* txl)
{
	cout << "确定要清空通讯录吗?" << endl;
	cout << "1------确定" << endl;
	cout << "2-------取消" << endl;
	int ret;
	cin >> ret;
	
	if (ret==1)//确定清除
	{
		txl->size = 0;//将当前通讯录中的人数置为0,逻辑上的清空
		cout << "通讯录已经清空" << endl;
	}
	else//误触
	{
		system("pause");
		system("cls");
		return;
	}
	system("pause");
	system("cls");
}

(2)测试

其他:

(1)定义宏常量时候后买你不需要添加分号

(2)case语句中如果语句比较长的时候,使用括号括起来

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

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

相关文章

HBase:(三)HBase API

HBase:(一)安装部署_只爱大锅饭的博客-CSDN博客hbase部署安装https://blog.csdn.net/qq_35370485/article/details/130988364?spm1001.2014.3001.5501 1.创建maven项目 2.添加依赖 <dependency><groupId>org.apache.hbase</groupId><artifactId>hba…

【Java基础】注解与反射

一、学习笔记 &#xff08;本文内容基本源自参考链接1视频教程&#xff09; 1、注解的含义 1&#xff09;注解&#xff08;annotation)是从jdk5.0开始引入的新技术&#xff0c;其作用&#xff1a;不是程序本身&#xff0c;可对程序作解释&#xff08;该作用与注释comment相同…

MFC(十二)多个对话框

我们来制定多个对话框&#xff0c;每个对话框都有不同的功能&#xff0c;单击下一步&#xff0c;即可跳转到下一个对话框 1.新建一个启动按钮 2.在资源视图&#xff0c;Dialog里面&#xff0c;右键-->添加资源---->dialog>选择IDD PROPPAGE_SMALL新建 属性页&#…

同浏览器下多窗口进行跨源通信、同源通信

同浏览器下多窗口进行跨源通信、同源通信 多页面通信运用到了“发布订阅”的设计模式&#xff0c;一个页面发布指令&#xff0c;其他页面进行订阅并进行相应的行为操作&#xff01; 一、跨源通信 window.postMessage() window.postMessage() 方法可以安全地实现跨源通信。通常…

Vue.js 中的数据双向绑定是如何实现的?

Vue.js 中的数据双向绑定是如何实现的&#xff1f; Vue.js 是一款流行的前端框架&#xff0c;它的核心功能之一是数据双向绑定。本文将介绍 Vue.js 中数据双向绑定的实现原理&#xff0c;并附上相关代码实例。 什么是数据双向绑定&#xff1f; 在传统的前端开发中&#xff0c…

智能应用搭建平台——LCHub低代码表单 vs 流程表单 vs 仪表盘

1. LCHub低代码如何选择 「流程表单」:填报数据,并带有流程审批功能,适合报销、请假申请或其他工作流; 「表单」:填报数据,并带有数据协作功能,如修改、删除、导入、导出,并可以给不同的人不同的管理权限; 「仪表盘」:数据分析处理、结果展示功能,如数据汇总、趋…

JavaSSM笔记(一)

**建议&#xff1a;**对Java开发还不是很熟悉的同学&#xff0c;最好先花费半个月到一个月时间大量地去编写小项目&#xff0c;不推荐一口气学完&#xff0c;后面的内容相比前面的内容几乎是降维打击&#xff0c;一口气学完很容易忘记之前所学的基础知识&#xff0c;尤其是Java…

Python--注释

Python--注释 <font size4, colorblue> 一、Python中注释的形式<font size4, colorblue> 1、单行注释&#xff1a;使用“#”符号注释<font size4, colorblue> 2、多行注释&#xff1a;使用一对三个英文单引号注释<font size4, colorblue> 3、多行注释&…

通用文字识别OCR 之实现数字化教材

引言 通用文字 OCR 识别 API 是一种功能强大的服务&#xff0c;可用于多场景、多语种的整图文字检测和识别&#xff0c;通过将OCR技术应用于学校环境&#xff0c;可以实现教育资源的数字化和学习过程的自动化。 本文将探讨通用文字识别OCR 在学校的实际应用&#xff0c;希望对…

如何在 JavaScript 中创建自定义警告框

本文将介绍如何使用 jQuery UI、SweetAlert2 和自定义警报功能在 JavaScript 中创建自定义警报框。 使用 jQuery UI 创建自定义警告框 我们可以使用 jQuery UI 来模仿 JavaScript 本机 alert() 函数的功能。 尽管 jQuery UI 有很多 API&#xff0c;您可以使用它的 dialog() AP…

基于摄影测量的三维重建【终极指南】

我们生活的时代非常令人兴奋&#xff0c;如果你对 3D 东西感兴趣&#xff0c;更是如此。 我们有能力使用任何相机&#xff0c;从感兴趣的物体中捕捉一些图像数据&#xff0c;并在眨眼间将它们变成 3D 资产&#xff01; 这种通过简单的数据采集阶段进行的 3D 重建过程是许多行业…

泰克AFG31000系列任意波函数发生器应用

模拟电路检定 这是一个模拟世界。所有物理量均使用模拟信号捕获和表示。因此&#xff0c;需要检定放大器、滤波器和转换器等模拟电路的性能。 InstaView? 技术避免在阻抗不匹配的 DUT 上增加的波形不确定性频率范围为 25 MHz 至 250 MHz由于信号保真度高&#xff0c;无需使…

# 车载软件架构 —— 闲聊几句AUTOSAR OS(三)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标准。到最…

SpringBoot整合OSS文件上传

一、注册阿里云账号并开通OSS服务 1、登录阿里云账号 2、创建一个bucket 3、创建子用户 对自用户分配权限&#xff0c;打开操作OSS的全部权限&#xff08;也可根据业务需求进行更改&#xff09; 4、配置上传跨域规则 任何来源: *允许方法: POST任何请求头Headers: * 二、…

sklearn中的roc_auc_score(二分类或多分类)

官方API地址&#xff1a; sklearn.metrics.roc_auc_score — scikit-learn 1.2.2 documentationExamples using sklearn.metrics.roc_auc_score: Release Highlights for scikit-learn 0.22 Release Highlights for scikit-learn 0.22 Probability Calibration curves Probabi…

如何查询期刊的SCI分区

好消息是CSDN AI写作助手上线了 我不用自己一个字一个字去写SCI分区是啥&#xff08;x&#xff09; 然而—— 麻了还是自己写吧&#xff0c; 在人工智能这条路上&#xff0c;CSDN还是需要努力。 简单来说&#xff0c;我们做科研、发文章&#xff0c;肯定是需要比较的 谁的…

创客匠人CEO蒋洪波:用门店思维做直播

互联网时代&#xff0c;转型线上做知识付费成为教育培训行业的主流&#xff0c;直播教学成为新型的教学模式受到了广泛认可。很多老师在线下培训深耕多年&#xff0c;知识储备丰富&#xff0c;但想要转型线上又缺少方法&#xff0c;缺少去改变的欲望&#xff0c;怕转型做线上直…

docker安装golang

最近玩 docker 比较多&#xff0c;试试安装 golang 操作系统&#xff1a;Linux 第一步 先看一下镜像&#xff1a; docker images 看一下我们目前的镜像中&#xff0c;是不是有go 如果有&#xff0c;版本不合适等&#xff0c;可以考虑删除&#xff0c;重新安装&#xff0c;也…

Linux之进程间通信——管道

文章目录 前言一、进程间通信1.概念2.目的3.进程间通信分类 二、管道1.管道介绍2.管道分类1.匿名管道pipi创建管道文件&#xff0c;打开读写端fork子进程关闭父进程的读取端&#xff0c;关闭子进程的写入端读写特征管道特征 2.命名管道mkfifo创建管道文件删除管道文件通信 三、…

Blindly Assess Image Quality in the Wild Guided by ASelf-Adaptive Hyper Network

Abstract 真实失真图像的盲图像质量评估(BIQA)一直是一个具有挑战性的问题&#xff0c;因为在野外采集的图像包含各种各样的内容和各种类型的失真。目前绝大多数的BIQA方法都专注于如何预测合成图像的质量&#xff0c;但当应用于真实世界的失真图像时却失败了。为了应对这一挑…
最新文章