C++通讯录管理系统

目录

系统需求

1、  创建项目

2、  菜单功能设计

3、  退出功能设计

4、  添加联系人功能设计

4.1  设计联系人结构体

4.2  设计通讯录结构体

4.3  在main函数中创建通讯录

4.4  封装添加联系人函数

4.5  添加联系人功能测试

5、  显示联系人功能设计

5.1  封装显示联系人函数

5.2  测试显示联系人功能

6、  删除联系人功能设计

6.1  封装检测联系人

6.2  联系人删除功能测试

7、 查找联系人功能设计

7.1  封装查找联系人函数

7.2  查找联系人功能测试

8、  修改联系人功能设计

8.1  封装修改联系人函数

8.2  修改联系人功能测试

9、  清空联系人

9.1  封装清空联系人函数

9.2  清空联系人功能测试

小结


系统需求

系统中需要实现的功能如下:

添加联系人:向通讯录中添加新人,信息包括(姓名、性别,年龄、联系电话、家庭住址)最多记录1000人

显示联系人:显示通讯录中所有联系人信息

删除联系人:按照姓名进行删除指定联系人

查找联系人:按照姓名查看指定联系人信息

修改联系人:按照姓名重新修改指定联系人

清空联系人:清空通讯录中所有信息

退出通讯录:退出当前使用的通讯录

1、  创建项目

创建一个“通信录管理系统.cpp”的项目文件,如下:

2、  菜单功能设计

封装函数显示菜单界面,如:void showMenu();

在main函数中调用封装好的函数

showMenu.h文件

#include<iostream>
using namespace std;void showMenu();

showMenu.cpp文件

#include"showMenu.h"//菜单界面
void showMenu()
{cout << "-----------------------" << endl;cout << "***  1、添加联系人  ***" << endl;cout << "***  2、显示联系人  ***" << endl;cout << "***  3、删除联系人  ***" << endl;cout << "***  4、查找联系人  ***" << endl;cout << "***  5、修改联系人  ***" << endl;cout << "***  6、清空联系人  ***" << endl;cout << "***  0、退出通讯录  ***" << endl;cout << "-----------------------" << endl;
}

运行结果:

3、  退出功能设计

功能描述:退出通讯录系统

通过switch语句进行菜单模式的选择,本步骤只完成退出功能的设计。

通过while()循环语句,进行菜单操作,只有当输入0时,执行退出操作。

main函数部分代码:

//创建用户输入的变量int select = 0;while (true){//菜单showMenu();cin >> select;switch (select){//添加联系人case 1:break;//显示联系人case 2:break;//删除联系人case 3:break;//查找联系人case 4:break;//修改联系人 case 5:break;//清空联系人case 6:break;//退出当前使用的通讯录case 0:cout << "欢迎下次使用" << endl;system("pause");return 0;break;}}	

此时运行结果:

4、  添加联系人功能设计

功能描述:向通讯录中添加新人,信息包括(姓名、性别,年龄、联系电话、家庭住址)最多记录1000人

4.1  设计联系人结构体

//设计联系人结构体
struct Person
{//姓名string m_Name;//性别 1男 2女int m_Sex;//年龄int m_Age;//电话string m_Phone;//住址string m_Addr;
};

4.2  设计通讯录结构体

//设计通讯录结构体
struct Addressbooks
{//通讯录中保存的联系人struct Person personArray[MAX];//通讯录当前记录联系人个数int m_Size;
};

4.3  在main函数中创建通讯录

			//添加联系人case 1:addPerson(&abs);
//创建通讯录的结构体变量Addressbooks abs;
//初始化通讯录当前人员个数abs.m_Size = 0;
//创建用户输入的变量int select = 0;

4.4  封装添加联系人函数

addPerson.cpp:

