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

通讯录的实现

一、目的:

使用C++实现通讯录

二、包含功能:

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

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

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

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

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

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

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

三、代码部分

打印菜单

void showMenu()
{cout << "*******************************" << endl <<"*******  1、添加联系人  *******" << endl <<"*******  2、删除联系人  *******" << endl <<"*******  3、显示联系人  *******" << endl <<"*******  4、查找联系人  *******" << endl <<"*******  5、修改联系人  *******" << endl <<"*******  6、清空联系人  *******" << endl <<"*******  0、退出通讯录  *******" << endl<<"*******************************" << endl;cout << "请选择:" << endl;
}

首先,因为我们要选择1、2、3、4、5、6、0这些数字从而开启各项功能,所以这里我使用switch语句

同时,当我们选择1-6这些数字时,功能完成后我们并不直接退出程序,而是重新回到功能展示界面供我们选择功能,因此我们使用while循环,只有选择了功能0,才执行退出功能

    while (true){showMenu();int input = 0;cin >> input;switch (input){case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;case 0:cout << "退出程序!" << endl;return 0;break;default:break;}}

而在实现添加联系人、删除联系人等的功能之前,需要先有联系人才行,因此接下来我们先实现联系人的创建,这里使用2个结构体:联系人结构体/通讯录结构体

#define MAX 1000
struct person  // 定义联系人结构体
{string name;int sex;int age;string tel;string address;
};
struct Contact // 定义通讯录结构体
{struct person ContactArray[MAX]; // 创建联系人结构体数组int size;    // 确定当前通讯录数量,上限为MAX=1000
};

添加联系人

