← 返回学习构建
项目 2 / 20 · 基础入门

个人收支小账本

记录日常收支,生成收入、支出与结余。

先完成核心,再扩展应用

控制台核心功能

站内评测验证输入输出与业务规则。本地接口、文件读写、数据库和界面需要按指南继续实现、测试,不会因核心评测通过而自动完成。

分阶段开发

开始写代码 ↓

当前版本阶段自查:0 / 3

先完成当前阶段的功能,再运行自测。样例用于解释规则,提交后还会运行补充验收用例。

阶段 1

定义账目

将金额按分保存,明确收支类型,避免浮点金额误差。

查看此阶段的目标自测

前期可以先手工推演,核心完成后再核对程序输出。

输入
4
I 10000
E 2500
E 500
I 2000
预期输出
12000 3000 9000

登录后保存阶段自查与笔记 →

阶段 2

分类累计

分别维护收入与支出,验证只有收入或只有支出的情况。

查看此阶段的目标自测

前期可以先手工推演,核心完成后再核对程序输出。

输入
1
E 7
预期输出
0 7 -7

登录后保存阶段自查与笔记 →

阶段 3

核对结余

计算收入减支出,以大额记录验证 long long。

查看此阶段的目标自测

前期可以先手工推演,核心完成后再核对程序输出。

输入
3
I 1000000000
I 1000000000
I 1000000000
预期输出
3000000000 0 3000000000

登录后保存阶段自查与笔记 →

下载起始材料

可以直接使用站内编辑器,也可以下载到本地开发。起始代码不包含参考答案。

完整需求与验收

个人收支小账本

记录日常收支,生成收入、支出与结余。

你将交付什么

控制台核心功能。完成核心版本后,可以继续开发文末的本地应用。站内测试通过代表核心功能达标,不代表扩展应用已完成。

前置知识

结构体、循环、整数金额。建议先完成学习之路中的相应概念,或在数据结构实验中验证理解。

需求与输入输出

第一行 n(1~100000)。接下来 n 行为 I 或 E 以及金额 x(0~10⁹ 分);I 收入,E 支出。输出总收入、总支出、结余,用空格分隔。结余允许为负。

使用 C++17。除非另有说明,数量为 0~10000,整数绝对值不超过 10⁹;标识符不含空格,输入符合协议。累计量使用 long long。

样例输入

4
I 10000
E 2500
E 500
I 2000

样例输出

12000 3000 9000

构建步骤

阶段 1:定义账目

将金额按分保存,明确收支类型,避免浮点金额误差。

阶段 2:分类累计

分别维护收入与支出,验证只有收入或只有支出的情况。

阶段 3:核对结余

计算收入减支出,以大额记录验证 long long。

验收清单

  • 按样例与协议输出结果,不附加交互菜单。
  • 空集合、无匹配与重复记录等边界按协议处理。
  • 输入输出与业务逻辑分离,保存可重复运行的样例。

思路提示

先手工推演样例第一条记录,写出中间状态。检查数据是否完整读取、同值如何排序、未找到记录如何处理。每完成一个阶段就用小数据运行一次。

本地开发与扩展

定义 Record 类,增加日期、类别和备注;以 CSV 保存和恢复记录,增加月度报表与预算提醒。保存后重新读取,校验汇总一致。

基础版本编译:g++ -std=c++17 main.cpp -o app。将样例输入存为 sample.txt;Windows PowerShell 使用 Get-Content sample.txt | .\app.exe,其他终端使用 ./app < sample.txt。接入网络或数据库前,保留无需外部服务的核心测试。

阶段自测数据

自测 1

输入:

4
I 10000
E 2500
E 500
I 2000

预期输出:

12000 3000 9000

自测 2

输入:

1
E 7

预期输出:

0 7 -7

自测 3

输入:

3
I 1000000000
I 1000000000
I 1000000000

预期输出:

3000000000 0 3000000000

推荐的数据模型

可以从下列结构开始,再根据自己的模块划分调整。它定义数据,不包含业务答案。

struct Record { char type; long long cents; };
struct Summary { long long income = 0, expense = 0; };

开发时如何分工

  1. 输入适配:只负责把输入转为上面的数据模型;先用一条样例检查字段。
  2. 业务服务:接收模型并返回结果,不直接读取 cin 或打印 cout,便于单独测试。
  3. 输出展示:按需求规定的顺序和格式生成文本,不在业务函数中拼接交互菜单。
  4. 应用扩展:本地版本可将模型移到 models.h,业务移到 service.cpp,main.cpp 负责组装;先保持核心测试通过,再接入文件、网络或数据库。

从核心程序到实用应用

定义 Record 类,增加日期、类别和备注;以 CSV 保存和恢复记录,增加月度报表与预算提醒。保存后重新读取,校验汇总一致。

  1. 拆分输入适配、业务逻辑和输出展示,先保持现有自测通过。
  2. 一次接入一种外部能力,并为失败、空数据、重复请求添加测试。
  3. 保存样例与运行说明,演示一次完整流程,再检查重启后数据是否符合设计。