C++解决大学课设所有管理系统(增删查改)

C++一篇解决大学课设所有**管理系统(增删查改)

1.引言

​ 话不多说,先看我的任务的需求跟你的是否一致。
在这里插入图片描述

​ (以通讯录管理系统为例),如果你的课设跟以上要求某某管理系统类似的话,也是要求增删查改的话,那么恭喜你刷到此文章。因为所有的大学课设管理系统的套路都是基本一致的。本篇作者将以在实际公司内实际实习考核为参考给大家介绍一份相对规范的管理系统。

本篇是默认存到文件里进行永久读取保存的,如果只是想读入内存一次性的使用,不想这么麻烦,那么请看最后一节。

1.1 使用结果展示

​ 做完后能达一种什么样的结果呢? 直接上截图:

增加:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

删除:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查找:

在这里插入图片描述

在这里插入图片描述

修改:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. 基本原理

​ 这类课设所有核心思路都是:在类vector的序列中存放管理实体对象。例如:

在这里插入图片描述

​ 然后所有的增删查改都是在对里面的对象元素进行修改,从而达到一种管理效果。

3. 文件层次结构

​ 这次实现我们采用面向对象思路:通过对应头文件里面放函数声明相关的.cpp文件来具体实现函数,在main.cpp中只用调用一下对象即可. 例如(以通讯录管理系统为例):

在这里插入图片描述

4.具体实现(通讯录管理系统为例)

4.1 通讯录实体类(addressbook.h)

​ 首先要创建通讯录管理系统,你首先得有一个通讯录吧?,在该类中需要声明(注意只是声明,函数的具体实现放在addressbook.cpp中)所有成员函数和成员变量。那么我们在类中规定通讯录有三种基本元素:姓名、号码、地址。 然后把这三种元素放入private中,public里面要写:获取元素的函数(如:getName() )和设置元素(如: setName() )的函数方便后续修改内容:那么你写完代码后跟我对对,应该有以下内容:

#ifndef __ADDRESSBOOK__
#define __ADDRESSBOOK__
#include<string>

class ZqyAddressBook
{

public:
    ZqyAddressBook() {}
    ZqyAddressBook(const std::string& strName, //构造
        const std::string& strNumber,
        const std::string& strAddress)
        :m_strName(strName)
        , m_strNumber(strNumber)
        , m_strAddress(strAddress)
    {}
	//修改成员函数
    void setName(const std::string& strName);
    void setNumber(const std::string& strNumber);
    void setAddress(const std::string& strAddress);
	//获取成员函数
    std::string& getName();
    std::string& getNumber();
    std::string& getAddress();

private:
    std::string m_strName; //姓名
    std::string m_strNumber;//号码
    std::string m_strAddress;//地址


};

4.2 通讯录实现类(addressbook.cpp)

那么我们这个类里面的函数就是实现上述声明的函数,没什么难的,直接上代码:

#include"addressbook.h"

void ZqyAddressBook::setName(const std::string& strName) { m_strName = strName; }
void ZqyAddressBook::setNumber(const std::string& strNumber) { m_strNumber = strNumber; }
void ZqyAddressBook::setAddress(const std::string& strAddress) { m_strAddress = strAddress; }

std::string&  ZqyAddressBook::getName() { return m_strName; }
std::string&  ZqyAddressBook::getNumber() { return m_strNumber; }
std::string&  ZqyAddressBook::getAddress() { return m_strAddress; }

4.3 通讯录管理类(zqymanager.h)

有了通讯录,我们就开始对通讯录进行增删查改的管理了。在这里创建一个管理类,里面写上增删查改

1.私有成员private: vector m_vecContainer //使用vector存储通讯里对象

2.公有成员public: void menu() // 菜单函数

​ size_t findPerson(const std::string& strName);// 查找人员

​ bool addPerson();//添加人员

​ bool deletePerson();//删除人员

​ bool modifyPerson(const std::string& strName); //修改人员

​ size_t findPersonDemo(const std::string& strName); // 查找人员插件,用于增删查里面判断存在

