通讯录管理系统实现(C++版本)

1.菜单栏的设置

(1)我么自定义了一个showmenu函数,用来打印输出我们的菜单栏;

(2)菜单栏里面设置一些我们的通讯录里面需要用到的功能,例如增加联系人,删除联系人等等

2.退出功能的实现

在我们的主函数里面,我们可以使用这个switch语句进行相应的判断,当用户的输入的数字是0的时候,我们就会直接返回,不会继续执行,但是我们肯定不能让用户输入0~6的时候还是退出呀,所以我们可以使用while循环语句,这样当我们输入0的时候,就会结束循环,当我们输入1~6的时候,程序就会继续显示菜单栏,让我们继续进行选择,我们后续可以继续进行设置;

3.添加联系人

添加的联系人的信息包括姓名,性别,年龄,联系电话,家庭地址;

(1)设计联系人的结构体

这个结构体的主要作用就是包含对应的联系人的相关的信息,是针对于联系人而创建的结构体;因为这个结构体涉及到了结构体的成员的姓名,电话,以及家庭住址,我们需要使用string关键字进行定义,这个时候要包含对应的头文件;

(2)生成通讯录结构体

这个结构体是把所有的联系人放进去,并且记录联系人的个数(使用的是int变量),我们可以设置通讯录里面的人数的上限,我们可以使用宏的方式进行定义,这样当通讯录的规模进行变动的时候,我们可以直接进行修改;

(3)主函数里面对应的参数的设置

这个里面我们首先要创建一个结构体的变量,初始化里面的size,也就是对应的通讯录里面的人数

(4)添加联系人的函数

因为我们的通讯录设置的最大的人数上限是1000,所以如果人数超过1000,就会显示通讯录已经满了的提示信息;

接下来我们分别输入对应的联系人的信息,并把我们输入的信息传到对应的结构体里面去,因为我们要往数组里面添加元素,所以我们可以使用结构体里面的size作为下标,每次添加联系人以后都要进行看加加操作;

在设置联系人的性别的时候,我们使用了一个循环,这个循环的作用就是进行判断,只有我们的输入是1,2才符合要求,如果输入其他的数字,就会显示提示信息,并且要求操作者知道输入正确才结束我们的循环;

因为形参的改变量不会影响实参,所以我们传递结构体变量的地址,我们使用结构体的指针进行接收就可以了;

如果我们不断的添加联系人的信息,显示屏就会很多信息,我们可以在每次添加完一个联系人的信息之后进行相应的清屏的操作;

4.显示联系人的信息

我们同样需要进行判断通讯录是否为空,否则我们无法显示联系人的信息;

我们当时是让1代表男性,2代表女性,我们这个时候不能让性别显示我们自己定义的1或者2,而是对应的男或者女,我们使用三目运算符就可以达到这样的目的;

我们为了让我们的每个联系人的信息在同一行进行显示,我们在每个信息的结尾使用制表符,只有最后一个才进行换行操作,这样就可以让我们的打印结果更加的美观;

5.删除联系人

首先我们要封装一个函数用来进行判断我们输入的姓名是否在通讯录里面存在,如果存在就返回对应的下标,如果不存在就直接-1;函数的实现如下:

相当于就是在通讯录里面进行遍历的操作,看看我们输入的姓名是否和通讯录里面一致的姓名符合,如果符合,就表明我们输入的联系人在通讯录里面是存在的,我们可以进行删除;

如果有这个联系人,我们应该如何进行删除呢?我们可以让后面的数据覆盖前面的联系人的信息,这样就可以删除我们要求的联系人的信息;为了防止覆盖,我们需要从前往后,挨个进行移动,最后把size进行减去1的操作;

6.查找联系人

查找联系人的主要思路就是先要进行判断这个联系人是否存在,如果存在就会打印输出对应的信息

如果并存在就会提示没有这个人

7.修改联系人

我们首先要判断修改的联系人是否存在,如果存在就重新进行输入并且进行赋值;

