通讯录管理(C++入门练习)

 通讯录管理系统
 

系统需求:


通讯录是一个可以记录亲人、好友信息的工具。本文主要利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:


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

 

1.结构体定义

// 联系人结构体
struct Person
{string m_name;int m_sex;		// 1:男	2:女int m_age;string m_phone;string m_addr;
};// 通讯录的结构体
struct Addressbooks
{// 当前保存联系人的数组struct Person personArray[MAX];// 当前保存联系人的个数int m_size;
};

2.添加函数

// 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 = 0;cout << "请输入联系人性别:" << endl;cout << "1 --- 男" << endl;cout << "2 --- 女" << endl;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->m_size].m_sex = sex;break;}else{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 addr;cin >> addr;abs->personArray[abs->m_size].m_addr = addr;// 更新通讯录人数abs->m_size++;cout << "添加成功!" << endl;system("pause");system("cls");}
}

3.显示函数

// 2、显示联系人
void showPerson(Addressbooks * abs)
{// 判空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");
}

4.删除函数

// 3、删除联系人// 检测联系人是否存在
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;
}void delatePerson(Addressbooks* abs)
{cout << "请输入删除联系人的姓名:" << endl;string name;cin >> name;int ret = isExist(abs, name);if (ret == -1){cout << "查无此人" << endl;}else{for (int i = ret; i < abs->m_size; i++){abs->personArray[i] = abs->personArray[i + 1];}abs->m_size--;cout << "删除成功" << endl;}system("pause");system("cls");
}

5.查找函数

//4、查找联系人
void findPerson(Addressbooks* abs)
{cout << "请输入你要查找的联系人:" << endl;string name;cin >> name;int ret = isExist(abs, name);if (ret == -1){cout << "查无此人" << endl;}else{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;}system("pause");system("cls");
}

6.修改函数