#include"addPerson.h"void addPerson(Addressbooks* abs)
{if (abs->m_Size == MAX){cout << "通讯录已满,无法添加!" << endl;return;}else{//姓名string name;cout << "请输入姓名:" << endl;cin >> name;abs->personArray[abs->m_Size].m_Name = name;//性别 1男 2女cout << "请输入性别:" << endl;cout << "1---男" << endl;cout << "2---女" << endl;int sex = 0;while (true){//当输入1或者2退出循环//如果输入错误,重新输入cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->m_Size].m_Sex = sex;break;}cout << "输入有误,请重新输入" << endl;}//年龄cout << "请输入年龄" << endl;int age = 0;cin >> age;abs->personArray[abs->m_Size].m_Age = age;//电话cout << "请输入联系电话" << endl;string phone = "";cin >> phone;abs->personArray[abs->m_Size].m_Phone = phone;//住址cout << "请输入家庭住址" << endl;string address;cin >> address;abs->personArray[abs->m_Size].m_Addr = address;//更新通讯录的人数abs->m_Size++;cout << "该联系人添加成功" << endl;}
}

addPerson.h:

#include<iostream>
using namespace std;
#include<string>
#include<stdlib.h>
#define MAX 1000//设计联系人结构体
struct Person
{//姓名string m_Name;//性别 1男 2女int m_Sex;//年龄int m_Age;//电话string m_Phone;//住址string m_Addr;
};//设计通讯录结构体
struct Addressbooks
{//通讯录中保存的联系人struct Person personArray[MAX];//通讯录当前记录联系人个数int m_Size;
};void addPerson(Addressbooks* abs);

4.5  添加联系人功能测试

运行结果:

5、  显示联系人功能设计

功能描述:显示通讯录中已有联系人信息

5.1  封装显示联系人函数

        判断当前通讯录中有无添加联系人,若联系人未0,则提醒添加联系人,若不为零,则显示通讯录的信息。

main函数部分代码:

//显示联系人case 2:showPerson(&abs);break; 

addPerson.h中添加的代码:

void showPerson(Addressbooks* abs);

showPerson.cpp:

#include"addPerson.h"void showPerson(Addressbooks* abs)
{//判断通讯录人数是否为0,如果为0,提示记录为空//如果不为0,显示记录的联系人信息if (abs->m_Size == 0){cout << "当前通讯录未添加联系人" << endl;}else{for (int i = 0; i < abs->m_Size; i++){cout << "姓名:" << abs->personArray[i].m_Name << "\t";cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";cout << "年龄:" << abs->personArray[i].m_Age << "\t";cout << "电话:" << abs->personArray[i].m_Phone << "\t";cout << "住址:" << abs->personArray[i].m_Addr << endl;}}system("pause");//按任意键继续system("cls");//清屏
}

5.2  测试显示联系人功能

运行结果:

6、  删除联系人功能设计

功能描述:按照姓名进行删除指定联系人

6.1  封装检测联系人

        在进行联系人删除前,我们应当先检测到所要删除的联系人是否存在,若存在则删除,不存在提示用户没有要删除的联系人。

main函数部分代码:

			//删除联系人	case 3:deletePerson(&abs);break;

addPerson.h中添加的代码:

void deletePerson(Addressbooks* abs);

deletePerson.cpp:

#include"addPerson.h"int isExist(Addressbooks* abs, string name)
{for (int i = 0; i < abs->m_Size; i++){if (abs->personArray[i].m_Name == name){return i;}}return -1;//如果遍历结束都没有找到。返回-1
}void deletePerson(Addressbooks* abs)
{cout << "请输入您要删除的联系人" << endl;string name;cin >> name;int ret = isExist(abs, name);if (ret != -1){for (int i = ret; i < abs->m_Size; i++){abs->personArray[i] = abs->personArray[i + 1];}abs->m_Size--;cout << "删除成功" << endl;}else{cout << "查无此人" << endl;}system("pause");system("cls");
}

6.2  联系人删除功能测试

添加一个联系人,对其进行显示:

对查找的联系人,进行删除操作:

在此删除显示:

7、 查找联系人功能设计

功能描述:按照姓名查找制定联系人姓名

7.1  封装查找联系人函数

思路:判断用户联系人是否存在。如果存在显示信息,不存在提示查无此人。

main函数部分代码:

			//查找联系人case 4:findPerson(&abs);break;

addPerson.h中添加的代码:

void findPerson(Addressbooks* abs);

findPerson.cpp:

#include"addPerson.h"//查找联系人
int isExist2(Addressbooks* abs, string name)
{for (int i = 0; i < abs->m_Size; i++){if (abs->personArray[i].m_Name == name){return i;}}return -1;//如果遍历结束都没有找到。返回-1
}void findPerson(Addressbooks* abs)
{cout << "请输入您要查找的联系人" << endl;string name;cin >> name;int ret = isExist2(abs, name);if (ret != -1){cout << "姓名:" << abs->personArray[ret].m_Name << "\t";cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";cout << "年龄:" << abs->personArray[ret].m_Age << "\t";cout << "电话:" << abs->personArray[ret].m_Phone << "\t";cout << "住址:" << abs->personArray[ret].m_Addr << endl;}else{cout << "查无此人" << endl;}system("pause");system("cls");}

7.2  查找联系人功能测试

代码示例:

        需要注意一点是,查找和显示不相同,查找功能是对所输入的姓名进行显示,而显示功能是对所有联系人信息进行显示,如下:

8、  修改联系人功能设计

功能描述:按照姓名重新修改联系人

8.1  封装修改联系人函数

实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人。

main函数部分代码:

			//修改联系人 case 5:modifyPerson(&abs);break;

addPerson.h中添加的代码:

//修改联系人
int modifyPerson(Addressbooks* abs);

findPerson.cpp:

#include"addPerson.h"int isExist3(Addressbooks* abs, string name)
{for (int i = 0; i < abs->m_Size; i++){if (abs->personArray[i].m_Name == name){return i;}}return -1;//如果遍历结束都没有找到。返回-1
}//修改联系人
int modifyPerson(Addressbooks* abs)
{cout << "请输入您要修改的联系人" << endl;string name;cin >> name;int ret = isExist3(abs, name);if (ret != -1){int cz = 0;while (true){cout << "姓名:" << abs->personArray[ret].m_Name << "\t";cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";cout << "年龄:" << abs->personArray[ret].m_Age << "\t";cout << "电话:" << abs->personArray[ret].m_Phone << "\t";cout << "住址:" << abs->personArray[ret].m_Addr << endl;cout << "请输入您要修改的内容:" << endl<< "1代表姓名" << endl<< "2代表性别" << endl<< "3代表年龄" << endl<< "4代表电话" << endl<< "5代表住址" << endl<< "0代表退出" << endl;cin >> cz;switch (cz){case 1:{//姓名string nam;cout << "请输入姓名:" << endl;cin >> nam;abs->personArray[ret].m_Name = nam;break;}case 2:{cout << "请输入性别:" << endl;cout << "1 -- 男" << endl;cout << "2 -- 女" << endl;//性别int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[ret].m_Sex = sex;break;}cout << "输入有误,请重新输入";}break;}case 3://删除联系人{//年龄cout << "请输入年龄:" << endl;int age = 0;cin >> age;abs->personArray[ret].m_Age = age;break;}case 4://查找联系人{//联系电话cout << "请输入联系电话:" << endl;string phone = "";cin >> phone;abs->personArray[ret].m_Phone = phone;break;}case 5:{//家庭住址cout << "请输入家庭住址:" << endl;string address;cin >> address;abs->personArray[ret].m_Addr = address;break;}case 0:cout << "退出修改" << endl;system("pause");system("cls");return 0;break;default:break;}}}else{cout << "查无此人" << endl;}system("pause");system("cls");
}

8.2  修改联系人功能测试

运行结果:

先添加一个联系人,进行显示,如下:

对其进行修改,本次修改的为性别,修改后“张三”性别已经修改,如下:

9、  清空联系人

功能描述:清空通讯录中所有信息

9.1  封装清空联系人函数

只要将通讯录记录的联系人数量置为0,即可。

main函数部分代码:

//清空联系人case 6:cleanPerson(&abs);break;

addPerson.h中添加的代码:

//清空联系人信息
void cleanPerson(Addressbooks* abs);

cleanPerson.cpp:

#include"addPerson.h"//清空联系人信息
void cleanPerson(Addressbooks* abs)
{abs->m_Size = 0;//将通讯录中数量大小直接置为0,我们便无法访问,//不用繁琐的挨个删除,也方便恢复数据cout << "通讯录已清空" << endl;system("pause");system("cls");}

9.2  清空联系人功能测试

运行结果:

先创建两个联系人,如下:

对其进行删除:

在此查看:

小结

        终于做完了,上面由于一步步添加main.cpp函数和addPerson.h函数,所以都是代码片段,下面把main.cpp函数和addPerson.h函数,完整版代码发出来。

main.cpp:

#include<iostream>
using namespace std;
#include"showMenu.h"
#include<string>
#include"addPerson.h"int main()
{//创建通讯录的结构体变量Addressbooks abs;//初始化通讯录当前人员个数abs.m_Size = 0;//创建用户输入的变量int select = 0;while (true){//菜单showMenu();cin >> select;switch (select){//添加联系人case 1:addPerson(&abs);break;//显示联系人case 2:showPerson(&abs);break; //删除联系人	case 3:deletePerson(&abs);break;//查找联系人case 4:findPerson(&abs);break;//修改联系人 case 5:modifyPerson(&abs);break;//清空联系人case 6:cleanPerson(&abs);break;//退出当前使用的通讯录case 0:cout << "欢迎下次使用" << endl;system("pause");return 0;break;}}	system("pause");return 0;
}

addPerson.h:

#include<iostream>
using namespace std;
#include<string>
#include<stdlib.h>
#define MAX 1000//设计联系人结构体
struct Person
{//姓名string m_Name;//性别 1男 2女int m_Sex;//年龄int m_Age;//电话string m_Phone;//住址string m_Addr;
};//设计通讯录结构体
struct Addressbooks
{//通讯录中保存的联系人struct Person personArray[MAX];//通讯录当前记录联系人个数int m_Size;
};//添加联系人信息
void addPerson(Addressbooks* abs);//添加联系人
void showPerson(Addressbooks* abs);//删除联系人
void deletePerson(Addressbooks* abs);//查找联系人
void findPerson(Addressbooks* abs);//修改联系人
int modifyPerson(Addressbooks* abs);//清空联系人信息
void cleanPerson(Addressbooks* abs);

        运行结果就是每一步的运行结果,在这里就不进行重复演示了。

整个压缩包放在最下面了

C++通讯录管理系统设计资源-CSDN文库

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

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

相关文章

算法基础之合并集合

合并集合 核心思想:并查集: 1.将两个集合合并2.询问两个元素是否在一个集合当中 基本原理:每个集合用一棵树表示 树根的编号就是整个集合的编号 每个节点存储其父节点&#xff0c;p[x]表示x的父节点 #include<iostream>using namespace std;const int N100010;int p[N];…

Huggingface 超详细介绍

Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商&#xff0c;他们本来打算创业做聊天机器人&#xff0c;然后在github上开源了一个Transformers库&#xff0c;虽然聊天机器人业务没搞起来&#xff0c;但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超…

【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】一、入门知识讲解 &#xff08;C关键字、命名空间、C输入&输出、缺省参数、函数重载&#xff09;-CSDN博客 六 . 引用 &#xff08;1&#xff09;. 引用的概念和特性…

Hugging Face宣布最受欢迎的AI机构,开源模型ChatGLM-6B广受认可

近日&#xff0c;Hugging Face作为开源AI社区的代表&#xff0c;总结了社区最欢迎的前15个公司和机构&#xff0c;几乎囊括了全部国内外风头正盛的AI科技机构&#xff0c;Stability AI、Meta AI、Runway占据排名前三&#xff0c;大众熟知的OpenAI、谷歌、微软也榜上有名。 其中…

医学检验(LIS)管理系统源码,LIS源码,云LIS系统源码

医学检验(LIS)管理系统源码&#xff0c;云LIS系统全套商业源码 随着全自动生化分析仪、全自动免疫分析仪和全自动血球计数器等仪器的使用&#xff0c;检验科的大多数项目实现了全自动化分析。全自动化分析引入后&#xff0c;组合化验增多&#xff0c;更好的满足了临床需要&…

php订单发起退款(余额和微信支付)

index.html <a class"btn btn-danger btn-change btn-tuikuan btn-disabled" href"javascript:;"><i class"fa fa-tuikuan"></i> 订单退款</a>-->order.js // 为表格绑定事件Table.api.bindevent(table);//退款按钮…

056-第三代软件开发-软件打包

第三代软件开发-软件打包 文章目录 第三代软件开发-软件打包项目介绍软件打包1 下载 linuxdepoyqt 工具2 安装 linuxdepoyqt3 qmake配置4 打包程序 总结 关键字&#xff1a; Qt、 Qml、 linuxdeployqt、 Ubuntu、 AppImage 项目介绍 欢迎来到我们的 QML & C 项目&…

本地运行“李开复”的零一万物 34B 大模型

这篇文章&#xff0c;我们来聊聊如何本地运行最近争议颇多的&#xff0c;李开复带队的国产大模型&#xff1a;零一万物 34B。 写在前面 零一万物的模型争议有很多&#xff0c;不论是在海外的社交媒体平台&#xff0c;还是在国内的知乎和一种科技媒体上&#xff0c;不论是针对…

基恩士软件的基本操作(五,日志记录与使用)

目录 基恩士是如何保存日志的&#xff1f; 如何使用日志功能 查看DM10的值1秒加1的记录日志 设定id与储存位置 软元件设定&#xff08; 日志ID有10个&#xff08;0~10&#xff09;&#xff0c;每一个ID最多添加512个软元件&#xff09; 设定触发 执行日志的梯形图程序 触…

【Amazon】在Amazon EKS集群中安装部署最小化KubeSphere容器平台

文章目录 一、准备工作二、部署 KubeSphere三、访问 KubeSphere 控制台四、安装Amazon EBS CSI 驱动程序4.1 集群IAM角色建立并赋予权限4.2 安装 Helm Kubernetes 包管理器4.3 安装Amazon EBS CSI 驱动程序 五、常见问题六、参考链接 一、准备工作 Kubernetes 版本必须为&…

i社为什么不出游戏了?

I社&#xff0c;即国际知名的游戏公司&#xff0c;近来为何鲜有新游问世&#xff1f;曾经风靡一时的游戏开发者&#xff0c;如今为何陷入了沉寂&#xff1f;这其中的种种原因&#xff0c;值得我们深入剖析。 首先&#xff0c;I社近期的沉寂可能与其内部管理层的调整和战略规划…

Scrum敏捷开发培训团队和组织来说的重要性

Scrum敏捷开发培训对于团队和组织来说是至关重要的&#xff0c;有以下几点&#xff0c;大家可以参考下&#xff1a; 理解敏捷价值观和原则&#xff1a; 培训有助于团队理解敏捷方法背后的核心理念和价值观&#xff0c;包括个体和互动、工作软件、客户合作和响应变化。这有助于建…

RESTful API 架构快速入门 Flask实现

RESTful 简介 1.1 为什么要使用 RESTful 架构&#xff1f; Representational State Transfer&#xff08;REST&#xff09;是一种面向资源的架构风格&#xff0c;广泛应用于网络服务的设计和开发。使用RESTful架构有以下几个优点&#xff1a; 简单性和可扩展性&#xff1a; RE…

[LaTex]arXiv投稿攻略——jpg/png转pdf

一、将图片复制进ppt&#xff0c;右键单击图片选择设置图片格式&#xff0c;获取图片高度和宽度 二、选择“设计-幻灯片大小-自定义幻灯片大小” 三、设置幻灯片大小为图片大小 四、 选择“最大化” 五、 检查幻灯片大小是否与图像大小一致 六、导出为PDF

浅谈Python中的鸭子类型和猴子补丁

文章目录 前言一、鸭子类型二、猴子补丁关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 Python 开发者可能…

springboot打印启动信息

打印启动信息 转载自:www.javaman.cn 1 spring Bean实例化流程 基本流程&#xff1a; 1、Spring容器在进行初始化时&#xff0c;会将xml或者annotation配置的bean的信息封装成一个BeanDefinition对象&#xff08;每一个bean标签或者bean注解都封装成一个BeanDefinition对象&a…

【Vulnhub靶机】Jarbas--Jenkins

文章目录 信息收集主机发现端口扫描目录爆破 漏洞探测whatwebhash-identifierwhatweb 文档说明&#xff1a;https://www.vulnhub.com/entry/jarbas-1,232/ 靶机下载&#xff1a;Download (Mirror): 信息收集 主机发现 扫描C段 sudo nmap -sn 10.9.75.0/24端口扫描 sudo nma…

装饰者设计模式

package com.jmj.pattern.decorator;/*** 快餐类(抽象构建角色)*/ public abstract class FastFood {private float price;private String desc;public float getPrice() {return price;}public void setPrice(float price) {this.price price;}public String getDesc() {retu…

竞赛选题 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于pyt…

LV.12 D20 RTC实验 学习笔记

一、RTC简介 RTC(Real Time Clock)即实时时钟&#xff0c;它是一个可以为系统提供精确的时间基准的元器件&#xff0c;RTC一般采用精度较高的晶振作为时钟源&#xff0c;有些RTC为了在主电源掉电时还可以工作&#xff0c;需要外加电池供电 二、Exynos4412下的 RTC控制器 它支持…