从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";elsecout<<"女\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--;  //通讯录中人数减1cout<<"删除联系人成功!"<<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 1000int main()
{ContactBook book;  book.user_num = 0;  //初始化通讯录人数为0while(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.hqwc.cn/news/314042.html

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

相关文章

Zookeeper-Zookeeper选举源码

看源码方法&#xff1a; 1、先使用&#xff1a;先看官方文档快速掌握框架的基本使用 2、抓主线&#xff1a;找一个demo入手&#xff0c;顺藤摸瓜快速静态看一遍框架的主线源码&#xff0c;画出源码主流程图&#xff0c;切勿一开始就陷入源码的细枝末节&#xff0c;否则会把自…

【分布式微服务专题】SpringSecurity快速入门

目录 前言阅读对象阅读导航前置知识笔记正文一、Spring Security介绍1.1 什么是Spring Security1.2 它是干什么的1.3 Spring Security和Shiro比较 二、快速开始2.1 用户认证2.1.1 设置用户名2.1.1.1 基于application.yml配置文件2.1.1.2 基于Java Config配置方式 2.1.2 设置加密…

71内网安全-域横向网络传输应用层隧道技术

必备知识点&#xff1b; 代理和隧道技术的区别&#xff1f; 代理主要解决的是网络访问问题&#xff0c;隧道是对过滤的绕过&#xff0c; 隧道技术是为了解决什么 解决被防火墙一些设备&#xff0c;ids&#xff08;入侵检测系统&#xff09;进行拦截的东西进行突破&#xff0…

图像特征提取之Hog特征提取

HOG全称&#xff08;histogram of oriented gradients&#xff09;,方向梯度直方图&#xff0c;可以用来提取表示图像的特征&#xff0c;本质就是一行高维特征。 HOG特征提取步骤 图像预处理&#xff08;gamma校正和灰度化&#xff09;【option】 计算每一个像素点的梯度值&am…

00-开篇导读:学习分库分表开源框架的正确方法

1 前言 互联网高速发展带来海量的信息化数据&#xff0c;也带来更多的技术挑战。各种智能终端设备&#xff08;比如摄像头或车载设备等&#xff09;以每天千万级的数据量上报业务数据&#xff0c;电商、社交等互联网行业更不必说。这样量级的数据处理&#xff0c;已经远不是传…

Note: An Interesting Festival

An Interesting Festival 一个有趣的节日。 festival The Agricultural Feast takes place after the independence Day. 农业盛会在独立日后举行 takes place independence feast agricultural It is not a worldwide celebration. 它不是一个全球的庆典。 worldwide ce…

【模拟电路】门电路-逻辑门

一、逻辑门 二、与门 三、或门 四、非门 五、异或门 六、与非门 七、或非门 一、逻辑门 逻辑门是数字电子电路中的基本构建块&#xff0c;用于执行不同的逻辑运算。每种逻辑门都有特定的输入和输出关系&#xff0c;实现了基本的逻辑功能。以下是一些常见的逻辑门&#xff1a; …

基于深度卷积神经网络的垃圾分类识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细介绍了一基于深度卷积神经网络的垃圾分类识别系统。采用TensorFlow和Keras框架&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;进行模型训练和预测。引入迁移学习中的VGG16模型…

用html,js和layui写一个简单的点击打怪小游戏

介绍&#xff1a; 一个简单的打怪小游戏&#xff0c;点击开始游戏后&#xff0c;出现攻击按钮&#xff0c;击败怪物后可以选择继续下一关和结束游戏。 继续下一个怪兽的血量会增加5点&#xff0c;攻击按钮会随机变色。 效果图&#xff1a; html代码&#xff1a; <!DOCTYPE…

小兔鲜儿 uniapp - SKU 模块

目录 存货单位&#xff08;SKU&#xff09;​ 插件市场​ 下载 SKU 插件​ 使用 SKU 插件​ 插件类型问题​ 核心业务​ 渲染商品规格​ 打开弹窗交互​ 渲染被选中的值​ 存货单位&#xff08;SKU&#xff09;​ SKU 概念 存货单位&#xff08;Stock Keeping Unit&a…

使用docker轻量化部署snmp agent(SNMPv2访问)

文章目录 服务器环境说明单机部署&#xff08;非挂载conf文件版&#xff09;debian:buster-slim容器简介实现步骤创建Dockerfile创建SNMP配置文件 (snmpd.conf)构建Docker镜像运行Docker容器 注意补充复制容器文件到本地容器、镜像操作 单机部署&#xff08;挂载conf文件版&…

会员案例库 | 零赛云:一站式工业数字化转型解决方案提供商

1.案例应用领域及行业 能源行业、机械设备等离散制造业 2.案例描述 新奥动力是新奥集团旗下专注于微、小型燃气轮机研发及产业化的高科技创新型企业&#xff0c;是专业的分布式能源系统核心能源装备供应商和解决方案提供商。通过多年累积&#xff0c;已建立从市场到研发&…