C++入门项目:通讯录管理系统

文章目录

    • 一、步骤拆分
      • 1.系统需求
      • 2.显示菜单
      • 3.添加联系人
      • 4.显示联系人
      • 5.删除联系人
      • 6.查找联系人
      • 7.修改联系人
      • 8.清空通讯录
      • 9.退出功能
    • 二、完整代码(200行)
    • 三、手把手视频教程

一、步骤拆分

1.系统需求

利用C++来实现一个通讯录管理系统,系统中需要实现的功能如下:

添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
显示联系人:显示通讯录中所有联系人信息
删除联系人:按照姓名进行删除指定联系人
查找联系人:按照姓名查看指定联系人信息
修改联系人:按照姓名重新修改指定联系人
清空联系人:清空通讯录中所有信息
退出通讯录:退出当前使用的通讯录


2.显示菜单

功能描述: 用户选择功能的界面

菜单界面效果如下图:
在这里插入图片描述


代码实现:

//显示菜单
void showMenu(){
    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;
}

3.添加联系人

在这里插入图片描述

//1.添加联系人
void addPerson(AddressBook &abs){
    cout << "添加联系人" << endl;
    if(abs.size == MAX){
        cout << "通讯录已满,无法添加" << endl;
        return;
    }
    cout << "abs.size = " << abs.size << endl;
    //姓名
    string name;
    cout << "请输入姓名" << endl;
    cin >> name;
    abs.personArray[abs.size].name = name;
    //性别
    string sex;
    cout << "请输入性别" << endl;
    while(true){
        cin >> sex;
        if(sex == "男" || sex == "女"){
            abs.personArray[abs.size].sex = sex;
            break;
        }
        cout << "输入有误,请重新输入性别,男 或 女" << endl;
    }
    //年龄
    int age;
    cout << "请输入年龄" << endl;
    cin >> age;
    abs.personArray[abs.size].age = age;
    //电话
    int phoneNumber;
    cout << "请输入电话" << endl;
    cin >> phoneNumber;
    abs.personArray[abs.size].phoneNumber= phoneNumber;
    //家庭住址
    string address;
    cout << "请输入家庭住址" << endl;
    cin >> address;
    abs.personArray[abs.size].address = address;
    //更新通讯录人数
    abs.size++;
    cout << "添加成功。" << endl;
    return;
}

4.显示联系人

//2.显示所有联系人
void showPerson(AddressBook &abs){
    if(abs.size == 0)  cout << "记录为空";
    else{
        for(int i = 0; i < abs.size; ++i){
            cout << "姓名:" << abs.personArray[i].name << "    ";
            cout << "性别:" << abs.personArray[i].sex << "    ";
            cout << "年龄:" << abs.personArray[i].age << "    ";
            cout << "电话:" << abs.personArray[i].phoneNumber << "    ";
            cout << "住址:" << abs.personArray[i].address << endl;
        }
    }
}

5.删除联系人

在这里插入图片描述

//3.删除联系人
void deletePerson(AddressBook &abs){
    string name;
    cout << "请输入要删除的联系人姓名" <<endl;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        for(int i = ret; i < abs.size; ++i){ //从要删除的位置ret开始,数组中每个数据都前移
            abs.personArray[i] = abs.personArray[i+1]; //数据前移,逻辑删除
        }
        abs.size--; //更新人员数
        cout << "删除成功。" << endl;
    }else{ //ret == -1
        cout << "查无此人。" << endl;
    }
}

6.查找联系人

//4.查找指定的联系人的信息
void findPerson(AddressBook abs){
    cout << "请输入您要查找的联系人" << endl;
    string name;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        cout << "姓名:" << abs.personArray[ret].name << "    ";
        cout << "性别:" << abs.personArray[ret].sex << "    ";
        cout << "年龄:" << abs.personArray[ret].age << "    ";
        cout << "电话:" << abs.personArray[ret].phoneNumber << "    ";
        cout << "住址:" << abs.personArray[ret].address << endl;
    }else{
        cout << "查无此人" << endl;
    }
}

