从0到1入门C++编程——02 通讯录管理系统

news2024/11/28 5:47:39

文章目录

  • 一、创建结构体及菜单显示
  • 二、添加联系人
  • 三、显示联系人
  • 四、删除联系人
  • 五、查找联系人
  • 六、修改联系人
  • 七、清空联系人
  • 八、退出通讯录


本文通过C++实现一个通讯录管理系统,系统要实现的功能如下。
1、添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人;
2、显示联系人:显示通讯录中所有联系人信息;
3、删除联系人:按照姓名进行删除指定联系人;
4、查找联系人:按照姓名查看指定联系人信息;
5、修改联系人:按照姓名重新修改指定联系人;
6、清空联系人:清空通讯录中所有信息;
7、退出通讯录:退出当前使用的通讯录。


一、创建结构体及菜单显示

在实现这个管理系统时,需要创建结构体存放不同类型的数据。
每个联系人的结构体中存放姓名、性别、年龄、联系电话和家庭住址信息,结构体如下。

struct users  //用户结构体
{
	string name;
	int sex;   //1--男 0--女
	int age;
	string number;
	string address;
};

通讯录结构体就是所有用户的集合,此外还要加上一个计数的整型变量,用于计算目前存放的联系人数量。

struct ContactBook  //通讯录结构体
{
	struct users user[MAX];
	int user_num;
};

菜单显示功能在程序运行后就打印菜单,以供用户输入选择进行某项操作。
菜单显示的函数如下,只在里面完成打印即可。

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

在主函数中调用菜单显示函数,运行程序之后如下所示,这会让执行的操作更加清楚。
在这里插入图片描述


二、添加联系人

在程序运行之后,用户输入1按下回车就要进行添加联系人的操作,添加联系人之前首先要判断通讯录是否已经存满,如果没有存满,就根据通讯录结构体中user_num作为数组下标开始添加联系人,并在添加完成之后将user_num加1,更新存放的联系人数量。
添加联系人的函数实现如下,注意函数参数的传递是通讯录结构体的地址传递,这样在函数中做的修改才能得以体现,后面的函数也是这样。

void add_user(ContactBook *p)
{
	if(p->user_num == MAX)
		cout<<"通讯录已满,无法添加新联系人!"<<endl;
	else
	{
		cout<<"输入联系人姓名:";
		cin>>p->user[p->user_num].name;
		
		int sex = 0;
		while(1)
		{
			cout<<"输入联系人性别(1--男 0--女):";
			cin>>sex;
			if(sex == 0 || sex == 1)
			{
				p->user[p->user_num].sex = sex;
				break;
			}
			cout<<"格式输入有误,重新输入(1--男 0--女)"<<endl;
		}
		
		int age = 0;
		while(1)
		{
			cout<<"输入联系人年龄:";
			cin>>age;
			if(age >= 0 && age <= 150)
			{
				p->user[p->user_num].age = age;
				break;
			}
			cout<<"年龄输入有误,重新输入!"<<endl;
		}

		cout<<"输入联系人电话:";
		cin>>p->user[p->user_num].number;
		cout<<"输入联系人地址:";
		cin>>p->user[p->user_num].address;
		p->user_num ++;
	}
	cout<<"添加联系人成功!"<<endl;
	system("pause");    //按任意键继续
	system("cls");    //清屏
}

程序运行后添加联系人的过程如下图所示。
在这里插入图片描述


三、显示联系人

在程序运行之后,用户输入2按下回车就要进行显示联系人的操作,显示联系人的过程比较简单,首先判断通讯录的user_num成员是否为0,为0表示通讯录为空,打印提示信息,否则就将存放的所有联系人信息打印。
显示联系人的函数实现如下。

void show_user(ContactBook *p)
{
	if(p->user_num == 0)
		cout<<"通讯录为空!"<<endl;
	else
	{
		cout<<"姓名\t"<<"性别\t"<<"年龄\t"<<"电话\t"<<"\t地址\t"<<endl;
		for(int i=0;i<p->user_num;i++)
		{
			cout<<p->user[i].name<<"\t";
			/*if(p->user[i].sex == 1)
				cout<<"男\t";
			else
				cout<<"女\t";*/
			cout<<(p->user[i].sex == 1 ? "男":"女")<<"\t";
			cout<<p->user[i].age<<"\t";
			cout<<p->user[i].number<<"\t";
			cout<<p->user[i].address<<"\t"<<endl;
		}
	}
	system("pause");    //按任意键继续
	system("cls");    //清屏
}

显示所有联系人的信息如下图所示。
在这里插入图片描述
如果没有联系人就提示通讯录为空。
在这里插入图片描述


四、删除联系人

