个人财政支出管理程序
目标:个人财政支出管理程序,将个人财务的目标及当前存款、支出保存下来,可以随时更,查看,比较新颖与目标的差距
设计要求:
- 将收支的数据与相应的函数封装到类中,并改写主程序,使程序结构化。
- 增加保存每笔收支的记录,并对每笔记录增加日期录入,按日期的顺序保存、查看记录。将所有记录放入一个文件中,每次运行程序时首先打开这个文件,程序运行完毕时将更新的记录放回文件中。
- 完善程序,补充类中数据成员盈余(dlBalance)的计算和输出,要求每笔收入和支出都要重新统计当前情况下的盈余数目。
- 增加程序监控功能,当输人时间发生错误(如月份超过12等),要求重新输入正确的时间;当结余的数目为负数时,输出信息,警告已经超支!
菜单要求:
- 输人收人记录
- 输人支出记录
- 查看收人记录
- 查看支出记录
- 查看收支平衡情况
- 根据日期查找记录
- 根据日期修改记录
- 根据日期删除记录
- 退出系统
开发文档
概述
个人财务管理系统是一个简单的控制台程序,旨在帮助用户记录和管理其收入和支出。该系统具有以下主要功能:
- 输入收入记录
- 查看收入记录
- 输入支出记录
- 查看支出记录
- 查看收支平衡情况
- 根据日期查找记录
- 根据日期修改收入记录
- 根据日期删除记录
- 根据日期修改支出记录
技术细节
- 语言: C++
- 存储: 使用二进制文件存储记录
- 用户界面: 使用控制台界面
- 数据结构: 使用类来组织数据,包括日期、金额和用途
开发思路
- 设计数据结构: 设计类来表示收入和支出记录,并定义必要的成员变量和函数。
- 实现主要功能: 实现收入和支出记录的添加、查看和删除功能。
- 实现辅助功能: 实现其他功能,如根据日期查找记录、修改记录等。
- 界面设计: 设计用户友好的控制台界面,以便用户可以轻松使用系统。
- 测试和调试: 对系统进行全面测试,并解决可能存在的问题和错误。
答辩可能问到的问题
- 系统的存储方式是什么?: 答:系统使用二进制文件来存储收入和支出记录。
- 如何保证数据的安全性?: 答:系统在写入和读取文件时进行了错误检查,并且在每次修改记录时都会备份数据,以防止意外损坏。
- 是否考虑到多用户并发访问的情况?: 答:本系统暂时未考虑多用户并发访问,它是为单个用户设计的。
- 系统的扩展性如何?: 答:系统可以轻松扩展,例如添加更多的统计功能、用户身份验证等。
- 是否考虑到跨平台兼容性?: 答:本系统目前仅在 Windows 平台上测试,尚未进行跨平台兼容性测试。
- 如何处理异常情况?: 答:系统会在出现异常情况时向用户提供相应的错误信息,并尽力保证程序的稳定性和可靠性。
这些问题的答案将有助于展示你对系统设计和实现的理解程度,以及对潜在问题的考虑和解决能力。
源码:
#include <iostream>
#include <fstream>
#include <limits>
#include <cstring>
#include <iomanip>
class CFinance {
private:
int nYear, nMonth, nDay;
double dlIncome, dlOutput;
double dlBalance;
char szPurpose[50]; // 增加长度以容纳更多内容
public:
CFinance() : nYear(0), nMonth(0), nDay(0), dlIncome(0.0), dlOutput(0.0), dlBalance(0.0) {}
void InputIncomeRecord() {
std::cout << "请输入日期(年 月 日):";
std::cin >> nYear >> nMonth >> nDay;
std::cout << "请输入金额:";
std::cin >> dlIncome;
std::cout << "请输入用途:";
std::cin.ignore();
std::cin.getline(szPurpose, 50);
dlBalance += dlIncome;
SaveIncomeRecord(); // 保存收入记录到文件
std::cout << "收入记录添加成功。" << std::endl;
std::cout << "按下 Enter 键继续...";
std::cin.get(); // 等待用户按下 Enter 键
system("cls");
std::cout << "已按下 Enter 键,继续执行下一步操作。" << std::endl;
}
void SaveIncomeRecord() {
std::ofstream outFile("income_records.data", std::ios::binary | std::ios::app);
if (!outFile) {
std::cerr << "无法打开文件。" << std::endl;
return;
}
outFile.write(reinterpret_cast<const char*>(&nYear), sizeof(nYear));
outFile.write(reinterpret_cast<const char*>(&nMonth), sizeof(nMonth));
outFile.write(reinterpret_cast<const char*>(&nDay), sizeof(nDay));
outFile.write(reinterpret_cast<const char*>(&dlIncome), sizeof(dlIncome));
outFile.write(szPurpose, sizeof(szPurpose));
outFile.close();
}
void ShowIncomeRecords() {
std::ifstream inFile("income_records.data", std::ios::binary);
if (!inFile) {
std::cerr << "无法打开文件。" << std::endl;
return;
}
std::cout << "收入记录:" << std::endl;
std::cout << std::setw(17) << "日期" << std::setw(20.5) << "金额" << std::setw(48) << "用途" << std::endl;
while (inFile.read(reinterpret_cast<char*>(&nYear), sizeof(nYear))) {
inFile.read(reinterpret_cast<char*>(&nMonth), sizeof(nMonth));
inFile.read(reinterpret_cast<char*>(&nDay), sizeof(nDay));
inFile.read(reinterpret_cast<char*>(&dlIncome), sizeof(dlIncome));
inFile.read(szPurpose, sizeof(szPurpose));
std::cout << std::setw(15) << nYear << "/" << std::setw(2) << nMonth << "/" << std::setw(2) << nDay << std::setw(15) << dlIncome <