Java小项目——家庭记账项目
学习Java已经过了半个月左右了,所学的知识已经能够写一些小程序或者小项目,虽然它可能没有那么高级,但是也能检验你之前所学的全部内容。所以今天就与大家分享一下我的小项目经验。
一、需求说明
该软件能够记录家庭的收入、支出,并能够打印收支明细表,项目采用分级菜单方式。主菜单如下:
-----------------家庭收支记账软件-----------------
1 收支明细
2 登记收入
3 登记支出
4 退 出
请选择(1-4):_
假设家庭起始的生活基本金为10000元
每次登记收入(菜单2)后,
收入的金额应累加到基本金上,并记录本次收入明细,
以便后续的查询。
每次登记支出(菜单3)后,
支出的金额应从基本金中扣除,并记
录本次支出明细,以便后续的查询。
查询收支明细( 菜单1)时,
将显示所有的收入、支出名细列表
二、项目阶段
阶段一
首先,实现界面展示功能
并且能根据输入的数据进入到每个功能里。
阶段二
在阶段一的过程中完成主要的“收入”,“支出”功能!
从键盘读取收入、支出的金额,从键盘读取收入、支出的原因,按照要求存储数据(数组),添加成功。如上图所示。
让项目更完善
引入工具类,实现一些错误输入判断,并且不断的调试程序的bug,完善程序的功能。
三、解题思路
首先项目需用到的知识有:Sanner(获取用户输入)、switch分支语句、方法的定义和调用、数组(一维或者二维)、以及让程序能一直运行下去的死循环语句。
菜单界面
首先构建一个死循环语句将菜单的基本界面放入循环当中,用打印语句System.out.println();构建基本菜单界面,构建完成后获取一个输入值,然后将这个值放入switch当中进行分支判断,这样就能让用户选择要进行的操作,然后再case语句中调用方法,实现对应的功能。
部分程序如下:
while(choice){System.out.println("1.收支明细");System.out.println("2.登记收入");System.out.println("3.登记支出");System.out.println("4.退出");System.out.println("请输入(1-4):");String a = readKeyBoard(1);//取c中的第一个字符char ch = a.charAt(0);if(ch != '1' && ch != '2' && ch != '3' && ch != '4'){System.out.println("您输入的数据有误,请重新输入");}else {switch (ch){case '1':incomeAndExpenditureDetails(i,arr);break;case '2':registrationIncome(i,arr);i++;break;case '3':registeredExpenditure(i,arr);i++;break;case '4':System.out.println("正在退出....");choice = false;break;}}}System.out.println("退出成功!");
收支明细
收支明细要做的事情就是打印出数组里的东西,将添加到数组里的数据答应输出到控制台。所以我们要写的方法为一个简单的循环输出语句即可。
代码如下:
//收支明细public static void incomeAndExpenditureDetails(int i,String[][] arr) {// System.out.println(Arrays.toString(arr));for (int k = 0; k < i; k++) {for (int j = 0; j <arr[k].length ; j++) {System.out.print(arr[k][j]+"\t");}System.out.println();}}
这里要注意,我们采用的是二维数组的方式来进行该项目。思路为在主函数中构建一个,足够大的二维数组,这里我给的长度为[10][4]。其实10可以更大,随你想运行多久的程序而确定。
String[][] arr= new String[10][4];
登记收入
构建一个方法要求能从键盘读取收入、支出的金额,从键盘读取收入、支出的原因,按照要求存储数据(数组),添加成功。
这里主要的问题在于数据类型的转换,因为有字符串的存在所以我们定义的数组为String类型的数组,所以我们存入的数据也必须是字符串类型的数组,但是收支金额要做加减运算的话就必须为整数或者是小数才行,这就需要用到强制类型转换。
转为String类型,代码如下:
String ab = c + "";
转为Double类型,代码如下:
double x = Double.parseDouble(arr[i-1][1])+c;
解决完这个问题后方法的功能基本就能完成,代码参考如下:
public static void registrationIncome(int i,String[][] arr) {String[] arr1= new String[4];Scanner sc = new Scanner(System.in);System.out.println("请输入收入金额:");
// String a = readKeyBoard(4);double c= readNumber();
// double ch = Double.parseDouble(a);if (c>0){//强制类型转换为StringString ab = "+"+c + "";arr1[2] =ab;System.out.println("请输入说明:");String b = readKeyBoard(6);arr1[3]=b;arr1[0] ="收入";//强制类型转换为doubledouble x = Double.parseDouble(arr[i-1][1])+c;String y = x + "";arr1[1] =y;for (int j = 0; j < 1; j++) {for (int k = 0; k <arr[j].length ; k++) {System.out.print(arr[j][k]+"\t");}System.out.println();}for (int j = 0; j <arr1.length ; j++) {System.out.print(arr1[j]+"\t");}System.out.println();arr[1][1] = arr1[1];arr[1][2] =arr1[2];}else {System.out.println("您输入的数据有误,请重新选择");}//将一维数组的值存入二维数值中for (int j = 0; j <=3 ; j++) {arr[i][j] = arr1[j];}}
登记支出
这里的方法跟登记收入差不多,只有一个加减的问题,完成登记收入的方法后就能依葫芦画瓢的完成登记支出方法的定义。
具体代码如下:
public static void registeredExpenditure(int i,String[][] arr) {String[] arr1= new String[4];Scanner sc = new Scanner(System.in);System.out.println("请输入支出金额:");double a= readNumber();double z = Double.parseDouble(arr[i-1][1]);if(a>z){System.out.println("余额不足,请重新选择");}else if(a>0){//强制类型转换为StringString ab = "-"+a + "";arr1[2] =ab;System.out.println("请输入说明:");String b = readKeyBoard(6);arr1[3]=b;arr1[0] ="支出";double x = Double.parseDouble(arr[i-1][1])-a;String y = x + "";arr1[1] =y;for (int j = 0; j < 1; j++) {for (int k = 0; k <arr[j].length ; k++) {System.out.print(arr[j][k]+"\t");}System.out.println();}for (int j = 0; j <arr1.length ; j++) {System.out.print(arr1[j]+"\t");}System.out.println();arr[1][1] = arr1[1];arr[1][2] = arr1[2];}else {System.out.println("您输入的数据有误,请重新选择");}for (int j = 0; j <=3 ; j++) {arr[i][j] = arr1[j];}}
完善项目
做完登记支出后项目的基本功能也就擦不多完成了,但是还有很多需要调整的地方,如我在输入收支金额的时候超长输入,或者输入“ashdakh”的这种字符串等,就会让程序出现问题,所以我们要写一下新的方法来对其进行限制。
如:限制输入的长度
public static String readKeyBoard(int limit) {Scanner sc = new Scanner(System.in);String line = "";//判断是否有数据输入sc.hasNext()while (sc.hasNext()) {line = sc.nextLine();if (line.length() < 1 || line.length() > limit) {System.out.println("输入长度(不大于" + limit + ")错误,请重新输入:");continue;}break;}return line;}
限制输入的类型:
public static double readNumber() {double n;for (; ; ) {String str = readKeyBoard(4);try {n = Double.parseDouble(str);break;} catch (NumberFormatException e) {System.out.println("数字输入错误,请重新输入:");}}return n;}
最后只要将这些方法在主函数中调用执行,就能完成一个小的家庭记账项目。
完整代码如下:
package 关卡7;import java.util.Arrays;
import java.util.Scanner;
public class test1 {public static void main(String[] args) {//Scanner sc = new Scanner(System.in);int i =2;String[][] arr= new String[10][4];arr[0][0] = "收支";arr[0][1] = "账户金额";arr[0][2] = "收支金额";arr[0][3] = "说明";arr[1][0] = "本金";arr[1][1] = "10000";arr[1][2] = "0";arr[1][3] = "账户资金";// int limit = 5;boolean choice = true;while(choice){System.out.println("1.收支明细");System.out.println("2.登记收入");System.out.println("3.登记支出");System.out.println("4.退出");System.out.println("请输入(1-4):");String a = readKeyBoard(1);//取c中的第一个字符char ch = a.charAt(0);if(ch != '1' && ch != '2' && ch != '3' && ch != '4'){System.out.println("您输入的数据有误,请重新输入");}else {switch (ch){case '1':incomeAndExpenditureDetails(i,arr);break;case '2':registrationIncome(i,arr);i++;break;case '3':registeredExpenditure(i,arr);i++;break;case '4':System.out.println("正在退出....");choice = false;break;}}}System.out.println("退出成功!");}
//收支明细public static void incomeAndExpenditureDetails(int i,String[][] arr) {// System.out.println(Arrays.toString(arr));for (int k = 0; k < i; k++) {for (int j = 0; j <arr[k].length ; j++) {System.out.print(arr[k][j]+"\t");}System.out.println();}}
//登记收入public static void registrationIncome(int i,String[][] arr) {String[] arr1= new String[4];Scanner sc = new Scanner(System.in);System.out.println("请输入收入金额:");
// String a = readKeyBoard(4);double c= readNumber();
// double ch = Double.parseDouble(a);if (c>0){//强制类型转换为StringString ab = "+"+c + "";arr1[2] =ab;System.out.println("请输入说明:");String b = readKeyBoard(6);arr1[3]=b;arr1[0] ="收入";//强制类型转换为doubledouble x = Double.parseDouble(arr[i-1][1])+c;String y = x + "";arr1[1] =y;for (int j = 0; j < 1; j++) {for (int k = 0; k <arr[j].length ; k++) {System.out.print(arr[j][k]+"\t");}System.out.println();}for (int j = 0; j <arr1.length ; j++) {System.out.print(arr1[j]+"\t");}System.out.println();arr[1][1] = arr1[1];arr[1][2] =arr1[2];}else {System.out.println("您输入的数据有误,请重新选择");}for (int j = 0; j <=3 ; j++) {arr[i][j] = arr1[j];}}
//登记支出public static void registeredExpenditure(int i,String[][] arr) {String[] arr1= new String[4];Scanner sc = new Scanner(System.in);System.out.println("请输入支出金额:");double a= readNumber();double z = Double.parseDouble(arr[i-1][1]);if(a>z){System.out.println("余额不足,请重新选择");}else if(a>0){//强制类型转换为StringString ab = "-"+a + "";arr1[2] =ab;System.out.println("请输入说明:");String b = readKeyBoard(6);arr1[3]=b;arr1[0] ="支出";double x = Double.parseDouble(arr[i-1][1])-a;String y = x + "";arr1[1] =y;for (int j = 0; j < 1; j++) {for (int k = 0; k <arr[j].length ; k++) {System.out.print(arr[j][k]+"\t");}System.out.println();}for (int j = 0; j <arr1.length ; j++) {System.out.print(arr1[j]+"\t");}System.out.println();arr[1][1] = arr1[1];arr[1][2] = arr1[2];}else {System.out.println("您输入的数据有误,请重新选择");}for (int j = 0; j <=3 ; j++) {arr[i][j] = arr1[j];}}//限制长度public static String readKeyBoard(int limit) {Scanner sc = new Scanner(System.in);String line = "";//判断是否有数据输入sc.hasNext()while (sc.hasNext()) {line = sc.nextLine();if (line.length() < 1 || line.length() > limit) {System.out.println("输入长度(不大于" + limit + ")错误,请重新输入:");continue;}break;}return line;}//限制输入类型public static double readNumber() {double n;for (; ; ) {String str = readKeyBoard(4);try {n = Double.parseDouble(str);break;} catch (NumberFormatException e) {System.out.println("数字输入错误,请重新输入:");}}return n;}
}
这就是我的思路和代码,写的比较粗糙和笨拙,所以仅供大家参考。
Java小项目——家庭记账项目相关推荐
- java小项目家庭记账程序
文章目录 java小项目家庭记账程序 **1.项目目标:** 2.项目需求: 3.具体思路: 4.具体代码: 1.页面: 2.Option_1类: 3.Option_2类: 4.Option_3类: ...
- java计算机毕业设计家庭记账系统源程序+mysql+系统+lw文档+远程调试
java计算机毕业设计家庭记账系统源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计家庭记账系统源程序+mysql+系统+lw文档+远程调试 本源码技术栈: 项目架构:B/S架构 开 ...
- 基于Java小案例家庭收入支出记录
基于Java小案例家庭收入支出记录 跟着视频来写的,不喜勿喷,谢谢 package JavaText;public class FamilyAccount {public static void ma ...
- Golang学习(二十四)家庭记账项目
一.项目开发流程 需求分析-->设计阶段-->实现阶段(代码)-->测试阶段-->实施阶段-->维护阶段 二.项目需求说明 1.模拟实现基于文本界面的 <家庭记账软 ...
- 微信小程序--家庭记账本开发--01
微信小程序的开发准备与开发工具的学习 在这次寒假伊始,临近春节,学习进程有所拉下,现在补上.寻找了好多网站的相关学习视频,包括微信公众平台关于小程序这方面也有好多相关资料供查阅. 1.开发准备: 首先 ...
- Java 编写一个家庭记账软件 -25天 学习笔记
练习 package com.xin.base; import java.util.Scanner;public class Part {public static void main (String ...
- Java基础:家庭记账程序
目标: 模拟实现一个基于文本界面的家庭记账软件,灵活运用基础知识 需求分析: 该软件能够记录家庭的收入.支出,并能够打印收支明细表 其主菜单如下: 需要满足的条件有: 工作流程图如下: 这里是实现代码 ...
- Java项目----家庭记账软件(基于文本界面)
一.涉及要点: ①变量的定义 ②基本数据类的使用 ③循环语句 ④分支语句 ⑤方法声明.调用和返回值的接收 ⑥简单屏幕输出格式控制 二.需求说明 ①能够记录家庭的收入.支出,并能够打印收支明细表 ②采用 ...
- JAVA毕设项目家庭记账系统(java+VUE+Mybatis+Maven+Mysql)
项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
最新文章
- activity 防止多次打开_杭州下沙罐式无负压供水设备防止水质污染变频电泵
- 801. Minimum Swaps To Make Sequences Increasing
- android 存储不被垃圾清理,手机内存足够大,就不需要清理垃圾了?你错了!
- python中set集合_Python中的SET集合操作
- MySQL 备份 nb3 和 psc的区别
- springsecurity3的验证过程
- Java、JSP大学生助学贷款管理系统的设计与实现
- 可以获得高排名的B2B平台大全
- QQ聊天记录的备份和恢复(含迁移与合并)
- textaligncenter仍然不居中_你不知道的中华文化,中华文化的根源不是儒家而是河图洛书...
- android 没有menu菜单键,android之onCreateOptionsMenu失效,按菜单键无反应
- Chrome设置--disable-web-security解决跨域问题
- 为什么五笔输入法打字那么快,现在使用的人却越来越少了?
- jQuery siblings() 方法
- uploadify html5 java_工作中碰到uploadify插件两个版本:HTML5和Flash
- python中怎么关闭文件-python_文件的打开和关闭
- 店铺如何提升流量,抢占先机
- 我成功转型大厂数据分析师后,总结了这些经验…
- 华为云麒麟arm架构docker启动redis报错:<jemalloc>: Unsupported system page size
- python 遥感图像分类