C++ 小项目 - 通讯录管理系统

C++ 小项目系列教程:

  • 通讯录管理系统

➡️➡️➡️本教程参考自 黑马程序员 C++ 视频课程 其中的 Markdown 文档,仅用于自己学习,源码发布在 Contact-Management。

文章目录

  • 1. 系统需求
  • 2. 创建项目
  • 3. 菜单
  • 4. 主要功能
    • 4.1 添加联系人
    • 4.2 显示联系人
    • 4.3 删除联系人
    • 4.4 查找联系人
    • 4.5 修改联系人
    • 4.6 清空联系人
    • 4.7 退出

1. 系统需求

通讯录是一个可以记录亲人、好友信息的工具,本教程主要利用 C++ 来实现一个通讯录管理系统,需要实现的功能如下:

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

2. 创建项目

作者是基于 Ubuntu 系统,在 VS Code 中编写代码再编译运行,详情请见 Ubuntu 系统安装 VS Code 并配置 C++ 环境。

项目结构如下图所示:

3. 菜单

功能描述: 用户选择功能的界面,如下图

步骤:

  • 封装显示该界面的函数,如 void showMenu()
  • main 主函数中调用该已封装好的函数。

部分代码:

void showMenu(){
    cout << "******************************************" << endl;
    cout << "***********  1. Add contact     **********" << endl;
    cout << "***********  2. Show contact    **********" << endl;
    cout << "***********  3. Delete contact  **********" << endl;
    cout << "***********  4. Find contact    **********" << endl;
    cout << "***********  5. Modify contact  **********" << endl;
    cout << "***********  6. Empty contact   **********" << endl;
    cout << "***********  0. Exit            **********" << endl;
    cout << "******************************************" << endl;
}

4. 主要功能

主要包含如下功能:

  • 添加联系人
  • 显示联系人
  • 删除联系人
  • 查找联系人
  • 修改联系人
  • 清空联系人
  • 退出

设计 - 联系人结构体:

struct Person{
    string m_Name; // name
    int m_Sex; // sex: 0(male) 1(female)
    int m_Age; // age
    string m_Phone; // phone
    string m_Addr; // address
};

设计 - 通讯录结构体:

#define MAX 100
struct Addressbooks{
    struct Person personArray[MAX];
    int m_Size;
};

4.1 添加联系人

功能描述: 实现添加联系人功能(上限为100人),联系人信息包括(姓名、性别、年龄、联系电话和家庭住址)

部分代码:

void addPerson(Addressbooks *abs){
    if (abs->m_Size == MAX){
        cout << "Address book is full, can't be added!" << endl;
        return;
    }
    else{
        // name
        string name;
        cout << "Please enter a name:";
        cin >> name;
        abs->personArray[abs->m_Size].m_Name = name;

        // sex
        cout << "Please enter gender(0->male 1->female):";
        int sex = 0;
        cin >> sex;
        while(true){
            if (sex == 0 || sex == 1){
                abs->personArray[abs->m_Size].m_Sex = sex;
                break;
            }
            cout << "Incorrect input, please re-enter!";
        }

        // age
        cout << "Please enter age:";
        int age=0;
        cin >> age;
        abs->personArray[abs->m_Size].m_Age = age;

        // phone
        cout << "Please enter phone(four digits):";
        string phone = "";
        cin >> phone;
        abs->personArray[abs->m_Size].m_Phone = phone;

        // address
        cout << "Please enter address:";
        string address = "";
        cin >> address;
        abs->personArray[abs->m_Size].m_Addr = address;

        // updated number of persons
        abs->m_Size++;

        cout << "Added Successfully!" << endl << endl;
    }

}

运行效果:

4.2 显示联系人

功能描述: 显示通讯录中已有的联系人信息

部分代码:

void showPerson(Addressbooks *abs){
    if (abs->m_Size == 0){
        cout << "current record is empty" << endl << endl;
    }
    else{
        for (int i = 0; i < abs->m_Size; i++){
            cout << "Name: " << abs->personArray[i].m_Name << "\t";
            cout << "Sex: " << (abs->personArray[i].m_Sex == 0 ? "male" : "female") << "\t";
            cout << "Age: " << abs->personArray[i].m_Age << "\t";
            cout << "Phone: " << abs->personArray[i].m_Phone << "\t";
            cout << "Address: " << abs->personArray[i].m_Addr << endl;
        }
    }
    cout << endl;
}