7.修改联系人

//5.修改联系人
void modifyPerson(AddressBook &abs){
    cout << "请输入要修改的联系人姓名" << endl;
    string name;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        //姓名
        cout << "将姓名改为:" << endl;
        string name = "";
        cin >> name;
        abs.personArray[ret].name = name;
        //性别
        cout << "将性别改为:" << endl;
        string sex = "";
        while(true){
            cin >> sex;
            if(sex == "男" || sex == "女"){
                abs.personArray[ret].sex = sex;
                break;  //输入正确,退出循环
            }
            cout << "输入有误,请重新输入" << endl;
        }
        //年龄
        cout << "将年龄改为:" << endl;
        int age = 0;
        cin >> age;
        abs.personArray[ret].age = age;
        //联系电话
        cout << "将电话改为:" << endl;
        string phoneNumber = "";
        cin >> phoneNumber;
        abs.personArray[ret].phoneNumber = phoneNumber;
        //家庭住址
        cout << "将家庭住址改为:" << endl;
        string address = "";
        cin >> address;
        abs.personArray[ret].address = address;
        cout << "修改成功!" << endl;
    }else{
        cout << "查无此人" << endl;
    }
}

8.清空通讯录

//6.清空联系人 (逻辑删除)
void clearPerson(AddressBook &abs){
    cout << "确认是否要清空所有联系人? 确认请输入 1" << endl;
    string str;
    cin >> str;
    if(str == "1"){
        abs.size = 0;
        cout << "联系人目录已清空。" << endl;
    }else{
        cout << "已放弃清空操作。" << endl;
    }
}

9.退出功能

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择7时候,执行退出,选择其他先不做操作,也不会退出程序

case 7:
      cout << "欢迎下次使用,再见。" << endl;
      return 0;



二、完整代码(200行)

#include <iostream>
#include <string>
using namespace std;
#define MAX 5  //通讯录人数上限

//联系人结构体
struct ContactPerson{
    string name;
    string sex;
    int age;
    string phoneNumber;
    string address;
};

//通讯录结构体:数组 + 容量
struct AddressBook{
    struct ContactPerson personArray[MAX];
    int size;
};

//显示菜单
void showMenu(){
    cout << "***********************" << endl;
    cout << "***** 1.添加联系人 *****" << endl;
    cout << "***** 2.显示联系人 *****" << endl;
    cout << "***** 3.删除联系人 *****" << endl;
    cout << "***** 4.查找联系人 *****" << endl;
    cout << "***** 5.修改联系人 *****" << endl;
    cout << "***** 6.清空联系人 *****" << endl;
    cout << "***** 7.退出通讯录 *****" << endl;
    cout << "***********************" << endl;
}

//1.添加联系人
void addPerson(AddressBook &abs){
    cout << "添加联系人,通讯录当前联系人个数:" << abs.size << endl;
    if(abs.size == MAX){
        cout << "通讯录已满,无法添加" << endl;
        return;
    }
    //姓名
    string name;
    cout << "请输入姓名" << endl;
    cin >> name;
    abs.personArray[abs.size].name = name;
    //性别
    string sex;
    cout << "请输入性别" << endl;
    while(true){
        cin >> sex;
        if(sex == "男" || sex == "女"){
            abs.personArray[abs.size].sex = sex;
            break;
        }
        cout << "输入有误,请重新输入性别,男 或 女" << endl;
    }
    //年龄
    int age;
    cout << "请输入年龄" << endl;
    cin >> age;
    abs.personArray[abs.size].age = age;
    //电话
    string phoneNumber;
    cout << "请输入电话" << endl;
    cin >> phoneNumber;
    abs.personArray[abs.size].phoneNumber= phoneNumber;
    //家庭住址
    string address;
    cout << "请输入家庭住址" << endl;
    cin >> address;
    abs.personArray[abs.size].address = address;
    //更新通讯录人数
    abs.size++;
    cout << "添加成功。" << endl;
    return;
}

