通讯录管理系统
目录
一. 实验目的
二. 系统设计
三. 系统设计流程:
四. 实验结果及效果展示
五. 实验总结
六. 附录:源代码
一. 实验目的
本次实验旨在通过实现一个简单的通讯录管理系统,加深对C++语言结构体、数组、指针、函数、控制结构等基本概念的理解与应用。通过设计并实现一个包含添加、删除、查找、显示、修改和清空联系人信息功能的通讯录系统,提高编程实践能力和问题解决能力。
二. 系统设计
1. 本实验完成了一个完整的通讯录管理系统,该系统通过结构体Person定义了联系人的基本信息,包括姓名、性别、年龄、电话号码和家庭住址。通过另一个结构体addressbooks定义了通讯录,该通讯录包含一个Person类型的数组和一个记录当前联系人个数的整数。系统提供了添加、删除、查找、显示、修改和清空通讯录等功能。
2. 结构体设计:
person结构体:用于存储联系人的详细信息,包括姓名、性别、年龄、电话号码和家庭住址。
addressbooks结构体:用于存储通讯录,包含一个Person类型的数组和一个记录当前联系人个数的整数。
3. 系统函数实现:
choice()函数:显示菜单选项,引导用户输入操作指令。
AddPerson(addressbooks*abs)函数:实现添加新联系人到通讯录功能。
ShowPerson(addressbooks*abs)函数:显示通讯录中所有联系人的信息。
IsHave(addressbooks*abs,string name)函数:判断通讯录中是否存在指定姓名的联系人,并返回其在数组中的位置。
DeletePerson(addressbooks*abs,string name)函数:根据姓名删除通讯录中的联系人。
FindPerson(addressbooks*abs)函数:根据姓名查找并显示联系人的详细信息。
ModifyPerson(addressbooks*abs)函数:根据姓名修改联系人的信息。
ClearAddress(addressbooks*abs)函数:清空通讯录中的所有联系人信息。
4. 控制结构与输入输出:
使用switch语句来根据用户不同的指令执行不同的功能,在进行查找,删除,修改等操作的时候,封装一个独立判断是否存在该联系人的IsHave函数。
三. 系统设计流程:

四. 实验结果及效果展示
首先进入通讯录管理系统界面:
在进行删除,查找联系人等操作之前,首先得有联系人才能进行,但是我们也能直接进行,系统会进行相关提示,这就是整个系统的容错性和健壮性,不会出现其他乱七八糟的错误,如下所示:
当要删除一个当前通讯录并不存在的联系人时,系统就会提示你,查无此人。并且由于我们在代码中加入了system("pause")和system("cls")两行代码,每执行完一个操作就会提示“请按任意键继续”,并且会进行清屏操作,不会影响用户的观感。
下面我们进行添加联系人操作:

