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

news2024/11/23 13:17:54

文章目录

    • 一、步骤拆分
      • 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.coloradmin.cn/o/1493968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# SwinV2 Stable Diffusion 提示词反推 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 C# SwinV2 Stable Diffusion 提示词反推 Onnx Demo 介绍 模型出处github地址&#xff1a;https://github.com/SmilingWolf/SW-CV-ModelZoo 模型下载地址&#xff1a;https://huggingface.co/SmilingWolf/wd-v1-4-swinv2-tagg…

errno 和 strerror函数

今天写了一个很简单的代码&#xff0c;编译时没啥错误和警告&#xff08;主要编译选项没开启警告&#xff09;&#xff0c;然后运行时居然 segmentation fault&#xff0c;把我给看傻了&#xff0c;代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> …

华为认证网络工程师学习笔记:AAA原理与配置

对于任何网络&#xff0c;用户管理都是最基本的安全管理要求之一。 AAA&#xff08;Authentication, Authorization, and Accounting&#xff09;是一种管理框架&#xff0c;它提供了授权部分用户访问指定资源和记录这些用户操作行为的安全机制。因其具有良好的可扩展性&#…

右值引用(rvalue reference)

定义 C11 引入了右值引用&#xff08;rvalue reference&#xff09;的概念&#xff0c;这是为了支持移动语义&#xff08;move semantics&#xff09;和完美转发&#xff08;perfect forwarding&#xff09;而引入的新特性。右值引用允许我们高效地处理临时对象&#xff0c;避…

运维知识点-hibernate引擎-HQL

HQL有两个主要含义&#xff0c;分别是&#xff1a; HQL&#xff08;Hibernate Query Language&#xff09;是Hibernate查询语言的缩写&#xff0c;它是一种面向对象的查询语言&#xff0c;类似于SQL&#xff0c;但不是去对表和列进行操作&#xff0c;而是面向对象和它们的属性…

Tech.co推荐:小型企业必备的5款财务管理软件

创业不易、守业更难。对于刚起步的小企业来说&#xff0c;财务管理也是拦路虎之一。除了财务团队建设、内部监管的加强&#xff0c;工具使用也必不可少。从趋势上来看&#xff0c;企业的财务数字化转型是必经之路&#xff0c;不过对于小企业来说&#xff0c;在谈数字化转型之前…

STM32 GPIO的几种工作模式

介绍STM32 GPIO的几种工作模式 1、输出模式 STM32的引脚输出有两种方式&#xff1a; 1、推挽输出 2、开漏输出 1.1 推挽输出 当引脚设置为推挽输出时&#xff0c;P-MOS和N-MOS共同配合工作。 当使用HAL库 //该函数的作用就是将P-MOS导通&#xff0c;N-MOS关…

FPGA- RGB_TFT显示屏原理及驱动逻辑

下图是TFT显示屏的显示效果 该显示屏共分为 2 个版本&#xff0c;4.3 寸版本的 TFT4.3’’_V3.0 和 5.0 寸版本的 TFT5.0’’_V3.0。 两者 PCB 背板电路完全相同&#xff0c;接口脚位定义完全相同&#xff0c;接口时序完全相同&#xff0c;仅使用的显示屏 模组尺寸不同。设计两…

chromedriverUnable to obtain driver for chrome using ,selenium找不到chromedriver

1、下载chromedriver chromedriver下载网址&#xff1a;CNPM Binaries Mirror 老版本在&#xff1a;chromedriver/ 较新版本在&#xff1a;chrome-for-testing/ 2、设置了环境变量还是找不到chromedriverUnable to obtain driver for chrome using NoSuchDriverException:…

IDEA修改git提交者的信息

git提交后&#xff0c;idea会记录下提交人的信息&#xff0c;如果不修改提交人信息的话&#xff0c;会有一个默认值。避免每次提交都要填提交人信息&#xff0c;直接设置成自己想要的默认值&#xff0c;该怎么操作&#xff1f; 提交的时候在这里修改提交人信息 避免每次都去设置…

