通讯录管理系统(cpp)

news2025/2/12 0:35:19

一 系统需求

主要用C++来实现一个通讯录管理系统
需要包含以下功能

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

二 创建项目

创建步骤如下:

  • 创建新项目
  • 添加文件

visual studio code创建新项目

三 菜单功能

用户选择功能的界面
步骤:

  • 封装函数显示该界面,如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;
}

在这里插入图片描述

四 退出功能

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

当用户选择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;
		}
	}

五 添加联系人

实现添加联系人功能,联系人上限为1000人,联系人信息包括姓名、性别、年龄、联系电话、家庭住址
添加联系人实现步骤:

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

5.1 设计联系人结构体

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

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

5.2 设计通讯录结构体

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

5.3 设计增添用户的方法

// 1.添加联系人
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;
		//性别
		cout << "请输入性别:" << endl;
		cout << "1----男" << endl;
		cout << "2----女" << endl;
		int sex = 0;
		while (true) {
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;
			}
		}
		//年龄
		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;

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

	}
}

六 显示联系人

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

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

6.1 封装显示联系人函数

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

// 2 显示联系人
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");
}

七 删除联系人

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

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

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

设计思路:
删除联系人前,需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示没有要删除的联系人,因此我们可以把检测联系人是否存在封装成封装成一个函数,如果存在,返回联系人在通讯录中的位置,不存在返回-1

// 检测联系人是否存在,如果存在,返回联系人所在数组中位置,不存在返回-1
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
	}
}

7.2 封装删除联系人函数

根据用户输入的来呢西人判断该通讯录中是否有此人
查找到进行删除,并提示删除成功
查不到提示查无此人

/ 删除指定联系人
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");
}

八 查找联系人

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

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

8.1 封装查找联系人函数

判断用户指定联系人是否存在,如果存在显示信息,不存在提示查无此人

//4. 查找联系人
void findPerson(Addressbooks *abs) {
	cout << "请输入您要查找的联系人:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret != -1) {
		cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
		cout << "性别:" << abs->personArray[ret].m_Sex << "\t";
		cout << "电话:" << abs->personArray[ret].m_Phone << "\t";
		cout << "年龄:" << abs->personArray[ret].m_Age << "\t";
		cout << "住址:" << abs->personArray[ret].m_Addr << "\t";

	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

九 修改联系人

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

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

9.1封装修改联系人函数

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

// 5 修改联系人
void modifyPerson(Addressbooks* abs) {
	cout << "请输入您想要修改的联系人" << endl;
	string name;
	cin >> name;
	int ret=isExist(abs, name);
	if (ret != -1) {
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs->personArray[ret].m_Name = name;
		int age;
		cout << "请输入年龄:" << endl;
		cin >> age;
		abs->personArray[ret].m_Age = age;
		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 << "输入有误,请重新输入" << endl;
		}
		string phone;
		cout << "请输入电话:" << endl;
		cin >> phone;
		abs->personArray[ret].m_Phone = phone;
		string addr;
		cout << "请输入地址:" << endl;
		cin >> addr;
		abs->personArray[ret].m_Addr = addr;
	}
	else {
		cout << "查无此人" << endl;
	}
	system("pause");
	system("cls");
}

十 清空联系人

功能描述:清空通讯录中所有信息
清空联系人步骤:

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

10.1 封装清空联系人函数

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

void cleanPerson(Addressbooks* abs) {
	abs->m_Size = 0;
	cout << "通讯录已经清空" << endl;
	system("pause");
	system("cls");
}

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

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

相关文章

【Spring】— 动态SQL :MyBatis的关联映射

目录 MyBatis的关联映射1、关联关系概述2、MyBatis中的关联关系2.1 一对一2.2 一对多2.3 多对多 MyBatis的关联映射 在实际应用中&#xff0c;对数据库的操作会涉及多张表&#xff0c;这在面向对象中就涉及对象与对象之间的关联关系。针对多表之间的操作&#xff0c;MyBatis提…

