【java】案例一:使用java写的记账软件

2023-11-19

一、需求说明

1.能够记录家庭的收入、支出,并能够打印收支明细表。
2.项目采用分级菜单方式。
3.假设家庭起始的生活基本金为10000元。

  • 每次登记收入后,收入的金额应累加到基本金上,并记录本次收入明细,以便后续的查询。
  • 每次登记支出后,支出的金额应从基本金中扣除,并记录本次支出明细,以便后续的查询。
  • 查询收支明细时,将显示所有的收入、支出名细列表。

二、主要思路

项目中分为两部分,分为Utility.java类和 Account类。
1.在Utility.java类中单独写了以下静态方法:

  • readMenuSelection() :该方法读取键盘,如果用户键入’1’-’4’中的 任意字符,则方法返回。返回值为用户键入字符。
  • readNumber() :该方法从键盘读取一个不超过4位长度的整数,并将 其作为方法的返回值。
  • readString() :该方法从键盘读取一个不超过8位长度的字符串,并将其作为方法的返回值。
  • readConfirmSelection():该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值。

2.在Account类中,主要使用switch-case语句对用户输入的’1-4’进行相应的输出结果。

三、代码实例

1.Utility.java代码部分
更多涉及了类和对象等相关知识,注意所定义函数的类型。

