通讯录管理系统实现(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python系列】Python 中 YAML 文件与字典合并的实用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MySQL数据库------------探索高级SQL查询语句

目录 一、常用查询 1.1按关键字排序 1.2简单的select条件查询(where) 二、排序 2.1升序排列 2.2降序排序 三、order by 查询结果排序 ①order by还可以结合where进行条件过滤&#xff0c;筛选地址是哪里的学生按分数降序排列 ②查询学生信息先按hobbyid降序排列&#…

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

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

(一)whatsapp 语音通话基本流程

经过了一整年的开发测试&#xff0c;终于将whatsapp 语音通话完成&#xff0c;期间主要参考webrtc的源码来实现.下面简要说一下大致的步骤 XMPP 协商 发起或者接受语音通话第一步是发起XMPP 协商&#xff0c;这个协商过程非常重要。下面是协商一个包 <call toxxxs.whatsap…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 4 套

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&…

背包DP模板

01背包 01背包-1 #include <bits/stdc.h> using namespace std;const int N 1e5 10; int n, m, f[N][N], v[N], w[N];int main() {cin >> n >> m;for (int i 1; i < n; i) {cin >> v[i] >> w[i];}for (int i 1; i < n; i) {for (int…

构建多语言数字资产交易平台和秒合约系统:从概念到实现

多语言交易所开发定制秒合约平台币数字所网站制作一条龙搭建 第一步&#xff1a;需求分析 在开始搭建多语言交易所和秒合约平台之前&#xff0c;需要进行详细的需求分析&#xff0c;包括以下几个方面&#xff1a; 功能需求&#xff1a;确定交易所需要提供的功能&#xff0c;包…

要创建企业百度百科,需要注意以下技巧和原则。

&#xfffd;&#xfffd;&#xfffd;词条内容技巧 词条排版必须美观&#xff0c;内容分段&#xff0c;然后制作副标题。例如&#xff0c;一个企业的名称分为小标题&#xff0c;如企业介绍、企业文化、企业发展、企业历史和企业新闻。这不仅可以给读者一个良好的阅读&#xf…

Learn OpenGL 30 SSAO

SSAO 我们已经在前面的基础教程中简单介绍到了这部分内容&#xff1a;环境光照(Ambient Lighting)。环境光照是我们加入场景总体光照中的一个固定光照常量&#xff0c;它被用来模拟光的散射(Scattering)。在现实中&#xff0c;光线会以任意方向散射&#xff0c;它的强度是会一…

python 第一次作业

因为笔者有一些 c/c 语言的基础&#xff0c;所以应该学 python 会稍微简单一些 格式化输出的时候&#xff0c;保留2位小数的格式是 # 假设输出 a &#xff0c;并且 a 保留 2 位小数 print(%.2f%a)输入 输入的时候所有的输入都是字符串类型&#xff0c;我们需要进行类型转换 …

RHCE- 4-Web服务器(2)

基于https协议的静态网站 概念解释 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。 HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果攻击者截取了Web浏览器和网站服务器之间的传输报文&#xff0c;就可以直接读懂其中…

应用层协议 - HTTP

文章目录 目录 文章目录 前言 1 . 应用层概要 2. WWW 2.1 互联网的蓬勃发展 2.2 WWW基本概念 2.3 URI 3 . HTTP 3.1 工作过程 3.2 HTTP协议格式 3.3 HTTP请求 3.3.1 URL基本格式 3.3.2 认识方法 get方法 post方法 其他方法 3.3.2 认识请求报头 3.3.3 认识请…

day8 ARM

main.c #include"key_inc.h"//封装延时函数void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}}}int main(){//按键中断的初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf("in main pro\n");delay(1000);}re…

基于鹦鹉优化器(PO)的无人机路径规划

该优化算法是2024年新发表的一篇SCI二区论文&#xff0c;具有良好的实际应用和改进意义。一键运行main函数代码自动保存高质量图片 1、鹦鹉优化器 摘要&#xff1a;随机优化方法作为一种有效的技术在当代研究中得到了显著的突出&#xff0c;有效地解决了复杂的优化挑战。本文…

java的一些内部小知识,类与对象的关系

目录 1. java2. 类与对象的关系 1. java test.java ---- javac --> Test.class ---- java-----> 内存 ----> cpu 源文件 二进制代码 所有正在运行的软件都在内存中有自己的内存空间 jvm —>运行java程序的&#xff0c;java虚拟机 main(); // 内部调用run()run(i…

Fiddler抓包工具之Fiddler界面主菜单功能介绍

Fiddler界面主菜单功能介绍 File菜单 File菜单中的命令主要支持完成通过Fiddler来启动和停止web流量的捕获&#xff08;capture&#xff09;,也可以加载或存储捕获的流量 &#xff08;1&#xff09;Capture Traffic&#xff1a;默认勾选&#xff0c;勾选此项才可抓包&#xff…

什么洗地机值得推荐?高口碑品牌深度测评严选

在所有清洁电器中&#xff0c;洗地机的清洁力是大家公认的&#xff0c;像性能好的机子&#xff0c;家里的日常清洁基本都是一遍过&#xff0c;像有娃的&#xff0c;有狗子的家庭&#xff0c;再炸裂的场景&#xff0c;三两下就能还原如初&#xff01;如果你现在正在为了如何挑选…

《自动机理论、语言和计算导论》阅读笔记:p5-p27

《自动机理论、语言和计算导论》学习第2天&#xff0c;p5-p27总结&#xff0c;总计23页。 一、技术总结 1.集合 (1)commutative law of union. (2)distribute law of union. 2.归纳法(induction) & 演绎法(deduction) (1)归纳法&#xff1a;从许多个别的事实或原理中…

C++基础之继承续(十六)

一.基类与派生类之间的转换 可以把派生类赋值给基类可以把基类引用绑定派生类对象可以把基类指针指向派生类对象 #include <iostream>using std::cin; using std::cout; using std::endl;//基类与派生类相互转化 class Base { private:int _x; public:Base(int x0):_x(…

(执行上下文作用域链)前端八股文修炼Day4

一 作用域作用域链 作用域&#xff08;Scope&#xff09;是指程序中定义变量的区域&#xff0c;作用域规定了在这个区域内变量的可访问性。在 JavaScript 中&#xff0c;作用域可以分为全局作用域和局部作用域。 全局作用域&#xff1a;在代码中任何地方都可以访问的作用域&am…