C++入门案例——通讯录管理系统 控制台项目

news2024/11/19 18:37:35

在这里插入图片描述

前言

C++入门案例——通讯录管理系统 & 控制台项目

目录

  • 前言
  • 总体概览
    • 实体类设计
    • 显示页面和退出系统
  • 添加联系人
    • 逻辑拆解
    • 相关代码
  • 显示联系人
    • 逻辑拆解
    • 相关代码
  • 根据名字删除联系人
    • 逻辑拆解
    • 相关代码
  • 根据名字查找联系人
    • 逻辑拆解
    • 相关代码
  • 修改联系人
    • 逻辑拆解
    • 相关代码
  • 清空所有联系人
    • 逻辑拆解
    • 相关代码
    • 完整代码
  • 总结

总体概览

实体类设计

在这里插入图片描述

// 设计联系人结构体
struct Person
{
	string name;
	int sex;
	int age;
	string tel;
	string addr;
};

// 设计通讯录
struct AddressBooks
{
	// 联系人数组
	struct Person personArray[MAX];

	// 当前联系人数量
	int size;

};

显示页面和退出系统

在这里插入图片描述

// 显示界面,main中使用页面封装函数
static 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;
}

在这里插入图片描述

添加联系人

逻辑拆解

1.判断是否达到最大容量,如果达到,则结束,如果未达到,进入下一步;

2.用户输入要添加的人的信息,姓名等,加入到通讯录的数组中;

3.修改通讯录当前人数,更新人数+1;

在这里插入图片描述

相关代码

// 添加联系人
void addPerson(AddressBooks* abs)
{
	// 判断是否满
	if (abs->size == MAX)
	{
		cout << "通讯录已满,添加失败" << endl;
	}
	else
	{
		// 添加联系人
		string name;
		cout << "请输入姓名" << endl;
		cin >> name;
		abs->personArray[abs->size].name = name;

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

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

		// 输入电话
		string tel;
		cout << "请输入电话" << endl;
		cin >> tel;
		abs->personArray[abs->size].tel = tel;

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

		// 更新人数
		abs->size++;
		cout << "添加成功!!!" << endl;

		system("pause"); // 按任意键继续
		system("cls"); // 清屏
	}
}

显示联系人

逻辑拆解

1.判断通讯录是否为空,size==0;如果不为空,进入下一步;

2.把数组中的联系人一个一个拿出来,打印相关信息;

3.性别1,2输出位男和女采用三目运算符实现;

在这里插入图片描述

相关代码

// 显示联系人
void showPerson(AddressBooks* abs) {

	if (abs->size==0)
	{
		cout << "通信录空" << endl;
	}
	else {
		for (int i = 0; i < abs->size; i++)
		{
			cout << "姓名:" << abs->personArray[i].name << "\t";
			// 三目运算符
			cout << "性别:" << (abs->personArray[i].sex ==1 ? "男":"女") << "\t";
			cout << "住址:" << abs->personArray[i].addr << endl;

		}
		system("pause"); // 按任意键继续
		system("cls"); // 清屏
	}
}

根据名字删除联系人

逻辑拆解

1.先判断一下是否存在该联系人,如果不存在,退出;如果存在,进入下一步;

2.从要删除的联系人开始,把后面的联系人一个一个迁移;

3.最后把通讯录中的人员数量 -1;

在这里插入图片描述

相关代码

/// <summary>
/// 监测人名是否存在
/// </summary>
/// <param name="abs"></param>
/// <param name="name"></param>
/// <returns></returns>

int isExist(AddressBooks* abs, string name) {
	for (int i = 0; i < abs->size; i++)
	{
		if (abs->personArray[i].name==name)
		{
			return i; // 返回位置
		}
	}
	return -1;
}