package u4;
import java.util.Scanner;
/**
将不同的功能封装为方法,就可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。
*/
public class Utility {
    private static Scanner scanner = new Scanner(System.in);
  //readKeyBoard方法
    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;
    }
    
    /**
	1.用于界面菜单的选择。该方法读取键盘,如果用户键入’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;
    }
	
	/**
	2.用于收入和支出金额的输入。该方法从键盘读取一个不超过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;
    }
	/**
	3.用于收入和支出说明的输入。该方法从键盘读取一个不超过8位长度的字符串,并将其作为方法的返回值。
	*/
    public static String readString() {
        String str = readKeyBoard(8);
        return str;
    }
	
	/**
	4.用于确认选择的输入。该方法从键盘读取‘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;
    }
	
}

2.Account.java代码部分

package u4;
public class Account {
	public static void main(String[] args) {
		boolean isFlag=true;
		int balance = 10000;//初始金额设为10000
		String details=" ";//记录收支情况
		while(isFlag) {
			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 selection = Utility.readMenuSelection();//	调用Utility里定义过的函数,获取用户选择
			switch(selection) {
			case '1':	
				System.out.println("-------------当前收支明细记录---------------");
				System.out.println("收支 \t 账户金额 \t 收支金额 \t 说明");
				System.out.println(details);
				System.out.println("----------------------------------------");
				break;
			
			case '2':	
				System.out.print("本次收入金额:");//登记收入
				int money_in = Utility.readNumber();//调用readNumber()函数获取输入			
				System.out.print("本次收入说明:");
				String info1 = Utility.readString();//调用readString()函数获取输入			
				//处理balance账户金额
				balance += money_in; 
				//处理details
				details += ("收入 \t" +balance+ "\t\t" +money_in + "\t\t" +info1+"\n");
				System.out.println("-----------------登记完成---------------------");
				break;
			
			case '3':
				System.out.print("本次支出金额:");//登记支出
				int money_out = Utility.readNumber();//调用readNumber()函数获取输入
				System.out.print("本次支出说明:");
				String info2 = Utility.readString();//调用readString()函数获取输入
				//处理balance账户金额
				if(balance >= money_out) {
					balance -= money_out;
					//处理details
					details += ("支出 \t"+balance+"\t\t" +money_out + "\t\t" +info2+"\n");
					System.out.println("-----------------登记完成---------------------");
				}
				else {
					System.out.print("支出超额,支付失败!");
				}
				break;
			
			case '4':	
				System.out.println("请选择:确认是否退出? Y/N");
				char isExit =Utility.readConfirmSelection();
				if(isExit == 'Y') {
					System.out.println("退出成功!");
					isFlag = false;
				
				}
				break;
			}
		}

	}

}

注意: 这两部分均在同一个包中。

四、运行结果

1.初始界面
初始界面
2.登记收入及查看收支情况登记收入及查看收支情况
3.登记支出及查看收支情况
登记支出及查看收支情况
4.退出登录
退出登录
退出成功-不在显示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【java】案例一:使用java写的记账软件 的相关文章

随机推荐

  • SQL关联表更新

    存在表数据 per user per emp info 需要将per emp info 中的name和post name更新到per user表中 mysql数据库 update per user u JOIN per emp info e
  • 我的英雄之路--转自HERO2008会刊

    HERO2007仍落落在目 HERO2008即将来临 能参加两届英雄大会 甚是荣幸 于是想写一写我的英雄之路 提笔易 落笔难 反复问自己是否配得上 英雄 二字 打开社区 看看自己的排名 虽排名速降 尚位居前列 于是厚起脸皮说说自己的在CSD
  • 【Vue项目实践】实现在线预览word文件、excel文件

    JUST DO IT 目录 一 查看word 1 引用mammoth js 2 页面布局 3 请求URL显示数据 二 查看Excel 1 引用sheetjs 2 页面布局 3 请求URL显示数据 三 项目应用 根据详情后缀分情况显示word
  • 修改CheckBox选择框、设置选择框颜色

    使用组件自带的属性 android buttonTint 可直接设置选择框的颜色 修改选择框选中与未选中时的状态 需设置选择器 selector XML
  • 医学图像公开数据集

    一 医学图像 1 阿里云 天池数据集 https tianchi aliyun com dataset spm 5176 14154004 J 4642415020 16 167b5699EO8yrc https tianchi aliyu
  • IDEA为spring-boot添加热部署

    在IDEA中 可以为spring boot添加热部署 一旦修改了java文件 spring boot会重新编译修改的文件 而不用重启 一 打开pom xml 添加依赖
  • 关于LC电路中电磁振荡过程的一个问题,向各位求教

    关于LC电路中电磁振荡过程的一个问题 向各位求教 复制链接 LC电路关键是产生能量在电感 L 和电容器 C 之间的转换 电感可以维持电流保持不变 电容可以维持两端电压不变 能量就在这个电压与电流之间转换 当电感中有电流时就会产生磁场 电容器
  • 若依框架自定义登录(免密登录)

    1 继承DaoAuthenticationProvider package com ruoyi framework config import org springframework security authentication BadC
  • iOS

    我们有的时候在创建UIView的时候 想要使用xib进行创建视图发现 xib文件不能和UIView文件一起创建 所以 我们要单独创建xib文件 我们选择Empty文件 而不要选择View文件 记得文件名和你之前创建的UIView文件名要一致
  • 简单了解默克尔(Merkle)树

    Merkle树是Ralph Merkle在1988年发明的 旨在构建更好的数字签名 原文是A DIGITAL SIGNATURE BASED ON A CONVENTIONAL ENCRYPTION FUNCTION本篇论文在Weki百科中
  • 各种平台下Perl模块的安装方法

    Perl到了第五版增加了模块的概念 用来提供面向对象编程的能力 这是Perl语言发展史上 的一个里程碑 此后 广大自由软件爱好者开发了大量功能强大 构思精巧的Perl模块 极大地 扩展了Perl语言的功能 CPAN Comprehensiv
  • 交换机access与trunk口

    交换机access与trunk口 转载自 https www cnblogs com weiyikang p 4945914 html 理论知识 以太网端口二种链路类型 Access 和Trunk Access 类型的端口 只能属于1 个V
  • 攻防世界-fileclude

  • Android-小游戏

    Android 打地鼠游戏 前端界面 布局文件 TableLayout 表格布局 TableRow 行 TextView 文本框 ImageView 图片框 java代码 Handler 消息处理 Runnable 建子线程 setOnCl
  • 自定义QMessageBox显示\按钮功能

    QPushButton okbtn new QPushButton QString fromLocal8Bit 确定 QPushButton cancelbtn new QPushButton QString fromLocal8Bit 取
  • Redis和MySQL的数据同步问题

    Redis的工作流程 1 前台发送请求 后台接口去查询 2 先去查询Redis缓存里面有没有数据 如果有数据 就直接返回数据 3 如果Redis缓存里面没有数据 就去查询数据库 在数据库中查到数据以后 保存到Redis缓存中 然后在返回前台
  • 5、面向对象的设计思想

    一 面向对象设计思想 1 1 面向过程的设计思想与面向对象的设计思想 例如 我要去新疆 面向过程 我开车 我挂挡 我踩油门 我过河北 我过陕西 面向对象 我命令车去新疆 车怎么去不关我事 信息封装在这这个类的内部 我不用去了解车整个开动的过
  • SATA M.2 NGFF PCIE AHCI NVME SSD固态硬盘的接口、总线和协议区分

    总线 协议 说接口之前先说总线 民用产品的硬盘总线多为 SATA 和 PCIe SATA 总线只能使用 AHCI 协议 NVME 对比 AHCI 的优势在于 低延时 低功耗 更适合固态硬盘 PCIe总线 可以使用 AHCI 也可以使用更高效
  • uniapp vue3 h5,微信小程序滚动屏幕元素渐入动画&自定义导航栏

    项目文件下载地址 实际效果如下 一 滚动屏幕元素渐入 注意事项 animate css需要添加样式兼容微信小程序 微信小程序滚动时boundingClientRect获取不到标签信息 1 HBuilderX打开uniapp创建的vue3项目
  • 【java】案例一:使用java写的记账软件

    目录 一 需求说明 二 主要思路 三 代码实例 四 运行结果 一 需求说明 1 能够记录家庭的收入 支出 并能够打印收支明细表 2 项目采用分级菜单方式 3 假设家庭起始的生活基本金为10000元 每次登记收入后 收入的金额应累加到基本金上