删除、查找、修改都要用到存放联系人的数组下标,因此单独写一个函数用来得到这个索引。
user_index函数根据用户名进行查找,如果找到则返回存放的数组下标,没有找到就返回-1。

int user_index(ContactBook *p,string name)
{
	if(p->user_num == 0)
		cout<<"通讯录为空!"<<endl;
	else
	{
		for(int i=0;i<p->user_num;i++)
		{
			if(p->user[i].name == name)
				return i;
		}
		return -1;
	}
}

在程序运行之后,用户输入3按下回车就要进行删除联系人的操作,删除联系人的函数如下,在里面调用user_index()函数返回下标值,根据下标值判断删除的用户是否存在,删除之后,当前位置之后的数据都要向前移动一位。

void delete_user(ContactBook *p)
{
	string name;
	int index = -1;
	cout <<"请输入要删除的联系人姓名:";
	cin >> name;
	index = user_index(p,name);
	if(index == -1)
		cout<<"要删除的联系人不存在!"<<endl;
	else
	{
		for(int i=index;i<p->user_num-1;i++)
		{
			p->user[i] = p->user[i+1];  //通讯录中存放的数据前移
		}
		p->user_num--;  //通讯录中人数减1
		cout<<"删除联系人成功!"<<endl;
	}
	system("pause");    //按任意键继续
	system("cls");    //清屏
}

已经添加了a和b两个联系人,下面删除掉用户名为b的联系人。
在这里插入图片描述
删除之后再显示联系人,发现联系人b已经被删除了。
在这里插入图片描述


五、查找联系人

在程序运行之后,用户输入4按下回车就要进行查找联系人的操作,根据要查找的联系人姓名查找,如果要查找的信息存在就进行打印,不存在就打印提示信息。

void find_user(ContactBook *p)
{
	string name;
	int index = -1;
	cout <<"请输入要查找的联系人姓名:";
	cin >> name;
	index = user_index(p,name);
	if(index == -1)
		cout<<"要查找的联系人不存在!"<<endl;
	else
	{
		cout<<"姓名:"<<p->user[index].name<<"\t";
		cout<<"性别:"<<(p->user[index].sex == 1 ? "男":"女")<<"\t";
		cout<<"年龄:"<<p->user[index].age<<"\t";
		cout<<"电话:"<<p->user[index].number<<"\t";
		cout<<"地址:"<<p->user[index].address<<"\t"<<endl;
	}
	system("pause");    //按任意键继续
	system("cls");    //清屏
}

联系人存在打印的信息如下。
在这里插入图片描述
联系人不存在的情况打印如下。
在这里插入图片描述


六、修改联系人

在程序运行之后,用户输入5按下回车就要进行修改联系人的操作,修改联系人这里先写了一个函数用来显示需要修改的项,根据用户的输入决定要修改的条目。

void show_item()
{
	cout <<"*****************************"<<endl;
	cout <<"*******  1、修改姓名  *******"<<endl;
	cout <<"*******  2、修改性别  *******"<<endl;
	cout <<"*******  3、修改年龄  *******"<<endl;
	cout <<"*******  4、修改电话  *******"<<endl;
	cout <<"*******  5、修改地址  *******"<<endl;
	cout <<"*******  6、修改完成  *******"<<endl;
	cout <<"*****************************"<<endl;
}

修改联系人的函数如下,同样根据联系人的用户名判断要修改的用户是否存在,如果存在就选择要修改的项目,根据选择的项目修改对应的内容。

void modify_user(ContactBook *p)
{
	string name;
	int index = -1;
	cout <<"请输入要修改的联系人姓名:";
	cin >> name;
	index = user_index(p,name);
	if(index == -1)
		cout<<"要修改的联系人不存在!"<<endl;
	else
	{
		int item = -1;
		while(1)
		{
			show_item();
			cout<<"输入要操作的条目编号:";
			cin>>item;
			switch(item)
			{
				case 1: 
					cout<<"输入修改后联系人姓名:";
					cin>>p->user[index].name;
					break;
				case 2: 
				{
					cout<<"输入修改后联系人性别(1--男 0--女):";
					int sex = -1;
					while(1)
					{
						cin>>sex;
						if(sex == 0 || sex == 1)
						{
							p->user[index].sex = sex;
							break;
						}
						cout<<"格式输入有误,重新输入(1--男 0--女)"<<endl;
					}
					break;
				}
				case 3:
				{
					cout<<"输入修改后联系人年龄:";
					int age = 0;
					while(1)
					{
						cin>>age;
						if(age >= 0 && age <= 150)
						{
							p->user[index].age = age;
							break;
						}
						cout<<"年龄输入有误,重新输入!"<<endl;
					}
					break;
				}
				case 4:
					cout<<"输入修改后联系人电话:"<<endl;
					cin>>p->user[index].number;
					break;
				case 5:
					cout<<"输入修改后联系人地址:"<<endl;
					cin>>p->user[index].address;
					break;
				case 6:
					cout<<"修改联系人信息成功!"<<endl;
					break;
				default:
					cout<<"请正确的输入要操作的条目编号!"<<endl;
			}
			if(item == 6)
				break;
		}
	}
	system("pause");    //按任意键继续
	system("cls");    //清屏
}