// 删除指定的联系人
void deletePerson(AddressBooks* abs) {
	cout << "输入要删除的联系人的name" << endl;
	string name;
	cin >> name; 
	int index = isExist(abs, name);
	if (index == -1)
	{
		cout << "查无此人" << endl;
		system("pause"); // 按任意键继续
		system("cls"); // 清屏
	}
	else {
		cout << "已找到" << endl;
		for (int i = index; i < abs->size; i++)
		{
			// 数据迁移
			abs->personArray[i] = abs->personArray[i + 1];
			abs->size--; // 更新人员数量
			cout << "删除成功" << endl;
			system("pause"); // 按任意键继续
			system("cls"); // 清屏
		}
	}
}

根据名字查找联系人

逻辑拆解

1.输入要查找的人的姓名,

2.判断该姓名是否存在数组中,如果存在进入下一步;

3.根据上一步获取该人在数组中的位置,进行人员信息的打印;

在这里插入图片描述

相关代码

// 查找联系人
void findPerson(AddressBooks* abs) {
	cout << "输入要查找的联系人的name" << endl;
	string name;
	cin >> name;
	int index = isExist(abs, name);
	if (index == -1)
	{
		cout << "查无此人" << endl;
	}
	else {
		cout << "已找到" << endl;
		cout << "姓名:" << abs->personArray[index].name << "\t";
		// 三元表达式
		cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";
		cout << "住址:" << abs->personArray[index].addr << endl;
	}

	system("pause"); // 按任意键继续
	system("cls"); // 清屏
}

修改联系人

逻辑拆解

1.输入要修改的联系人的name;

2.查询是否存在该联系人,如果存在,则进入下一步;

3.输入该联系人的新的信息,姓名等;

相关代码

// 修改联系人
void modifyPerson(AddressBooks* abs) {
	cout << "输入要修改的联系人的name" << endl;
	string name;
	cin >> name;
	int index = isExist(abs, name);
	if (index == -1)
	{
		cout << "查无此人" << endl;
	}
	else {
		cout << "已找到" << endl;
		cout << "姓名:" << abs->personArray[index].name << "\t";
		// 三元表达式
		cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";
		cout << "住址:" << abs->personArray[index].addr << endl;

		// 进行修改
		string name;
		cout << "请输入姓名" << endl;
		cin >> name;
		abs->personArray[index].name = name;

		// 输入性别
		cout << "请输入性别,1男,2女" << endl;
		int sex = 0;
		while (true)
		{
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				abs->personArray[index].sex = sex;
				break; // 输入正确,退出循环
			}
			cout << "输入有误,重新输入" << endl;
		}
	}

	system("pause"); // 按任意键继续
	system("cls"); // 清屏
}

清空所有联系人

逻辑拆解

1.因为清空操作需要慎重考虑,因此加入了二次确认的机制;

2.清空联系人把当前记录的联系人的数量置为0即可;

相关代码

在这里插入图片描述

// 清空所有联系人
void cleanPerson(AddressBooks* abs) {
	cout << "即将清空所有联系人,是否继续,继续输入1" << endl;
	int flag;
	cin >> flag;
	if (flag == 1)
	{
		abs->size = 0; // 将当前记录的联系人数量置为0,做逻辑删除
		cout << "清空成功" << endl;
		system("pause"); // 按任意键继续
		system("cls"); // 清屏
	}
	else
	{
		cout << "您取消了清空" << endl;
	}
}

完整代码

在这里插入图片描述

# include <iostream>
# include <string>
# define MAX 1000 // 定义常量
using namespace std;

// 设计联系人结构体
struct Person
{
	string name;
	int sex;
	int age;
	string tel;
	string addr;
};

// 设计通讯录
struct AddressBooks
{
	// 联系人数组
	struct Person personArray[MAX];

	// 当前联系人数量
	int size;

};

// 添加联系人
void addPerson(AddressBooks* abs)
{
	// 判断是否满
	if (abs->size == MAX)
	{
		cout << "通讯录已满,添加失败" << endl;
	}
	else
	{
		// 添加联系人
		string name;
		cout << "请输入姓名" << endl;
		cin >> name;
		abs->personArray[abs->size].name = name;

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

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

		// 输入电话
		string tel;
		cout << "请输入电话" << endl;
		cin >> tel;
		abs->personArray[abs->size].tel = tel;

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

		// 更新人数
		abs->size++;
		cout << "添加成功!!!" << endl;

		system("pause"); // 按任意键继续
		system("cls"); // 清屏
	}
}

