【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--;                                           // 通讯录人数-1
        cout << "删除成功" << 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); // 退出程序
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript类型转换

一些需要注意的数据类型&#xff1a; NaN的数据类型是numberArray、Date、null的数据类型是object未定义变量的数据类型是undefined 自动转换类型&#xff1a;尝试操作一个 “错误” 的数据类型时&#xff0c;会自动转换为 “正确” 的数据类型。 5 null // 返回 5 …

百度测试经理,对自动化测试初学者的一些忠告

前言 相信很多的测试人员都有这样的顾虑&#xff0c;初学自动化测试应该怎么去做&#xff0c;那么现在我就把我在百度测试岗学到的经验分享给大家&#xff0c;希望对你们有帮助。 为了大家在学习的道路上更加轻松&#xff0c;我还给大家整理了一套Python自动化测试学习资料以…

Vue全家桶:vue2+vue3全部搞懂:第五篇,Vue的watch监视器

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;不然不好懂 这一专栏知识将一次性将vue、vue2、vue3全部讲明白 一、何为watch监视器 其实我个人理解&#xff0c;就跟原本的表单的input事件一样&#xff0c;实时监视事件发生并同步更新数…

RuoYi-Vue-Plus功能分析-jackson配置

文章目录 前言一、配置文件二、配置类三、注解四、json工具类1. 工具内容2. 使用工具 前言 前端在给我发送请求的时候一般包含三个部分url&#xff0c;header&#xff0c;body。那么就会涉及我们后端如何接收这些请求参数并且我们处理完毕参数后前端又如何接收参数 通过url传…

【python】json转成成yaml中文编码异常显示成:\u5317\u4EAC\u8DEF123\u53F7

姊妹篇&#xff1a;【python】json转成成yaml json数据 {"name": "张三","age": 30,"isMarried": false,"children": [{"name": "小王","age": 5},{"name": "小李",&qu…

装饰器模式 详解 设计模式

装饰器模式 它允许你在不改变对象结构的情况下&#xff0c;动态地将新功能附加到对象上。 结构&#xff1a; 抽象组件&#xff08;Component&#xff09;&#xff1a;定义了原始对象和装饰器对象的公共接口或抽象类&#xff0c;可以是具体组件类的父类或接口。具体组件&…

算法--动态规划(线性DP、区间DP)

这里写目录标题 tip数组下标从0开始还是从1开始 线性DP数学三角形介绍算法思想例题代码 最长上升子序列介绍算法思想例题代码 最长公共子序列介绍算法思想例题代码 编辑距离介绍例题代码 区间DP问题石子合并介绍算法思想例题代码 tip 数组下标从0开始还是从1开始 如果代码中涉…

Topaz Video AI:一键提升视频品质,智能重塑影像魅力 mac/win版

Topaz Video AI是一款革命性的视频智能处理软件&#xff0c;它利用先进的机器学习和人工智能技术&#xff0c;为视频创作者提供了前所未有的视频增强和修复功能。无论您是专业视频编辑师、摄影师&#xff0c;还是热爱视频创作的爱好者&#xff0c;Topaz Video AI都能帮助您轻松…

返回JSON对象

在目前的Java项目中&#xff0c;我们最经常使用的便是JSON&#xff0c;不是传递JSON对象&#xff0c;就是返回JSON对象&#xff0c;甚至还把多个参数封装成JSON对象来进行传递&#xff0c;以便简化代码等&#xff01; 但是&#xff0c;该如何操作代码才能正确的返回一个或者多…

excel导出标准化

虽然标题叫标准化&#xff0c;只不过是我自己的习惯&#xff0c;当一件事情变得流程标准化之后&#xff0c;开发程序就会飞快&#xff0c;开发评估工作总是 搞个1~2天&#xff0c;实则前端后端一起开发&#xff0c;1个小时就可以搞定。 1 前端 const exportXls async () >…

每日一题——LeetCode1556.千位分隔符

方法一 个人方法&#xff1a; 把n转为字符串&#xff0c;逆序遍历n&#xff0c;把n的每个元素加入res&#xff0c;每三次加入.&#xff0c;最后将res翻转再转为字符串即为符合题目要求的结果 var thousandSeparator function(n) {nlet res[],lenn.length-1for(let ilen;i>…

tomcat 搭建博客 及破解数据库密码

一 tomcat 搭建博客 &#xff08;一&#xff09;博客安装包 1&#xff0c; 把博客war包 放到 webapps 文件夹下 2&#xff0c;会自动解压 3&#xff0c;做个软连接 方便后续操作 可以注意到 因为war包 是又tomcat 自己解压的 所以属主数组还是 tomcat &#xff08…

大模型生成,Open API调用

大模型是怎么生成结果的 通俗原理 其实&#xff0c;它只是根据上文&#xff0c;猜下一个词&#xff08;的概率&#xff09;…… OpenAI 的接口名就叫【completion】&#xff0c;也证明了其只会【生成】的本质。 下面用程序演示【生成下一个字】。你可以自己修改 prompt 试试…

LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

电脑休眠之后唤不醒

现象&#xff1a;午休时间电脑休眠了&#xff0c;醒来之后发现在密码输入界面&#xff0c;但鼠标键盘没反应。按重启键或电源机重新开机&#xff0c;结果开不了机。 原因&#xff1a;1、内存条脏了&#xff0c;导致内存条读取失败 2、休眠的时候硬盘休眠了&#xff0c;导致按…

7、Redis-事务、持久化、内存淘汰机制和过期key处理

目录 一、事务 二、持久化 三、内存淘汰机制 四、过期key处理 一、事务 Redis的事务本质上就是一个批量执行命令的操作。分为三个步骤&#xff1a; 开始事务&#xff1a;multi命令入队&#xff1a;正常输入命令即可执行事务&#xff08;依次执行命令&#xff09;&#xf…

linux_day04

大纲&#xff1a;命令&#xff0c;vim&#xff0c;gcc&#xff0c;编译工具&#xff0c;生成代码&#xff0c;调试&#xff0c;库makefile&#xff0c;系统编程 文件系统&#xff1a;文件属性&#xff0c;文件内容&#xff0c;万物皆文件&#xff08;不在内存中的是文件&#…

为什么说?上位机开发有广泛的前景

上位机开发展现了广泛的前景&#xff0c;主要有以下几个方面的原因&#xff1a; 广泛应用的C#语言&#xff1a; C#在软件开发领域得到了广泛应用&#xff0c;拥有丰富的库、工具和社区支持&#xff0c;使得学习和使用C#进行上位机开发更加便捷。与Windows密切相关&#xff1a; …

LeetCode -- 79.单词搜索

1. 问题描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水…

用 Pytest+Allure 生成漂亮的 HTML 图形化测试报告

本篇文章将介绍如何使用开源的测试报告生成框架 Allure 生成规范、格式统一、美观的测试报告。 通过这篇文章的介绍&#xff0c;你将能够&#xff1a; 将 Allure 与 Pytest 测试框架相结合&#xff1b;如何定制化测试报告内容执行测试之后&#xff0c;生成 Allure 格式的测试报…