【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的预训练是在大规模文本语料库上进行的,这些语料库涵盖了来自互联网、书籍、文章、对话记录等多种来源的丰富数据。这种大规模的…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
C++中vector类型的介绍和使用
文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