输入相关联系人信息,通讯录当中就保存了该联系人。
进行查看联系人操作如下所示:
下面我们进行最后一步,清空通讯录,并退出该系统,如下所示:
当执行完清空通讯录操作之后,我们再执行查看联系人操作,就会发现,通讯录已为空:
最后退出整个通讯录管理系统:
五. 实验总结
本次实验通过设计并实现一个通讯录管理系统,加深了对C++语言结构体、数组、指针、函数、控制结构等概念的深入理解。通过实际操作,掌握了如何将这些知识点应用到实际编程中,提高了编程实践能力和问题解决能力。未来将继续努力,提高自己的编程水平和能力。
六. 附录:源代码
#include<iostream>
using namespace std;
#include<string>
#define MAX 1000//定义好联系人的结构体
typedef struct Person {string p_name; //联系人姓名int p_sex; //联系人性别,1-男,2-女int p_age; //联系人年龄string p_phonenum; //电话号码string p_addresshome; //家庭住址
};//定义好通讯录结构体
typedef struct addressbooks {Person personarry[MAX]; //通讯录保存联系人,这里设置为MAX,也就是最多1000个int a_num; //联系人实际个数
};//函数的声明
void choice();
void AddPerson(addressbooks* abs);
void ShowPerson(addressbooks* abs);
int IsHave(addressbooks* abs, string name);
void DeletePerson(addressbooks* abs, string name);
void FindPerson(addressbooks* abs);
void ModifyPerson(addressbooks* abs);
void ClearAddress(addressbooks* abs);void main() {//通讯录管理系统addressbooks abs;abs.a_num = 0;while (1) {int num1;string name;choice();cin >> num1;switch (num1) {case 1:AddPerson(&abs);break;case 2: cout << "请输入要删除的联系人姓名:" << endl;cin >> name;DeletePerson(&abs, name);break;case 3:FindPerson(&abs);break;case 4:ShowPerson(&abs);break;case 5:ModifyPerson(&abs);break;case 6:ClearAddress(&abs);break;case 0:cout << "感谢使用通讯录管理系统" << endl;return;break;}system("pause");system("cls");}
}//实现通讯录菜单
void choice() {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;cout << "请输入您所要进行的操作(0~6):" << endl;
}//实现添加联系人功能
void AddPerson(addressbooks * abs) {string name;cout << "请输入要添加的联系人姓名:" << endl;cin >> name;abs->personarry[abs->a_num].p_name = name;while (1) {int sex;cout << "请输入要添加的联系人性别:" << endl;cout << "1----男" << endl;cout << "2----女" << endl;cin >> sex;if (sex == 1 || sex == 2) {abs->personarry[abs->a_num].p_sex = sex;break;}else {cout << "输入有误,请输入正确的性别(1,2):" << endl;}}int age;cout << "请输入要添加的联系人年龄:" << endl;cin >> age;abs->personarry[abs->a_num].p_age = age;string phone;cout << "请输入要添加的联系人电话号码:" << endl;cin >> phone;abs->personarry[abs->a_num].p_phonenum = phone;string address;cout << "请输入要添加联系人的家庭住址:" << endl;cin >> address;abs->personarry[abs->a_num].p_addresshome = address;abs->a_num++;cout << "添加成功" << endl;
}//实现显示联系人的功能
void ShowPerson(addressbooks* abs) {if (abs->a_num == 0) {cout << "当前通讯录为空" << endl;}else {for (int i = 0; i < abs->a_num; i++) {cout << "姓名:" << abs->personarry[i].p_name << "\t";cout << "性别:" << (abs->personarry[i].p_sex == 1 ? "男" : "女") << "\t";cout << "年龄:" << abs->personarry[i].p_age << "\t";cout << "电话号码:" << abs->personarry[i].p_phonenum << "\t";cout << "家庭住址:" << abs->personarry[i].p_addresshome << endl;}}
}//实现一个判断通讯录当中是否有联系人的功能,方便查找,删除,清空等操作
int IsHave(addressbooks* abs, string name) {for (int i = 0; i < abs->a_num; i++) {if (abs->personarry[i].p_name == name) {return i;}}return -1;
}//实现删除联系人功能
void DeletePerson(addressbooks* abs, string name) {int flag=IsHave(abs, name);if (flag == -1) {cout << "查无此人" << endl;}else {for (int i = flag; i < abs->a_num; i++) {abs->personarry[i] = abs->personarry[i + 1];}abs->a_num--;cout << "删除成功" << endl;}
}//实现查找一个联系人的功能
void FindPerson(addressbooks* abs) {string name;cout << "请输入您要查找的联系人姓名:" << endl;cin >> name;int flag = IsHave(abs, name);if (flag != -1) {cout << "姓名:" << abs->personarry[flag].p_name << "\t";cout << "性别:" << (abs->personarry[flag].p_sex == 1 ? "男" : "女") << "\t";cout << "年龄:" << abs->personarry[flag].p_age << "\t";cout << "电话号码:" << abs->personarry[flag].p_phonenum << "\t";cout << "家庭住址:" << abs->personarry[flag].p_addresshome << endl;}else {cout << "查无此人" << endl;}
}//实现修改联系人的功能
void ModifyPerson(addressbooks* abs) {string name;cout << "请输入要修改的联系人姓名:" << endl;cin >> name;int flag = IsHave(abs, name);if (flag != -1) {string name1;cout << "请输入新姓名:" << endl;cin >> name1;abs->personarry[flag].p_name = name1;while (1) {int sex;cout << "请输入联系人新的性别:" << endl;cout << "1----男" << endl;cout << "2----女" << endl;cin >> sex;if (sex == 1 || sex == 2) {abs->personarry[flag].p_sex = sex;break;}else {cout << "输入有误,请输入正确的性别(1,2):" << endl;}}int age1;cout << "请输入联系人年龄:" << endl;cin >> age1;abs->personarry[flag].p_age = age1;string phone1;cout << "请输入联系人电话号码:" << endl;cin >> phone1;abs->personarry[flag].p_phonenum = phone1;string address1;cout << "请输入联系人的家庭住址:" << endl;cin >> address1;abs->personarry[flag].p_addresshome = address1;cout << "修改该联系人成功" << endl;}else {cout << "该通讯录中没有此人" << endl;}
}//实现清空通讯录的功能
void ClearAddress(addressbooks*abs) {int n;cout << "您是否真要执行清空通讯录的功能:" << endl;cout << "1--是" << endl;cout << "2--否" << endl;while (1) {cin >> n;if (n == 1 || n == 2) {if (n == 2) {cout << "您已退出该操作,未执行清空操作" << endl;return;}else {abs->a_num = 0;cout << "该通讯录已清空" << endl;return;}}else {cout << "请输入正确的指令(1或2):" << endl;}}
}
相关文章:
通讯录管理系统
目录 一. 实验目的 二. 系统设计 三. 系统设计流程: 四. 实验结果及效果展示 五. 实验总结 六. 附录:源代码 一. 实验目的 本次实验旨在通过实现一个简单的通讯录管理系统,加深对C语言结构体、数组、指针、函数、控制结构等基本概念的理…...
基于Python爬虫+机器学习的长沙市租房价格预测研究
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
开发效率翻倍攻略!大学生电脑小白管理秘籍,资料秒搜技巧大公开!C盘满了怎么办?如何快速安全的清理C盘?烦人的电脑问题?一键解决!
如何正确管理自己的第一台电脑?大一新生如何管理自己的电脑?老鸟如何追求快捷操作电脑? 文章目录 如何正确管理自己的第一台电脑?大一新生如何管理自己的电脑?老鸟如何追求快捷操作电脑?前言初级基础分区操…...
[C#数据加密]——MD5、SHA、AES、RSA
一、C#数据加密介绍 数据加密是信息安全领域的一个重要组成部分,它用于保护数据不被未授权访问。以下是一些常见的加密算法和方法: 1、MD5 (Message Digest Algorithm 5): 一种广泛使用的哈希函数,可以产生128位的哈希值。通常用于验证文件完…...
QT不阻塞UI的方式
方法1:QtConcurrent #include <QtConcurrent> #include <QFuture> #include <QFutureWatcher> #include <QDebug>void longRunningTask() {// 模拟耗时操作QThread::sleep(5); }void startTask() {QFuture<void> future QtConcurre…...
鸿蒙HarmonyOS开发:常用布局及实用技巧
文章目录 一、概述二、盒子模型三、线性布局(Column/Row)1、space属性2、justifyContent属性3、alignItems属性 四、实用技巧1、Blank组件的使用2、layoutWeight属性的使用 一、概述 布局是指对页面组件进行排列和定位的过程,其目的是有效地…...
【解答】洛必达法则的使用条件及常见错误,洛必达法则的适用条件,常见的易错点,2022数一第一题例题
目录 洛必达法则的使用条件及常见错误 洛必达法则的适用条件 常见的易错点 举例说明(见D选项) 总结 🌈 嗨,我是命运之光! 🌌 2024,每日百字,记录时光,感谢有你&…...
使用Python下载飞书共享表格数据教程
写在前面 随着企业协作办公软件的流行,飞书以其高效的协作能力和便捷的共享功能,成为了许多公司必备的工具之一。在日常工作中,我们经常需要从飞书中下载共享的表格数据进行分析。本文将详细介绍如何使用Python下载飞书共享表格数据。 前置…...
【C++】protobuf的简单使用(通讯录例子)
protobuf的简单使用(通讯录例子) .proto文件的编写保留字段字段唯一编号protobuf的类型enum类型Any类型oneof类型map类型完整通讯录代码.proto文件write文件read文件运行结果 .proto文件的编写 syntax用于指定protobuf的语法;package当.prot…...
Apple 智能基础语言模型
Introducing Apple’s On-Device and Server Foundation Models technical details June 10, 2024 在2024年的全球开发者大会上,苹果推出了Apple Intelligence,这是一个深度集成到iOS 18、iPadOS 18和macOS Sequoia中的个人智能系统。Apple Intelligen…...
GreptimeDB融资数百万美元; Oracle提供免费长期MySQL; 谷歌大模型支持云数据库问题洞察
重要更新 1. 开源时序数据库 GreptimeDB宣布完成数百万美元的新一轮融资。GreptimeDB是一款Rust 语言编写的时序数据库,具有分布式,开源,云原生,兼容性强等特点,帮助企业实时读写、处理和分析时序数据的同时࿰…...
Java中的抽象类与接口
1. 抽象类 1.1 抽象类概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的, 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 比如&…...
云计算概念以及与云服务的区别
目录 1.云的概念 1.1 什么是云? 1.2 云计算的类型 1.3 云计算的服务模式 1.4 云计算的优势 2.云计算和云服务的区别 2.1 定义 2.2 范围 2.3 角色 2.5 举例 2.6使用者 3.总结 1.云的概念 1.1 什么是云? “云”在计算机科学和信息技术领域通常…...
Netty技术全解析:LengthFieldBaseFrameDecoder类深度解析
❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」 ☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 :…...
深入InnoDB核心:揭秘B+树在数据库索引中的高效应用
目录 一、索引页与数据行的紧密关联 (一)数据页的双向链表结构 (二)记录行的单向链表结构 二、未创建索引情况 (一)无索引下的单页查找过程 以主键为搜索条件 以非主键列为搜索条件 (二…...
c++(面向对象的性质:抽象,封装,继承,多态)
ctrla全选,ctrli对齐 ctrl/ 一起注释 ctrlz 退回上一步 一些基础的内容: cout:输出流对象 cin:输入流对象 输入一个i和一个j,然后输出ij的和: 值不变的原因: 值传递,a和i是…...
java基础学习笔记1
Java编程规范 命名风格 1. 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例:_name / __name / $name / name_ / name$ / name__ 2. 【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直…...
[VBA]使用VBA在Excel中 操作 形状shape 对象
excel已关闭地图插件,对于想做 地图可视化 的,用形状来操作是一种办法,就是要自行找到合适的 地图形状,修改形状颜色等就可以用于 可视化展示不同省市销量、人口等数据。 引言 在Excel中,通过VBA(Visual Basic for Applications)可以极大地增强数据可视化和报告自动化…...
Apache POI 实现 Excel 表格下载
这里以苍穹外卖中数据导出功能为例,记录下 Apache POI 导出 Excel 表格的过程。 首先在 pom.xml 中导入相关依赖 <!-- poi 用于操作 excel 表格--> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId&…...
大华嵌入式面试题大全及参考答案(2万字长文)
目录 在C语言中,static 关键字有哪些主要用途? static 修饰的全局变量与普通全局变量有什么区别? 为什么要在嵌入式系统中使用 static 修饰函数? 虚函数与纯虚函数了解么? strcpy 给你加结束符吗,还是要自己加? select 的作用是什么,它和 epoll 的区别? map 与…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
