C++入门案例——通讯录管理系统 控制台项目

在这里插入图片描述

前言

C++入门案例——通讯录管理系统 & 控制台项目

目录

  • 前言
  • 总体概览
    • 实体类设计
    • 显示页面和退出系统
  • 添加联系人
    • 逻辑拆解
    • 相关代码
  • 显示联系人
    • 逻辑拆解
    • 相关代码
  • 根据名字删除联系人
    • 逻辑拆解
    • 相关代码
  • 根据名字查找联系人
    • 逻辑拆解
    • 相关代码
  • 修改联系人
    • 逻辑拆解
    • 相关代码
  • 清空所有联系人
    • 逻辑拆解
    • 相关代码
    • 完整代码
  • 总结

总体概览

实体类设计

在这里插入图片描述

// 设计联系人结构体
struct Person
{string name;int sex;int age;string tel;string addr;
};// 设计通讯录
struct AddressBooks
{// 联系人数组struct Person personArray[MAX];// 当前联系人数量int size;};

显示页面和退出系统

在这里插入图片描述

// 显示界面,main中使用页面封装函数
static 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.判断是否达到最大容量,如果达到,则结束,如果未达到,进入下一步;

2.用户输入要添加的人的信息,姓名等,加入到通讯录的数组中;

3.修改通讯录当前人数,更新人数+1;

在这里插入图片描述

相关代码

// 添加联系人
void addPerson(AddressBooks* abs)
{// 判断是否满if (abs->size == MAX){cout << "通讯录已满,添加失败" << endl;}else{// 添加联系人string name;cout << "请输入姓名" << endl;cin >> name;abs->personArray[abs->size].name = name;// 输入性别cout << "请输入性别,1男,2女" << endl;int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->size].sex = sex;break; // 输入正确,退出循环}cout << "输入有误,重新输入" << endl;}// 输入年龄int age = 0 ;cout << "请输入年龄" << endl;cin >> age;abs->personArray[abs->size].age = age;// 输入电话string tel;cout << "请输入电话" << endl;cin >> tel;abs->personArray[abs->size].tel = tel;// 输入家庭住址string addr;cout << "请输入家庭住址" << endl;cin >> addr;abs->personArray[abs->size].addr = addr;// 更新人数abs->size++;cout << "添加成功!!!" << endl;system("pause"); // 按任意键继续system("cls"); // 清屏}
}

显示联系人

逻辑拆解

1.判断通讯录是否为空,size==0;如果不为空,进入下一步;

2.把数组中的联系人一个一个拿出来,打印相关信息;

3.性别1,2输出位男和女采用三目运算符实现;

在这里插入图片描述

相关代码

// 显示联系人
void showPerson(AddressBooks* abs) {if (abs->size==0){cout << "通信录空" << endl;}else {for (int i = 0; i < abs->size; i++){cout << "姓名:" << abs->personArray[i].name << "\t";// 三目运算符cout << "性别:" << (abs->personArray[i].sex ==1 ? "男":"女") << "\t";cout << "住址:" << abs->personArray[i].addr << endl;}system("pause"); // 按任意键继续system("cls"); // 清屏}
}

根据名字删除联系人

逻辑拆解

1.先判断一下是否存在该联系人,如果不存在,退出;如果存在,进入下一步;

2.从要删除的联系人开始,把后面的联系人一个一个迁移;

3.最后把通讯录中的人员数量 -1;

在这里插入图片描述

相关代码

/// <summary>
/// 监测人名是否存在
/// </summary>
/// <param name="abs"></param>
/// <param name="name"></param>
/// <returns></returns>int isExist(AddressBooks* abs, string name) {for (int i = 0; i < abs->size; i++){if (abs->personArray[i].name==name){return i; // 返回位置}}return -1;
}// 删除指定的联系人
void deletePerson(AddressBooks* abs) {cout << "输入要删除的联系人的name" << endl;string name;cin >> name; int index = isExist(abs, name);if (index == -1){cout << "查无此人" << endl;system("pause"); // 按任意键继续system("cls"); // 清屏}else {cout << "已找到" << endl;for (int i = index; i < abs->size; i++){// 数据迁移abs->personArray[i] = abs->personArray[i + 1];abs->size--; // 更新人员数量cout << "删除成功" << endl;system("pause"); // 按任意键继续system("cls"); // 清屏}}
}

根据名字查找联系人

逻辑拆解

1.输入要查找的人的姓名,

2.判断该姓名是否存在数组中,如果存在进入下一步;

3.根据上一步获取该人在数组中的位置,进行人员信息的打印;

在这里插入图片描述

相关代码

// 查找联系人
void findPerson(AddressBooks* abs) {cout << "输入要查找的联系人的name" << endl;string name;cin >> name;int index = isExist(abs, name);if (index == -1){cout << "查无此人" << endl;}else {cout << "已找到" << endl;cout << "姓名:" << abs->personArray[index].name << "\t";// 三元表达式cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";cout << "住址:" << abs->personArray[index].addr << endl;}system("pause"); // 按任意键继续system("cls"); // 清屏
}

修改联系人

逻辑拆解

1.输入要修改的联系人的name;

2.查询是否存在该联系人,如果存在,则进入下一步;

3.输入该联系人的新的信息,姓名等;

相关代码

// 修改联系人
void modifyPerson(AddressBooks* abs) {cout << "输入要修改的联系人的name" << endl;string name;cin >> name;int index = isExist(abs, name);if (index == -1){cout << "查无此人" << endl;}else {cout << "已找到" << endl;cout << "姓名:" << abs->personArray[index].name << "\t";// 三元表达式cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";cout << "住址:" << abs->personArray[index].addr << endl;// 进行修改string name;cout << "请输入姓名" << endl;cin >> name;abs->personArray[index].name = name;// 输入性别cout << "请输入性别,1男,2女" << endl;int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[index].sex = sex;break; // 输入正确,退出循环}cout << "输入有误,重新输入" << endl;}}system("pause"); // 按任意键继续system("cls"); // 清屏
}

清空所有联系人

逻辑拆解

1.因为清空操作需要慎重考虑,因此加入了二次确认的机制;

2.清空联系人把当前记录的联系人的数量置为0即可;

相关代码

在这里插入图片描述

// 清空所有联系人
void cleanPerson(AddressBooks* abs) {cout << "即将清空所有联系人,是否继续,继续输入1" << endl;int flag;cin >> flag;if (flag == 1){abs->size = 0; // 将当前记录的联系人数量置为0,做逻辑删除cout << "清空成功" << endl;system("pause"); // 按任意键继续system("cls"); // 清屏}else{cout << "您取消了清空" << endl;}
}

完整代码

在这里插入图片描述

# include <iostream>
# include <string>
# define MAX 1000 // 定义常量
using namespace std;// 设计联系人结构体
struct Person
{string name;int sex;int age;string tel;string addr;
};// 设计通讯录
struct AddressBooks
{// 联系人数组struct Person personArray[MAX];// 当前联系人数量int size;};// 添加联系人
void addPerson(AddressBooks* abs)
{// 判断是否满if (abs->size == MAX){cout << "通讯录已满,添加失败" << endl;}else{// 添加联系人string name;cout << "请输入姓名" << endl;cin >> name;abs->personArray[abs->size].name = name;// 输入性别cout << "请输入性别,1男,2女" << endl;int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->size].sex = sex;break; // 输入正确,退出循环}cout << "输入有误,重新输入" << endl;}// 输入年龄int age = 0 ;cout << "请输入年龄" << endl;cin >> age;abs->personArray[abs->size].age = age;// 输入电话string tel;cout << "请输入电话" << endl;cin >> tel;abs->personArray[abs->size].tel = tel;// 输入家庭住址string addr;cout << "请输入家庭住址" << endl;cin >> addr;abs->personArray[abs->size].addr = addr;// 更新人数abs->size++;cout << "添加成功!!!" << endl;system("pause"); // 按任意键继续system("cls"); // 清屏}
}// 显示联系人
void showPerson(AddressBooks* abs) {if (abs->size==0){cout << "通信录空" << endl;}else {for (int i = 0; i < abs->size; i++){cout << "姓名:" << abs->personArray[i].name << "\t";// 三目运算符cout << "性别:" << (abs->personArray[i].sex ==1 ? "男":"女") << "\t";cout << "住址:" << abs->personArray[i].addr << endl;}system("pause"); // 按任意键继续system("cls"); // 清屏}
}/// <summary>
/// 监测人名是否存在
/// </summary>
/// <param name="abs"></param>
/// <param name="name"></param>
/// <returns></returns>int isExist(AddressBooks* abs, string name) {for (int i = 0; i < abs->size; i++){if (abs->personArray[i].name==name){return i; // 返回位置}}return -1;
}// 删除指定的联系人
void deletePerson(AddressBooks* abs) {cout << "输入要删除的联系人的name" << endl;string name;cin >> name; int index = isExist(abs, name);if (index == -1){cout << "查无此人" << endl;system("pause"); // 按任意键继续system("cls"); // 清屏}else {cout << "已找到" << endl;for (int i = index; i < abs->size; i++){// 数据迁移abs->personArray[i] = abs->personArray[i + 1];abs->size--; // 更新人员数量cout << "删除成功" << endl;system("pause"); // 按任意键继续system("cls"); // 清屏}}
}// 查找联系人
void findPerson(AddressBooks* abs) {cout << "输入要查找的联系人的name" << endl;string name;cin >> name;int index = isExist(abs, name);if (index == -1){cout << "查无此人" << endl;}else {cout << "已找到" << endl;cout << "姓名:" << abs->personArray[index].name << "\t";// 三元表达式cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";cout << "住址:" << abs->personArray[index].addr << endl;}system("pause"); // 按任意键继续system("cls"); // 清屏
}// 修改联系人
void modifyPerson(AddressBooks* abs) {cout << "输入要修改的联系人的name" << endl;string name;cin >> name;int index = isExist(abs, name);if (index == -1){cout << "查无此人" << endl;}else {cout << "已找到" << endl;cout << "姓名:" << abs->personArray[index].name << "\t";// 三元表达式cout << "性别:" << (abs->personArray[index].sex == 1 ? "男" : "女") << "\t";cout << "住址:" << abs->personArray[index].addr << endl;// 进行修改string name;cout << "请输入姓名" << endl;cin >> name;abs->personArray[index].name = name;// 输入性别cout << "请输入性别,1男,2女" << endl;int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[index].sex = sex;break; // 输入正确,退出循环}cout << "输入有误,重新输入" << endl;}}system("pause"); // 按任意键继续system("cls"); // 清屏
}// 清空所有联系人
void cleanPerson(AddressBooks* abs) {cout << "即将清空所有联系人,是否继续,继续输入1" << endl;int flag;cin >> flag;if (flag == 1){abs->size = 0; // 将当前记录的联系人数量置为0,做逻辑删除cout << "清空成功" << endl;system("pause"); // 按任意键继续system("cls"); // 清屏}else{cout << "您取消了清空" << endl;}
}// 显示界面,main中使用页面封装函数
static 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() {// 通讯录结构体变量AddressBooks abs;// 初始化当前人员个数abs.size = 0;// 用户的选择int select = 0;while (true){// 调用菜单showMenu();cin >> select;switch (select){case 1: // 1、添加联系人addPerson(&abs); // 利用地址传值,修饰实参break;case 2: // 2、显示联系人showPerson(&abs);break;case 3: // 3、删除联系人{deletePerson(&abs);}break;case 4: // 4、查找联系人findPerson(&abs);break;case 5: // 5、修改联系人modifyPerson(&abs);break;case 6: // 6、清空联系人cleanPerson(&abs);break;case 0: // 0、退出系统cout << "欢迎下次使用" << endl;system("pause");return 0;break;default:break;}}system("pause"); // 按任意键继续return 0;
}

总结

C++入门案例——通讯录管理系统 & 控制台项目

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

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

相关文章

如何理解单例模式----饿汉式?

饿汉式单例模式是一种单例设计模式的实现方式&#xff0c;它在类加载时就创建并初始化了单例对象&#xff0c;无需延迟加载。这种模式的优点是实现简单且线程安全&#xff0c;因为实例在类加载时就已经创建&#xff0c;不存在多线程竞争创建实例的问题。然而&#xff0c;它的缺…

AcWing.899.编辑距离

给定 n 个长度不超过 1010 的字符串以及 m 次询问&#xff0c;每次询问给出一个字符串和一个操作次数上限。 对于每次询问&#xff0c;请你求出给定的 n 个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。 每个对字符串进行的单个字符的插入、删除或…

C# 中,接口和抽象类的区别,分别在什么时候使用

在C#中&#xff0c;接口和抽象类都可用于创建可由子类实现和继承的规范。尽管它们有相似之处&#xff0c;但在使用场景和行为上存在显著差异。以下是你需要知道的接口和抽象类的区别以及它们各自的使用场景&#xff1a; 定义与目的&#xff1a; 接口&#xff08;Interface&…

(二)模板templates

首 Django模板层是为动态生成html服务的&#xff0c;非本文重点。前后端分离的设计更为常见&#xff0c;尽量少的涉及Django模板层内容。本文记录Django如何找到一个html文件。 模板文件 在创建一个Django项目project后&#xff0c;目录下会生成一个同名目录和manage.py。创…

鸿蒙ArkTS的起源和简介

theme: lilsnake 1、引言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力&#xff0c;到具备类型系统的高效工程开发能力&#xff0c;再到融合声明式UI、多维状态管理等丰富的应用开发能力&#xff0c;共同…

ASP.NET Core列表增删改查

前置要求&#xff1a; 1. vueelement-plus实现前端静态页面 HelloWorld.vue <template><h2>hello界面</h2><div class"tableList"><!-- 搜索框 --><el-row :gutter"20"><el-col :span"8"><!-- 搜…

STM32 GD32 瑞萨 psoc 等单片机 无线wifi蓝牙最佳解决方案

新联鑫威一系列低功耗高性价比sdio wifi/蓝牙combo的模块CYWL6208 , CYWL6312, CYW6209等可以搭配stm32 各种型号例如以下,支持sta/ap/apsta&#xff0c;双模蓝牙的应用&#xff0c;支持rt-thread, freertos, Azure RTOS, Linux, Android系统. 稳定强&#xff0c;功耗低&#x…

Linux系统资源分析手段:CPU,内存,磁盘与网络IO的瓶颈定位

前言&#xff1a;性能分析手段的应用场景 用于优化&#xff1a; 在程序编码完成后&#xff0c;我们通常要对自己编写的工具进行功能测试与性能分析。 用于监控&#xff1a; 在观察某个系统的运行情况时&#xff0c;需要观察系统内多个中间件及组件的资源占用情况。 用于测试…

tcpdump常用参数以及wireshark密文解密

tcpdump常用参数以及wireshark密文解密 文章目录 一、tcpdump命令和常用参数二、在wireshark中协议解析 tcpdump常用参数 一、tcpdump命令和常用参数 tcpdump常用命令&#xff1a;tcpdump -i eth0 src host 11.6.224.1 and udp port 161 -s 0 -w 161.pcap &#xff08;161为sn…

C盘满了,我用什么思路清理?

20240115 上周六同事传了一个很大的虚拟机给我&#xff0c;C盘就红了 虽然是飞秋选错了存储文件的路径&#xff0c;但后来忘了&#xff0c;就开始毫无目的删除文件&#xff0c;过程中会有没有权限删除的&#xff0c;这样还是没有改善。 咨询了公司IT技术人员&#xff0c; 告…

leetcode2376. 统计特殊整数

Problem: 2376. 统计特殊整数 文章目录 题目思路Code 题目 如果一个正整数每一个数位都是 互不相同 的&#xff0c;我们称它是 特殊整数 。 给你一个 正 整数 n &#xff0c;请你返回区间 [1, n] 之间特殊整数的数目。 示例 1&#xff1a; 输入&#xff1a;n 20 输出&…

利用python将Excel文件拆分为多个CSV

目录 一、准备工作 二、拆分Excel文件为多个CSV 1、读取Excel文件&#xff1a; 2、确定要拆分的列&#xff1a; 3、创建空的字典来存储CSV文件&#xff1a; 4、循环遍历数据并根据类别拆分&#xff1a; 5、打印或返回CSV文件名字典&#xff1a; 6、保存CSV到特定目录&a…

开源的代名词「GitHub 热点速览」

当开发者谈论开源时&#xff0c;通常会想到 GitHub&#xff0c;它不仅仅是一个代码托管平台&#xff0c;更是一个汇聚了全球开发者的社交中心。过去&#xff0c;开发者发布一款软件后&#xff0c;都是在自己的小圈子里默默努力和交流&#xff0c;现在通过 GitHub 平台可以方便地…

day02_计算机常识丶第一个程序丶注释丶关键字丶标识符

计算机常识 计算机如何存储数据 计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。 进制 进制也就是进位计数制&#xff0c;是人为定义的带进位的计数方法 实例&#xff1a; // 在java 中 可以使用不同…

【机器学习】强化学习 (一)强化学习简介

一、强化学习简介 1.1 问题定义 1.2 马尔可夫决策过程 举例说明马尔可夫决策过程 例1&#xff1a; 例2&#xff1a; 执行动作的策略 强化学习的目标是让智能体通过不断尝试&#xff0c;找到最优的策略&#xff08;policy&#xff09;&#xff0c;即在每个状态下选择什么动作&am…

消息中间件RabbitMQ

1. 消息队列 1.1. MQ 的相关概念 1.1.1. 什么是MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息…

给APM固定翼增加相机

一、原因 由于要做固定翼仿真和末端视觉制导方面的工作,所以需要对APM固件的固定翼飞机添加相机模型。 对于SDF文件而言,其本质是有XML语言进行描述的,所以我们只需要对其相机的添加过程进行描述即可。 二、要求 (1)mavros和ros确保已经安装 (2)gazebo确保已经安装 (…

【vue】-

目录 pinia搭建pinia环境存储、读取数据修改数据&#xff08;三种方式&#xff09; pinia 搭建pinia环境 一、第一步&#xff1a;npm install pinia 二、第二步&#xff1a;操作src/main.ts import { createApp } from vue import App from ./App.vue/* 引入createPinia&…

如何将github copilot当gpt4用

现在写代码已经离不开ai辅助了我用的是github copilot&#xff0c;一方面是因为它和vscode结合得比较好&#xff0c;另一方面就是copilot chat了。可以在不切换工具的情况下&#xff0c;问它问题&#xff0c;在copilot chat还在内测阶段的时候我就申请使用了&#xff08;现在已…

Android studio 简单登录APP设计

一、登录界面: 二、xml布局设计: <LinearLayoutandroid:id="@+id/linearLayout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:layout_editor_absoluteX="…