【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); // 退出程序
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/503619.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat部署及多实例

一、Tomcat简介 1、简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 当在一台机器上配置好Apache 服务器&#xff0c…

ElasticSearch搜索引擎使用指南

一、ES数据基础类型 1、数据类型 字符串 主要包括: text和keyword两种类型&#xff0c;keyword代表精确值不会参与分词&#xff0c;text类型的字符串会参与分词处理 数值 包括: long, integer, short, byte, double, float 布尔值 boolean 时间 date 数组 数组类型不…

VMware虚拟机找不到*.vmdk文件

解决方法&#xff1a;查看这些文件序号是否连续&#xff0c;如果不是连续的&#xff0c;看看是否有其它软件误删了&#xff0c;如病毒防护软件&#xff0c;尝试恢复被删除的文件。 在这里恢复

IPD MM流程之业务策略工具:安索夫矩阵

IPD市场管理流程&#xff0c;华为内部称为“MM流程”&#xff08;Market Management&#xff0c;MM&#xff09;。华为市场管理是通过对市场和细分市场的分析&#xff0c;制定细分市场的策略&#xff0c;形成商业计划&#xff0c;把商业计划落实在日常工作当中。MM流程其中一个…

StarRocks实战——表设计规范与监控体系

目录 前言 一、StarRocks表设计 1.1 字段类型 1.2 分区分桶 1.2.1 分区规范 1.2.2 分桶规范 1.3 主键表 1.3.1 数据有冷热特征 1.3.2 大宽表 1.4 实际案例 1.4.1 案例一&#xff1a;主键表内存优化 1.4.2 案例一&#xff1a;Update内存超了&#xff0c;导致主键表导…

nginx 配置浏览器不缓存文件 每次都会从服务器 请求新的文件

目录 解决问题方法说明 测试html环境js环境第一步然后修改内容 打开带有js缓存的页面强制刷新 配置nginx 每次打开页面都会重新请求index.js 文件重启nginx再次修改index.js 总结设置为全局 解决问题 适用于实时更新数据的&#xff0c;网页 可以让用户每次都是重新请求&#x…

计算机网络——22TCP拥塞

TCP拥塞 TCP拥塞控制机制 端到端的拥塞控制机制 路由器不向主机有关拥塞的反馈信息 路由器的负担较轻符合网络核心简单的TCP/IP架构原则 端系统根据自身得到的信息&#xff0c;判断是否发生拥塞&#xff0c;从而采取动作 拥塞控制的几个问题 如何检测拥塞 轻微拥塞拥塞 控…

Java中封装的解析

在 Java 中&#xff0c;封装是一种将类的内部实现细节隐藏起来&#xff0c;只向外部暴露必要的接口的机制。这样可以提高代码的安全性、可维护性和可重用性。 封装的主要目的是保护类的内部状态不被外部直接访问&#xff0c;同时提供公共的方法来操作这些状态。通过封装&#…

【airtest】自动化入门教程(三)Poco操作

目录 一、准备工作 1、创建一个pthon脚本 2、光标位置 2、选择Android 3、选择yes 二、定位元素 三、poco基于设备/屏幕 方式 1、poco.click( (x,y))基于屏幕点击相对坐标为x&#xff0c;y的位置 2、poco.get_screen_size() 3、poco.swipe(v1,v2)基于屏幕从v1位置滑到…

物联网与智慧城市:科技驱动下的城市智能化升级之路

一、引言 随着科技的不断进步和城市化进程的加速&#xff0c;物联网与智慧城市的结合已经成为推动城市智能化升级的关键力量。物联网技术以其强大的连接和数据处理能力&#xff0c;为智慧城市的建设提供了无限可能。本文旨在探讨物联网如何助力智慧城市的构建&#xff0c;以及…

midjourney提示词语法

更高级的提示可以包括一个或多个图像URL、多个文本短语和一个或更多个参数 Image Prompts 可以将图像URL添加到提示中&#xff0c;以影响最终结果的样式和内容。图像URL总是位于提示的前面。 https://docs.midjourney.com/image-prompts Text Prompt 要生成的图像的文本描述。…

什么是Vue组件?如何在Vue中定义一个组件?

在前端开发中&#xff0c;Vue.js是一种流行的JavaScript框架&#xff0c;用于构建交互式的Web界面。Vue组件是Vue.js中非常重要的概念&#xff0c;它允许我们将UI划分为可重用、独立和功能性的代码块。在Vue.js中&#xff0c;每个组件都有自己的HTML模板、JavaScript逻辑和CSS样…