java实现简单的家庭收支记账程序

文章目录

  • java实现简单的家庭收支记账程序
  • 前言
  • 一、需求分析
    • 1.要求
    • 2.不同模块功能
    • 3.需定义的变量(仅供参考)
    • 4.一些优化建议
  • 二、工具类
    • 概念
    • 本项目工具类代码及解析
  • 三、代码实现
  • 总结

前言

本篇文章主要介绍了家庭收支记账程序的设计思路以及代码实现过程,希望能为大家学习java提供有用的经验。


一、需求分析

1.要求

该软件能够记录家庭的收入、支出,并能够打印收支明细表。
项目采用分级菜单方式。主菜单示例如下:

-----------------家庭收支记账软件-----------------

1 收支明细
2 登记收入
3 登记支出
4 退 出

2.不同模块功能

1.主界面——输入选项——判断选项,进行不同功能块
2.收支明细展示界面——向用户展示已有的记录
3.登记收入/登记支出界面——接收用户输入计算总计并添加数据记录
4.退出界面——用于退出程序

3.需定义的变量(仅供参考)

在编程过程中有如下场景需要定义变量
1.数据记录——这里可以用二维数组
2.菜单选项——可以是整型、字符型(1,2,3,4)
3.收入——(收支与总金额用整型比较好)
4.支出
5.总金额
6.说明——字符串
7.确认退出——字符
8.存放记录索引,实现一条一条的数据添加——整型
9.数据存满时用于退出循环——布尔型

4.一些优化建议

1.在代码编写时最好加上自己的注释,方便自己与他人更直观地理解代码
2.将不同功能块打包成方法能够显著的减少代码量,提高编程效率
3.在代码编程过程中,尽可能考虑到用户的使用体验,在某些细节处迎合用户需求。
4.为了避免数据存满发生冲突,可以设置一个布尔变量作为旗帜,在数据存满后输出表格,并退出界面

二、工具类

概念

封装了若干方法的类,可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。

本项目工具类代码及解析

在这个工具类中较为重要的是readKeyBoard()方法
打包了读取键盘输入的代码,设置了limit参数,用于限定输入长度,当输入长度不合法时会发出提示。
工具包内的其他方法都是由此方法延申而来。

