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

文章目录

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


本文通过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入门编程,学习编程不再难

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

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

相关文章

【2023年终总结:轻舟已过万重山】

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff09;&#xff0c;发送【资料】可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景、中间件系列…

【CF比赛记录】—— Good Bye 2023(A、B、C)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;CF比赛记录 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; cf闯关练习 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

【Java进阶篇】 ClassNotFoundException和NoClassDefFoundError的区别是什么?

ClassNotFoundException和NoClassDefFoundError的区别 ✔️典型解析✔️扩展知识仓✔️NoSuchMethodError ✔️典型解析 ClassNotFoundException是一个受检异常 (checked exception) 。他通常在运行时&#xff0c;在类加载段尝试加载类的过程中&#xff0c;找不到类的定义时触发…

IBM介绍?

IBM&#xff0c;全名国际商业机器公司&#xff08;International Business Machines Corporation&#xff09;&#xff0c;是一家全球知名的美国科技公司。它成立于1911年&#xff0c;总部位于美国纽约州阿蒙克市&#xff08;Armonk&#xff09;&#xff0c;是世界上最大的信息…

Python pygame贪吃蛇小游戏 (200行完整代码+注释+可运行)

一、运行效果图 二、完整代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # author&#xff1a;Wangdali time:2021年1月20日16:08:44 #python实现&#xff1a;贪吃蛇游戏玩法&#xff1a;回车开始游戏&#xff1b;空格暂停游戏/继续游戏&#xff1b;方向键/wsad控制小蛇…

SQL之CASE WHEN用法详解

目录 一、简单CASE WHEN函数&#xff1a;二、CASE WHEN条件表达式函数三、常用场景 场景1&#xff1a;不同状态展示为不同的值场景2&#xff1a;统计不同状态下的值场景3&#xff1a;配合聚合函数做统计场景4&#xff1a;CASE WHEN中使用子查询场景5&#xff1a;经典行转列&am…

【Linux】理解文件系统

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 了解磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑结构1.3 磁盘的存储结构 2. 文件系统2.…

ROS TF坐标变换 - 动态坐标变换

目录 一、动态坐标变换&#xff08;C实现&#xff09;二、动态坐标变换&#xff08;Python实现&#xff09; 一、动态坐标变换&#xff08;C实现&#xff09; 所谓动态坐标变换&#xff0c;是指两个坐标系之间的相对位置是变化的。比如机械臂末端执行器与 base_link 之间&…

考pmp有用么?

PMP考出来究竟有什么用&#xff0c;这个问题一直是站在边缘的朋友经常思考的问题&#xff0c;其实我想说的是&#xff0c;当能力和经验都充足的时候&#xff0c;可能这单单的一张证书就能有莫大的作用&#xff0c;帮助你实现目前所追求的东西。 当我利用这张证书达到我的目的之…

Vue3 的 emit 该怎么写, vue2 对比

Vue3 的 emit 该怎么写&#xff0c; vue2 对比 这是个新手问题&#xff0c;从 vue2 转到 vue3 之后&#xff0c;一时间不知道该怎么用它了。 vue2 用法 vue2 在 template 中 和 在方法中的用法如下&#xff1a; <template><button click"$emit(clicked, 要传…

数据结构期末复习(3)栈和队列

堆栈&#xff08;stack&#xff09; 堆栈&#xff08;stack&#xff09;是一种基于后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;原则的数据结构。它模拟了现实生活中的堆栈&#xff0c;类似于一摞盘子或一堆书。 堆栈有两个基本操作&#xff1a;入栈&a…

移除链表元素

description 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; …

开放原子训练营(第四季)TobudOS——TobudOS内核移植(keil版)

前言 12月份参加了开放原第四季线下活动&#xff0c;觉得很有意义。通过这篇博文&#xff0c;记录一下这次活动进行的移植TobudOS内核的过程&#xff0c;下面就让我们开始吧。 开发板介绍 本次使用的开发板型号为STM32H750&#xff0c;当然了&#xff0c;其他型号的开发版也…

OSG读取和添加节点学习

之前加载了一个模型&#xff0c;代码是&#xff0c; osg::Group* root new osg::Group(); osg::Node* node new osg::Node(); node osgDB::readNodeFile("tree.osg"); root->addChild(node); root是指向osg::Group的指针&#xff1b; node是 osg:…

240101-5步MacOS自带软件无损快速导出iPhone照片

硬件准备&#xff1a; iphone手机Mac电脑数据线 操作步骤&#xff1a; Step 1: 找到并打开MacOS自带的图像捕捉 Step 2: 通过数据线将iphone与电脑连接Step 3&#xff1a;iphone与电脑提示“是否授权“&#xff1f; >>> “是“Step 4&#xff1a;左上角选择自己的设…

软件工程期末总复习

第一章 软件工程概述 什么是软件&#xff1a;程序数据配套文档 软件危机&#xff1a;计算机软件开发过程中所遇到的一系列严重问题 软件危机的背景&#xff1a;20世纪60年代中后期软件开发需求急剧增长 软件工程的定义&#xff1a;指导计算机软件开发和维护的工程学科&…

安装Typora

链接&#xff1a;https://pan.baidu.com/s/1OLHtUTziKdB0sW0UIOnBBw?pwd6666 提取码&#xff1a;6666

spring创建与使用

spring创建与使用 创建 Spring 项⽬创建⼀个 Maven 项⽬添加 Spring 框架⽀持添加启动类 存储 Bean 对象创建 Bean将 Bean 注册到容器 获取并使⽤ Bean 对象创建 Spring 上下⽂获取指定的 Bean 对象获取bean对象的方法 使⽤ Bean 总结 创建 Spring 项⽬ 接下来使⽤ Maven ⽅式…

css 实现圆角渐变色效果

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>css 实现圆角渐变色效果</title…

字母简化(UPC练习)

题目描述 给出一串全部为小写英文字母的字符串&#xff0c;要求把这串字母简化。简化规则是&#xff1a;统计连续出现的字母数&#xff0c;输出时先输出个数&#xff0c;再输出字母。比如&#xff1a;aaabbbaa&#xff0c;则简化为3a3b2a&#xff1b;而zzzzeeeeea&#xff0c;…