Java实现收支明细统计系统_控制台项目综合训练

答案:实现一个Java控制台程序,通过IncomeExpenseRecord和FinanceManager类完成收支记录、查看、统计等功能,使用ArrayList存储数据,Scanner处理输入,SimpleDateFormat生成时间,支持添加收入支出、查看明细与统计余额,并可扩展文件保存等功能。

java实现收支明细统计系统_控制台项目综合训练

用Java实现一个简单的收支明细统计系统作为控制台项目,是巩固基础语法、面向对象编程和集合操作的很好方式。这个项目不需要图形界面,重点在于数据管理、用户交互和结构设计。下面是一个完整的实现思路和代码结构说明。

1. 功能需求分析

系统应具备以下基本功能:

记录收入和支出:每笔记录包含类型(收入/支出)、金额、说明、时间查看所有收支明细:按时间顺序列出所有记录统计总收入、总支出和账户余额支持退出系统

2. 类设计与结构

系统主要由两个类构成:

IncomeExpenseRecord 类

立即学习“Java免费学习笔记(深入)”;

表示一条收支记录:

public class IncomeExpenseRecord {    private String type;        // "收入" 或 "支出"    private double amount;      // 金额    private String description; // 说明    private String date;        // 日期
public IncomeExpenseRecord(String type, double amount, String description, String date) {    this.type = type;    this.amount = amount;    this.description = description;    this.date = date;}// Getter 方法public String getType() { return type; }public double getAmount() { return amount; }public String getDescription() { return description; }public String getDate() { return date; }@Overridepublic String toString() {    return date + " | " + type + " | ¥" + amount + " | " + description;}

}

Pic Copilot Pic Copilot

AI时代的顶级电商设计师,轻松打造爆款产品图片

Pic Copilot 158 查看详情 Pic Copilot

FinanceManager 类

主程序类,负责菜单显示、用户输入处理和数据管理:

import java.text.SimpleDateFormat;import java.util.*;

