首页 > 编程语言 >【C++进阶实战】个人财务管理系统

【C++进阶实战】个人财务管理系统

时间:2024-11-16 20:18:33浏览次数:3  
标签:std 进阶 记录 管理系统 用户 C++ records 预算 cout

功能说明

  1. 添加收入和支出记录:用户可以添加新的收入和支出记录。
  2. 查看记录:用户可以查看所有的收入和支出记录。
  3. 生成财务报告:用户可以生成总收入、总支出和剩余金额的报告。
  4. 设定预算:用户可以设定每月的预算,并查看是否超出预算。
  5. 文件存储:使用文件来存储记录,以便下次启动程序时仍然可用。

示例代码

记录文件 records.txt

假设我们有一个记录文件 records.txt,内容如下:

income 1000 Salary
expense 500 Rent
C++ 代码
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>

struct FinancialRecord {
    std::string type;      // "income" 或 "expense"
    double amount;         // 金额
    std::string description; // 描述
};

class FinancialManager {
private:
    std::vector<FinancialRecord> records;
    std::string filename;
    double budget;

public:
    FinancialManager(const std::string& file) : filename(file), budget(0) {
        loadRecords();
    }

    void addRecord(const FinancialRecord& record) {
        records.push_back(record);
        saveRecords();
    }

    void viewRecords() const {
        if (records.empty()) {
            std::cout << "没有记录。" << std::endl;
            return;
        }

        std::cout << "财务记录:" << std::endl;
        for (const auto& record : records) {
            std::cout << "类型: " << record.type << ", 金额: " << std::fixed << std::setprecision(2) << record.amount << ", 描述: " << record.description << std::endl;
        }
    }

    void generateReport() const {
        double totalIncome = 0, totalExpense = 0;

        for (const auto& record : records) {
            if (record.type == "income") {
                totalIncome += record.amount;
            } else if (record.type == "expense") {
                totalExpense += record.amount;
            }
        }

        double remaining = totalIncome - totalExpense;
        std::cout << "财务报告:" << std::endl;
        std::cout << "总收入: " << std::fixed << std::setprecision(2) << totalIncome << std::endl;
        std::cout << "总支出: " << std::fixed << std::setprecision(2) << totalExpense << std::endl;
        std::cout << "剩余金额: " << std::fixed << std::setprecision(2) << remaining << std::endl;
    }

    void setBudget(double newBudget) {
        budget = newBudget;
        std::cout << "预算已设置为: " << std::fixed << std::setprecision(2) << budget << std::endl;
    }

    void checkBudget() const {
        double totalExpense = 0;

        for (const auto& record : records) {
            if (record.type == "expense") {
                totalExpense += record.amount;
            }
        }

        if (totalExpense > budget) {
            std::cout << "警告:已超出预算。" << std::endl;
        } else {
            std::cout << "当前支出未超出预算。" << std::endl;
        }
    }

private:
    void loadRecords() {
        std::ifstream file(filename);
        if (!file.is_open()) {
            std::cerr << "无法打开记录文件:" << filename << std::endl;
            return;
        }

        records.clear();
        std::string type, description;
        double amount;
        while (file >> type >> amount >> description) {
            records.push_back({type, amount, description});
        }
    }

    void saveRecords() const {
        std::ofstream file(filename);
        if (!file.is_open()) {
            std::cerr << "无法打开记录文件:" << filename << std::endl;
            return;
        }

        for (const auto& record : records) {
            file << record.type << " " << record.amount << " " << record.description << std::endl;
        }
    }
};

int main() {
    FinancialManager manager("records.txt");

    while (true) {
        std::cout << "\n个人财务管理系统菜单:" << 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 << "6. 退出" << std::endl;
        std::cout << "请选择一个选项: ";

        int choice;
        std::cin >> choice;

        switch (choice) {
            case 1: {
                std::string type, description;
                double amount;
                std::cout << "请输入记录类型(income/expense): ";
                std::cin >> type;
                std::cout << "请输入金额: ";
                std::cin >> amount;
                std::cout << "请输入描述: ";
                std::cin.ignore(); // 忽略之前的换行符
                std::getline(std::cin, description);
                manager.addRecord({type, amount, description});
                break;
            }
            case 2: {
                manager.viewRecords();
                break;
            }
            case 3: {
                manager.generateReport();
                break;
            }
            case 4: {
                double newBudget;
                std::cout << "请输入新的预算金额: ";
                std::cin >> newBudget;
                manager.setBudget(newBudget);
                break;
            }
            case 5: {
                manager.checkBudget();
                break;
            }
            case 6: {
                std::cout << "退出个人财务管理系统。" << std::endl;
                return 0;
            }
            default: {
                std::cout << "无效的选项,请重新选择。" << std::endl;
                break;
            }
        }
    }

    return 0;
}

