控制台实现简单的家庭收支记录软件

简介: 控制台实现简单的家庭收支记录软件

1、工具类的实现

import java.util.Scanner;
/**
Utility工具类:
将不同的功能封装为方法,就是可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。
*/
public class Utility {
    private static Scanner scanner = new Scanner(System.in);
    /**
  用于界面菜单的选择。该方法读取键盘,如果用户键入’1’-’4’中的任意字符,则方法返回。返回值为用户键入字符。
  */
  public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1);
            c = str.charAt(0);
            if (c != '1' && c != '2' && c != '3' && c != '4') {
                System.out.print("选择错误,请重新输入:");
            } else break;
        }
        return c;
    }
  /**
  用于收入和支出金额的输入。该方法从键盘读取一个不超过4位长度的整数,并将其作为方法的返回值。
  */
    public static int readNumber() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(4);
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
  /**
  用于收入和支出说明的输入。该方法从键盘读取一个不超过8位长度的字符串,并将其作为方法的返回值。
  */
    public static String readString() {
        String str = readKeyBoard(8);
        return str;
    }
  /**
  用于确认选择的输入。该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值。
  */
    public static char readConfirmSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }
    private static String readKeyBoard(int limit) {
        String line = "";
        while (scanner.hasNext()) {
            line = scanner.nextLine();
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }
        return line;
    }
}

2、FamilyAccount类的实现

public class FamilyAccount{
  public static void main(String[] args){
    //初始化金额
    int balance=10000;
    //保存收支明细
    String details="收支\t账户金额\t收支金额\t说明\n";
    //c初始化flag为true,保证下面前三个操作之后会再次运行循环体
    boolean flag=true;
    do{
    //初始化的菜单
      System.out.println("----------------家庭收支记录软件------------\n");
    System.out.println("    1 收支明细             ");
    System.out.println("    2 登记收入             ");
    System.out.println("    3 登记支出             ");
    System.out.println("    4 退出                \n");
    System.out.print("    请选择(1-4):");
    //判断输入的数字
    char key=Utility.readMenuSelection();
    switch(key){
      case '1':
        System.out.println("--------------当前的收支明细-------------");
        //打印收支明细
        System.out.println(details);
        break;
      case '2':
        System.out.print("请输入本次收入金额数:");
        int amount=Utility.readNumber();
        System.out.print("请输入本次收入说明:");
        String str=Utility.readString();
        balance+=amount;
        details+="收\t"+balance+"\t\t"+amount+"\t\t"+str+"\n";
        break;
      case '3':
        System.out.print("请输入本次支出金额数:");
        int amount1=Utility.readNumber();
        System.out.print("请输入本次支出说明:");
        String str2=Utility.readString();
        balance-=amount1;
        details+="支\t"+balance+"\t\t"+amount1+"\t\t"+str2+"\n";
        break;
      case '4':
        System.out.print("确定要退出吗?(Y/N?)");
        char c=Utility.readConfirmSelection();
        //当输入为y或者Y时,把flag设置为false,就会跳出循环
        if(c=='Y'){
          flag=false;
          System.out.print("谢谢您的使用");
        }
        break;
    }
    }while(flag);
  }
}

3、运行截图

1、展示菜单

ceb2fa9490884f168907a0e1febf633e.png

2、登记收入

6d833c7a63fb481a972507280e9d1535.png

3、登记支出

a1a1bdfc228f468aaccce6ba019ee9a2.png

4、收支明细

c8cef07a087f471ab20ce2a8cd966c6e.png

5、退出

31f2221d2fa940f3a1edfcde766dc5f3.png

6、总结:本次实现很简单,没有数据库存储一次运行的数据,利用合适的字符串来存储数据的。主要是考验大家对流程控制的小考验啦。

相关文章
|
缓存 监控 数据可视化
linux查看内存信息
在Linux中检查内存使用:`free -h`或`-m`显示简洁内存统计;`cat /proc/meminfo`获取详细信息;`top`或`htop`(如果安装)实时监控进程内存占用;`vmstat`查看虚拟内存统计;`sar -r`(需要sysstat)报告系统内存活动。图形工具如Gnome System Monitor提供可视化界面。
586 4
|
网络协议 Linux
Debian中如何设置静态IP地址 网关 DNS
新安装的Debian系统,默认一般使用DHCP获取IP地址,除非在安装过程中,使用了指定的IP地址。本文将介绍如何在Debian系统中,配置使用静态IP地址,配置网关,以及设置DNS服务器。 这些配置通过修改配置文件,很容易实现。
10799 0
|
9月前
|
Web App开发 前端开发 JavaScript
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
2015年,JavaScript之父Brendan Eich再次创业,推出Brave浏览器和加密货币Basic Attention Token(BAT),旨在颠覆传统广告行业。Brave屏蔽广告、保护隐私,加载速度快;BAT则通过奖励机制让用户、内容创作者和广告主三方受益。尽管面临用户习惯和巨头竞争的挑战,Brave已拥有超4000万月活跃用户,成为全球增长最快的隐私浏览器,引领Web3生态发展。
340 22
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
|
12月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
270 4
|
10月前
|
机器学习/深度学习 人工智能 API
【AI系统】昇腾异构计算架构 CANN
本文介绍了昇腾 AI 异构计算架构 CANN,涵盖硬件层面的达·芬奇架构和软件层面的全栈支持,旨在提供高性能神经网络计算所需的硬件基础和软件环境。通过多层级架构,CANN 实现了高效的 AI 应用开发与性能优化,支持多种主流 AI 框架,并提供丰富的开发工具和接口,助力开发者快速构建和优化神经网络模型。
657 1
|
数据采集 JavaScript API
Splash的爬虫应用(一)
Splash的爬虫应用(一)
249 0
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
887 6
|
SQL 缓存 前端开发
PHP性能优化实战:从代码到服务器的全方位攻略
【7月更文挑战第30天】在Web开发的世界里,PHP以其灵活性和易用性赢得了广泛的赞誉。然而,随着应用规模的扩大,性能问题逐渐浮现。本文将深入探讨PHP的性能优化策略,不仅涉及代码层面的精细调整,还包括服务器配置的优化技巧。我们将一起探索如何通过减少资源消耗、优化数据库交互以及利用缓存技术来提升PHP应用的性能表现。无论你是PHP新手还是资深开发者,这篇文章都将为你提供实用的优化建议,帮助你打造更快、更稳定的PHP应用。
236 4
|
XML Java 数据库连接
【问题已解决】Caused by: java.lang.IllegalStateException
【问题已解决】Caused by: java.lang.IllegalStateException
342 0
|
机器学习/深度学习 人工智能 供应链
构建未来:AI技术在智能物流中的应用
【5月更文挑战第38天】 随着人工智能技术的飞速发展,其在各行各业的应用已经变得日益广泛。特别是在智能物流领域,AI不仅改变了传统物流的运作模式,还极大提升了效率和准确性。本文将深入探讨AI在智能物流中的具体应用,包括库存管理、运输优化、自动化仓库以及客户服务等方面,并分析其对整个行业的深远影响。通过案例分析和数据支撑,我们展示了AI如何帮助物流公司降低成本、提高客户满意度,并推动整个供应链系统的创新。