import java.util.Scanner;
/**Utility工具类:将不同的功能封装为方法,就是可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。*/
public class Utility {private static Scanner scanner = new Scanner(System.in);/**readKeyBoard该方法用于读取键盘,定义了参数整型参数 limit ,用于限定输入长度后面几个方法中都会用到*/private static String readKeyBoard(int limit) {String line = ""; //用于接收键盘输入的字符串/*此处使用while循环 ,条件为 scanner.hasNext() 即有输入的话就循环,没有继续输入的话就退出循环*/while (scanner.hasNext()) {line = scanner.nextLine(); //将输入赋值给line变量/*使用if语句判断输入字符长度是否符合要求,如果输入不合法,则提示用户输入错误,跳过本次循环,开始新的循环。*/if (line.length() < 1 || line.length() > limit) {System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");continue;}break;//如果符合要求就退出循环}return line;//返回输入的字符串}
}/**用于界面菜单的选择。该方法读取键盘,如果用户键入’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); //用于将字符串转换为int类型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(); //.toUpperCase()无论输入字符穿为大小写都转换为大写c = str.charAt(0);//将字符串类型转换为字符类型if (c == 'Y' || c == 'N') {break;} else {System.out.print("选择错误,请重新输入:");}}return c;}

三、代码实现

1.主界面代码:

System.out.print("请输入1-4的选项" + "\n"+"1.收支明细"+"\n"+"2.登记收入"+"\n"+"3.登记支出"+"\n"+"4.退出"+"\n")

2.收入界面代码

 public  static void Incomeregistration(String a[][]){System.out.println("请输入本次收入的金额:");income=Utility.readNumber(); //接收用户输入的收入数据System.out.println("请输入本次收入的说明:");remarks=Utility.readString(); //接受用户的收入说明a[count][0]="收入"; //录入数据的收支类型sumNum+=income; //计算新的总金额a[count][1]=sumNum+""; //录入新的总金额/*注意!存放数据的数组是以字符串/String类型定义的无法存放int类型数据这里的+“”是为了将int类型的sumNum转换为字符串/String类型*/a[count][2]="+"+income;//录入收入金额,前面添加“+”是为了用户有更好的使用体验a[count][3]=remarks; //录入收入说明count++; //将索引后移到下一个未赋值的数组元素上System.out.println("添加成功!"); //输出添加成功的提示}

3.支出界面代码
由于支出界面与收入界面只是将“+”换成了“-”所有这里省略了一些注释

//支出记录方法-Outcomeregistrationpublic  static void Outcomeregistration(String a[][]){System.out.println("请输入本次支出的金额:");expenditure=Utility.readNumber();System.out.println("请输入本次支出的说明:");remarks=Utility.readString();a[count][0]="支出";sumNum-=expenditure;a[count][1]=sumNum+"";a[count][2]="-"+expenditure;a[count][3]=remarks;count++;System.out.println("添加成功!");}

4.退出界面代码

//确认退出方法-Confirmexitpublic  static boolean Confirmexit(char e){System.out.println("确认是否退出(Y/N)?:");
//                    Scanner qr =new Scanner(System.in);
//                    d=qr.next();e= Utility.readConfirmSelection();if (e=='Y'){System.out.println("拜拜!退出成功!");flag=false;return flag;}return false;}

完整代码如下(示例):
注释掉的代码是最开始没有使用方法调用的代码如果还没学习方法调用的同学可以参考一下)