代码解释

  1. 结构体 FinancialRecord:

    • 定义了一个包含记录类型(收入或支出)、金额和描述的结构体。
  2. FinancialManager:

    • 成员变量
      • records:存储财务记录的向量。
      • filename:存储记录的文件名。
      • budget:用户的预算金额。
    • 构造函数:初始化文件名并加载已有的记录。
    • 方法
      • addRecord:添加一个新的财务记录并保存到文件。
      • viewRecords:显示所有财务记录。
      • generateReport:生成总收入、总支出和剩余金额的报告。
      • setBudget:设置用户的预算金额。
      • checkBudget:检查当前支出是否超出预算。
      • loadRecords:从文件中加载记录。
      • saveRecords:将记录保存到文件。
  3. 主函数 main:

    • 创建一个 FinancialManager 实例,记录文件名为 "records.txt"
    • 提供一个简单的命令行界面,让用户选择添加记录、查看记录、生成报告、设置预算、检查预算或退出程序。
    • 根据用户的选择调用相应的 FinancialManager 方法。

运行示例

假设用户输入如下:

个人财务管理系统菜单:
1. 添加记录
2. 查看记录
3. 生成财务报告
4. 设置预算
5. 检查预算
6. 退出
请选择一个选项: 1
请输入记录类型(income/expense): income
请输入金额: 1000
请输入描述: Salary

然后用户选择查看记录:

个人财务管理系统菜单:
1. 添加记录
2. 查看记录
3. 生成财务报告
4. 设置预算
5. 检查预算
6. 退出
请选择一个选项: 2
财务记录:
类型: income, 金额: 1000.00, 描述: Salary
类型: expense, 金额: 500.00, 描述: Rent

标签:std,进阶,记录,管理系统,用户,C++,records,预算,cout
From: https://blog.csdn.net/weixin_42300449/article/details/143811961

相关文章

  • 【C++进阶实战】电子词典
    功能说明查询单词:用户可以输入一个单词,程序将显示该单词的释义。文件存储:使用文件来存储单词和释义,以便下次启动程序时仍然可用。用户界面:提供简单的命令行界面,让用户选择查询单词或退出程序。示例代码词库文件 dictionary.txt假设我们有一个词库文件dictionary.txt,内容......
  • 穿越数据迷宫:C++哈希表的奇幻旅程
    文章目录前言......
  • 基于Spring Boot成人自考本科教育网站设计与实现(源码+定制+讲解)在线自考教育管理系统
    博主介绍:  ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生......
  • [C++] 智能指针
    文章目录智能指针的使用原因及场景分析为什么需要智能指针?异常抛出导致的资源泄漏问题分析智能指针与RAIIC++常用智能指针使用智能指针优化代码优化后的代码优化点分析析构函数中的异常问题解决方法RAII和智能指针的设计思路详解什么是RAII?RAII的工作原理智能......
  • 全面指南 | 知识库管理系统在零售行业中的作用是什么?
    中国的零售行业在2023年展现出了稳健的增长态势。根据国家统计局的数据,2023年国内社会消费品零售总额为47.15万亿元,同比增长7.2%。有一点是明确的——零售行业只会继续蓬勃发展。在这个不断壮大的巨大行业中,要想在竞争激烈的市场中脱颖而出绝非易事。问题是,如何才能成为顾......
  • 基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现四
    一、前言介绍:免费学习:猿来入此1.1项目摘要随着人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。然而,宠物的数量增长也带来了一系列问题,如流浪宠物数量的增加、宠物健康管理的缺失以及宠物领养收养信息的不透明等。这些问题不仅影响了宠物的生存状况,也给社会带来了一定......
  • 多线程进阶
    1.常见的锁策略如果你自己实现一把锁,你认为标准库给你提供的锁不够用,这个时候你就需要关注锁策略,其实synchronized已经非常好用了足够覆盖大多数的使用场景。这里的锁策略不是和java强相关的,其他语言但凡涉及到并发编程,设计到锁都可以谈到这样的锁策略。1.1乐观锁VS悲观锁......
  • 3C产品跨境电商:知识库管理系统如何起作用?
    在数字化和全球化的浪潮中,3C产品(计算机、通信和消费类电子产品)跨境电商行业正以前所未有的速度发展。然而,随着市场规模的扩大,企业面临的挑战也日益复杂。为了在激烈的市场竞争中保持领先地位,3C产品跨境电商企业不仅需要高效的运营和管理体系,还需要一个强大的知识库管理系统......
  • 基于java+vue的广告管理系统设计与实现
    目录:目录:博主介绍: 完整视频演示:你应该选择我技术栈介绍:需求分析:系统各功能实现一览:1.注册2.登录部分代码参考: 项目功能分析: 项目论文:源码获取:博主介绍: ......
  • 基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现三
    一、前言介绍:免费学习:猿来入此1.1项目摘要随着人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。然而,宠物的数量增长也带来了一系列问题,如流浪宠物数量的增加、宠物健康管理的缺失以及宠物领养收养信息的不透明等。这些问题不仅影响了宠物的生存状况,也给社会带来了一定......