修改的过程如下图所示。
在这里插入图片描述
修改后再显示联系人如下,信息就被修改成功了。
在这里插入图片描述


七、清空联系人

在程序运行之后,用户输入6按下回车就要进行清空联系人的操作,清空联系人的操作没必要将所有的数据清空,只需要将通讯录结构体中的计数成员user_num清零即可。

void clear_user(ContactBook *p)
{
	int x;
	cout<<"是否要清空通讯录?(1--是,0--否)";
	cin>>x;
	if(x == 1)
	{
		p->user_num = 0; //作逻辑清空即可,没必要删除所有数据
		cout<<"通讯录已清空!"<<endl;
	}
	system("pause");    //按任意键继续
	system("cls");    //清屏
}

清空的过程中还会询问是否清空,如下图所示。
在这里插入图片描述
再次显示联系人,显示通讯录为空!
在这里插入图片描述


八、退出通讯录

退出通讯录在主函数中实现,主函数及头文件的内容如下。

#include <iostream>
#include <string>
using namespace std;
#define MAX 1000

int main()
{
	ContactBook book;  
	book.user_num = 0;  //初始化通讯录人数为0
	while(1)
	{
		show_menu();
		int select;
		cout <<"输入要操作的项目编号:";
		cin >> select;
		switch(select)
		{
			case 1: 
				add_user(&book);
				break;
			case 2: 
				show_user(&book);
				break;
			case 3: 
				delete_user(&book);
				break;
			case 4: 
				find_user(&book);
				break;
			case 5: 
				modify_user(&book);
				break;
			case 6: 
				clear_user(&book);
				break;
			case 7: 
				system("pause");  //按任意键继续
				return 0;
			default: 
				system("cls");    //清屏
				cout <<"请正确的输入要操作的项目编号!"<<endl;
		}
	}

	system("pause");
	return 0;
}

当输入7的时候就return 0,按下回车后就退出了程序。
在这里插入图片描述


本文参考视频:
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难

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

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

相关文章