全志V3S嵌入式驱动开发(wifi驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 荔枝派上面除了支持v3s自带的有线网口&#xff0c;还带有一个支持sd协议的esp 8089 wifi模块。有了这个模块&#xff0c;v3s没有网线&#xff0c;也…

chatgpt赋能python:Python程序与SEO:如何建立程序使您的网站优化更好

Python程序与SEO&#xff1a;如何建立程序使您的网站优化更好 今天&#xff0c;越来越多的网站和在线业务转向搜索引擎优化&#xff0c;以吸引更多访问者和客户。Python编程语言是一种快速、灵活、易于学习的工具&#xff0c;如果正确使用它可以使您的网站SEO更好。下面我们来…

【从删库到跑路】MySQL系列——数据库的介绍MySQL的启动

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;什么是数据库⭐组成⭐数据库的优势 &#x1f35…

Spring Security--自动登录

也就是remember me 在配置链上加一个 然后发送请求时加上:remember-me字段 value值可以为&#xff0c;ture&#xff0c;1&#xff0c;on 我们记住登录后&#xff0c;关掉浏览器再打开&#xff0c;访问一下接口&#xff0c;可以访问&#xff0c;说明记住登录成功了。 因为有的…

Spring中Bean的生命 周期与作用域

文章目录 前言Bean的作用域概念Bean作用域类型1. singleton&#xff1a;单例作⽤域2. prototype&#xff1a;原型作⽤域&#xff08;多例作⽤域&#xff09;3. request&#xff1a;请求作⽤域4. session&#xff1a;回话作⽤域5. application&#xff1a;全局作⽤域6. websocke…

51单片机实训项目之“红外控制小风扇”代码详解

本代码实现的功能是通过红外遥控来控制风扇的转速。废话不多说&#xff0c;直接上代码。 另外补充一点红外通信的原理&#xff1a; 红外接收 NEC协议&#xff1a; 数据格式 发射端的方波图&#xff0c;接收端的正好与之相反&#xff0c;数据传输从最低位开始 NEC 标准下…

mqtt.fx连接阿里云物联网平台

这里写目录标题 注册公共示例创建产品添加设备创建云产品流转生成基本信息配置mqtt.fx客户端数据传送 前提条件&#xff1a;下载mqtt.fx软件&#xff0c;以及注册好阿里云物联网平台账号 本实验用两个mqtt.fx客户端接入阿里云物联网平台&#xff0c;来实现不同设备间消息的传输…

大数据Doris(四十):Routine Load基本原理和语法介绍

文章目录 Routine Load基本原理和语法介绍 一、基本原理 二、Routine Load 语法 Routine Load基本原理和语法介绍 例行导入(Routine Load)功能,支持用户提交一个常驻的导入任务,通过不断的从指定的数据源读取数据,将数据导入到 Doris 中。目前Rou

chatgpt赋能python:如何使用Python获取Listview

如何使用Python获取Listview 在现代数据驱动的世界中&#xff0c;处理大量数据已经成为一项关键技能。准确地说&#xff0c;操作大量数据要比操作一小部分数据要困难得多。Python是一门非常出色的编程语言&#xff0c;它的处理大量数据的能力无人能敌。在这篇文章中&#xff0…

MySQL面试题详解

优化 如何定位慢查询 mysql中慢查询通常发生在以下几种情况&#xff0c;聚合查询&#xff0c;多表查询&#xff0c;表数据量过大查询&#xff0c;深度分页查询。 表象&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长(超过1s) 定位慢查询的方法主要有两种。方法一…

Windows 下编译 OpenCV 和 OpenCV-contrib

文章目录 导言环境准备源码获取环境获取 配置 CMake 并编译ConfigureGenerate 生成项目总结 导言 在本文中&#xff0c;我们将介绍如何在 Windows 系统下编译 OpenCV 和 OpenCV-contrib。OpenCV 是一个开源的计算机视觉库&#xff0c;它包含了许多图像处理和计算机视觉的功能。…

gismo调试-组总刚

文章目录 前言一、1 组总刚main文件的断点2 跳转到gsElasticityAssembler.hpp3 gsElasticityAssembler.hpp的177行进入gsVisitorLinearElasticity.h4 进入gsAssembler.h重新进入gsVisitorLinearElasticity.h进入gsSparseSystem.h1.14 进入gsAssembler.h1.21.31.4 二、2.12.22.3…

Cracking C++(11): CMake代码高亮调研

文章目录 1. 目的2. VSCode 插件CMake 和 CMake ToolsCMake Language SupportCMake Highlights 3. JetBrains 系列3.1 CLion3.2 Fleet 4. Kate5. Sublime Text6. 总结 1. 目的 CMake 已经是开源 C 项目的主流 building system&#xff0c; 这里简单调研关注的编辑器 / IDE 下&…

Jetson nano 进阶教程4_通过IIC输出PWM

Jetson nano 进阶教程4_通过IIC输出PWM Jetson nano的40PIN不能直接发出PWM波&#xff0c;在很多控制舵机&#xff0c;电机调速方面很不方便&#xff0c;因此利用一块PCA9685模块&#xff0c;通过I2C总线控制PCA9685输出pwm波&#xff0c;并且可以调整占空比。 How do I use P…

Android Activity启动过程详解

目录 一&#xff0c;背景介绍 二&#xff0c;Activity启动过程 2.1 调用 ATMS 系统进程 2.1.1 时序图 2.1.2 Launcher 桌面的 App 图标入口 2.1.3 startActivitySafely() 方法 2.1.4 execStartActivity() 方法 2.2 ATMS 向 AMS 发送创建应用进程的过程 2.2.1 时序图 …

03- 流程控制(C语言)

一 概述 C语言支持三种程序运行结构&#xff1a;顺序结构、选择结构、循环结构。 顺序结构&#xff1a;按照语句编写的顺序 上到下逐句执行。选择结构&#xff1a;也叫 分支结构&#xff0c;依据是否满足条件&#xff0c;有选择的执行相应功能。循环结构&#xff1a;依据条件…

动态字符串SDS

基本概括 Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 但Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff08;C语言中实际上没有字符串&#xff0c;本质上是字符数…

面向对象的封装

9. 面向对象特征一&#xff1a;封装性(encapsulation) 什么是封装 就像快递一样我们在网上买的物品&#xff0c;快递都会给我们添加外包装&#xff0c;给我们封装起来&#xff0c;这就是封装 客观世界里每一个事物的内部信息都隐藏在其内部&#xff0c;外界无法直接操作和修改…

怎样才算一个计算机知识体系完整的毕业生

为什么突然想写这个话题呢&#xff1f; 最近有不少新关注的读者&#xff0c;在后台问&#xff1a;大学学 Java 和 C 哪个好找工作&#xff0c;学前端好还是后端好&#xff0c;该学 Vue 还是 React。。。 仿佛看到了自己当年的模样&#xff0c;所以觉得有必要单独写一篇文章&a…