// 显示联系人
void showPerson(AddressBooks* abs) {

	if (abs->size==0)
	{
		cout << "通信录空" << endl;
	}
	else {
		for (int i = 0; i < abs->size; i++)
		{
			cout << "姓名:" << abs->personArray[i].name << "\t";
			// 三目运算符
			cout << "性别:" << (abs->personArray[i].sex ==1 ? "男":"女") << "\t";
			cout << "住址:" << abs->personArray[i].addr << endl;

		}
		system("pause"); // 按任意键继续
		system("cls"); // 清屏
	}
}


/// <summary>
/// 监测人名是否存在
/// </summary>
/// <param name="abs"></param>
/// <param name="name"></param>
/// <returns></returns>

int isExist(AddressBooks* abs, string name) {
	for (int i = 0; i < abs->size; i++)
	{
		if (abs->personArray[i].name==name)
		{
			return i; // 返回位置
		}
	}
	return -1;
}

// 删除指定的联系人
void deletePerson(AddressBooks* abs) {
	cout << "输入要删除的联系人的name" << endl;
	string name;
	cin >> name; 
	int index = isExist(abs, name);
	if (index == -1)
	{
		cout << "查无此人" << endl;
		system("pause"); // 按任意键继续
		system("cls"); // 清屏
	}
	else {
		cout << "已找到" << endl;
		for (int i = index; i < abs->size; i++)
		{
			// 数据迁移
			abs->personArray[i] = abs->personArray[i + 1];
			abs->size--; // 更新人员数量
			cout << "删除成功" << endl;
			system("pause"); // 按任意键继续
			system("cls"); // 清屏
		}
	}
}



// 查找联系人
void findPerson(AddressBooks* abs) {
	cout << "输入要查找的联系人的name" << endl;
	string name;
	cin >> name;
	int index = isExist(abs, name);
	if (index == -1)
	{
		cout << "查无此人" << endl;
	}
	else {
		cout << "已找到" << endl;
		cout << "姓名:" << abs->personArray[index].name << "\t";
		// 三元表达式
		cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";
		cout << "住址:" << abs->personArray[index].addr << endl;
	}

	system("pause"); // 按任意键继续
	system("cls"); // 清屏
}


// 修改联系人
void modifyPerson(AddressBooks* abs) {
	cout << "输入要修改的联系人的name" << endl;
	string name;
	cin >> name;
	int index = isExist(abs, name);
	if (index == -1)
	{
		cout << "查无此人" << endl;
	}
	else {
		cout << "已找到" << endl;
		cout << "姓名:" << abs->personArray[index].name << "\t";
		// 三元表达式
		cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";
		cout << "住址:" << abs->personArray[index].addr << endl;

		// 进行修改
		string name;
		cout << "请输入姓名" << endl;
		cin >> name;
		abs->personArray[index].name = name;

		// 输入性别
		cout << "请输入性别,1男,2女" << endl;
		int sex = 0;
		while (true)
		{
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				abs->personArray[index].sex = sex;
				break; // 输入正确,退出循环
			}
			cout << "输入有误,重新输入" << endl;
		}
	}

	system("pause"); // 按任意键继续
	system("cls"); // 清屏
}


// 清空所有联系人
void cleanPerson(AddressBooks* abs) {
	cout << "即将清空所有联系人,是否继续,继续输入1" << endl;
	int flag;
	cin >> flag;
	if (flag == 1)
	{
		abs->size = 0; // 将当前记录的联系人数量置为0,做逻辑删除
		cout << "清空成功" << endl;
		system("pause"); // 按任意键继续
		system("cls"); // 清屏
	}
	else
	{
		cout << "您取消了清空" << endl;
	}
}