​ //读入文件相关

​ void loadContactsFromFile();//加载文件

​ void resaveContactsToFile();//重新写入数据,因为删除了某个元素

#ifndef __ZQYMANAGER__
#define __ZQYMANAGER__

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<map>
#include"addressbook.h"

class ZqyManager

{
public:
    ZqyManager() {}
    void menu();

    ~ZqyManager() {}
    
     void loadContactsFromFile();//加载文件

    void resaveContactsToFile();//重新写入数据,因为删除了某个元素

    size_t findPersonDemo(const std::string& strName); // 查找人员插件

    size_t findPerson(const std::string& strName);// 查找人员

    bool addPerson();//添加人员

    bool deletePerson();//删除人员

    bool modifyPerson(const std::string& strName); //修改人员


private:

    std::vector<ZqyAddressBook> m_vecContainer; //vector存储对象
};

4.4 通讯录管理实现类(zqymanager.cpp)

在这个类里面我们具体实现上述声明出来的函数:

4.4.1 menu()函数

​ 先看代码:我们通过读入用户输入的12345,再通过switch语句来确定我们要调用什么函数

void ZqyManager::menu()
{
    while (true)
    {

        std::cout << " " << std::endl;
        std::cout << "****************************" << std::endl;
        std::cout << "*******1.添加联系人*********" << std::endl;
        std::cout << "*******2.删除联系人*********" << std::endl;
        std::cout << "*******3.查找联系人*********" << std::endl;
        std::cout << "*******4.修改联系人*********" << std::endl;
        std::cout << "*******5.保存并退出通讯录*********" << std::endl;
        std::cout << "****************************" << std::endl;
        std::cout << "请输入你的选项:";

        std::string strChoice; //输入类型从int改为string类型,防止std::cin >> int输入string字符串而出现BUG的问题
        std::cin >> strChoice;

        std::cout << " " << std::endl;

            E_Choice eUserChoice = it->second; //改成枚举类型方便下方case理解和维护

            switch (strChoice)
            {

            case '1':
            {
                addPerson(); //增加函数
                break;
            }

            case '2':
            {
                deletePerson();
                break;
            }

            case '3':
            {
                std::string strName;
                std::cout << "请输入您要查询的人员信息:";
                std::cin >> strName;
                if (findPerson(strName) == -1) //如果调用查找人员插件函数,没找到的话
                {
                    std::cout << "查无此人" << std::endl;
                }

                break;
            }

            case '4':
            {
                std::string strName;
                std::cout << "请输入您要修改的人姓名:";
                std::cin >> strName;
                modifyPerson(strName); //调用修改函数
                break;
            }


            case '5':
            {
                resaveContactsToFile(); //读入内存函数
                std::cout << "感谢使用,再见!" << std::endl;
                std::exit(EXIT_SUCCESS);
            }
            default:
                std::cout << "输入非法,再次输入" << std::endl;
                break;
            }
        }


    }

}

4.4.2 findPersonDemo() 查找人员插件函数

​ 这个函数是为了在增删改的函数里面判断到底存不存在此人的情况而出现。也就是为了别的函数调用的

size_t ZqyManager::findPersonDemo(const std::string& strName) // 查找人员插件
{
    for (size_t i = 0; i < m_vecContainer.size(); i++)
    {
        if (m_vecContainer[i].getName() == strName)
        {

            return i;
        }
    }

    return -1; //返回值为-1 代表不存在
}
4.4.3 findPerson(const std::string& strMsg) 查找人员函数

这个才是正儿八经的查找人员函数了,其实代码大差不差。

{
    std::vector<ZqyAddressBook> vecTemp;
    for (auto& it : m_vecContainer)
    {
        if (it.getName().find(strMsg) != std::string::npos ||
            it.getNumber().find(strMsg) != std::string::npos ||
            it.getAddress().find(strMsg) != std::string::npos)
        {
            vecTemp.push_back(it);
        }
    }
    if (vecTemp.empty())
    {
        return -1; //临时vector为空说明一个满足的都没有:查无此人
    }
    else
    {
        for (auto& it : vecTemp) //输出临时变量中的对象
        {
            std::cout << "找到此人:" << it.getName() << " "
                << it.getNumber() << " " << it.getAddress() << std::endl;
        }
        return 0;
    }


}