public class Test3_t {static int income,expenditure; //收入支出变量static String remarks; // 说明变量static char confirm; // 确认退出变量static int sumNum=10000; //初始化总金额变量static String[][] arr = new String[10][4]; // 初始化数组用于存储数据static int count=0;/*count变量的作用:1.记录数据条数2.在数组赋值未满时指向下一个未赋值的索引位置*/static boolean flag=true ;//用于数组存满后退出//输出表中信息的方法——printsurfacepublic  static void printsurface(String a[][]){System.out.println("-------------------收支明细记录表-----------------------");System.out.println("收支\t\t账户总金额\t\t收支金额\t\t说   明");
//        使用for循环递归输出表中所有信息
//        j代表第j条数据for (int j = 0; j <a.length ; j++) {//            判断非空输出数据if (a[j][0]!=null){System.out.println(a[j][0]+"\t\t"+(a[j][1]+"")+"\t\t\t"+(a[j][2]+"")+"\t\t\t"+(a[j][3]+""));}}System.out.println("--------------------------------------------------------\n");}//收入记录方法——Incomeregistrationpublic  static void Incomeregistration(String a[][]){System.out.println("请输入本次收入的金额:");income=Utility.readNumber();System.out.println("请输入本次收入的说明:");remarks=Utility.readString();a[count][0]="收入";sumNum+=income;a[count][1]=sumNum+"";a[count][2]="+"+income;a[count][3]=remarks;count++;System.out.println("添加成功!");}//支出记录方法-Outcomeregistrationpublic  static void Outcomeregistration(String a[][]){System.out.println("请输入本次支出的金额:");expenditure=Utility.readNumber();System.out.println("请输入本次支出的说明:");remarks=Utility.readString();a[count][0]="支出";sumNum-=expenditure;a[count][1]=sumNum+"";a[count][2]="-"+expenditure;a[count][3]=remarks;count++;System.out.println("添加成功!");}//确认退出方法-Confirmexitpublic  static boolean Confirmexit(char e){System.out.println("确认是否退出(Y/N)?:");
//                    Scanner qr =new Scanner(System.in);
//                    d=qr.next();e= Utility.readConfirmSelection();if (e=='Y'){System.out.println("拜拜!退出成功!");flag=false;return flag;}return false;}public static void main(String[] args) {while(flag){if (count>=10){System.out.println("系统满载!立即退出!当前所有数据如下:");/*System.out.println("-------------------收支明细记录表-----------------------");System.out.println("收支\t\t账户总金额\t\t收支金额\t\t说   明");for (int j = 0; j <arr.length ; j++) {if (arr[j][0]!=null){System.out.println(arr[j][0]+"\t\t"+(arr[j][1]+"")+"\t\t\t"+(arr[j][2]+"")+"\t\t\t"+(arr[j][3]+""));}}*/flag=false;printsurface(arr);break;}System.out.print("请输入1-4的选项" + "\n"+"1.收支明细"+"\n"+"2.登记收入"+"\n"+"3.登记支出"+"\n"+"4.退出"+"\n");
//            Scanner sc= new Scanner(System.in);
//            a=sc.nextInt();char choice=Utility.readMenuSelection();switch (choice){case '1':/*System.out.println("-------------------收支明细记录表-----------------------");System.out.println("收支\t\t账户总金额\t\t收支金额\t\t说   明");for (int j = 0; j <arr.length ; j++) {if (arr[j][0]!=null){System.out.println(arr[j][0]+"\t\t"+(arr[j][1]+"")+"\t\t\t"+(arr[j][2]+"")+"\t\t\t"+(arr[j][3]+""));}}System.out.println("--------------------------------------------------------\n");*/printsurface(arr);break;case '2':/*System.out.println("请输入本次收入的金额:");//Scanner sr =new Scanner(System.in);//b=sr.nextInt();income=Utility.readNumber();System.out.println("请输入本次收入的说明:");//Scanner ss =new Scanner(System.in);//d=ss.next();remarks=Utility.readString();arr[count][0]="收入";sumNum+=income;arr[count][1]=sumNum+"";arr[count][2]="+"+income;arr[count][3]=remarks;count++;System.out.println("添加成功!");*/Incomeregistration(arr);break;case '3':/* System.out.println("请输入本次支出的金额:");expenditure=Utility.readNumber();
//                    Scanner zc =new Scanner(System.in);
//                    c=zc.nextInt();System.out.println("请输入本次支出的说明:");remarks=Utility.readString();
//                    Scanner zs =new Scanner(System.in);
//                    d=zs.next();arr[count][0]="支出";sumNum-=expenditure;arr[count][1]=sumNum+"";arr[count][2]="-"+expenditure;arr[count][3]=remarks;count++;System.out.println("添加成功!");*/Outcomeregistration(arr);break;case '4':/* System.out.println("确认是否退出(Y/N)?:");
//                    Scanner qr =new Scanner(System.in);
//                    d=qr.next();confirm= Utility.readConfirmSelection();if (confirm=='Y'){System.out.println("拜拜!退出成功!");flag=false;break;}*/Confirmexit(confirm);break;default:System.out.println("您输入的选项类别有误");break;}}}
}

总结

家庭收支记账程序,有助于大家熟练掌握运用封装方法来完成程序编写。显然通过方法的封装只需要将参数带入到方法中就能得出结果,能够很好地避免代码的重复使用,帮助我们更简洁地完成代码的编写。

