C++从0到1的入门级教学(八)——通讯录管理系统

文章目录

  • 8 通讯录管理系统
    • 8.1 系统需求
    • 8.2 菜单功能
    • 8.3 退出功能
    • 8.4 添加联系人
      • 8.4.1 设计联系人结构体
      • 8.4.2 设计通讯录结构体
      • 8.4.3 main函数中创建通讯录
      • 8.4.4 封装添加联系人函数
    • 8.5 显示联系人
      • 8.5.1 封装显示联系人函数
      • 8.5.2 调用显示联系人函数
    • 8.6 删除联系人
      • 8.6.1 封装检测联系人是否存在
      • 8.6.2 封装删除联系人函数
    • 8.7 查找联系人
      • 8.7.1 封装查找联系人函数

8 通讯录管理系统

8.1 系统需求

通讯录是一个可以记录亲人,好友信息的工具。

本教程主要利用C++来实现一个通讯录管理系统,系统中需要实现的功能如下:

  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人。
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人信息
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有信息
  • 退出通讯录:退出当前使用的通讯录

8.2 菜单功能

功能描述:用户选择功能的界面

菜单界面效果如下图:
image-20211104052617316

步骤

  • 函数显示该界面,如void showMenu()
  • 在main函数中调用封装好的函数

代码

//函数显示该界面,如`void showMenu()`
//在main函数中调用封装好的函数#include <iostream>
using namespace std;//菜单界面
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;
}int main()
{showMenu();system("pause");return 0;
}

8.3 退出功能

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

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择0的时候,执行退出,选择其他先不做操作,也不会退出程序。

代码

//函数显示该界面,如`void showMenu()`
//在main函数中调用封装好的函数#include <iostream>
using namespace std;//菜单界面
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;
}int main()
{//创建用户输入的选择变量int select{};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;default:cout << "您输入的选择有误,请重新输入" << endl;}}system("pause");return 0;
}

8.4 添加联系人

功能描述:实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)

添加联系人实现步骤:

  • 设计联系人结构体
  • 设计通讯录结构体
  • main函数中创建通讯录
  • 封装添加联系人函数
  • 测试添加联系人功能

8.4.1 设计联系人结构体

联系人信息包括:姓名、性别、年龄、联系电话、家庭住址。

设计如下:

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

8.4.2 设计通讯录结构体

设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量。

代码

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

8.4.3 main函数中创建通讯录

添加联系人函数封装后,在main函数中创建一个通讯录变量,这个就是我们需要一直维护的通讯录

代码

//创建通讯录结构体变量Addressbooks abs;//初始化通讯录中当前的人员个数abs.m_Size = 0;

8.4.4 封装添加联系人函数

添加联系人前先判断通讯录是否已满,如果满了就不再添加,未满情况将新联系人信息逐个加入到通讯录当中

代码

//菜单界面
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;
}//1、添加联系人
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;//性别int sex;cout << "请输入性别" << endl;cout << "1——男" << endl;cout << "2——女" << endl;while (true) {//如果输入的是1或者2可以退出循环,因为输入的是正确值//如果输入有误,重新输入cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->m_Size].m_Sex = sex;break;}else{cout << "输入有误,请重新输入" << endl;}}//年龄int age;cout << "请输入年龄:" << endl;cin >> age;abs->personArray[abs->m_Size].m_Age = age;//电话string phone;cout << "请输入电话号码:" << endl;cin >> phone;abs->personArray[abs->m_Size].m_Phone = phone;//住址string addr;cout << "请输入地址:" << endl;cin >> addr;abs->personArray[abs->m_Size].m_Addr = addr;abs->m_Size += 1;//提示信息cout << "添加成功" << endl;//界面美化system("pause");//按任意键继续system("cls");//清屏操作}
}

8.5 显示联系人

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

显示联系人实现步骤:

  • 封装显示联系人函数
  • 测试显示联系人功能

8.5.1 封装显示联系人函数

思路:判断如果当前通讯录中没有人员,就提示记录为空;人数大于0,显示通讯录中信息

代码

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");
}

8.5.2 调用显示联系人函数

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

8.6 删除联系人

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

删除联系人实现步骤:

  • 封装检测联系人是否存在
  • 封装删除联系人函数
  • 测试删除联系人功能

8.6.1 封装检测联系人是否存在

删除联系人之前,我们需要判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人。

