通讯录管理系统
目录
一. 实验目的
二. 系统设计
三. 系统设计流程:
四. 实验结果及效果展示
五. 实验总结
六. 附录:源代码
一. 实验目的
本次实验旨在通过实现一个简单的通讯录管理系统,加深对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 与…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...