老胡的周刊(第122期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 movie-web[2] 开源可自部署的简约在线电影搜…

【MATLAB】鲸鱼算法优化混合核极限学习机(WOA-HKELM)时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 鲸鱼算法优化混合核极限学习机&#xff08;WOA-HKELM&#xff09;是一种时序预测算法&#xff0c;它结合了鲸鱼算法和混合核极限学习机&#xff08;HKELM&#xff09;的优点。以下是该算法…

解锁React魔法门:高效项目开发工作流揭秘

你好&#xff0c;我是坚持分享干货的 EarlGrey&#xff0c;翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。 如果我的分享对你有帮助&#xff0c;请关注我&#xff0c;一起向上进击。 创作不易&#xff0c;希望大家给一点鼓励&#xff0c;把公众号设置为…

2024年PMP考试新考纲-PMBOK第七版-【模型、方法和工件】真题解析(2)

今天我们继续来看第七版PMBOK第四部分【模型、方法和工件】这个章节相关的真题。 实际上在做题的时候&#xff0c;可能有的小伙伴会发现&#xff0c;这部分和第六版PMBOK中散落在各个知识领域的题目很相似。没错&#xff01;在之前版本的PMBOK中&#xff0c;很经典的框架是每个…

2.1 DFMEA步骤一:策划和准备

2.1.1 目的 设计FMEA的“策划和准备”步骤旨在确定将要执行的FMEA类型,以及根据进行中的分析类型(如系统、子系统或组件)明确每个FMEA的范围。设计FMEA(DFMEA)的主要目标包括: 项目识别项目计划:涵盖目的、时间安排、团队、任务和工具(5T)分析边界:界定分析的范围,…

LLM应用的分块策略

每日推荐一篇专注于解决实际问题的外文&#xff0c;精准翻译并深入解读其要点&#xff0c;助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号 原文标题&#xff1a;Chunking Strategies for LLM Applications 原文地址&#xff1a;https://www.pinecone.io/learn/c…

数据结构:队列(链表和数组模拟实现)

目录 1.何为队列 2.链表模拟实现 2.1 节点和队列创建 2.2 初始化队列 2.3 入队操作 2.4 出队操作 2.5 遍历队列 2.6 获取队首和队尾元素 2.7 判断队列是否为空 2.8 完整实现 3. 数组模拟实现 3.1 创建队列 3.2 入队和出队操作 3.3 遍历队列 3.4 获取队首和队尾元…

计算机组成原理复习4

习题 练习题 下列不属于系统总线的为&#xff08;&#xff09; a.数据总线 b.地址总线 c.控制总线 d.片内总线 D 系统总线中地址总线的功能是&#xff08;&#xff09; a.选择主存单元地址 b.选择进行信息传输的设备 c.选择外存地址 d.指定主存和I/O设备接口电路的地址 D 解…

【电商项目实战】商品详情显示与Redis存储购物车信息

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

第9章 继承和派生习题(详解)

一、选择题 1&#xff0e;下列表示引用的方法中&#xff0c; &#xff08;&#xff09; 是正确的。已知&#xff1a;int m10&#xff1a; A&#xff0e;int &xm&#xff1b; B&#xff0e;int &y10&#xff1b; C&#xff0e;int &z&#xff1b; D&#xff0e;fl…

[CISCN 2019华东南]Web11

[CISCN 2019华东南]Web11 wp 信息搜集 页面内容如下&#xff1a; 右上角显示的是我的当前 IP 。 在最下角提示&#xff1a;Build With Smarty ! Smarty 是 PHP 的一个模板引擎&#xff0c;那么这道题应该是 Smarty 模板注入。 Smarty 模板注入 可以参考博客&#xff1a;Sm…

4年微博热搜数据,一次拿走

又是新的一年了&#xff0c;从2020年开始&#xff0c;就养成了定时备份各大平台热搜数据的习惯&#xff0c;微博&#xff0c;知乎都在备份&#xff0c;今天给大家看一下从2020年到2023年的微博热搜数据情况 这是2022年的备份数据&#xff0c;每天的热搜数据一个文件&#xff0c…

[蓝桥杯基础题型] 图论题目

遍历 添加路障 首先答案只能是0 1 2 &#xff0c;原因&#xff1a;把出发点堵住只需要两个路障 路障为0&#xff1a;不能找到一条从出发点到终点的路 路障为1&#xff1a;能找到一条从出发点到终点的路&#xff0c;但是只有一条 路障为2&#xff1a;能找到一条从出发点到终…

Origin 2021软件安装包下载及安装教程

Origin 2021下载链接&#xff1a;https://docs.qq.com/doc/DUnJNb3p4VWJtUUhP 1.选中下载的压缩包&#xff0c;然后鼠标右键选择解压到"Origin 2021"文件夹 2.双击打开“Setup”文件夹 3.选中“Setup.exe”鼠标右键点击“以管理员身份运行” 4.点击“下一步" 5…

SELinux 安全模型——MLS

首发公号&#xff1a;Rand_cs BLP 模型&#xff1a;于1973年被提出&#xff0c;是一种模拟军事安全策略的计算机访问控制模型&#xff0c;它是最早也是最常用的一种多级访问控制模型&#xff0c;主要用于保证系统信息的机密性&#xff0c;是第一个严格形式化的安全模型 暂时无…

SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因 1&#xff09;索引失效 索引分为单索、复合索引。 四种创建索引方式 create index index_name on user (name); create index index_name_2 on user(id,name,email); 2&#xff09;查询语句较烂 3&#xff09;关联查询太多join&a…

Embedding模型在大语言模型中的重要性

引言 随着大型语言模型的发展&#xff0c;以ChatGPT为首&#xff0c;涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快&#xff0c;却少有关注支撑许多大型语言模型应用落地的必不可少的Embedding模型。本文将主要介绍为什么…

【SpringCloud Alibaba笔记】(2)Nacos服务注册与配置中心

Nacos Nacos简介与下载 是什么&#xff1f; 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;就是注册中心&#xff0b;配置中心的组合 Nacos Eureka Config Bus 替代Eureka…

初识HTTP协议

Web服务器可以接收浏览器的请求&#xff0c;并将服务器中的web项目资源响应给浏览器&#xff0c;浏览器与服务器之间进行网络通信遵循HTTP协议。 一、什么是HTTP协议 超文本传输协议&#xff08;HTTP&#xff0c;HyperText Transfer Protocol&#xff09;(浏览器---->web服务…

27 UVM queue

uvm_queue类构建一个动态队列&#xff0c;该队列将按需分配并通过引用传递。 uvm_queue类声明&#xff1a; class uvm_queue #( type T int ) extends uvm_object 1 uvm_queue class hierarchy 2 uvm_queue class Methods 3 UVM Queue Example 在下面的示例中&#xff0c;…