4.4.4 添加人员函数 addPerson() 添加人员函数
bool ZqyManager::addPerson() //添加人员
{
    std::string strName, strNumber, strAddress;
    std::cout << "请输入您要添加的人员姓名:";
    std::cin >> strName;
    std::cout << "请输入您要添加的人员号码:";
    std::cin >> strNumber;
    std::cout << "请输入您要添加的人员地址:";
    std::cin >> strAddress;


    if (findPersonDemo(strName) != -1) //判断添加人员是否存在
    {
        std::cout << "姓名已存在,不保存" << std::endl;
        return false;
    }

    ZqyAddressBook b(strName, strNumber, strAddress);
    m_vecContainer.push_back(b);
    std::cout << "人员添加成功!" << std::endl;
    return true;
}
4.4.5 deletePerson() 删除人员函数
bool ZqyManager::deletePerson() //删除人员
{
    std::string strName;
    std::cout << "请输入您要删除的人员姓名:";
    std::cin >> strName;
    size_t iTmp = findPersonDemo(strName);
    if (iTmp != -1)
    {
        m_vecContainer.erase(m_vecContainer.begin() + findPersonDemo(strName));
        std::cout << "删除成功! " << std::endl;

        return true;
    }
    std::cout << "没找到这人,删除失败" << std::endl;
    return false;

}
4.4.6 modifyPerson(const std::string& strName) 修改人员函数
bool  ZqyManager::modifyPerson(const std::string& strName)
{
    if (findPersonDemo(strName) != -1) //找到了
    {
        std::string strNewName, strNewNumber, strNewAddress;
        std::cout << "请输入您要修改成什么名字:";
        std::cin >> strNewName;
        std::cout << "请输入您要修改成什么号码:";
        std::cin >> strNewNumber;
        std::cout << "请输入您要修改成什么地址:";
        std::cin >> strNewAddress;

        for (auto& it : m_vecContainer)
        {
            if (it.getName() == strName)
            {
                it.setName(strNewName);
                it.setNumber(strNewNumber);
                it.setAddress(strNewAddress);
                std::cout << "修改成功!!" << std::endl;
                return true;
            }
        }


    }

    std::cout << "没找到此联系人,无法修改" << std::endl;
    return false;

}

4.4.7 loadContactsFromFile() 加载文件

通过文件流ifstream来读取文件

void ZqyManager::loadContactsFromFile() //加载文件
{
    std::ifstream file("booktest.txt");
    if (!file.is_open())
    {
        // 文件不存在,创建一个新文件
        std::ofstream createFile("booktest.txt");
        createFile.close();

        // 重新尝试打开文件
        file.open("booktest.txt");
    }

    if (file.is_open())
    {
        ZqyAddressBook object;
        while (file >> object.getName() >> object.getNumber() >> object.getAddress())
        {
            m_vecContainer.push_back(object);
        }
        file.close();
    }
}
4.4.8 resaveCOntactsToFile() 重新写入文件函数

我们光加载进文件后还不够,因为每次增删查改后还要重新更新文件数据


void ZqyManager::resaveContactsToFile() //重新写入数据
{
    std::ofstream file("booktest.txt");
    if (file.is_open())
    {
        for (auto& it : m_vecContainer)
        {
            file << it.getName() << " " << it.getNumber() << " "
                << it.getAddress() << "\n";
        }
        file.close();
    }
}

4.5 main.cpp

在主函数中我们只用创建对象,然后调用加载文件函数、菜单函数和重新写入文件函数就够了。

#include"addressbook.h"
#include"zqymanager.h"

int main()
{
    ZqyManager test;
    test.loadContactsFromFile(); //加载文件函数

    test.menu(); //调用菜单函数,读取到用户输入后自动执行增删查改

    test.resaveContactsToFile(); //重新读取函数
    return 0; 
}