void Add(Contact* Con)
{if (Con->size == MAX){cout << "通讯录已满,无法添加!" << endl;return;}else{cout << "请输入姓名:" << endl;cin >> Con->ContactArray[Con->size].name;int sex = 0;while (true){cout << "请输入性别:" << endl;cout << "男 - 1" << "  " << "女 - 2" << endl;cin >> sex;if (sex == 1 || sex == 2){Con->ContactArray[Con->size].sex = sex;break;}cout << "输入错误,请重新输入!" << endl;}int age = 0;while (true){cout << "请输入年龄:" << endl;cin >> age;if (age > 0 && age < 110){Con->ContactArray[Con->size].sex = age;break;}cout << "输入错误,请重新输入!" << endl;}cout << "请输入电话:" << endl;cin >> Con->ContactArray[Con->size].tel;cout << "请输入住址:" << endl;cin >> Con->ContactArray[Con->size].address;Con->size++; // 数量+1cout << "添加成功!" << endl;system("pause"); // 请按任意键继续}system("cls"); // 清屏
}

显示联系人

void Show(Contact* Con)
{if (Con->size == 0){cout << "通讯录为空!" << endl;}else{for (int i = 0; i < Con->size; i++){cout << "序号:" << i+1 << "\t";cout << "姓名:" << Con->ContactArray[i].name << "\t";cout << "性别:" << (Con->ContactArray[i].sex == 1 ? "男" : "女") << "\t";// 1则返回男,否则是女cout << "年龄:" << Con->ContactArray[i].age << "\t";cout << "电话:" << Con->ContactArray[i].tel << "\t";cout << "住址:" << Con->ContactArray[i].address << "\t";cout << endl;}system("pause"); // 请按任意键继续}system("cls"); // 清屏
}

判断联系人是否存在

int Exist(Contact* Con,string name)
{for (int i = 0; i <= Con->size; i++){if (Con->ContactArray[i].name == name)return i;elsereturn -1;}
}

查找联系人

void Find(Contact* Con)
{cout << "请输入要查找人的名字:" << endl;string name;cin >> name;int ret = Exist(Con, name);if (ret == -1){cout << "查无此人!" << endl;}else{cout << "序号:" << ret + 1 << "\t";cout << "姓名:" << Con->ContactArray[ret].name << "\t";cout << "性别:" << (Con->ContactArray[ret].sex == 1 ? "男" : "女") << "\t";// 1则返回男,否则是女cout << "年龄:" << Con->ContactArray[ret].age << "\t";cout << "电话:" << Con->ContactArray[ret].tel << "\t";cout << "住址:" << Con->ContactArray[ret].address << "\t";cout << endl;}system("pause");system("cls"); // 清屏
}

删除指定联系人

void Del(Contact* Con)
{cout << "请输入要删除人的名字:" << endl;string name;cin >> name;int ret = Exist(Con,name);if (ret == -1){cout << "查无此人!" << endl;}else{for (; ret < Con->size; ret++){// 数据前移Con->ContactArray[ret] = Con->ContactArray[ret + 1];}Con->size--;cout << "删除成功!" << endl;}system("pause");system("cls");
}

修改指定联系人

void Mod(Contact* Con)
{cout << "请输入要修改人的名字:" << endl;string name;cin >> name;int ret = Exist(Con, name);if (ret == -1){cout << "查无此人!" << endl;}else{cout << "请输入姓名:" << endl;cin >> Con->ContactArray[ret].name;int sex = 0;while (true){cout << "请输入性别:" << endl;cout << "男 - 1" << "  " << "女 - 2" << endl;cin >> sex;if (sex == 1 || sex == 2){Con->ContactArray[Con->size].sex = sex;break;}cout << "输入错误,请重新输入!" << endl;}int age = 0;while (true){cout << "请输入年龄:" << endl;cin >> age;if (age > 0 && age < 110){Con->ContactArray[Con->size].age = age;break;}cout << "输入错误,请重新输入!" << endl;}cout << "请输入电话:" << endl;cin >> Con->ContactArray[ret].tel;cout << "请输入住址:" << endl;cin >> Con->ContactArray[ret].address;cout << "修改成功!" << endl;}system("pause");system("cls"); // 清屏
}

清空联系人

void Des(Contact* Con)
{char input;cout << "请确认是否要清空联系人?" << endl<< " 确认输入Y ,否则输入N" << endl;cin >> input;if (input == 'Y'){Con->size = 0;cout << "已清空通讯录!" << endl;}system("pause");system("cls"); // 清屏
}

主函数

int main()
{Contact Con;Con.size = 0;while (true){showMenu();int input = 0;cin >> input;switch (input){case 1:Add(&Con);break;case 2:Del(&Con);break;case 3:Show(&Con);break;case 4:Find(&Con);break;case 5:Mod(&Con);break;case 6:Des(&Con);break;case 0:cout << "退出程序!" << endl;return 0;break;default:break;}}return 0;
}

相关文章:

通讯录的实现

一、目的&#xff1a;使用C实现通讯录二、包含功能&#xff1a;添加联系人:向通讯录中添加新人&#xff0c;信息包括&#xff08;姓名、性别、年龄、联系电话、家庭住址&#xff09;最多记录1000人显示联系人:显示通讯录中所有联系人信息删除联系人:按照姓名进行删除指定联系人…...

Urho3D导航

Urho3D通过使用Recast和Detour库实现导航网格生成和路径查找。 导航功能通过NavigationMesh和Navigable组件公开。 NavigationMesh从已使用Navigable组件标记的子节点收集几何体。默认情况下&#xff0c;可导航组件的行为是递归的&#xff1a;除非禁用递归&#xff0c;否则也…...

【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)

前段时间尝试了一款激光雷达和相机标定的代码&#xff0c;总结了博客&#xff1a; 【学习总结】激光雷达与相机外参标定&#xff1a;原理与代码 但总觉得那个代码太差劲&#xff0c;而且精度不行&#xff0c;于是又找了些新的代码&#xff0c;体验比之前的好很多&#xff0c;在…...

车载技术开发—{Android CarFrameWork}

Android Automotive平台 Android Automotive是通过Android的通用框架&#xff0c;语言和API来实现的一个全栈&#xff0c;开源&#xff0c;高度可定制的平台。 Android Automotive与整个Android生态系统的关系 Android Automotive是Android的一部分。 Android Automotive不是…...

多城市二手车买卖发布管理小程序开发

多城市二手车买卖发布管理小程序开发 功能特性: 为你介绍二手车微信小程序的功能特性。 车辆分类搜索&#xff0c;支持按品牌、售价、年龄、上牌时间、排量等筛选。 车源发布&#xff0c;支持用户一键发布二手车&#xff0c;平台审核上线&#xff0c;发布可编辑、删除等操作。…...

企业级信息系统开发学习笔记1.2 初探Spring——利用组件注解符精简Spring配置文件

文章目录零、本讲学习目标一、课程引入二、打开项目 - SpringDemo三、利用组件注解符精简Spring配置文件&#xff08;一&#xff09;创建新包&#xff08;二&#xff09;复制四个类&#xff08;三&#xff09;修改杀龙任务类&#xff08;四&#xff09;修改救美任务类&#xff…...

37、基于51单片机乒乓球比赛系统设计

摘要 乒乓球游戏电路是一个对输入信号、输入时机正确与否的8个LED表示乒乓球球台和乒乓球&#xff0c;用数码管模拟显示器&#xff0c;显示比赛局数比分和每局玩家得分的电路。电路并不复杂&#xff0c;整体分为两个模块&#xff1a;一&#xff0c;游戏主模块&#xff1b;二&a…...

VMware虚拟机安装Win11最详细过程以及遇到的这台电脑无法运行Windows11的问题

准备工作 在使用VMware虚拟机安装Win11之前我们先把准备工作做好&#xff0c;以免后续思绪混乱导致出错。 1. 到VMware官网或点击链接下载正版VMware Workstation 16 Pro。 2. 双击打开安装包&#xff0c;点击下一步。 3. 阅读用户许可协议&#xff0c;勾选我接受许可协议中的…...

centos误删python2后怎么重新安装

此教程为离线安装 一. 先查询系统版本 cat /proc/version Linux version 3.10.0-1127.el7.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Tue Mar 31 23:36:51 UTC 2020 二. 安装python2.7.5(已知原python版…...

Qt 开发使用VSCode 笔记2

在之前有写过使用VSCode开发QT的笔记 Qt 开发使用VSCode 在以前的基础上继续学习记录写下《Qt 开发使用VSCode 笔记2》 该笔记相比之前的Qt 开发使用VSCode新加了如下内容&#xff1a; 工作区的使用使用Natvis进行Qt感知对象可视化通过vscode创建QT Quick项目 工作区的使用 …...

查找算法复习

先序在了解查找算法之前&#xff0c;需要熟悉几个概念&#xff0c;不然后面容易产生理解错误。查找表&#xff1a;即被查找的对象&#xff0c;通常由几个关键字组成。关键字&#xff1a;就是数据项、字段的意思。关键字有主次之分&#xff0c;其中主关键字取值是唯一的。查找长…...

腾讯前端必会面试题(必备)

如何提取高度嵌套的对象里的指定属性&#xff1f; 有时会遇到一些嵌套程度非常深的对象&#xff1a; const school {classes: {stu: {name: Bob,age: 24,}} }像此处的 name 这个变量&#xff0c;嵌套了四层&#xff0c;此时如果仍然尝试老方法来提取它&#xff1a; const {…...

探访上汽通用武汉奥特能超级工厂

上汽通用汽车在电动化和智能网联化新技术领域投入了700亿大洋&#xff0c;武汉奥特能超级工厂就是其中一个重点项目。这个工厂已经投产&#xff0c;将成为上汽通用汽车的新能源生产基地&#xff0c;加速奥特能平台车型的推出。 最近别克推出了Electra E5&#xff0c;它是别克第…...

【Linux】线程函数和线程同步详细整理(金针菇般细)

目录 一&#xff0c;线程函数 1.获取当前线程ID 2.创建线程 3.退出线程 4.阻塞线程 5.分离线程 6.取消线程 7.线程比较 8.测试代码&#xff08;线程函数总结&#xff09; 二&#xff0c;线程同步 1.互斥锁 2.读写锁 3.条件变量 4.信号量 一&#xff0c;线程函数 …...

Python学习笔记6:抽象

抽象 函数 判断某个对象是否可调用&#xff0c;可使用内置函数callable >>> import math >>> x 1 >>> y math.sqrt >>> callable(x) False >>> callable(y) True斐波那契数组 def fibs(num): result [0, 1] for i i…...

自己手写一个redux

提起 Redux 我们想到最多的应该就是 React-redux 这个库&#xff0c;可是实际上 Redux 和 React-redux 并不是同一个东西, Redux 是一种架构模式&#xff0c;源于 Flux。 React-redux 是 Redux 思想与 React 结合的一种具体实现。 在我们使用 React 的时候&#xff0c;常常会遇…...

mysql调优参数

my.conf [client] port 端口 socket sokcet位置 [mysqld] basedir mysql位置 port 3306 socket sokcet位置 datadir data目录 pid_file mysqld.pid位置 bind_address 0.0.0.0 lower_case…...

JavaEE简单示例——再插入的同时获取插入的主键列

简单介绍&#xff1a; 在某些时候&#xff0c;我们在插入完成一条语句之后&#xff0c;我们会想要返回之前插入的这条语句的主键列的数据&#xff0c;进行下一步的展示或者修改&#xff0c;我们就可以使用MyBatis的主键回写功能&#xff0c;帮助我们获取插入成功的一条数据的主…...

sql语句练习

一、现有以下两张表&#xff1a;第一张表名为cust&#xff0c;其表结构如下&#xff1a;第二张表名为mark&#xff0c;其表结构如下:1) [5分]请写出计算 所有学生的英语平均成绩的sq|语句。2) [5分]现有五 个学生,其学号假定分别为11,22,33,44,55;请用一条SQL语句实现列出这五个…...

广州蓝景—结合chatGPT下的教育模式变化

最近爆火的人工智能AI聊天工具ChatGPT&#xff0c;不仅在互联网&#xff0c;更是在各行各业中&#xff0c;得到了广泛的传播&#xff0c;应该没有哪一个不知道它的存在&#xff0c;但其实你又是否知道&#xff0c;其实ChatGPT是一类模型的统称&#xff0c;随着人工智能的快速发…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...