运行效果:

4.3 删除联系人

功能描述: 按照姓名来删除指定联系人

设计思路:

  • 删除联系人前,需要先判断用户输入的联系人是否存在,存在则删除,反之,提示用户没有“这号人物”;

  • 所以,可以将判断联系人是否存在封装到一个函数中,若存在,返回其索引位置,若不存在,则返回 -1

int isExist(Addressbooks *abs, string name){
    for (int i = 0; i < abs->m_Size; i++){
        if (abs->personArray[i].m_Name == name){
            return i;
        }
    }
    return -1;
}

部分代码:

void deletePerson(Addressbooks *abs){
    cout << "Please enter the contact you want to delete:";
    string name;
    cin >> name;

    int ret = isExist(abs, name);
    if (ret != -1){
        for (int i = ret; i < abs->m_Size; i++){
            abs->personArray[i] = abs->personArray[i + 1];
        }
        abs->m_Size--;
        cout << "Deleted Successfully!" << endl;
    }
    else{
        cout << "This person does not exist!" << endl;
    }
    cout << endl;
}

运行效果:

4.4 查找联系人

设计思路: 判断用户指定的联系人是否存在,存在即显示其相关信息,不存在则提示没有“这号人物”。

部分代码:

void findPerson(Addressbooks *abs){
    cout << "Please enter the contact you want to find:";
    string name;
    cin >> name;

    int ret = isExist(abs, name);
    if (ret != -1){
        cout << "Name: " << abs->personArray[ret].m_Name << "\t";
        cout << "Sex: " << (abs->personArray[ret].m_Sex == 0 ? "male" : "female") << "\t";
        cout << "Age: " << abs->personArray[ret].m_Age << "\t";
        cout << "Phone: " << abs->personArray[ret].m_Phone << "\t";
        cout << "Address: " << abs->personArray[ret].m_Addr << endl;
    }
    else{
        cout << "This person does not exist!" << endl ;
    }
    cout << endl;
}

运行效果:

4.5 修改联系人

功能描述: 按照姓名重新修改指定联系人

设计思路: 查找用户输入的联系人,若查找成功,则进行修改操作,反之提示没有“这号人物”。

部分代码:

void modifyperson(Addressbooks *abs){
    cout << "Please enter the contact you want to modify:";
    string name;
    cin >> name;

    int ret = isExist(abs, name);
    if (ret != -1){
        // name
        cout << "Please enter a modified name:";
        cin >> name;
        abs->personArray[ret].m_Name = name;

        // sex
        cout << "Please enter a modified gender(0->male 1->female):";
        int sex = 0;
        while (true)
        {
            cin >> sex;
            if (sex == 0 || sex == 2){
                abs->personArray[ret].m_Sex = sex;
                break;
            }
            cout << "Incorrect input, please re-enter!";
        }

        // age
        cout << "Please enter a modified age:";
        int age=0;
        cin >> age;
        abs->personArray[ret].m_Age = age;

        // phone
        cout << "Please enter a modified phone(four digits):";
        string phone = "";
        cin >> phone;
        abs->personArray[ret].m_Phone = phone;

        // address
        cout << "Please enter a modified address:";
        string address = "";
        cin >> address;
        abs->personArray[ret].m_Addr = address;

        cout << "Modified successfully!" << endl;
    }
    else{
        cout << "This person does not exist!" << endl;
    }
    cout << endl;
}

运行效果:

4.6 清空联系人

功能描述: 清空通讯录中的所有信息

实现思路: 将通讯录中的所有联系人信息清除掉,只需将其联系人数量置为 0,做逻辑清空即可。

部分代码:

void emptyPerson(Addressbooks *abs){
    abs->m_Size = 0;
    cout << "Address book cleared!" << endl;
}

4.7 退出

功能描述: 退出通讯录系统,根据用户的不同选择,进入不同的功能,可以考虑 switch 分支结构;当用户输入 0 时,执行退出操作,输入其他时,执行对应的操作。

部分代码:

switch(select){
            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: 
                emptyPerson(&abs);
                break;
            case 0: // exit
                cout << "Welcome to next time!" << endl;
                return 0;
                break;
            default: break;
        }

运行效果:

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

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

相关文章

关于主干布线,你应该知道什么

所有大型建筑都需要复杂的通信网络才能有效运行。这需要多个不同的通信室和电缆将这些房间连接在一起。在这里&#xff0c;骨干布线是任何建筑物通信系统的重要组成部分&#xff0c;可以发挥作用。 那么&#xff0c;什么是骨干布线&#xff1f;它是做什么用的&#xff1f;它究…

Monaco Editor系列(四)版本对比、自定义右键菜单、光标滚动

前言&#xff1a;亲爱的小伙伴们&#xff0c;又见面了&#xff01;上一篇文章我们一起学习了 Monaco Editor 的几个功能&#xff0c;设置内容、多文件编辑、自定义主题&#xff1b;下面让我们继续Monaco Editor的旅程吧&#xff01; 前情提要&#xff1a; 上一篇文章我介绍了M…

Facebook隐私保护:用户数据安全的关键挑战

在数字化时代&#xff0c;数据已成为最宝贵的资源之一。社交媒体平台如Facebook为用户提供了便捷的交流和信息分享工具&#xff0c;但同时也面临着如何保护用户数据安全和隐私的挑战。本文将深入探讨Facebook在数据安全方面面临的关键挑战&#xff0c;以及其如何应对这些挑战&a…

部署Zabbix5.0

一.部署zabbix客户端 端口号10050 zabbix 5.0 版本采用 golang 语言开发的新版本客户端 agent2 。 zabbix 服务端 zabbix_server 默认使用 10051 端口&#xff0c;客户端 zabbix_agent2 默认使用 10050 端口。 1.1.关闭防火墙和selinux安全模块 systemctl disable --now fir…

python中的列表、元组、字典、集合(集合篇)

数据类型定义符号访问元素是否可变是否重复是否有序列表 [ ]索引可变可重复有序元组&#xff08;&#xff09;索引不可变可重复有序字典{key&#xff1a;value}键可变可重复无序集合{ }可变不可重复无序 基本概念 python语言中的集合是无序的、可变的容器类对象&#xff0c;所…

【Web】HTML基础

专栏文章索引&#xff1a;Web 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、HTML介绍 1.HTML 定义 2.标签语法 3.HTML 基本骨架 4.标签的关系 5.HTML 注释 二、标签 1.排版标签 1.1 标题标签 1.2 段落标签 1.3 换行标签 1.4 水平线标签 1.5 文本格…

Python学习(四)

文件操作 想想我们平常对文件的基本操作&#xff0c;大概可以分为三个步骤(简称文件操作三步走): ① 打开文件 ② 读写文件 ③ 关闭文件 注意:可以只打开和关闭文件&#xff0c;不进行任何读写 在Python&#xff0c;使用open函数&#xff0c;可以打开一个已经存在的文件&…

4.16作业

1.总结keil5下载代码和编译代码需要注意的事项 一、在编译代码时需要先点击魔术棒点击 修改flash Downlond 和pack 二、可以通过F12转跳到对应的函数中&#xff0c;查看函数的原型 三、注释出现乱码通过 Edit中的中的来修改 四、要先bulid在load 2.总结STM32Cubemx的使用方…

【UE 材质】表面湿润效果

效果 步骤 1. 创建一个材质函数&#xff0c;这里命名为“MF_Weather_Wetness”&#xff0c;打开材质函数添加如下节点 其中输入的默认值分别为&#xff1a; 其中&#xff0c;“Desaturation”节点用于控制饱和度&#xff0c;我们通过给“Fraction”引脚输入一个负值来增加饱和…

【AR开发示例】实现AR管线巡检

写在前面的话 这是一篇旧文档&#xff0c;代码仓库见 https://gitee.com/tanyunxiu/AR-pipe 本文档是基于超图移动端SDK的AR模块开发的示例&#xff0c;仅供参考&#xff0c;SDK在持续迭代中&#xff0c;相关描述可能有变化。 示例介绍 这是一个使用AR查看墙内管线的基础示…

授权协议OAuth 2.0之除了授权码许可还有什么授权流程?