我们需要对每一项信息进修重新录入和赋值;

8.清除联系人

我们只是逻辑上面把size的数值变为0,就可以实现清除的目的;

9.通讯录完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#define MAX 1000
using namespace std;
struct person
{string name;int sex;int age;string phone;string address;
};
struct addressbooks
{struct person personarray[MAX];int size;
};void add(addressbooks *abs)
{//判断是否满了if (abs->size == MAX){cout << "通讯录已满" << endl;return;}else{string name;cout << "请输入姓名 " << endl;cin >> name;abs->personarray[abs->size].name = name;cout << "请输入性别 " << endl;cout << "1---男" << endl;cout << "2---女" << endl;int sex;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personarray[abs->size].sex = sex;break;}cout << "输入有误,请重新输入  " << endl;}cout << "请输入年龄 " << endl;int age = 0;cin >> age;cout << "请输入电话 " << endl;string phone;cin >> phone;abs->personarray[abs->size].phone = phone;cout << "请输入地址 " << endl;string address;cin >> address;abs->personarray[abs->size].address = address;abs->size++;cout << "添加成功  " << endl;system("cls");}
}void show(addressbooks* abs)
{if (abs->size == 0){cout << "当前的联系人个数为空" << endl;}else{int i = 0;for (i = 0; i < abs->size; i++){cout << "姓名:" << abs->personarray[i].name << '\t';cout << "性别:" << (abs->personarray[i].sex == 1 ? "男" : "女") << '\t';cout << "年龄" << abs->personarray[i].age << '\t';cout << "电话:" << abs->personarray[i].phone << '\t';cout << "地址:" << abs->personarray[i].address << endl;}}
}int isexist(addressbooks* abs, string name)
{int i = 0;for (i = 0; i < abs->size; i++){if (abs->personarray[i].name == name){return i;}}return -1;
}void deleteperson(addressbooks* abs)
{cout << "请输入你想要删除的联系人  " << endl;string name;cin >> name;int ret = isexist(abs, name);if (ret != -1){int i = ret;for (i = ret; i < abs->size; i++){abs->personarray[i] = abs->personarray[i + 1];}abs->size--;}cout << "删除成功" << endl;system("cls");
}void find(addressbooks* abs)
{cout << "请输入需要查找的联系人" << endl;string name;cin >> name;int ret = isexist(abs, name);if (ret != -1){cout << "姓名:" << abs->personarray[ret].name << '\t';cout << "性别:" << (abs->personarray[ret].sex == 1 ? "男" : "女") << '\t';cout << "年龄" << abs->personarray[ret].age << '\t';cout << "电话:" << abs->personarray[ret].phone << '\t';cout << "地址:" << abs->personarray[ret].address << endl;}else{cout << "没有这个联系人  " << endl;}system("pause");system("cls");}void modify(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].name = name;int sex;cout << "请输入性别  " << endl;cout << "1----男" << endl;cout << "2---女" << endl;cin >> sex;abs->personarray[ret].sex = sex;int age;cout << "请输入年龄  " << endl;cin >> age;abs->personarray[ret].age = age;int phone;cout << "请输入号码  " << endl;cin >> phone;abs->personarray[ret].phone = phone;string address;cout << "请输入家庭地址:   " << endl;cin >> address;abs->personarray[ret].address = address;cout << "修改成功" << endl;}else{cout << "没找到这个联系人  " << endl;}system("pause");system("cls");
}void clear(addressbooks* abs)
{abs->size = 0;cout << "已经清除  " << endl;system("pause");system("cls");
}
void showmenu()
{cout << "***********************" << endl;cout << "***** 1.添加联系人 *****" << endl;cout << "***** 2.显示联系人 *****" << endl;cout << "***** 3.删除联系人 *****" << endl;cout << "***** 4.查找联系人 *****" << endl;cout << "***** 5.修改联系人 *****" << endl;cout << "***** 6.清空联系人 *****" << endl;cout << "***********************" << endl;
}
int main()
{//创建通讯录的结构体变量addressbooks abs;//初始化通讯录的人数abs.size = 0;while (true){showmenu();int input = 0;cin >> input;switch (input){case 1:add(&abs);break;case 2:show(&abs);break;case 3:deleteperson(&abs);break;case 4:find(&abs);break;case 5:modify(&abs);break;case 6:clear(&abs);break;case 0:cout << "欢迎下次使用" << endl;return 0;break;default:break;}}return 0;
}

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

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