//2.显示所有联系人
void showPerson(AddressBook &abs){
    if(abs.size == 0)  cout << "当前记录为空,没有联系人。" << endl;
    else{
        for(int i = 0; i < abs.size; ++i){
            cout << "姓名:" << abs.personArray[i].name << "    ";
            cout << "性别:" << abs.personArray[i].sex << "    ";
            cout << "年龄:" << abs.personArray[i].age << "    ";
            cout << "电话:" << abs.personArray[i].phoneNumber << "    ";
            cout << "住址:" << abs.personArray[i].address << endl;
        }
    }
}

//3.检测联系人是否存在:若存在,返回联系人在通讯录中的位置;若不存在,返回-1
int isExist(AddressBook abs,string name){
    for(int i = 0; i < abs.size; ++i){  //数组下标从0开始
        if(abs.personArray[i].name == name)  return i;
    }
    return -1;
}

//3.删除联系人
void deletePerson(AddressBook &abs){
    string name;
    cout << "请输入要删除的联系人姓名" <<endl;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        for(int i = ret; i < abs.size; ++i){ //从要删除的位置ret开始,数组中每个数据都前移
            abs.personArray[i] = abs.personArray[i+1]; //数据前移,逻辑删除
        }
        abs.size--; //更新人员数
        cout << "删除成功。" << endl;
    }else{ //ret == -1
        cout << "查无此人。" << endl;
    }
}

//4.查找指定的联系人的信息
void findPerson(AddressBook abs){
    cout << "请输入您要查找的联系人" << endl;
    string name;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        cout << "姓名:" << abs.personArray[ret].name << "    ";
        cout << "性别:" << abs.personArray[ret].sex << "    ";
        cout << "年龄:" << abs.personArray[ret].age << "    ";
        cout << "电话:" << abs.personArray[ret].phoneNumber << "    ";
        cout << "住址:" << abs.personArray[ret].address << endl;
    }else{
        cout << "查无此人" << endl;
    }
}

//5.修改联系人
void modifyPerson(AddressBook &abs){
    cout << "请输入要修改的联系人姓名" << endl;
    string name;
    cin >> name;
    int ret = isExist(abs,name);
    if(ret != -1){
        //姓名
        cout << "将姓名改为:" << endl;
        string name = "";
        cin >> name;
        abs.personArray[ret].name = name;
        //性别
        cout << "将性别改为:" << endl;
        string sex = "";
        while(true){
            cin >> sex;
            if(sex == "男" || sex == "女"){
                abs.personArray[ret].sex = sex;
                break;  //输入正确,退出循环
            }
            cout << "输入有误,请重新输入" << endl;
        }
        //年龄
        cout << "将年龄改为:" << endl;
        int age = 0;
        cin >> age;
        abs.personArray[ret].age = age;
        //联系电话
        cout << "将电话改为:" << endl;
        string phoneNumber = "";
        cin >> phoneNumber;
        abs.personArray[ret].phoneNumber = phoneNumber;
        //家庭住址
        cout << "将家庭住址改为:" << endl;
        string address = "";
        cin >> address;
        abs.personArray[ret].address = address;
        cout << "修改成功!" << endl;
    }else{
        cout << "查无此人" << endl;
    }
}

//6.清空联系人 (逻辑删除)
void clearPerson(AddressBook &abs){
    cout << "确认是否要清空所有联系人? 确认请输入 1" << endl;
    string str;
    cin >> str;
    if(str == "1"){
        abs.size = 0;
        cout << "联系人目录已清空。" << endl;
    }else{
        cout << "已放弃清空操作。" << endl;
    }
}

int main() {
    AddressBook abs; //创建一个通讯录对象
    abs.size = 0;

    while(true){
        cout << endl;
        showMenu(); //菜单调用

        cout << "请输入您选择的功能编号" << endl;
        int select = 0; //用户选择
        cin >> select;

        if (cin.fail()) { // 检查是否输入错误
            cin.clear(); // 清除cin的错误状态
            cin.ignore(); // 清除缓冲区直到下一个换行符
            // 输出错误信息并继续循环
            cout << "输入无效,请输入一个数字。" << endl;
            continue;
        }

        switch(select) {  //switch-case结构
            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:
                clearPerson(abs);
                break;
            case 7:
                cout << "欢迎下次使用,再见。" << endl;
                return 0;
            default:
                cout << "功能数字不存在" << endl;
        }
    }
}