写在前面 源码 。 本文看下OAuth2.0的另外3中授权流程&#xff0c;资源拥有者凭据许可&#xff0c;客户端许可&#xff0c;隐式许可。分别看下具体的使用流程以及该使用场景。 1&#xff1a;资源拥有者凭据许可 资源拥有者凭据许可&#xff0c;这里资源拥有者的凭据是什么呢&…

【C++核心】面向对象的三大特性

面向对象的三大特性 一、封装性1. 封装性的意义1.1 表现事物1.2 权限控制1.3 成员属性设置为私有 2. 封装性的衍生知识2.1 struct和class区别2.2 友元2.2.1 全局函数做友元2.2.2 类做友元2.2.3 成员函数做友元 二、继承性1. 继承的语法2. 继承方式3. 继承中的对象模型3.1 说明3…

17 如何查看Hadoop中wordCount源码

1.进入官网下载源码并进行解压操作&#xff1a; 我们使用的是hadoop-3.1.4版本&#xff0c;直接进入官网进行下载&#xff1a;https://archive.apache.org/dist/hadoop/common/hadoop-3.1.4/ 下载得到的文件如下图所示&#xff1a; 解压后的文件&#xff1a; 2.使用Idea打开此项…

vue3.0项目生成标签条形码(插件:jsbarcode)并打印(插件:Print.js)支持pda扫码枪扫描

文章目录 功能场景生成条形码设置打印功能踩坑 功能场景 功能场景&#xff1a;供应链中对一些货品根据赋码规则进行赋码&#xff0c;赋码之后生成根据赋码结果生成条形码&#xff0c;执行打印功能&#xff0c;贴在货品之上&#xff0c;打印之后可以用pda的手枪进行扫描&#x…

(亲测有效)win7安装nodejs高版本(18.8.0)

现在学习vue3,vite,使用pnpm创建项目都需要高版本的nodejs了&#xff0c;win7最高只能安装13版本&#xff0c;好多已经不支持了。当然此篇只是以安装18.8.0为例&#xff0c;可以替换成更高的18或者20版本&#xff0c;只是太高的话可能出现冲突&#xff0c;够用就好。希望对各位…

如何修改WordPress数据库表前缀以提高安全性

WordPress作为世界上最受欢迎的内容管理系统之一&#xff0c;吸引了数以百万计的用户。然而&#xff0c;正因为其广泛的使用&#xff0c;WordPress网站也成为了黑客攻击的目标之一。其中一个最常见的安全漏洞是使用默认的数据库表前缀wp_&#xff0c;使得黑客能够更轻松地进行大…

分布式调度器

xxl-job介绍 xxl-job 是一个轻量级分布式任务调度框架&#xff0c;支持动态添加、修改、删除定时任务&#xff0c;支持海量任务分片执行&#xff0c;支持任务执行日志在线查看和分页查询&#xff0c;同时支持任务失败告警和重试机制&#xff0c;支持分布式部署和高可用。xxl-j…

亚马逊云科技官方重磅发布GenAI应用开发学习路线(全免费)

今天小李哥给大家分享的是亚马逊云科技&#xff08;AWS&#xff09;最近官方发布的GenAI应用开发最佳学习路线&#xff0c;不仅内容非常全面更主要的是全部免费&#xff01;大家动动小手就能成为GenAI开发大&#x1f42e;&#xff01; 1️⃣这个GenAI开发学习路线包括什么&…

跟着Datawhale重学数据结构与算法(2)———数组知识

数组定义 数组是一种数据结构&#xff0c;用于存储一系列相同类型的元素。在大多数编程语言中&#xff0c;数组中的每个元素都有一个索引&#xff0c;通常从0开始。 数组的特点 固定大小&#xff1a;一旦定义&#xff0c;数组的大小通常是固定的&#xff0c;不能动态增减。相…

虚拟机数据恢复—KVM虚拟机磁盘文件数据恢复案例

虚拟化数据恢复环境&故障&#xff1a; KVM是Kernel-based Virtual Machine的简称&#xff0c;是一个开源的系统虚拟化模块&#xff0c;自Linux2.6.20版本之后集成在Linux的各个主要发行版本中。KVM使用Linux自身的调度器进行管理。 本案例中的服务器操作系统为Linux&#x…