5. 简便操作*

​ 如果不想读入写入文件这么麻烦的话,就取消掉loadContacksFromFile()加载文件和resaveCOntactsToFile() 重新写入文件函数,并且在main中注释掉就ok了。

其实只在一次执行的内存中读取就已经能够满足大学管理系统课设的基本要求了!

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

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

相关文章

蓝桥杯 — — 完全日期

完全日期 友情链接&#xff1a;完全日期 题目&#xff1a; 思路&#xff1a; 直接从20010101枚举到20211231&#xff0c;然后再判断每一个数是否是一个合法的日期&#xff0c;如果这个日期是合法的&#xff0c;接着判断这个日期的每一个位置上的数字之和是否是一个完全平方数…

ChatGPT 可以预测未来吗?

推荐 4月13日的一篇有趣的 paper&#xff0c;特来分享。 &#x1f449; 当前的大型语言模型&#xff08;LLMs&#xff09;具有强大的数据合成和推理能力&#xff0c;但它们在直接预测尚未发生事件的准确性上常常受到限制。传统的预测方法依赖于直接询问模型关于未来的问题。 …

linux下安装nacos2.2.0

1、获取下载地址并下载 1.1、打开nacos官网 1.2、找到对应版本&#xff0c;点进去 ## 1.3、复制地址 1.4下载 # 进入要安装的目录&#xff0c;cd /usr/local/src # 执行wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz2、 安装…

【产品经理修炼之道】- 平台型产品经理与业务型产品经理

从2015年开始&#xff0c;阿里的产品经理招聘分为平台型和业务型&#xff0c;后来很多互金公司逐步学习采纳了这种分工方式&#xff0c;那么什么是平台型产品经理&#xff0c;什么是业务型产品经理呢&#xff1f;先上结论&#xff1a; 平台型产品经理&#xff08;产品设计&…

loD:如何实现代码的“高内聚、低耦合“

设计模式专栏&#xff1a;http://t.csdnimg.cn/3a25S 目录 1.引用 2.何为"高内聚、低耦合" 3.LoD 的定义描述 4.定义解读与代码示例一 5.定义解读与代码示例二 1.引用 本节介绍最后一个设计原则:LoD(Law of Demeter&#xff0c;迪米特法则)。尽LoD不像SOLID、KI…

CTFshow-PWN-Test_your_nc(pwn0-pwn4)

1、pwn0 连上&#xff0c;等它程序执行完你可以直接来到 shell 界面 执行命令&#xff0c;获取 flag ctfshow{294ffc57-ee28-40ea-8c74-4dfeaf89d1e7} 2、pwn1 提供一个后门函数&#xff0c;连上即可得到flag 下载附件&#xff0c;拉进 ubantu &#xff0c;使用命令 checksec …

深度学习基础——计算量、参数量和推理时间

深度学习基础——计算量、参数量和推理时间 在深度学习中&#xff0c;计算量、参数量和推理时间是评估模型性能和效率的重要指标。本文将介绍这三个指标的定义、计算方法以及如何使用Python进行实现和可视化展示&#xff0c;以帮助读者更好地理解和评估深度学习模型。 1. 定义…

oracle 19c数据库W00n进程使用很多PGA内存资源的分析

今天&#xff0c;客户反馈测试环境的数据库PGA资源不足&#xff0c;报错ORA-04036: 实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT&#xff1b;分析是多个W00n进程使用大量PGA-触发了BUG&#xff0c;对应解决办法就是打补丁。&#xff08;民间办法就是KILL进程、重启数据库&…

【JavaSE】搞定String类

前言 本篇会细致讲解String类的常见用法&#xff0c;让小伙伴们搞定String类~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 常用的三种字符串构造 字符串长度length 字符串比较 比较 比较字符串的内容equals…

一个不努力学习的人是怎么过的软考高项?