三、手把手视频教程

1.通讯录管理系统

2.黑马程序员 C++语法教程

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

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

相关文章

[计算机效率] 软件优化及垃圾清理

1.7 软件优化及垃圾清理 1.7.1 Advanced SystemCare(优化清理) Advanced SystemCare是一款功能强大的系统性能优化软件&#xff0c;可以全方位诊断系统&#xff0c;找到性能瓶颈并进行有针对性的优化&#xff0c;提升系统运行速度和网络速度&#xff0c;还可以清理加速和保护…

串联谐振电路基础知识2(总结篇)

我们发现对于串联谐振电路,整个电路来讲,不是纯感性,也不是纯容性,也不一定是纯阻性 如果,感抗=容抗,那么感抗容抗刚好抵消,谐振电路呈纯阻性了 如果是,感抗>容抗,那么串联谐振电路就是,感抗抵消容抗之后还剩下部分感抗。对于这个串联谐振电路而言,他就是等效成感…

基于springboot的作业管理系统论文

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的作业管理系统有…

七牛云 上传 文件 file is empty

问题 七牛云 上传 文件 file is empty 详细问题 笔者进行Android 开发&#xff0c;使用URI上传文件&#xff0c;上传核心代码 具体报错信息 {ver:8.7.0,ResponseInfo:1709276329412131,status:-6, reqId:, xlog:null, xvia:null, host:null, time:1709276329,error:file is…

运维知识点-ACCESS

ACCESS access 扫出后缀为asp的数据库文件 迅雷下载&#xff0c;直接改后缀为.mdbMicrosoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点&#xff0c;是 Microsoft Office 的系统程序之一。 Microsoft Off…

JavaScript变量声明提升,网站前端开发学习

第一个阶段&#xff0c;开发环境和工具准备 浏览器 &#xff08;Google&#xff0c;FireFox&#xff0c;…&#xff09;下载&#xff0c;安装前端开发工具vscode&#xff0c;下载、安装 node、npm、webpack、webpack-cli、cnpm&#xff0c;配置前端开发环境下载、配置PHP和MyS…

【数据结构】队列 循环队列 双端队列——顺序队列+链式队列完整代码(创建、入队、出队)

2.队列 2.1 队列的定义 定义 只允许在一端进行插入&#xff0c;另一端删除的线性表。 特征&#xff1a;先进先出&#xff08;First In First Out->FIFO&#xff09; 重要术语&#xff1a;队头、队尾、空队列 2.2 队列的顺序存储 2.2.1 初始化 结构体 typedef struct{…

unity学习(44)——选择角色菜单——顺利收到服务器的数据

本节的思路参考自&#xff0c;内容并不相同&#xff1a;13ARPG网络游戏编程实践&#xff08;十三&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;四&#xff09;_哔哩哔哩_bilibili 现在的代码写在MessageManager.cs中&#xff0c;函数名UserHandler(是从OnMess…

蓝牙系列三:BLE协议栈各层数据格式解析

继续蓝牙的学习,本篇还是根据韦东山老师的视频理解以及整理。 对于BLE系统,它分为上下两块。上面那一块,我们称为host主机。下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片。如下图所示(Host + Controller,他们的接口是HCI) 对于host这一块,它运行于linu…

YOLOv8-Openvino-ByteTrack【CPU】

纯检测如下&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 注&#xff1a;YOLOv8和YOLOv9代码内容基本一致&#xff01; 全部代码Github&…

OJ_链表合并

题干 C实现 #include <stdio.h> #include <list>using namespace std;int main() {int s1, s2, val;scanf("%d", &s1);list<int> ls1, ls2;for (int i 0; i < s1; i) {scanf("%d", &val);ls1.push_back(val);}scanf("…

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor

arxiv 2023 08的论文 1 intro 1.1 人类流动性的独特性 人类流动性的独特特性在于其固有的规律性、随机性以及复杂的时空依赖性 ——>准确预测人们的行踪变得困难近期的研究利用深度学习模型的时空建模能力实现了更好的预测性能 但准确性仍然不足&#xff0c;且产生的结果…

GIS之深度学习06:CUDA12安装(适配版)

CUDA&#xff08;Compute Unified Device Architecture&#xff09;是NVIDIA开发的并行计算平台和编程模型&#xff0c;用于利用NVIDIA GPU的并行计算能力&#xff0c;它允许开发者使用类似于C语言的编程语言编写并行程序&#xff0c;利用GPU的大规模并行计算能力加速各种类型的…

3D行业趋势2024

3D 行业似乎总是想出新的方法来加快自身的变革速度&#xff0c;并一路上给我们带来惊喜。 2024 年&#xff0c;3D 景观将会发生前所未有的变化&#xff0c;但仍有一些线索可以帮助我们指明正确的方向。 话虽如此&#xff0c;以下是 3D 工程行业正在着手、扩大或可能在来年深入参…

矩阵爆破逆向-条件断点的妙用

不知道你是否使用过IDA的条件断点呢&#xff1f;在IDA进阶使用中&#xff0c;它的很多功能都有大作用&#xff0c;比如&#xff1a;ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大&#xff0c;配合IDA-python的输出语句能够大杀特杀&#xff01; 那么本文就介绍一下这个…

Kaggle竞赛入门级---泰坦尼克号飞船(0.80)

由于数据集需要翻墙&#xff0c;先附上数据集 链接&#xff1a;https://pan.baidu.com/s/10MTlK_3kXMRw6JsSTT8tVg?pwd6666 提取码&#xff1a;6666 注意正文会讲述我的步骤处理思路&#xff08;代码可能并不会完整的放在正文中&#xff08;这过于繁琐了&#xff09;&#…

ArmSoM Rockchip系列产品 通用教程 之 HDMI-IN使用

1. HDMI-IN简介 HDMI IN功能可以通过桥接芯⽚的⽅式实现&#xff0c;将HDMI信号转换成MIPI信号接收RK3588芯⽚平台⾃带HDMI RX模块&#xff0c;可以直接接收HDMI信号&#xff0c;无需通过桥接芯⽚实现。在ArmSoM系列产品中&#xff0c;ArmSoM-W3支持HDMI-IN功能HDMI-IN功能框图…

华大基因护航沙特“2030愿景”实现,将“中国技术”带到中东市场

沙特“2030愿景”提出&#xff0c;要将国民平均寿命从74岁提高到80岁。沙特人民日益增长的医疗健康需求亟待更加全面、高效的医疗卫生体系。2023年&#xff0c;在沙特首都利雅得&#xff0c;由华大基因沙特全资子公司与当地合作方共同成立的综合精准医学检验实验室Genalive开业…

基于单片机的数字温度计设计

目 录 摘 要 I Abstract II 引 言 1 1 整体方案设计 3 1.1 主控芯片类型选择 3 1.2 测温电路选择 3 1.3 系统总体方案 4 2 系统的硬件电路设计 5 2.1 单片机系统设计 5 2.2 显示模块设计 8 2.3 温度读取电路的设计 10 3 系统软件设计 13 3.1 软件开发环境的介绍 13 3.2 系统重…

图像分类技术在城市垃圾分类与处理中的应用与实践

一、引言 在当今世界&#xff0c;城市化进程不断加快&#xff0c;随之而来的是日益增长的垃圾处理压力。城市生活垃圾、工业固体废物和危险废物的处理已经成为环境保护领域的一大挑战。为了应对这一挑战&#xff0c;卫生填埋、垃圾堆肥和垃圾焚烧等技术路线应运而生。其中&…
最新文章