【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写的记账软件 的相关文章

  • java中监视目录变化

    我正在使用 WatchService 来监视目录中的更改 特别是目录中新文件的创建 下面是我的代码 package watcher import java nio file import static java nio file Stand
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • 如何在java中将日期格式从YYMMDD更改为YYYY-MM-DD? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从机器可读代码中获取日期格式为 YYMMDD 如何将其更改为 YYYY MM DD 例如我收到 871223 YYMMDD 我想把它改成
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • Java继承,扩展类如何影响实际类

    我正在查看 Sun 认证学习指南 其中有一段描述了最终修饰符 它说 如果程序员可以自由地扩展我们所知的 String 类文明 它可能会崩溃 他什么意思 如果可以扩展 String 类 我是否不会有一个名为 MyString 的类继承所有 S
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp

随机推荐

  • 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元 每次登记收入后 收入的金额应累加到基本金上