相关文章

javaWeb私人牙科诊所管理系统

一、摘要 随着科技的飞速发展&#xff0c;计算机已经广泛的应用于各个领域之中。在医学领域中&#xff0c;计算机主要应用于两个方面&#xff1a;一是医疗设备智能化&#xff0c;以硬件为主。另一种是病例信息管理系统&#xff08;HIS&#xff09;以软件建设为主&#xff0c;以…

1978-2022年全国31省社会消费品零售总额数据

1978-2022年全国31省社会消费品零售总额数据 1、时间&#xff1a;1978-2022年 2、指标&#xff1a;社会消费品零售总额 3、范围&#xff1a;31省市 4、来源&#xff1a;整理自国家统计J和各省年鉴 5、缺失情况说明&#xff1a;1997-2022年31省市均无缺失&#xff0c; 199…

随机链表的深拷贝

目录 一、何为深拷贝&#xff1f; 二、题目 三、思路 1.拷贝节点插入到原节点后面 2.控制拷贝节点的random 3.脱离原链表 : 尾插的思想 四、代码 五、附加 一、何为深拷贝&#xff1f; 一个引用对象一般来说由两个部分组成&#xff1a;一个具名的Handle&#xff0c;也就…

面试官问我 ,try catch 应该在 for 循环里面还是外面?

首先 &#xff0c; 话说在前头&#xff0c; 没有什么 在里面 好 和在外面好 或者 不好的 一说。 本篇文章内容&#xff1a; 使用场景 性能分析 个人看法 1. 使用场景 为什么要把 使用场景 摆在第一个 &#xff1f; 因为本身try catch 放在 for循环 外面 和里面 &#…

2024年NOC大赛软件创意编程(python初中组初赛)真题

题型和分值&#xff1a;单选题(20题,40分)、判断题(5题,10分)、多选题(5题,20分)、填空题(10题,30分) 一、单选题&#xff08;每题2分&#xff0c;共20题&#xff0c;满分40分&#xff09; 1、下面的程序&#xff0c;会无限循环下去的是&#xff08; &#xff09; A&#x…

【数据结构】双向奔赴的爱恋 --- 双向链表

关注小庄 顿顿解馋๑ᵒᯅᵒ๑ 引言&#xff1a;上回我们讲解了单链表(单向不循环不带头链表)&#xff0c;我们可以发现他是存在一定缺陷的&#xff0c;比如尾删的时候需要遍历一遍链表&#xff0c;这会大大降低我们的性能&#xff0c;再比如对于链表中的一个结点我们是无法直接…

DNS协议 是什么?说说DNS 完整的查询过程?

一、是什么 DNS&#xff08;Domain Names System&#xff09;&#xff0c;域名系统&#xff0c;是互联网一项服务&#xff0c;是进行域名和与之相对应的 IP 地址进行转换的服务器 简单来讲&#xff0c;DNS相当于一个翻译官&#xff0c;负责将域名翻译成ip地址 IP 地址&#…

js实现拖放效果

dataTransfer对象 说明&#xff1a;dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性&#xff0c;所以在拖放事件的事件处理程序外部无法访问 dataTransfer。在事件处理程序内部&#xff0c;可以使用这个对象的属性和方法实现拖放功能…

【鸿蒙HarmonyOS开发笔记】使用@Preview装饰器预览组件

概述 ArkTS应用/服务支持组件预览&#xff0c;要求compileSdkVersion为8或以上。组件预览支持实时预览&#xff0c;不支持动态图和动态预览。组件预览通过在组件前添加注解Preview实现&#xff0c;在单个源文件中&#xff0c;最多可以使用10个Preview装饰自定义组件。 Preview…