// 显示界面,main中使用页面封装函数
static 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() {

	// 通讯录结构体变量
	AddressBooks abs;
	// 初始化当前人员个数
	abs.size = 0;

	// 用户的选择
	int select = 0;

	while (true)
	{
		// 调用菜单
		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;
		}
	}
	system("pause"); // 按任意键继续
	return 0;
}


总结

C++入门案例——通讯录管理系统 & 控制台项目

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

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

相关文章

如何公网远程访问Axure RP制作的本地web页面【内网穿透】

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

Angular系列教程之组件

文章目录 前言组件的基本概念组件与指令的关系在模板中使用组件总结 前言 在Angular中&#xff0c;组件是构建Web应用程序的核心单元。它们允许我们将UI划分为独立且可重用的部分&#xff0c;并通过数据绑定和事件处理等机制来实现交互性。本文将介绍Angular组件的基本概念&am…

2024大数据“打假”:什么才是真湖仓一体?

编者按&#xff1a;近年来&#xff0c;随着金融、制造、政务、交通、医疗等行业数字化转型深入&#xff0c;大量智慧应用涌现&#xff0c;使得构建强大的数据分析技术栈成为必须&#xff0c;也让“湖仓一体”成为热门词汇。但面对市场中各色各样的湖仓技术&#xff0c;众多行业…

【漏洞复现】Kubernetes PPROF内存泄漏漏洞(CVE-2019-11248)

Nx01 产品简介 Kubernetes&#xff08;简称K8S&#xff09;是Google在2014年开源的一个容器集群管理系统。它用于容器化应用程序的部署、扩展和管理&#xff0c;目标是让部署容器化应用简单且高效。 Nx02 漏洞描述 漏洞存在于Kubernetes的1.18.6版本之前&#xff0c;可能导致未…

某侠网js逆向wasm解析

本次目标地址如下&#xff0c;使用base64解密获得 aHR0cHM6Ly93d3cud2FpbWFveGlhLm5ldC9sb2dpbg 打开网址&#xff0c;本次的目标是登录接口&#xff0c;如下图 本文主要讲解wasm的解析&#xff0c;所以对其他参数不做逆向处理&#xff0c;本次由wasm加密的参数只有sign一个&a…

07 整合SSM的快速理解

1.1 第一问&#xff1a;SSM整合需要几个IoC容器&#xff1f; 两个容器 本质上说&#xff0c;整合就是将三层架构和框架核心API组件交给SpringIoC容器管理&#xff01; 一个容器可能就够了&#xff0c;但是我们常见的操作是创建两个IoC容器&#xff08;web容器和root容器&…

记一次小黄站渗透过程,实操!

前言 记录某一次无意点开的一个小网站的渗透过程&#xff0c;幸运的是搭建平台是phpstudy&#xff0c;cms是beecms&#xff0c;beecms有通用漏洞&#xff0c;然后去网上找了资料&#xff0c;成功getshell并获取服务器权限。 渗透过程 无意点开一个网站&#xff0c;发现网站比…

【操作系统】在阅读论文:OrcFS: Orchestrated file system for flash storage时需要补充的基础知

在阅读论文&#xff1a;OrcFS: Orchestrated file system for flash storage是需要补充的基础知识 这篇论文是为了解决软件层次之间的信息冗余问题 To minimize the disk traffic, the file system buffers the updates and then flushes them to the disk as a single unit, …

datawhale 大模型理论基础 引言

学习地址&#xff1a;大模型理论基础 一、什么是语言模型&#xff08;Language Model) 语言模型其实是一个概率模型&#xff0c;给每一个句子列表计算一个概率值&#xff1a; p(x1​,…,xL​) 例如&#xff1a; p(the, mouse, ate, the, cheese)0.02…

解决若依Vue3前后端分离---路由切换时显示白屏