//检测联系人是否存在,如果存在,返回联系人所在数组中的具体位置,不存在返回-1
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
}
case 3://删除联系人{cout << "请输入要删除的联系人姓名:" << endl;string name;cin >> name;if (isExist(&abs, name) == -1){cout << "通讯录中没有这个人" << endl;}else{cout << "找到这个人了!" << endl;}system("pause");system("cls");}

8.6.2 封装删除联系人函数

根据用户输入的联系人判断该通讯录中是否有此人,查找到进行删除,并提示删除成功

查不到提示查无此人。

//3、删除联系人
void deletePerson(Addressbooks* abs)
{cout << "请输入您要删除的联系人:" << endl;string name;cin >> name;//ret == -1 未查到//ret != -1 查到了 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;}
}

8.7 查找联系人

功能描述:按照姓名查看指定联系人的信息

查找联系人实现步骤

  • 封装查找联系人函数
  • 测试查找指定联系人

8.7.1 封装查找联系人函数

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

代码

//4、查找联系人
void findPerson(Addressbooks* abs)
{cout << "请输入您要查找的联系人" << endl;string name;cin >> name;//判断指定的联系人是否存在通讯录中int ret = isExist(abs, name);if (ret != -1)//找到联系人{cout << "姓名:" << abs->personArray[ret].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;}else//查无此人{cout << "通讯录中找不到该联系人" << endl;}system("pause");system("cls");
}

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

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

相关文章

【Data Cluster】真机环境下MySQL数据库集群搭建

真机环境下MySQL-Cluster搭建文档 MySQL Cluster简介 MySQL cluster 和 Oracle RAC 完全不同&#xff0c;它采用 无共享架构Shared nothing&#xff08;shared nothing architecture&#xff09;。整个集群由管理节点(ndb_mgmd)&#xff0c;处理节点(mysqld)和存储节点(ndbd)组…

【层次聚类】python scipy实现

层次聚类 原理 有一个讲得很清楚的博客&#xff1a;博客地址 主要用于&#xff1a;没有groundtruth&#xff0c;且不知道要分几类的情况 用scipy模块实现聚类 参考函数说明&#xff1a;pdistsquareformlinkagefcluster scipy.spatial.distance.pdist&#xff1a;计算点之间的距…

Find a girl friend

Find a girl friend Time Limit: 1000ms Memory limit: 262144K 有疑问&#xff1f;点这里^_^ 题目描述 CC wants to find a girl friend, he knows each girls age and name in his class, and each girl’s age is different.. Now he wants to know the youngest girls n…

数据结构杂谈(八)——树(上)

文章目录8 树(上)8.1 引入8.2 树的基础知识8.3 树的存储结构8.3.1 双亲表示法8.3.2 孩子表示法8.4 二叉树8.4.1 基础知识8.4.2 高频考点8.4.3 二叉树的性质8.4.4 二叉链表8.4.5 树和二叉树的转换8.4.6 森林和二叉树的转换8.5 遍历8 树(上) 8.1 引入 我们在前面的章节中一直在…

vs entityframwork Validation failed for one or more entities

问题&#xff1a;添加数据库一条数据时出错 查找异常 catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("P…

Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide开源组件加载网络图片的优缺点比较...

在android中的加载网络图片是一件十分令人头疼的事情&#xff0c;在网上有着许多关于加载网络图片的开源库&#xff0c;可以让我们十分方便的加载网络图片。在这里我主要介绍一下我自己在使用Volley, Picasso, Universal-Imageloader的一些使用的感悟。以及最基本的用法介绍。1…

hdu 1754 I Hate It(分块做法)

题意&#xff1a;中文题&#xff0c;不多解释 思路&#xff1a;这个题原本用线段树很容易做&#xff0c;但分块其实也很容易&#xff0c;对于分块的复杂度还不是很会计算&#xff0c;只知道是每次分为sqrt&#xff08;n&#xff09;块&#xff0c;然后一共有sqrt&#xff08;n&…

Maven(一)——快速上手Maven

文章目录Maven概述Maven简介Maven的安装Maven的基本使用IDEA配置Maven依赖管理依赖范围Maven概述 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; &#xff08;一&#xff09;提供了一套标准化的项目结构 不同的IDE项目结构是不一样的&…

如何定制Activity的标题栏

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); //自定义标题栏 mWindow getWindow(); mWindow.setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar); titlebar.xml <?xml version"1.…

