当前位置: 首页 > article >正文

通讯录管理小程序

通讯录管理系统

是对c++基础语法的巩固,比较简单的一个小程序,重点在于养成良好的c++代码习惯
通讯录是一个可以记录亲人、好友信息的工具。

本教程主要利用C++来实现一个通讯录管理系统

下面是一些需要实现的功能:

1. 添加联系人

  • 功能描述:实现添加联系人,人数上限为1000人

    信息包括(姓名、性别、年龄、联系电话、家庭住址)
  • 实现步骤:
    • 设计联系人结构体
    • 设计通讯录结构体
    • mian函数中创建通讯录
//设计联系人结构体
struct Person
{//姓名string m_name;//性别 1男0女int m_sex;//年龄int m_age;//联系电话string m_phonenum;//住址string m_address;
};//设计通讯录结构体
struct Addressbooks
{//通讯录中保存的联系人数组struct Person personArray[MAX];//通讯录当前保存的联系人个数int size;
};
  * 封装添加联系人函数
//1.添加联系人
void addPerson(Addressbooks *abs)
{//判断通讯录是否已经满了if (abs->size == MAX){cout <<"通讯录已满,无法添加联系人!" << endl;return;}else{//添加联系人//姓名string name;cout <<"请输入联系人姓名:" << endl;cin >> name;abs->personArray[abs->size].m_name = name;//性别int sex;cout <<"请输入性别:" << endl;cout <<"1---男" << endl;cout <<"0---女" << endl;while (true){cin >> sex;//如果不是0或1则输入形式错误if (sex==1||sex==0){abs->personArray[abs->size].m_sex=sex;break;}cout <<"输入有误,请重新输入:" << endl;}//年龄int age;cout <<"请输入年龄:" << endl;cin >> age;abs->personArray[abs->size].m_age = age;//联系电话string phonenum;cout <<"请输入联系方式:" << endl;cin >> phonenum;abs->personArray[abs->size].m_phonenum = phonenum;//地址string address;cout <<"请输入地址:" << endl;cin >> address;abs->personArray[abs->size].m_address = address;abs->size++;cout <<"添加成功!" << endl;system("pause");system("cls");}
}
  * 测试添加联系人功能

2. 显示联系人

* 功能描述:显示通讯录中已有联系人
* 实现步骤:* 封装显示联系人函数
//封装显示联系人函数
void showPerson(Addressbooks *abs)
{//判断通讯录是否为空if (abs->size == 0)cout <<"通讯录为空!"<< endl;else{for (int i = 0; i < abs->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_phonenum << "\t";cout <<"住址:"<< abs->personArray[i].m_address << endl;}system("pause");system("cls");}
}
    * 测试显示联系人功能

3. 查找联系人

* 功能描述:按照指定的姓名查找联系人
* 实现步骤:* 封装查找联系人函数
//检测联系人是否存在,如果存在就返回联系人在通讯录中的位置,否则就返回-1
int isEmpty(Addressbooks *abs,string name)
{for (int i = 0; i < abs->size; i++){if (abs->personArray[i].m_name == name)return i;}return -1;
}//4.查找联系人
void findPerson(Addressbooks *abs)
{cout <<"请输入要查找的联系人姓名:"<< endl;string name;cin >> name;int ret=isEmpty(abs,name);if (ret == -1)cout <<"查无此人!"<< endl;else{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_phonenum << "\t";cout <<"住址:"<< abs->personArray[ret].m_address << endl;}
}
    * 测试查找联系人函数

4. 删除联系人

* 功能描述:根据姓名删除联系人
* 实现步骤:* 检测联系人是否存在* 封装删除联系人函数
//3.删除联系人
void deletePerson(Addressbooks *abs)
{cout <<"输入要删除的联系人姓名:"<< endl;string name;cin >> name;//ret=-1没查到、否则查到了int ret=isEmpty(abs,name);if (ret == -1)cout <<"查无此人!"<< endl;else{cout <<"查到此人!"<< endl;cout <<"是否删除 "<< abs->personArray[abs->size].m_name <<" 的相关信息"<< endl;cout <<"1---Yes"<< endl;cout <<"0---No"<< endl;int flag=0;cin >> flag;if (flag==1){//数据前移for (int i = ret; i < abs->size-1; i++)abs->personArray[i]=abs->personArray[i+1];abs->size--;//更新通讯录中的人数cout <<"操作成功!"<< endl;}}
}
    * 测试联系人函数功能