解决若依Vue3前后端分离---路由切换时显示白屏 1.问题重述 解决基于Vue3若依前后端分离项目中出现的路由正常切换但是就是不显示数据的问题&#xff0c;也就是不发起网络请求的问题。 找到如下位置中AppMain.vue文件 将除了css中的代码进行替换成如下的代码。 <template&g…

Python数据分析案例34——IMDB电影评论情感分析(Transformer)

电影评论的情感分析 案例背景 很多同学对电影系列的数据都比较喜欢&#xff0c;那我就补充一下这个最经典的文本分类数据集&#xff0c;电影情感评论分析。用神经网络做。对国外的英文评论文本进行分类&#xff0c;看是正面还是负面情感。 数据集介绍 数据集&#xff1a;IMDb…

C# wpf 获取控件的刷新时机

文章目录 前言一、为何需要刷新时机&#xff1f;例子一、隐藏控件后截屏例子二、修改控件大小后做计算 二、如何实现&#xff1f;1.使用动画2.使用TaskCompletionSource 三、完整代码四、使用示例1、隐藏工具条截屏2、修改宽高后获取ActualWidth、ActualHeight 总结 前言 做wp…

Codeforces Round 920 (Div. 3) F题 根号分治,后缀和,后缀和的后缀和

Problem - F - Codeforces 我看的这位UP的视频讲解 &#xff1a; Codeforces Round 920 (Div. 3) F题 根号分治 详解_哔哩哔哩_bilibili 目录 题意&#xff1a; 思路&#xff1a; 后缀和的后缀和: 后缀和的后缀和的中间段如何求&#xff1a; ———— 根号分治: 核心…

2024极新生态营再出发,携手华为云点燃AI技术与商业创新的火花

“ 成功的风口是时间加产品竞争力 ” 文&#xff5c;欣桐&凯丰 编辑 | 云舒 出品&#xff5c;极新 2023年大模型获得突破性进展&#xff0c;正在带来新一轮科技革命和产业变革&#xff0c;众多头部企业在一年内完成了产品迭代、拿到多轮融资&#xff0c;初创企业更是如…

Java-网络爬虫(三)

文章目录 前言一、爬虫的分类二、跳转页面的爬取三、网页去重四、综合案例1. 案例三 上篇&#xff1a;Java-网络爬虫(二) 前言 上篇文章介绍了 webMagic&#xff0c;通过一个简单的入门案例&#xff0c;对 webMagic 的核心对象和四大组件都做了简要的说明&#xff0c;以下内容…

不是人才用不起,而是AI巡检更有性价比!

在许多行业中&#xff0c;如煤炭、电力、化工等&#xff0c;安全生产是至关重要的。这就需要通过巡检&#xff0c;对设备运行状态进行实时监测&#xff0c;及时发现并处理潜在的安全隐患&#xff0c;从而降低事故发生的概率。但是传统的巡检方式通常依赖于人工进行&#xff0c;…

odoo17 | Qweb模板简介

前言 到目前为止&#xff0c;我们的房地产模块的界面设计还相当有限。构建列表视图很简单&#xff0c;因为只需要字段列表。表单视图也是如此&#xff1a;尽管使用了几个标签&#xff0c;如 <group>标签或 <page>标签 &#xff0c;但在设计方面几乎没什么可做的。…

【Java数据结构】04-图(Prim,Kruskal,Dijkstra,topo)

5 图 推荐辅助理解 【视频讲解】bilibili Dijkstra Prim 【手动可视化】Algorithm Visualizer &#xff08;https://algorithm-visualizer.org/&#xff09; 【手动可视化】Data Structure Visualizations (https://www.cs.usfca.edu/~galles/visualization/Algorithms.ht…

Python 捕获异常(Try Except Exception)

目录 前言 常见的十类异常类型&#xff1a; try...except...else语句 格式 示例1 示例2 捕获所有异常&#xff08;常用&#xff09; 格式 示例 try...except...finally语句 格式 示例 前言 异常捕获就是针对某一部分可能出错的代码&#xff0c;在运行期间一旦出现…