算法---矩阵的乘法及其运用

相信我们都做过一个题叫斐波那契数列&#xff0c;对于一般的题&#xff0c;n的取值范围通常在1000以内&#xff0c;但是如果你遇到的是下面这题呢&#xff1f; 斐波那契数列 - 洛谷 发现了吗&#xff1f;我的n取值范围连long long都会爆出&#xff0c;所以下面我们通过矩阵乘法…

张驰咨询:光伏产业新质生产力提升咨询方案

光伏产业新质生产力提升咨询方案 一、光伏行业目前发展现状及特点 1、高度竞争 2、技术驱动 3、绿色发展 二、光伏发展新质生产力面临的痛点 1、成本压缩与效率提升并存挑战 2、新技术应用与推广难度 3、国际贸易摩擦影响 4、市场需求波动大 5、政策与补贴依赖性 三、…

第2章 辐射度、光度和色度学基本理论

一、前言 辐射度学&#xff08;radiology&#xff09;是一门以整个电磁波段&#xff08;electromagnetic band&#xff09;的电磁辐射能&#xff08;electromagnetic radiation energy&#xff09;测量为研究对象的科学。计算机图形学中涉及的辐射度学&#xff0c;则集中于整个…

融云:社交泛娱乐出海,地区和赛道如何选?

“出海是这个时代给我们的机遇。”这是当前很多互联网出海人的心声。 走过跌宕起伏的 16 年出海历程&#xff0c;中国出海人现在面对与此前截然不同的市场环境&#xff0c;很多地区蓝海不再&#xff0c;也有不少赛道变得拥挤。 一体两面&#xff0c;如今的社交泛娱乐出海也已…

【TB作品】430单片机,单片机串口多功能通信,Proteus仿真

文章目录 题目功能仿真图程序介绍代码、仿真、原理图、PCB 题目 60、单片机串口多功能通信 基本要求: 设计一串口通信程序,波特率38400,通过RS232与PC机通信。 自动循环发送数据串(设计在程序中) 接收并存储和显示该数据串 在发送端定义10个ASCII码键0-9 按键发送单字节,PC机接…

Redis的安装与启动

一、Linux环境安装&启动Redis 1. 安装步骤 第一步&#xff1a;在官网下载好Redis安装包&#xff0c;上传到Linux中并进行解压到相应&#xff08;如/opt/software/&#xff09;目录中&#xff1b;&#xff08;注意&#xff1a;完成了第二步后&#xff0c;即安装了C/C语言…

「媒体宣传」财经类媒体邀约资源有哪些?-51媒体

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 财经类媒体邀约资源包括但不限于以下几类&#xff1a; 商业杂志和报纸&#xff1a;可以邀请如《财经》、《新财富》、《经济观察报》等主流商业杂志和报纸。这些媒体通常具有较强的品牌影…

54、Qt/对话框、事件机制相关学习20240325

一、完善对话框&#xff0c;点击登录按钮&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#…

Machine Learning机器学习之随机森林(Random Forests)

目录 前言&#xff1a; 思想与原理&#xff1a; 随机森林分类效果与什么因素有关&#xff1a; 经典的随机森林算法&#xff1a; 一、构建经典随机森林算法 1、思路 2、步骤&#xff1a; 3、代码实现 二、随机森林算法应用 建模步骤 Python代码实现&#xff08;完整代码&#xf…

36.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-数据解码器的实现

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;35.登录成功数据…

Embedding模型提升效果的方法之一:Whitening和pooling

0. 前言 Embedding模型的主流框架基本上分为三类——基于bert结构的&#xff0c;基于GPT结构的和基于T5结构的&#xff0c;当然这些结构都是Transformer的变形。对于Embedding模型&#xff0c;使用bert结构目前看是最好的。有篇论文论文对基于bert的Embedding模型和基于GPT的E…