牛客网 牛客小白月赛1 H.写真がとどいています

H.写真がとどいています链接&#xff1a;https://www.nowcoder.com/acm/contest/85/H来源&#xff1a;牛客网这个题数乱了&#xff0c;导致wa了好几次。特别弱智&#xff0c;从A开始往上&#xff0c;就是A,B,C,D,E,F。A的下面就是G开始倒着&#xff0c;G,F,E。我智障&#xff0…

EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

在前面的教程你实施了一套基本的 CRUD 操作&#xff0c;为Student实体的 web 页。在本教程中&#xff0c;您将添加排序、 筛选和分页到 StudentsIndex的功能。您还将创建一个页面&#xff0c;并简单分组。 下面的插图显示页面当你完成时的样子。列标题是链接&#xff0c;用户可…

eclipes快捷键

本文原创作者&#xff1a;pipi-changing 本文原创出处&#xff1a;http://www.cnblogs.com/pipi-changing/ Ctrl1 快速修复(最经典的快捷键,就不用多说了)CtrlD: 删除当前行 CtrlAlt↓ 复制当前行到下一行(复制增加)CtrlAlt↑ 复制当前行到上一行(复制增加)Alt↓ 当前行和下面一…

fluentd主从配置

fluentd是一个免费的、完全开源的日志管理工具&#xff0c;可以对日志进行收集、处理、存储。对于一些高流量的网站或者特殊的架构&#xff0c;需要fluentd高可用配置。 以下是在测试环境搭建模拟fluentd主从配置&#xff0c;模拟主从切换。 服务器 服务 192.168.199.1 elas…

Hadoop总结

目录 大数据概述 Hadoop大数据开发平台 资源管理YARN 分布式文件系统HDFS 非关系型数据库NOSQL 分布式数据库HBASE 批处理和MapReduce 数据仓库查询分析和Hive 基于内存计算的Spark 流计算和Flink 图计算和PREGEL Hadoop常用命令总结 大数据概述 大数据的4V&#x…

poj 2449

转自http://blog.csdn.net/sdj222555/article/details/7690081 题目大意就是给出一个图&#xff0c;然后给出一个起点个一个终点&#xff0c;求这两点间的第K短路。 本题中是可以走重复的路的&#xff0c;所以如果一张图中有一个环的话&#xff0c;无论求第几短路都是存在的。 …

CTS类型

类如果被封装&#xff0c;叫做密封类&#xff0c;密封类不能作为其他类的基类接口是抽象成员的集合&#xff0c;它在对象和对象用户间提供一个契约&#xff0c;CTS允许类实现任何数目的接口抽象类不能直接被创建&#xff0c;但可以用来为派生类型定义公共的行为&#xff0c;具体…

HDFS的常用操作

1、HDFS文件的权限以及读写操作 HDFS文件的权限&#xff1a; •与Linux文件权限类似 •r: read; w:write; x:execute&#xff0c;权限x对于文件忽略&#xff0c;对于文件夹表示是否允许访问其内容 •如果Linux系统用户zhangsan使用hadoop命令创建一个文件&#xff0c;那么这个文…

并行计算总结

作者&#xff1a;ArimaMisaki 目录 1 并行计算概述. 2 1.1 基本概念. 2 1.2 存储器的层次结构. 3 1.3 并行计算. 3 1.4 动态互连网络. 4 1.5 并行计算机结构模型. 5 1.6 并行算法的基本设计策略. 6 1.7 并行编程风范. 6 1.8 单核多线程和并发执行. 7 1.9 拓展&#x…

HDMI转MIPI DSI芯片方案TC358779XBG

型号&#xff1a;TC358779XBG功能&#xff1a;HDMI1.4转MIPI DSI通信方式&#xff1a;IIC分辨率&#xff1a;1920*1080电源&#xff1a;3.3/1.8/1.2封装形式&#xff1a;BGA80深圳长期现货 &#xff0c;提供技术支持&#xff0c;样品申请及规格书请联系蔡生M18312533639 Q1520…

基础总结篇之中的一个:Activity生命周期

子曰&#xff1a;溫故而知新&#xff0c;能够為師矣。《論語》 学习技术也一样&#xff0c;对于技术文档或者经典的技术书籍来说&#xff0c;指望看一遍就全然掌握&#xff0c;那基本不大可能&#xff0c;所以我们须要常常回过头再细致研读几遍&#xff0c;以领悟到作者的思想精…