首先要感谢软考方式的改革&#xff0c;如果不是机考&#xff0c;我可能也过不了&#xff0c;因为自己的笔迹实在太糟糕了。其实如果不是因为笔迹太差&#xff0c;我觉得我19年高项就过了&#xff0c;19年栽倒在论文上&#xff0c;只得了43分&#xff0c;我记忆深刻。 然后说一…

【算法】深入理解二分查找算法及其应用

文章目录 1. 朴素二分查找的基本步骤&#xff1a;2. 总结二分模板 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找目标值的高效算法。它的基本思想是将数组分成两半&#xff0c;然后确定目标值可能存在的那一半&#xff0c;重复这个过程直到找到目标值或…

如何进行支付功能的测试?

非现金支付时代&#xff0c;非现金支付已经成为了生活不可或缺的一部分&#xff0c;我们只需要一台手机便可走遍全国各地&#xff08;前提是支付宝&#xff0c;微信有钱<00>&#xff09;。 那么作为测试人员&#xff0c;支付测试也是非常重要的一环&#xff0c;那么下面…

隐私保护?还是安全漏洞?邮箱分身双重身份及创建攻略解析!

很多人只知道微信、QQ等应用分身&#xff0c;对于邮箱分身并不是很了解。邮箱分身和他们的不同点在于我们直接在原有邮箱的基础上创立新的虚拟邮箱地址&#xff0c;并且密码一致&#xff0c;在我们需要运营多个社交媒体账号或者管理多个项目的情况下&#xff0c;邮箱分身是一个…

IntelliJ IDEA2024 安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 IDEA&#xff08;Integrated Development Environment for Apache&#xff09; 是一款专为 Apache 开发者设计的集成开发环境。该软件提供了丰富的功能和工具&#xff0c;帮助开发者更高效地创建、调试和部署 Apache 项目。 主…

MobaXterm无法登陆oracle cloud的问题

问题 我在oracle cloud上创建实例的时候&#xff0c;只能使用密钥的方式登陆&#xff0c;当时下载了私钥文件。实例创建好以后&#xff0c;在mobaxterm上使用这个私钥文件无法登陆 排查 尝试使用mobaxterm的keygen&#xff0c;把私钥文件转成ppk格式&#xff0c;还是不行。…

【论文阅读02】一种基于双通道的水下图像增强卷积神经网络

来源&#xff1a;海洋论坛▏一种基于双通道的水下图像增强卷积神经网络 当前不会的 一、背景&#xff1a; 水下图像增强方法包含有无水下成像模型的水下图像增强方法、基于水下成像模型的水下图像恢复方法、水下成像模型与深度学习相结合的方法以及完全采用深度学习的方…

STM32H7的8个串口fifo收发(兼容232和485)

STM32H7的8个串口fifo收发&#xff08;兼容232和485&#xff09; 串口硬件串口时序串口高级特性同步和异步的区别单工、半双工、全双工的区别 STM32H78个串口fifo驱动定义数据结构uart_fifo.huart驱动包括中断配置等 应用示例RS485深入理解 仅供学习。 USART 的全称是 Universa…

springcloud 整合swagger文档教程

我用的是nacos和gateway 我的模块 父依赖没什么太大关系如果出现版本冲突问题可用参考我的依赖版本 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org…

试试流量回放,不用再写烦人的自动化测试case了

接触过接口自动化测试的同学都知道&#xff0c;我们一般要基于某种自动化测试框架&#xff0c;编写自动化case&#xff0c;编写自动化case的依据来源于接口文档&#xff0c;对照接口文档里面的请求参数进行人工添加接口自动化case 其实&#xff0c;对于日常新的服务端需求的迭…

Vue3(二):报错调试,vue3响应式原理、computed和watch,ref,props,接口

一、准备工作调试 跟着张天禹老师看前几集的时候可能会遇到如下问题&#xff1a; 1.下载插件&#xff1a;Vue Language Features (Volar)或者直接下载vue-offical 2.npm run serve时运行时出现错误&#xff1a;Error: vitejs/plugin-vue requires vue (&#xff1e;3.2.13) …