java实现简单的家庭收支记账程序相关推荐

  1. java编写家庭收支记账程序

    一.明确需求:                                                                                              ...

  2. Java基础项目——基于文本家庭简易收支记账程序

    一.目标 1.模拟实现一个基于文本的家庭简易收支记账程序 2.掌握初步的编程技巧和调试程序 3.灵活使用基础知识 二.项目需求 模拟实现一个基于文本界面(程序控制台)的<家庭收支记录程序> ...

  3. 使用Java实现简单的家庭记账程序

    文章目录 1.需求说明 2.具体实现 1.需求说明 1.模拟实现一个基于文本界面(程序控制台)的<家庭收支记录程序>,该程序能够记录家庭的收入.支出,并能够打印收支明细表. 2.项目采用分 ...

  4. Java项目:家庭收支记账软件

    目录 前言 一.任务要求 二.实现代码 总结 前言 最近花了一个星期看了JAVA经典书籍<Java核心技术卷I>,囫囵吞枣般看完,领略了其中大概内容,花时间看视频巩固一下,就去b站看了尚硅 ...

  5. java编写家庭收支记录,Java家庭收支记账小项目(java基础)

    Java家庭收支记账小项目(java基础) Java家庭收支记账小项目(java基础) 需求说明: 模拟实现基于文本界面的<家庭记账软件>. 该软件能够记录家庭的收入.支出,并能够打印收支 ...

  6. 家庭收支记账系统--java项目练习

    一.功能介绍: 采用分级菜单模式 主界面为菜单选择: 通过从键盘输入数字来进行记录家庭的收入.支出,并且打印收支明细表等功能 二.代码演示 代码由FamilyAccount Java文件和自定义Uti ...

  7. Java项目一(案例):家庭收支记账软件

    Java项目一(案例):家庭收支记账软件 项目概述 软件功能 项目说明 涉及Java知识点 软件需求说明 程序代码示例 FamilyAccount.class文件 自定义Utility.class工具 ...

  8. java基础(家庭收支记账软件)

    家庭收支记账软件 目标 模拟实现一个基于文本界面的<家庭记账软件> 掌握初步的编程技巧和调试技巧 主要涉及以下知识点: 变量的定义 基本数据类型的使用 循环语句 分支语句 方法声明.调用和 ...

  9. java家庭收支记账软件

    说明: 这篇文章主要运用了一些java基础知识的一个综合运用 主要涉及以下知识点:  变量的定义  基本数据类型的使用  循环语句  分支语句  方法声明.调用和返回值的接收  简单的屏幕 ...

最新文章

  1. transform插件
  2. python函数高级运用
  3. Codeforces 题解 CF863A 【Quasi-palindrome】
  4. iphone屏蔽系统更新_iPhone手机经常提示更新系统,教你一招关闭方法,学到了
  5. 全球及中国4-氨基间甲酚行业应用需求与发展策略分析报告2022版
  6. 重要的基础注解@import
  7. linux设置开机启动 服务不支持chkconfig解决方法脚本
  8. Xcode统计整个项目代码行数
  9. php 8.0 jit,PHP 8.0 正式版发布,性能提升 10%
  10. 7.程序员的自我修养---动态链接
  11. nginx location总结
  12. 装机员Ghost一键备份还原使用方法(硬盘装系统)
  13. C语言——简单三子棋
  14. IE 9 beta 下载地址
  15. 学会用CUPS管理打印机
  16. 为什么社会上的Java程序员还没有饱和?
  17. 【MAYA】模型生长
  18. OMAPL138报Error connecting to the target:Connect to PRSC failed解决办法
  19. 清华刘知远提出CPT:基于预训练视觉-语言模型的跨模态Prompt-Tuning
  20. 时间序列预测分析(2)How to Develop a Skillful Machine Learning Time Series Forecasting Model

热门文章

  1. 随机密码生成工具类(java)
  2. 编程是将c语言编写的源程序,C语言程序设计基础教程习题答案20120319.doc
  3. 项目数据表中的并发控制机制之version
  4. 日本株式会社ARTISTIC CO.与J SELECT合作新品 首发会于北京举行
  5. 一键刷机三星I9220
  6. Mybatis-plus使用过程中出现Invalid bound statement (not found):com.xxx.xxx.xxxMapper.selectList
  7. 使用了systemctl disable lightdm快速恢复
  8. 用PPA下载codeblocks
  9. 外国的搜索引擎 可搜索被封信息
  10. 丰子恺的20条生活哲学: 只要生机不灭,终有抬头的日子