//5、修改联系人
void modifyPerson(Addressbooks* abs)
{cout << "请输入你要修改的联系人:" << endl;string name;cin >> name;int ret = isExist(abs, name);if (ret == -1){cout << "查无此人" << endl;}else{// 姓名string name;cout << "请输入联系人姓名:" << endl;cin >> name;abs->personArray[ret].m_name = name;// 性别int sex = 0;cout << "请输入联系人性别:" << endl;cout << "1 --- 男" << endl;cout << "2 --- 女" << endl;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[ret].m_sex = sex;break;}else{cout << "请重新输入:" << endl;}}// 年龄cout << "请输入联系人年龄:" << endl;int age = 0;cin >> age;abs->personArray[ret].m_age = age;// 电话cout << "请输入联系人电话:" << endl;string phone;cin >> phone;abs->personArray[ret].m_phone = phone;// 地址cout << "请输入联系人地址:" << endl;string addr;cin >> addr;abs->personArray[ret].m_addr = addr;cout << "修改成功!" << endl;}system("pause");system("cls");
}

7.主函数调用

int main()
{// 创建通讯录结构体变量Addressbooks abs;// 初始化通讯录中人员个数abs.m_size = 0;int select = 0;while (true){showMenu();cout << "请选择你要实现的功能:" << endl;cin >> select;switch (select){case 1:		// 1、添加联系人addPerson(&abs);		// 地址传递可以修饰实参break;case 2:		// 2、显示联系人showPerson(&abs);break;case 3:		// 3、删除联系人delatePerson(&abs);break;case 4:		// 4、查找联系人findPerson(&abs);break;case 5:		// 5、修改联系人modifyPerson(&abs);break;case 6:		// 6、清空联系人clearPerson(&abs);break;case 0:		// 0、退出通讯录cout << "欢迎下次使用!" << endl;system("pause");return 0;break;default:break;}}system("pause");return 0;
}

总代码汇总:

#include<iostream>
using namespace std;
#include<string>
#define MAX 1000// 菜单界面
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;
}// 联系人结构体
struct Person
{string m_name;int m_sex;		// 1:男	2:女int m_age;string m_phone;string m_addr;
};// 通讯录的结构体
struct Addressbooks
{// 当前保存联系人的数组struct Person personArray[MAX];// 当前保存联系人的个数int m_size;
};// 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 = 0;cout << "请输入联系人性别:" << endl;cout << "1 --- 男" << endl;cout << "2 --- 女" << endl;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->m_size].m_sex = sex;break;}else{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 addr;cin >> addr;abs->personArray[abs->m_size].m_addr = addr;// 更新通讯录人数abs->m_size++;cout << "添加成功!" << endl;system("pause");system("cls");}
}// 2、显示联系人
void showPerson(Addressbooks * abs)
{// 判空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");
}// 3、删除联系人// 检测联系人是否存在
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;
}void delatePerson(Addressbooks* abs)
{cout << "请输入删除联系人的姓名:" << endl;string name;cin >> name;int ret = isExist(abs, name);if (ret == -1){cout << "查无此人" << endl;}else{for (int i = ret; i < abs->m_size; i++){abs->personArray[i] = abs->personArray[i + 1];}abs->m_size--;cout << "删除成功" << endl;}system("pause");system("cls");
}//4、查找联系人
void findPerson(Addressbooks* abs)
{cout << "请输入你要查找的联系人:" << endl;string name;cin >> name;int ret = isExist(abs, name);if (ret == -1){cout << "查无此人" << endl;}else{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;}system("pause");system("cls");
}//5、修改联系人
void modifyPerson(Addressbooks* abs)
{cout << "请输入你要修改的联系人:" << endl;string name;cin >> name;int ret = isExist(abs, name);if (ret == -1){cout << "查无此人" << endl;}else{// 姓名string name;cout << "请输入联系人姓名:" << endl;cin >> name;abs->personArray[ret].m_name = name;// 性别int sex = 0;cout << "请输入联系人性别:" << endl;cout << "1 --- 男" << endl;cout << "2 --- 女" << endl;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[ret].m_sex = sex;break;}else{cout << "请重新输入:" << endl;}}// 年龄cout << "请输入联系人年龄:" << endl;int age = 0;cin >> age;abs->personArray[ret].m_age = age;// 电话cout << "请输入联系人电话:" << endl;string phone;cin >> phone;abs->personArray[ret].m_phone = phone;// 地址cout << "请输入联系人地址:" << endl;string addr;cin >> addr;abs->personArray[ret].m_addr = addr;cout << "修改成功!" << endl;}system("pause");system("cls");
}//6、清空联系人
void clearPerson(Addressbooks* abs)
{abs->m_size = 0;cout << "通讯录已清空" << endl;system("pause");system("cls");
}int main()
{// 创建通讯录结构体变量Addressbooks abs;// 初始化通讯录中人员个数abs.m_size = 0;int select = 0;while (true){showMenu();cout << "请选择你要实现的功能:" << endl;cin >> select;switch (select){case 1:		// 1、添加联系人addPerson(&abs);		// 地址传递可以修饰实参break;case 2:		// 2、显示联系人showPerson(&abs);break;case 3:		// 3、删除联系人delatePerson(&abs);break;case 4:		// 4、查找联系人findPerson(&abs);break;case 5:		// 5、修改联系人modifyPerson(&abs);break;case 6:		// 6、清空联系人clearPerson(&abs);break;case 0:		// 0、退出通讯录cout << "欢迎下次使用!" << endl;system("pause");return 0;break;default:break;}}system("pause");return 0;
}

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

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

相关文章

昇思25天学习打卡营第21天|DCGAN生成漫画头像

DCGAN原理 DCGAN&#xff08;深度卷积对抗生成网络&#xff0c;Deep Convolutional Generative Adversarial Networks&#xff09;是GAN的直接扩展。不同之处在于&#xff0c;DCGAN会分别在判别器和生成器中使用卷积和转置卷积层。 它最早由Radford等人在论文Unsupervised Re…

数据结构历年考研真题对应知识点(哈夫曼树和哈夫曼编码)

目录 5.5.1哈夫曼树和哈夫曼编码 1.哈夫曼树的定义 2.哈夫曼树的构造 【分析哈夫曼树的路径上权值序列的合法性&#xff08;2010&#xff09;】 【哈夫曼树的性质&#xff08;2010、2019&#xff09;】 3.哈夫曼编码 【根据哈夫曼编码对编码序列进行译码&#xff08;201…

【AMBA】AXI总线中的AXLEN、AXSIZE、AXBURST和4K边界

文章目录 AXI传输层级概念AXLEN[7:0]定义突发传输长度AXSIZE[2:0]定义突发传输transfer的位宽AXBURST[1:0]定义突发传输类型4K边界 AXI传输层级概念 在手册的术语表中&#xff0c;与 AXI 传输相关的有三个概念&#xff0c;分别是 transfer(beat)、burst、transaction。用一句话…

树莓派关机

文件 shutdown.sh #!/usr/bin/bash sudo shutdown -r nowpython 文件开头添加 #!/usr/bin/python3

C字符串和内存函数介绍(三)——其他的字符串函数

在#include<string.h>的这个头文件里面&#xff0c;除了前面给大家介绍的两大类——长度固定的字符串函数和长度不固定的字符串函数。还有一些函数以其独特的用途占据一席之地。 今天要给大家介绍的是下面这三个字符串函数&#xff1a;strstr&#xff0c;strtok&#xf…

详解Go语言中的Goroutine组(Group)在项目中的使用

背景(Why) Go语言通过其内置的goroutine和通道&#xff08;channel&#xff09;机制&#xff0c;提供了强大的并发支持。goroutine的开销非常低&#xff0c;一个goroutine仅占用几KB的内存&#xff0c;可以轻松创建成千上万个goroutine来处理并发任务。然而&#xff0c;随着并…

前端web性能统计

前端web性能统计 1. 背景2. 业界方案2.1 腾讯2.2 蚂蚁金服2.3 字节跳动2.4 美团 3. 相关观念3.1 RAIL模型3.2 性能指标3.3 真实用户监控3.4 performance 4. 性能监控工具介绍5. 推荐采用方案 1. 背景 在如今的数字时代&#xff0c;网站和应用程序的性能对用户体验至关重要。用…

Bootstrap 栅格系统的工作原理?

Bootstrap的栅格系统是一种响应式的网格布局系统&#xff0c;用于在不同屏幕尺寸下实现页面布局的自适应。栅格系统基于12列的布局&#xff0c;可以让开发者轻松地创建响应式的网页布局。 工作原理如下&#xff1a; 容器&#xff08;Container&#xff09;&#xff1a;Bootstra…

STM32MP135裸机编程:唯一ID(UID)、设备标识号、设备版本

0 资料准备 1.STM32MP13xx参考手册1 唯一ID&#xff08;UID&#xff09;、设备标识号、设备版本 1.1 寄存器说明 &#xff08;1&#xff09;唯一ID 唯一ID可以用于生成USB序列号或者为其它应用所使用&#xff08;例如程序加密&#xff09;。 &#xff08;2&#xff09;设备…

Java实习修炼:力扣第116题之填充每个节点的下一个右侧指针

摘要 LeetCode第116题要求填充每个节点的下一个右侧指针&#xff0c;并指向其下一个右侧节点。本题考察了二叉树的遍历和指针操作。本文将介绍如何使用Java语言解决这个问题&#xff0c;并提供详细的代码实现。 1. 问题描述 给定一个完美二叉树&#xff0c;节点数量为m&…

Git代码管理工具 — 3 Git基本操作指令详解

目录 1 获取本地仓库 2 基础操作指令 2.1 基础操作指令框架 2.2 git status查看修改的状态 2.3 git add添加工作区到暂存区 2.4 提交暂存区到本地仓库 2.5 git log查看提交日志 2.6 git reflog查看已经删除的记录 2.7 git reset版本回退 2.8 添加文件至忽略列表 1 获…

0.单片机工作原理

文章目录 最小系统 单片机芯片 时钟电路 复位电路 电源 最小系统 单片机芯片 本次51单片机的芯片为&#xff1a;STC89C52 Flash(闪存)程序存储器&#xff1a;存储程序的空间 SRAM&#xff1a;数据存储器&#xff0c;可用于存放程序执行的中间结果和过程数据 DPTR&#xff1a;…

2024-07-14 Unity插件 Odin Inspector2 —— Essential Attributes

文章目录 1 说明2 重要特性2.1 AssetsOnly / SceneObjectsOnly2.2 CustomValueDrawer2.3 OnValueChanged2.4 DetailedInfoBox2.5 EnableGUI2.6 GUIColor2.7 HideLabel2.8 PropertyOrder2.9 PropertySpace2.10 ReadOnly2.11 Required2.12 RequiredIn&#xff08;*&#xff09;2.…

决策树算法入门到精通:全面解析与案例实现

1. 介绍决策树算法 决策树的基本概念和原理 决策树是一种基于树形结构的分类和回归方法&#xff0c;通过对数据集进行递归地划分&#xff0c;每个内部节点表示一个属性上的判断&#xff0c;每个叶节点代表一种类别或者数值。 决策树在机器学习中的应用场景 分类问题&#xf…

删除矩阵中0所在行 matlab

%for验证 new[]; for i1:size(old,1)if old(i,4)~0 %assume 0所在列在第4列new(end1,:)old(i,:);end enda(a(:,2)0,:)[]参考&#xff1a; 两种方式

Java:使用JMH做Benchmark基准测试

BenchMark 又叫做基准测试&#xff0c;主要用来测试一些方法的性能&#xff0c;可以根据不同的参数以不同的单位进行计算&#xff08;例如可以使用吞吐量为单位&#xff0c;也可以使用平均时间作为单位&#xff0c;在 BenchmarkMode 里面进行调整&#xff09;。 依赖 <dep…

机器人相关工科专业课程体系

机器人相关工科专业课程体系 前言传统工科专业机械工程自动化/控制工程计算机科学与技术 新兴工科专业智能制造人工智能机器人工程 总结Reference: 前言 机器人工程专业是一个多领域交叉的前沿学科&#xff0c;涉及自然科学、工程技术、社会科学、人文科学等相关学科的理论、方…

Linux编程(三)—makefile快速编译

起因 linux环境下&#xff0c;编译c程序很麻烦&#xff0c;后面g -o demo demo.cpp ……往往跟了许多许多东西&#xff0c;这些每次编译的时候都要书写&#xff0c;所以就产生了makefile快速编译方式&#xff0c;具体操作如下。 怎么用makefile? 第一步&#xff1a;下载 m…

WPF学习(2) -- 样式基础

一、代码 <Window x:Class"学习.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/2008&…

gtest单元测试:进程冻结与恢复管理模块的单元测试实现

文章目录 1. 概要2. 进程管理接口详解2.1 进程冻结与恢复的基本概念2.2 进程查找与PID获取2.3 进程冻结与恢复的实现2.3.1 进程冻结2.3.2 进程恢复 2.4 进程终止2.5 进程状态监控与控制 3. dummy_process的设计与实现3.1 创建dummy_process脚本3.2 启动dummy_process3.3 终止du…