当前位置: 首页 > news >正文

通讯录管理系统

目录

一. 实验目的

二. 系统设计

三. 系统设计流程:

四. 实验结果及效果展示

五. 实验总结

六. 附录:源代码


一. 实验目的

        本次实验旨在通过实现一个简单的通讯录管理系统,加深对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;}}
}

 

         

相关文章:

通讯录管理系统

目录 一. 实验目的 二. 系统设计 三. 系统设计流程&#xff1a; 四. 实验结果及效果展示 五. 实验总结 六. 附录&#xff1a;源代码 一. 实验目的 本次实验旨在通过实现一个简单的通讯录管理系统&#xff0c;加深对C语言结构体、数组、指针、函数、控制结构等基本概念的理…...

基于Python爬虫+机器学习的长沙市租房价格预测研究

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

开发效率翻倍攻略!大学生电脑小白管理秘籍,资料秒搜技巧大公开!C盘满了怎么办?如何快速安全的清理C盘?烦人的电脑问题?一键解决!

如何正确管理自己的第一台电脑&#xff1f;大一新生如何管理自己的电脑&#xff1f;老鸟如何追求快捷操作电脑&#xff1f; 文章目录 如何正确管理自己的第一台电脑&#xff1f;大一新生如何管理自己的电脑&#xff1f;老鸟如何追求快捷操作电脑&#xff1f;前言初级基础分区操…...

[C#数据加密]——MD5、SHA、AES、RSA

一、C#数据加密介绍 数据加密是信息安全领域的一个重要组成部分&#xff0c;它用于保护数据不被未授权访问。以下是一些常见的加密算法和方法&#xff1a; 1、MD5 (Message Digest Algorithm 5): 一种广泛使用的哈希函数&#xff0c;可以产生128位的哈希值。通常用于验证文件完…...

QT不阻塞UI的方式

方法1&#xff1a;QtConcurrent #include <QtConcurrent> #include <QFuture> #include <QFutureWatcher> #include <QDebug>void longRunningTask() {// 模拟耗时操作QThread::sleep(5); }void startTask() {QFuture<void> future QtConcurre…...

鸿蒙HarmonyOS开发:常用布局及实用技巧

文章目录 一、概述二、盒子模型三、线性布局&#xff08;Column/Row&#xff09;1、space属性2、justifyContent属性3、alignItems属性 四、实用技巧1、Blank组件的使用2、layoutWeight属性的使用 一、概述 布局是指对页面组件进行排列和定位的过程&#xff0c;其目的是有效地…...

【解答】洛必达法则的使用条件及常见错误,洛必达法则的适用条件,常见的易错点,2022数一第一题例题

目录 洛必达法则的使用条件及常见错误 洛必达法则的适用条件 常见的易错点 举例说明&#xff08;见D选项&#xff09; 总结 &#x1f308; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30c; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你&…...

使用Python下载飞书共享表格数据教程

写在前面 随着企业协作办公软件的流行&#xff0c;飞书以其高效的协作能力和便捷的共享功能&#xff0c;成为了许多公司必备的工具之一。在日常工作中&#xff0c;我们经常需要从飞书中下载共享的表格数据进行分析。本文将详细介绍如何使用Python下载飞书共享表格数据。 前置…...

【C++】protobuf的简单使用(通讯录例子)

protobuf的简单使用&#xff08;通讯录例子&#xff09; .proto文件的编写保留字段字段唯一编号protobuf的类型enum类型Any类型oneof类型map类型完整通讯录代码.proto文件write文件read文件运行结果 .proto文件的编写 syntax用于指定protobuf的语法&#xff1b;package当.prot…...

Apple 智能基础语言模型

Introducing Apple’s On-Device and Server Foundation Models technical details June 10, 2024 在2024年的全球开发者大会上&#xff0c;苹果推出了Apple Intelligence&#xff0c;这是一个深度集成到iOS 18、iPadOS 18和macOS Sequoia中的个人智能系统。Apple Intelligen…...

GreptimeDB融资数百万美元; Oracle提供免费长期MySQL; 谷歌大模型支持云数据库问题洞察

重要更新 1. 开源时序数据库 GreptimeDB宣布完成数百万美元的新一轮融资。GreptimeDB是一款Rust 语言编写的时序数据库&#xff0c;具有分布式&#xff0c;开源&#xff0c;云原生&#xff0c;兼容性强等特点&#xff0c;帮助企业实时读写、处理和分析时序数据的同时&#xff0…...

Java中的抽象类与接口

1. 抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c; 如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 比如&…...

云计算概念以及与云服务的区别

目录 1.云的概念 1.1 什么是云&#xff1f; 1.2 云计算的类型 1.3 云计算的服务模式 1.4 云计算的优势 2.云计算和云服务的区别 2.1 定义 2.2 范围 2.3 角色 2.5 举例 2.6使用者 3.总结 1.云的概念 1.1 什么是云&#xff1f; “云”在计算机科学和信息技术领域通常…...

Netty技术全解析:LengthFieldBaseFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…...

深入InnoDB核心:揭秘B+树在数据库索引中的高效应用

目录 一、索引页与数据行的紧密关联 &#xff08;一&#xff09;数据页的双向链表结构 &#xff08;二&#xff09;记录行的单向链表结构 二、未创建索引情况 &#xff08;一&#xff09;无索引下的单页查找过程 以主键为搜索条件 以非主键列为搜索条件 &#xff08;二…...

c++(面向对象的性质:抽象,封装,继承,多态)

ctrla全选&#xff0c;ctrli对齐 ctrl/ 一起注释 ctrlz 退回上一步 一些基础的内容&#xff1a; cout&#xff1a;输出流对象 cin&#xff1a;输入流对象 输入一个i和一个j&#xff0c;然后输出ij的和&#xff1a; 值不变的原因&#xff1a; 值传递&#xff0c;a和i是…...

java基础学习笔记1

Java编程规范 命名风格 1. 【强制】代码中的命名均不能以下划线或美元符号开始&#xff0c;也不能以下划线或美元符号结束。 反例&#xff1a;_name / __name / $name / name_ / name$ / name__ 2. 【强制】代码中的命名严禁使用拼音与英文混合的方式&#xff0c;更不允许直…...

[VBA]使用VBA在Excel中 操作 形状shape 对象

excel已关闭地图插件,对于想做 地图可视化 的,用形状来操作是一种办法,就是要自行找到合适的 地图形状,修改形状颜色等就可以用于 可视化展示不同省市销量、人口等数据。 引言 在Excel中,通过VBA(Visual Basic for Applications)可以极大地增强数据可视化和报告自动化…...

Apache POI 实现 Excel 表格下载

这里以苍穹外卖中数据导出功能为例&#xff0c;记录下 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 与…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...