【c++】通讯录管理系统
1.系统功能介绍及展示
2.创建项目
3.菜单实现
4.退出功能实现
5.添加联系人—结构体设计
6.添加联系人—功能实现
7.显示联系人
8.删除练习人—检测联系人是否存在
9.删除联系人—功能实现
10.查找联系人
11.修改联系人
12.清空通讯录

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;const int MAX = 1e3 + 10; // 最大人数struct Person
{string name; // 姓名string sex; // 性别int age; // 年龄string phone; // 电话号码string address; // 住址
};struct addressbook
{Person personarray[MAX]; // 通讯录中保存的联系人数组int size; // 通讯录中人员个数
};void showMenu();
void addPerson(addressbook *abs);
void showPerson(const addressbook *abs);
int namefind(addressbook *abs);
int phonefind(addressbook *abs);
int addressfind(addressbook *abs);
void deletePerson(addressbook *abs);
void findPerson(addressbook *abs);
void modifyPerson(addressbook *abs);
void ofaddressbook(const addressbook *abs);
void ifaddressbook(addressbook *abs);
void cleanPerson(addressbook *abs);
void end();int main()
{int select;addressbook abs;abs.size = 0;while (true){showMenu(); // 菜单调用cin >> select;system("clear");switch (select){case 0: // 退出通讯录end();break;case 1: // 添加联系人addPerson(&abs);break;case 2: // 显示联系人showPerson(&abs);break;case 3: // 删除联系人deletePerson(&abs);break;case 4: // 查找联系人findPerson(&abs);break;case 5: // 修改联系人modifyPerson(&abs);break;case 6: // 备份通讯录ofaddressbook(&abs);break;case 7: // 恢复通讯录ifaddressbook(&abs);break;case 8: // 清空通讯录cleanPerson(&abs);break;default:cout << "输入错误,请重新输入" << endl;cout << "请按任意键并回车继续" << endl; // MAC系统cin >> select; // MAC系统system("clear"); // MAC系统// system("pause");WINDOWS系统// system("cls");WINDOWS系统continue;}cout << "请按任意键并回车继续" << endl; // MAC系统cin >> select; // MAC系统system("clear"); // MAC系统// system("pause");WINDOWS系统// system("cls");WINDOWS系统}return 0;
}void showMenu()
{cout << "***********************" << endl<< "*****1、添加联系人*****" << endl<< "*****2、显示联系人*****" << endl<< "*****3、删除联系人*****" << endl<< "*****4、查找联系人*****" << endl<< "*****5、修改联系人*****" << endl<< "*****6、备份通讯录*****" << endl<< "*****7、恢复通讯录*****" << endl<< "*****8、清空通讯录*****" << endl<< "*****0、退出通讯录*****" << endl<< "***********************" << endl;
}void addPerson(addressbook *abs)
{if (abs->size == MAX) // 判断通讯录人数是否已满{cout << "通讯录人数已满" << endl;}else{cout << "请输入姓名:";cin >> abs->personarray[abs->size].name;cout << "请输入性别:";cin >> abs->personarray[abs->size].sex;cout << "请输入年龄:";cin >> abs->personarray[abs->size].age;cout << "请输入电话号码:";cin >> abs->personarray[abs->size].phone;cout << "请输入住址:";cin >> abs->personarray[abs->size].address;abs->size++;cout << "联系人添加成功" << endl;}
}void showPerson(const addressbook *abs)
{if (abs->size) // 判断人数是否为零{for (int i = 0; i < abs->size; i++){cout << "姓名:" << abs->personarray[i].name<< "\t性别:" << abs->personarray[i].sex<< "\t年龄:" << abs->personarray[i].age<< "\t电话号码:" << abs->personarray[i].phone<< "\t住址:" << abs->personarray[i].address<< endl;}}else{cout << "通讯录为空" << endl;}
}int namefind(addressbook *abs)
{string name;cout << "请输入您要查找联系人的姓名" << endl;cin >> name;for (int i = 0; i < abs->size; i++) // 查找输入的联系人{if (name.compare(abs->personarray[i].name) == 0){return i;}}return -1;
}int phonefind(addressbook *abs)
{string phone;cout << "请输入您要查找联系人的电话号码" << endl;cin >> phone;for (int i = 0; i < abs->size; i++) // 查找输入的联系人{if (phone.compare(abs->personarray[i].phone) == 0){return i;}}return -1;
}int addressfind(addressbook *abs)
{string address;cout << "请输入您要查找联系人住址" << endl;cin >> address;for (int i = 0; i < abs->size; i++) // 查找输入的联系人{if (address.compare(abs->personarray[i].address) == 0){return i;}}return -1;
}void deletePerson(addressbook *abs)
{int n;cout << "请输入查询方式\n1.姓名\n2.电话号码\n3.住址" << endl;cin >> n;switch (n) // 选择查询方式{case 1:n = namefind(abs);break;case 2:n = phonefind(abs);break;case 3:n = addressfind(abs);break;default:cout << "您输入有误,请重新输入" << endl;}system("clear");if (n != -1){abs->personarray[n] = abs->personarray[abs->size - 1]; // 替换将删除的联系人abs->size--; // 通讯录人数-1cout << "删除成功" << endl;}else{cout << "查无此人" << endl;}
}void findPerson(addressbook *abs)
{int n;cout << "请输入查询方式\n1.姓名\n2.电话号码\n3.住址" << endl;cin >> n;switch (n) // 选择查询方式{case 1:n = namefind(abs);break;case 2:n = phonefind(abs);break;case 3:n = addressfind(abs);break;default:cout << "您输入有误,请重新输入" << endl;}system("clear");if (n != -1){cout << "姓名:" << abs->personarray[n].name<< "\t性别:" << abs->personarray[n].sex<< "\t年龄:" << abs->personarray[n].age<< "\t电话号码:" << abs->personarray[n].phone<< "\t住址:" << abs->personarray[n].address<< endl;}else{cout << "查无此人" << endl;}
}void modifyPerson(addressbook *abs)
{int n;cout << "请输入查询方式\n1.姓名\n2.电话号码\n3.住址" << endl;cin >> n;switch (n) // 选择查询方式{case 1:n = namefind(abs);break;case 2:n = phonefind(abs);break;case 3:n = addressfind(abs);break;default:cout << "您输入有误,请重新输入" << endl;}system("clear");if (n != -1){cout << "请输入修改后的姓名:";cin >> abs->personarray[n].name;cout << "请输入修改后的性别:";cin >> abs->personarray[n].sex;cout << "请输入修改后的年龄:";cin >> abs->personarray[n].age;cout << "请输入修改后的电话号码:";cin >> abs->personarray[n].phone;cout << "请输入修改后的住址:";cin >> abs->personarray[n].address;cout << "修改成功" << endl;}else{cout << "查无此人" << endl;}
}void ofaddressbook(const addressbook *abs)
{ofstream ofs;ofs.open("addressbook.txt", ios::out); // 打开文件ofs << "姓名\t性别\t年龄\t电话号码\t住址" << endl;for (int i = 0; i < abs->size; i++){ofs << abs->personarray[i].name<< "\t\t" << abs->personarray[i].sex<< "\t\t" << abs->personarray[i].age<< "\t\t" << abs->personarray[i].phone<< "\t\t" << abs->personarray[i].address<< endl;}ofs.close(); // 关闭文件cout << "备份成功" << endl;
}void ifaddressbook(addressbook *abs)
{string temp;ifstream ifs;ifs.open("addressbook.txt", ios::in); // 打开文件if (ifs.is_open()){getline(ifs, temp); // 将文件上方的标签输入到临时字符串while (ifs >> abs->personarray[abs->size].name >> abs->personarray[abs->size].sex >> abs->personarray[abs->size].age >> abs->personarray[abs->size].phone >> abs->personarray[abs->size].address){abs->size++; // 人数+1}ifs.close(); // 关闭文件cout << "恢复成功" << endl;}else{cout << "文件打开失败" << endl;}
}void cleanPerson(addressbook *abs)
{abs->size = 0; // 将通讯录清空cout << "通讯录已清空" << endl;
}void end()
{cout << "欢迎下次使用" << endl;exit(0); // 退出程序
}
相关文章:
【c++】通讯录管理系统
1.系统功能介绍及展示 2.创建项目 3.菜单实现 4.退出功能实现 5.添加联系人—结构体设计 6.添加联系人—功能实现 7.显示联系人 8.删除练习人—检测联系人是否存在 9.删除联系人—功能实现 10.查找联系人 11.修改联系人 12.清空通讯录 #include <iostream> #include <…...
Tomcat 架构
一、Http工作原理 HTTP协议是浏览器与服务器之间的数据传送协议。作为应用层协议,HTTP是基于TCP/IP协议来传递数据的(HTML文件、图片、查询结果等),HTTP协议不涉及数据包(Packet)传输,主要规定了…...
Spring 整合mybatis
目录 1、梳理整合思路 2、整合实现 2.1 环境搭建 2.2 案例 1、梳理整合思路 将MyBatis的DataSource交给Spring IoC容器创建并管理,使用第三方数据库连接池(Druid,C3P0等)代替MyBatis内置的数据库连接池将MyBatis的SqlSessionFactory交给Spring IoC容…...
centos7升级openssl_3
1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…...
nvidia a100-pcie-40gb环境安装
1.conda create --name torch_li python3.8 2. conda install pytorch1.7.1 torchvision0.8.2 torchaudio0.7.2 cudatoolkit11.0 -c pytorch 环境测试:torch.cuda.is_available() 3.conda remove -n torch_li --all 4.pip install opencv-python-headless 5.pip ins…...
嵌入式 Linux 下的 LVGL 移植
目录 准备创建工程修改配置修改 lv_drv_conf.h修改 lv_conf.h修改 main.c修改 Makefile 编译运行更多内容 LVGL(Light and Versatile Graphics Library)是一个轻量化的、开源的、在嵌入式系统中广泛使用的图形库,它提供了一套丰富的控件和组件…...
js同步和异步请求
2023.3.2今天我学习了同步请求和异步请求的区别: 同步请求: 指代码按照顺序依次执行,每一行代码都要等待上一行代码执行完成后才能继续执行,比如你有两个接口,它会第一个接口请求完才去请求下一个接口。 异步请求&a…...
【Leetcode】2369. 检查数组是否存在有效划分
文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的整数数组 nums ,你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分: 子数组 恰 由 2 个…...
Laravel Octane 和 Swoole 协程的使用分析
之前在工作中使用 Laravel Octane 的 concurrently 处理并发时,发现在队列和定时任务中不会触发并发效果。经过分析,作了如下猜测:队列和定时任务都属于一个独立的进程,与 Octane 服务无关,而 Octane concurrently 恰恰…...
腾讯云又双叕降价,云服务器配置优惠价格表2024新版报价
腾讯云服务器多少钱一年?62元一年起,2核2G3M配置,腾讯云2核4G5M轻量应用服务器218元一年、756元3年,4核16G12M服务器32元1个月、312元一年,8核32G22M服务器115元1个月、345元3个月,腾讯云服务器网txyfwq.co…...
【react native】css踩坑记录
1、IOS上面opacity重叠失效 在 iOS 上,当两个具有相同背景色的元素重叠时,不透明度(opacity)较低的元素会显示在较高的元素上方。 所以考虑使用rgba的形式。 // 对于下面这种写法,如果存在container和activeIndicat…...
ChatGPT学习第四周
📖 学习目标 ChatGPT实践操作 通过实际操作和练习,加深对ChatGPT功能的理解。 项目:创建一个ChatGPT应用案例 设计一个基于ChatGPT的小项目,将理论应用于实践。 ✍️ 学习活动 学习资料 《万字干货!ChatGPT 从零完…...
2D割草/吸血鬼游戏 性能优化——GPU Spine动画
视频中万人同屏方案(gpu动画、渲染、索敌、避障等功能),可某宝搜店铺:【游戏开发资源商店】获取整套方案源码。 在过去的几年里,割草、类吸血鬼玩法的游戏频出爆款,其丰富的技能、满屏特效、刷怪清屏的解压畅快是此类游戏的核心&…...
VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程
引言劝退 VSCode,全称为Visual Studio Code,是由微软开发的一款轻量级,跨平台的代码编辑器。大家能来搜用VSCode配置c/c,想必也知道VSCode的强大,可以手握一个VSCode同时编写如C,C,C#ÿ…...
[渗透教程]-013-嗅探工具-wireshark操作
文章目录 tor下载wireshark抓包类型启动场景实战tor下载 tor下载链接 zlibary暗网地址 2681506@gmail.com YanErrol123@wireshark Wireshark是网络封包分析软件,可以抓包.可以 使用winpcap与网卡直接进行数据交换.作用: 网络管理员使用wireshark来检测网络问题,网络工程师使用…...
NLP Seq2Seq模型
🍨 本文为[🔗365天深度学习训练营学习记录博客🍦 参考文章:365天深度学习训练营🍖 原作者:[K同学啊 | 接辅导、项目定制]\n🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mi…...
如何在 Linux 上使用 dmesg 命令
文章目录 1. Overview2.ring buffer怎样工作?3.dmesg命令4.移除sudo需求5. 强制彩色输出6.使用人性化的时间戳7.使用dmesg的人性化可读时间戳8.观察实时event9.检索最后10条消息10.搜索特定术语11.使用Log Levels12.使用Facility Categories13.Combining Facility a…...
WPF的DataGrid设置标题头
要设置DataGrid标题头的分割线、背景色和前景色等属性,您可以使用DataGrid的样式和模板来自定义标题头的外观。下面是详细解释以及示例代码: 分割线设置: 您可以使用DataGrid.ColumnHeaderStyle样式中的BorderThickness和BorderBrush属性来设…...
【软考】UML中的图之通信图
目录 1. 说明2. 图示3. 特性4. 例题4.1 例题1 1. 说明 1.通信图强调收发消息的对象的结构组织2.早期版本叫做协作图3.通信图强调参加交互的对象和组织4.首先将参加交互的对象作为图的顶点,然后把连接这些对象的链表示为图的弧,最后用对象发送和接收的消…...
为什么ChatGPT预训练能非常好地捕捉语言的普遍特征和模式
ChatGPT能够非常好地捕捉语言的普遍特征和模式,主要得益于以下几个方面的原因: 大规模语料库:ChatGPT的预训练是在大规模文本语料库上进行的,这些语料库涵盖了来自互联网、书籍、文章、对话记录等多种来源的丰富数据。这种大规模的…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