public class FinanceManager {private List records;private Scanner scanner;

public FinanceManager() {    records = new ArrayList();    scanner = new Scanner(System.in);}public void start() {    while (true) {        showMenu();        int choice = getIntInput();        switch (choice) {            case 1:                addRecord("收入");                break;            case 2:                addRecord("支出");                break;            case 3:                viewAllRecords();                break;            case 4:                showSummary();                break;            case 5:                System.out.println("感谢使用,再见!");                return;            default:                System.out.println("无效选择,请重新输入。");        }        System.out.println(); // 空行分隔    }}private void showMenu() {    System.out.println("=== 收支明细统计系统 ===");    System.out.println("1. 添加收入");    System.out.println("2. 添加支出");    System.out.println("3. 查看所有明细");    System.out.println("4. 查看统计信息");    System.out.println("5. 退出");    System.out.print("请选择操作:");}private int getIntInput() {    while (!scanner.hasNextInt()) {        System.out.print("请输入数字:");        scanner.next(); // 清除非法输入    }    int value = scanner.nextInt();    scanner.nextLine(); // 消费换行符    return value;}private double getDoubleInput() {    while (!scanner.hasNextDouble()) {        System.out.print("请输入有效金额:");        scanner.next();    }    double value = scanner.nextDouble();    scanner.nextLine();    return value;}private void addRecord(String type) {    System.out.print("请输入金额:");    double amount = getDoubleInput();    System.out.print("请输入说明:");    String desc = scanner.nextLine();    String date = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());    records.add(new IncomeExpenseRecord(type, amount, desc, date));    System.out.println(type + "记录已添加!");}private void viewAllRecords() {    if (records.isEmpty()) {        System.out.println("暂无任何记录。");        return;    }    System.out.println("\n--- 所有收支明细 ---");    for (IncomeExpenseRecord record : records) {        System.out.println(record);    }}private void showSummary() {    double totalIncome = 0;    double totalExpense = 0;    for (IncomeExpenseRecord record : records) {        if ("收入".equals(record.getType())) {            totalIncome += record.getAmount();        } else {            totalExpense += record.getAmount();        }    }    double balance = totalIncome - totalExpense;    System.out.println("\n--- 统计信息 ---");    System.out.printf("总收入:¥%.2f\n", totalIncome);    System.out.printf("总支出:¥%.2f\n", totalExpense);    System.out.printf("账户余额:¥%.2f\n", balance);}public static void main(String[] args) {    FinanceManager manager = new FinanceManager();    manager.start();}

}

3. 使用建议与扩展点

这个项目可以作为Java初学者的综合练习,帮助掌握以下知识点:

类与对象的设计:封装数据和行为集合类使用:ArrayList 存储多条记录Scanner 输入处理:注意输入合法性校验SimpleDateFormat 获取当前时间循环与条件控制:菜单逻辑

后续可扩展功能:

将数据保存到文件(如文本文件或CSV)从文件加载历史记录按月份筛选记录增加分类(餐饮、工资、交通等)支持修改或删除记录

基本上就这些。不复杂但容易忽略细节,比如输入异常处理和日期格式统一。动手实现一遍,对理解Java基础很有帮助。

以上就是Java实现收支明细统计系统_控制台项目综合训练的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1070346.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 06:35:58
下一篇 2025年12月2日 06:36:19

相关推荐

  • 怎么在 PHP 8 中开启 JIT?

    PHP 8 的 JIT 编译器旨在提高 PHP 代码执行速度。通过将代码编译成机器码,JIT 在频繁执行的场景中带来显著提升,但它消耗更多内存并存在兼容性问题。用户应在权衡性能与风险后谨慎开启 JIT,并进行充分测试以确保兼容性。 PHP 8 的 JIT 编译器,这玩意儿听着挺高大上,实际上呢?说白…

    2025年12月9日
    000
  • PHP 8 的 JIT 编译对代码有什么要求?

    PHP 8 的 JIT 编译器可将 PHP 代码编译为机器码以提升性能,但对代码有特定要求。高效代码应包含热点、类型声明、静态属性访问、循环优化和避免过度复杂控制流。例如,inefficient_loop 函数无类型声明,JIT 编译效果不佳,而 efficient_loop 函数优化了这些因素,显…

    2025年12月9日
    000
  • 在旧版 Symfony/项目中使用 Memcache 进行会话存储

    概述 本文档指导您如何在旧版Symfony 1.4/1.5项目中配置Memcache会话存储。 前提条件 已安装Symfony 1.4/1.5项目Docker环境PHP 7.4 (推荐用于旧版Symfony)Memcached服务器 步骤一:配置PHP容器 在您的PHP容器中安装Memcache扩展…

    2025年12月9日
    000
  • 教程:Laravel Nextjs 教程

    熟悉Laravel,想学习Next.js?本文将指导您如何结合这两个框架,构建强大的全栈应用。即使您是Next.js新手,也能轻松上手! 借助AI工具,如GPTeach,学习过程将更加高效。 Next.js简介 Next.js是一个流行的开源React框架,它简化了服务器端渲染(SSR) React…

    2025年12月9日
    000
  • Jenkins 与 PHP – 运行您的第一个管道

    Jenkins与PHP:构建您的首个Pipeline Jenkins是一款流行的开源自动化服务器,可用于自动化软件构建、测试和部署等任务。本教程将指导您配置Jenkins以运行PHP项目,并创建一个简单的“Hello, World!”示例Pipeline,以及从Git仓库运行PHP项目。 准备工作 …

    2025年12月9日
    000
  • 使用 PHP 数组:初学者指南

    在本文中,我们将介绍 PHP 数组的基础知识以及一些高级概念。我们将首先向您介绍什么是数组,然后再介绍数组的基本语法和可用的不同类型的索引。 PHP 数组简介 PHP 数组是强大的数据结构,允许开发人员 存储和操作值的集合。数组是一个变量, 可以保存多个值,每个值都由唯一的键或索引标识 value.…

    2025年12月9日
    000
  • 如何使用异步操作提升PHP7性能

    异步操作提升 PHP7 性能的方法:识别并行任务使用并行处理(pcntl 扩展)使用非阻塞 I/O(stream_select 和 stream_socket_client 函数)管理并发监视性能 如何使用异步操作提升 PHP7 性能 异步操作是一种在不阻塞主线程的情况下执行任务的技术。在 PHP7…

    2025年12月9日
    000
  • PHP7的最佳实践有哪些,以提升性能

    通过实施最佳实践,如启用 Opcache、使用 Preloading、减少 Autoloading、优化数据库查询、避免使用过时的函数和扩展、利用 JIT 编译器、使用 Composer、启用严格模式、使用 Profilers 和考虑使用 Swoole,可以提升 PHP7 的性能和效率。 PHP7 …

    2025年12月9日
    000
  • 大佬们的 JSON

    什么是 json? json 代表 javascript 对象表示法。它是一种轻量级数据格式,用于在系统之间存储和交换信息,尤其是在 web 应用程序中。 将 json 视为一种以清晰、结构化的格式编写和组织数据的方法。 为什么选择 json? 人类可读:易于理解和编写。与语言无关:用于多种编程语言…

    2025年12月9日
    000
  • 在 Hostinger(共享服务器)上安装 Symfony

    哈喽朋友们,你们好吗? 今天我来谈谈在hostinger共享服务器上安装symfony的过程。一路上,我对如何安装该项目产生了一些疑问。其中之一是 .htaccess 文件、php 版本、域名,我什至不确定我的共享服务器计划是否足够,或者我是否需要迁移到 vps。在我的问题中,我问了一个关于服务器的…

    2025年12月9日 好文分享
    000
  • CakePHP 上层的 DI 容器

    动机 我想通过di容器将service注入到command和controller中。另外,service 使用 repository 注入。文档中并没有提到嵌套注入这种情况。 文档 https://book.cakephp.org/4/en/development/dependency-inject…

    2025年12月9日
    000
  • PHP 8的Constructor Property Promotion是什么

    PHP 8 的构造函数属性提升特性允许在构造函数中声明并初始化类属性。具体步骤如下:在构造函数中声明属性,并直接赋值。属性必须具有明确的数据类型。声明的属性不能在构造函数之外重新赋值,除非声明为 var。该特性提高了代码简洁性、可读性和效率,适用于类属性,但不适用于实例变量。 PHP 8 的构造函数…

    2025年12月9日
    000
  • 使用PHP 8需要注意哪些事项

    PHP 8 带来弃用和新特性:弃用 func_get_arg() 等函数,建议使用 … 展开语法;allow_url_fopen 被标记为已弃用,建议使用 cURL 或 HTTP 流。新特性包括:联合类型、空安全、命名参数和模式匹配,以及属性语法。性能改进包括 JIT 编译器改进、减少对…

    2025年12月9日
    000
  • PHP 8的最佳实践有哪些

    PHP 8 最佳实践包括:使用联合类型提高可读性和灵活性。利用模式匹配简化代码和减少嵌套 if/else。启用弱类型比较以防止意外类型转换。使用 NULL 合并运算符安全地访问嵌套属性或数组元素。使用字符串函数简化字符串操作。提高数组性能,通过 array_is_list() 检查数组类型。利用特性…

    2025年12月9日
    000
  • PHP 8 的新语法和特性

    PHP 8 引入了属性、联合类型、模式匹配、null 合并运算符和 match 表达式等新语法,增强了语言功能和易用性。此外,它还增加了 JIT 编译、泛型、目标类型、预加载类和弱引用等特性,提升了性能、类型安全性、可重用性和优化。 PHP 8 的新语法和特性 PHP 8 引入了许多新语法和特性,极…

    2025年12月9日
    000
  • PHP ews:构造函数属性提升

    构造函数属性提升 是 php 8 中引入的一项功能,可简化类中的属性声明和初始化。在 php 8 之前,您必须显式声明类属性,然后在构造函数中初始化它们。通过此功能,您可以直接在构造函数的参数列表中声明和初始化属性,从而减少样板代码。 传统语法(php 8 之前) class product { p…

    2025年12月9日
    000
  • PHP 中的 CSRF 保护

    什么是 csrf? 跨站请求伪造 (csrf) 是一种网络安全漏洞,攻击者可以利用该漏洞诱骗经过身份验证的用户在他们当前登录的网站上执行不需要的操作。该攻击通过利用网站所拥有的信任来进行在用户的浏览器中。 csrf 攻击如何运作 用户登录合法网站 a 并收到会话 cookie用户在仍登录 a 的情况…

    2025年12月9日
    000
  • 基于 JSON 结构创建 WordPress 插件选项

    有一天,我想知道如何让 wordpress 插件选项由 json 文件控制,以便将来可以更轻松地添加其他设置,而无需调整代码本身。 本文提供了一个极其简单的 wordpress 插件示例,该插件的单个设置页面由 2 个部分和 3 个字段/选项组成。 完整代码可以在github上找到。 设置基地 该插…

    2025年12月9日 好文分享
    000
  • 代码气味 – 未解析的元标签

    不完整的元标签是不专业的 tl;dr:不完整或空元标记会破坏功能和用户体验。 问题 标签出现在输出中电子邮件文本包含人类可读文本之间的占位符丢失的占位符会让用户感到困惑网站呈现奇怪的字符空值会触发错误潜在的安全注入漏洞 解决方案 验证元标记尽早断言完整性快速失败避免空值抛出有意义的异常自动元验证 语…

    2025年12月9日 好文分享
    000
  • 编写高质量的测试

    不幸的是,测试在许多组织中仍然没有得到应有的关注。有时,如果开发人员没有编写任何测试,他们会感到内疚,同时测试代码往往没有得到适当的审查。相反,评论中经常检查的唯一事情是是否有任何测试,这是一种耻辱,因为仅仅进行测试还不够好。实际上,它们至少应该与项目中的所有其他代码具有相同的质量,即使不是更高的质…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信