当前位置: 首页 > 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;随着人工智能的快速发…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...