小白优化Oracle的利器”sqltrpt.sql”脚本

SQL调优顾问是Oracle自带的一个功能强大的内部诊断工具&#xff0c;用于对性能不佳的SQL语句给出优化建议。但如果从命令行调用它比较麻烦&#xff0c;幸运的是&#xff0c;Oracle提供了一个方便的内置脚本“sqltrpt.sql”&#xff0c;简化了调用过程。 sqltrpt.sql脚本位于Or…

【论文速读】 | AI驱动修复:漏洞自动化修复的未来

本次分享论文为&#xff1a;AI-powered patching: the future of automated vulnerability fixes 基本信息 原文作者&#xff1a;Jan Nowakowski, Jan Keller 作者单位&#xff1a;Google Security Engineering 关键词&#xff1a;AI, 安全性漏洞, 自动化修复, LLM, sanitiz…

C++初阶篇----类与对象下卷

目录 1.再谈析构函数1.1构造函数体赋值1.2 初始化列表1.3 explicit关键字 2.Static成员2.1概念2.2 特性 3.友元3.1 概念3.2友元函数3.3 友元类 4.内部类4.1 概念 5.匿名对象5.1 概念 6.拷贝对象时的一些编译器优化7.再次理解封装 1.再谈析构函数 1.1构造函数体赋值 在对类的实…

力扣大厂热门面试算法题 - 动态规划

爬梯子、跳跃游戏、最小路径和、杨辉三角、接雨水。每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.05 可通过leetcode所有测试用例。 目录 70. 爬楼梯 解题思路 完整代码 Python Java 55. 跳跃游戏 解题思路 完整代码 Python 代码…

LeetCode每日一题 二叉树的最大深度(二叉树)

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,nul…

大摩突发:将推出比特币ETF

作者&#xff1a;秦晋 随着比特币ETF愈发火爆&#xff0c;华尔街另一家管理1.3万亿美元资产的大型经纪自营商「摩根士丹利」正在蠢蠢欲动&#xff0c;准备进军比特币ETF。 据彭博社数据显示&#xff0c;目前10只比特币现货ETF在上周三创下单日交易新纪录&#xff0c;成交量超过…

太惊艳了!多微信管理利器,让你事半功倍!

作为现代社交媒体的主要平台之一&#xff0c;微信在商务领域中扮演着重要的角色。为了提高我们的工作效率&#xff0c;微信管理系统应运而生。 这个系统可以同时登录多个微信账号&#xff0c;并进行统一管理。除了便捷的登录管理功能外&#xff0c;微信管理系统还提供了许多实…

优思学院|质量和企业的盈利能力有何关系?

质量和企业的盈利能力有何关系&#xff1f;三十年前&#xff0c;这个问题就已经被提出。当时的学者们研究了高质量产品如何带来更高的盈利。虽然这听起来像是老生常谈&#xff0c;但它的真理至今仍深深影响着我们的商业决策。 为了更直观地理解&#xff0c;一些学者绘制了以下…

Redis 核心面试题归纳

文章目录 RedisAOF 相关1. redis AOF 文件备份时&#xff0c;是使用的 write ahead log 的方式吗2. redis 开启AOF后的写入步骤3. redis AOF文件重写过程4.AOF 持久化策略 RDB 相关1.RDB 写入过程rdb 过程中&#xff0c;复制的页表是什么 Redis 主从同步1.PSYNC 和 SYNC 的区别…

Vue 前端开发 v-for和v-if两个指令不能混合使用

原由&#xff1a; 在进行项目开发的时候因为在一个标签上同时使用了v-for和v-if两个指令导致的报错。 提示错误&#xff1a;The undefined variable inside v-for directive should be replaced with a computed property that returns filtered array instead. You should no…