通讯录管理系统实现(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,一经查实,立即删除!

相关文章

ocrclass.h:117:18: error: field ‘end_time‘ has incomplete type ‘timeval‘

Alpine Linux v3.5上安装 tesseract-4.1.1 报错&#xff1a; 缺少timeval函数 ocrclass.h:117:18: error: field end_time has incomplete type timeval Current Behavior: In file included from control.cpp:37:0: ../../src/ccutil/ocrclass.h:117:18: error: field end…

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…

GB 16807-2009 防火膨胀密封件检测

防火膨胀密封件是指火灾时遇火或高温作用能够膨胀&#xff0c;且能辅助建筑构配件使之具有隔火、隔烟、隔热等防火密封性能的产品。 GB 16807-2009防火膨胀密封件检测项目&#xff1a; 测试项目 测试方法 外观 GB 16807 尺寸允许偏差 GB 16807 膨胀性能 GB 16807 产烟…

随机链表的深拷贝

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

spring boot3 解决跨域几种方式

在Spring Boot 3中&#xff0c;解决跨域请求&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;的问题主要有以下几种方式&#xff1a; 1. 使用CrossOrigin注解 你可以直接在Controller类或者具体的请求处理方法上使用CrossOrigin注解来允许跨域请求。 …

Java面试题:请解释Java中的输入输出(I/O)流?详细说明应用场景

Java中的输入输出&#xff08;I/O&#xff09;流是用于读取和写入数据的机制。在Java中&#xff0c;I/O流被设计为按照流的方向和数据源/目标类型进行分类。流的方向分为输入流和输出流&#xff0c;而数据源/目标类型则分为字节流和字符流。 流的方向&#xff1a; 输入流&…

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

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

图片标注编辑平台搭建系列教程(2)——fabric.js简介

文章目录 综述数据管理图形渲染图形编辑事件监听预告 综述 fabric提供了二维图形编辑需要的所有基础能力&#xff0c;包括&#xff1a;数据管理、图形渲染、图形编辑和事件监听。其中&#xff0c;图形编辑可以通过事件监听和图形渲染来实现&#xff0c;所以可以弃用。数据管理…

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;再比如对于链表中的一个结点我们是无法直接…

OJ :1092 :素数表(函数专题)

题目描述 输入两个正整数m和n&#xff0c;输出m和n之间的所有素数。 要求程序定义一个prime()函数和一个main()函数&#xff0c;prime()函数判断一个整数n是否是素数&#xff0c;其余功能在main()函数中实现。 int prime(int n) { //判断n是否为素数&#xff0c; 若n为素数…

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

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

linux - rm命令删除文件到垃圾箱

修改原来的rm指令到垃圾箱&#xff0c;对于误操作的删除可以直接从垃圾箱里拉回来&#xff0c;同时提高网络安全意识。 创建remove.sh 脚本 PARA_CNT$# TRASH_DIR"/home/pass/.trash" # 指定垃圾箱目录 for i in $*; doSTAMPdate %Y%m%d # 删除时间fileName…

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;则集中于整个…

ARM.day8

1.自己设置温度湿度阈值&#xff0c;当温度过高时&#xff0c;打开风扇&#xff0c;蜂鸣器报警 2.当湿度比较高时&#xff0c;打开LED1灯&#xff0c;蜂鸣器报警 main.c #include "si7006.h" #include "CH1.h" #include "led.h" // 延时函数in…