5. 修改联系人

* 功能描述:按照联系人姓名修改相关信息
* 实现步骤:* 封装修改联系人函数
//5.修改指定联系人
void modifyPerson(Addressbooks *abs)
{cout <<"请输入要修改的联系人姓名:"<< endl;string name;cin >> name;int ret=isEmpty(abs,name);if (ret == -1)cout <<"查无此人!"<< endl;else{string name;cout <<"请输入联系人姓名:" << endl;cin >> name;abs->personArray[ret].m_name = name;//修改性别int sex;cout <<"请输入性别:" << endl;cout <<"1---男" << endl;cout <<"0---女" << endl;while (true){cin >> sex;//如果不是0或1则输入形式错误if (sex==1||sex==0){abs->personArray[ret].m_sex=sex;break;}cout <<"输入有误,请重新输入:" << endl;}//修改年龄int age;cout <<"请输入年龄:" << endl;cin >> age;abs->personArray[ret].m_age = age;//修改联系电话string phonenum;cout <<"请输入联系方式:" << endl;cin >> phonenum;abs->personArray[ret].m_phonenum = phonenum;//修改地址string address;cout <<"请输入地址:" << endl;cin >> address;abs->personArray[ret].m_address = address;}system("pause");system("cls");
}
    * 测试修改联系人功能

6. 清空联系人

* 功能描述:将通讯录逻辑清空
* 将通讯录联系人数量清空即可
//清空通讯录
void cleanPerson(Addressbooks *abs)
{abs->size=0;cout <<"通讯录已清空!"<< endl;system("pause");system("cls");
}

7. 退出系统

8.源代码

源码上传到Gitee(contact_management_system)上了,需要的自取。

相关文章:

通讯录管理小程序

通讯录管理系统 是对c基础语法的巩固&#xff0c;比较简单的一个小程序&#xff0c;重点在于养成良好的c代码习惯。 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统 下面是一些需要实现的功能&#xff1a; 1. 添加联系人 功能描述&…...

掌握API和控制点(从Java到JNI接口)_38 JNI从C调用Java函数 01

1. Why? 将控制点下移到下C/C层 对古典视角的反思 App接近User&#xff0c;所以App在整体架构里&#xff0c;是主导者&#xff0c;拥有控制权。所以&#xff0c; App是架构的控制点所在。Java函数调用C/C层函数&#xff0c;是合理的。 但是EIT造形告诉我们&#xff1a; App…...

理解UML中的四种关系:依赖、关联、泛化和实现

在软件工程中&#xff0c;统一建模语言&#xff08;UML&#xff09;是一种广泛使用的工具&#xff0c;用于可视化、设计、构造和文档化软件系统。UML提供了多种图表类型&#xff0c;如类图、用例图、序列图等&#xff0c;帮助开发者和设计师更好地理解系统的结构和行为。在UML中…...

windows蓝牙驱动开发-蓝牙 LE 邻近感应配置文件

邻近感应检测是蓝牙低功耗 (LE) 的常见用途。 本部分提供了创建可用于开发 UWP 设备应用的邻近感应配置文件的设备实现的指南。 在开发此应用之前&#xff0c;应熟悉蓝牙 LE 函数和蓝牙 LE 邻近感应配置文件规范。 示例服务声明 蓝牙低功耗引入了一个新的物理层&#xff0c;…...

【截图】selenium自动通过浏览器截取指定元素div的图片

【截图】selenium自动通过浏览器截取指定元素div的图片 思路 截取完整网页截图 通过元素的坐标 截图到指定位置的图片 前提是已经获取到 driver 了 # 定位目标divtarget_div driver.find_element(By.CLASS_NAME, headlines-right)# 获取div的位置和大小location target_div…...

【算法】动态规划专题⑨ —— 二维费用背包问题 python

目录 前置知识进入正题实战演练 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 python 进入正题 二维费用背包问题 方法思路 二维费用背包问题在传统背包问题的基础上增加了第二个维度的限制&#xff08;如重量&#xff09;。 每个物品具有两种费用&#x…...

免费windows pdf编辑工具Epdf

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …...

MVCC机制深度解析

在数据库管理系统中&#xff0c;多版本并发控制&#xff08;MVCC&#xff0c;Multi-Version Concurrency Control&#xff09;是一种用于提高数据库并发性能的技术。它通过在同一数据项上存储多个版本&#xff0c;允许事务在读取数据时不必等待其他事务的完成&#xff0c;从而提…...

C++:类和对象初识

C&#xff1a;类和对象初识 前言类的引入与定义引入定义类的两种定义方法1. 声明和定义全部放在类体中2. 声明和定义分离式 类的成员变量命名规则 类的访问限定符及封装访问限定符封装 类的作用域与实例化类的作用域类实例化实例化方式&#xff1a; 类对象模型类对象的大小存储…...

伪分布式Spark3.4.4安装

参考&#xff1a;Spark2.1.0入门&#xff1a;Spark的安装和使用_厦大数据库实验室博客 我的版本&#xff1a; hadoop 3.1.3 hbase 2.2.2 java openjdk version "1.8.0_432" 问了chatgpt,建议下载Spark3.4.4&#xff0c;不适合下载Spark 2.1.0: step1 Spark下载…...

kafka服务端之控制器

文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controler&#xff09;&#xff0c;它负责管理整个集群中所有分区和副本的状态。…...

element-plus el-tree-select 修改 value 字段

element-plus el-tree-select 修改 value 字段 &#xff0c;不显示label 需要注意两个地方&#xff1a; <el-tree-select v-model"value" :data"data" multiple :render-after-expand"false" show-checkbox style"width: 240px" …...

SQL最佳实践(笔记)

写在前面&#xff1a; 之前baeldung的Java Weekly &#xfeff;Reviews里面推荐了一篇关于SQL优化的文章&#xff0c;正好最近在学习数据库相关知识&#xff0c;记一些学习笔记 原文地址&#xff1a;SQL Best Practices Every Java Engineer Must Know 1. 使用索引 使用索引…...

在 Java 中执行一个复杂的 SQL 查询(包含多表连接、子查询和聚合函数),如何确保查询的性能?请列举至少三条措施。请简要描述其工作原理?

在Java中执行复杂的SQL查询时&#xff0c;确保查询性能是非常重要的。 以下是三条关键措施&#xff0c;以及它们的详细解释、代码示例和实际开发中的注意事项。 1. 使用索引 索引是提高数据库查询性能的最基本手段之一。通过在查询条件中使用的列上创建索引&#xff0c;可以…...

java将list转成树结构

首先是实体类 public class DwdCusPtlSelectDto {//idprivate String key;//值private String value;//中文名private String title;private List<DwdCusPtlSelectDto> children;private String parentId;public void addChild(DwdCusPtlSelectDto child) {if(this.chil…...

【R语言】数据分析

一、描述性统计量 借助R语言内置的airquality数据集进行简单地演示&#xff1a; 1、集中趋势&#xff1a;均值和中位数 head(airquality) # 求集中趋势 mean(airquality$Ozone, na.rmT) # 求均值 median(airquality$Ozone, na.rmT) # 求中位数 2、众数 众数&#xff08;mod…...

传输层协议 UDP 与 TCP

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 前置复盘&#x1f98b; 传输层&#x1f98b; 再谈端口号&#x1f98b; 端口号范围划分&#x1f98b; 认识知名端口号 (Well-Know Port Number) 二&#xf…...

Linux 调用可执行程序

Linux 调用可执行程序 1. system() 函数1.1 system() 函数的声明1.2 system() 函数的不同场景返回值1.3 system() 函数的代码示例 2. exec() 函数族2.1 exec() 函数族的声明2.2 exec() 函数族执行失败的情况2.3 exec() 函数族的代码示例 3. exec() 与 system() 的区别以及使用注…...

Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用

概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案&#xff0c;包括 DTO语言 更全面更强大的缓存机制&#xff0c;以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力&#xff0c;包括Jimmer独创的远程异常 …...

剪辑学习整理

文章目录 1. 剪辑介绍 1. 剪辑介绍 剪辑可以干什么&#xff1f;剪辑分为哪些种类&#xff1f; https://www.bilibili.com/video/BV15r421p7aF/?spm_id_from333.337.search-card.all.click&vd_source5534adbd427e3b01c725714cd93961af 学完剪辑之后如何找工作or兼职&#…...

IDEA查看项目依赖包及其版本

一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…...

centos虚拟机迁移没有ip的问题

故事背景&#xff0c;我们的centos虚拟机本来是好好的&#xff0c;但是拷贝到其他电脑上就不能分配ip&#xff0c;我个人觉得这个vmware他们软件应该搞定这个啊&#xff0c;因为这个问题是每次都会出现的。 网络选桥接 网络启动失败 service network restart Restarting netw…...

Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

Java中的继承及相关概念

在 Java 中&#xff0c;继承是一种允许一个类继承另一个类的特性。通过继承&#xff0c;子类可以获取父类的属性和方法&#xff0c;这有助于减少代码冗余并提高代码的可维护性。以下是关于文件内容的相关分析和知识点总结&#xff1a; 一、继承的核心概念 1.继承的语法 Java …...

赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索

hello~朋友们&#xff01;好久不见&#xff01; 今天给大家带来赛博算命第三期——梅花易数的java实现 赛博算命系列文章&#xff1a; 周易六十四卦 掐指一算——小六壬 更多优质文章&#xff1a;个人主页 JAVA系列&#xff1a;JAVA 大佬们互三哦~互三必回&#xff01;&#xf…...

DNS攻击方式有哪些,应该采取哪些应对措施?

在当今数字化时代&#xff0c;网络已成为人们生活和工作不可或缺的一部分。而 DNS&#xff08;域名系统&#xff09;作为互联网的关键基础设施&#xff0c;如同电话簿一般&#xff0c;将人们易于记忆的域名转换为计算机能够识别的 IP 地址&#xff0c;让我们能够轻松访问各类网…...

即梦(Dreamina)技术浅析(六):多模态生成模型

多模态生成模型是即梦(Dreamina)的核心技术之一,旨在结合文本和图像信息,生成更符合用户需求的视觉内容。多模态生成模型通过整合不同类型的数据(如文本和图像),能够实现更丰富、更精准的生成效果。 1. 基本原理 1.1 多模态生成模型概述 多模态生成模型的目标是结合不…...

如何优化爬虫以提高搜索效率

在数据采集和网络爬虫领域&#xff0c;优化爬虫性能是提升数据采集效率的关键。随着网页结构的日益复杂和数据量的不断增长&#xff0c;高效的爬虫能够显著降低运行时间和资源成本。本文将详细介绍如何优化爬虫以提高搜索效率&#xff0c;包括选择合适的工具、优化代码逻辑、使…...

Node.js中http模块(二)

一、http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer0) 方法&#xff0c;就能方便的把一台普通的电脑&#xff0c;变成一台 Web 服务器&#xff0c;从而对外提供 Web 资源服务。 二、域名和域名服务器 尽管 I…...

android selinux 问题

参考 Android Selinux介绍&#xff0c;如何添加selinux 权限SELinux权限-总结添加Selinux 权限/常见的Selinux 权限问题为何Android普通APP可以执行私有数据中的so文件&#xff0c;而system app却不可以&#xff1f;Android SELinux权限概念和配置说明Selinux中的APP分类Andro…...