使用java实现基础的家庭记账程序

需求说明

1.该程序能够记录家庭的收入、支出,并能打印收支明细表
2.项目采用分级菜单的方式。主菜单如下:
在这里插入图片描述
3.假设家庭起始的生活基本金为10000元
4.每次登记收入(菜单2)后,收入的金额应累加到基本金上,并记录本次收入明细,以便后续的查询。
5.每次登记支出(菜单3)后,支出的金额应从基本金中扣除,并记录本次支出明细,以便后续的查询。
6.查询收支明细( 菜单1)时,将显示所有的收入、支出名细列表

具体操作

在这里插入图片描述
初始化

double[] money=new double[100];//初始化收入
double basedOnMoeny=10000;//初始化金钱
String[] explain=new String[100];//初始化原因
int count=0;//计数器

抛出异常,并使用循环继续进入菜单,防止程序提前结束

while (true){//当异常抛出后,在此进入程序
    try {
        zhuCaiDan(money,count,explain,basedOnMoeny);
    }catch (Exception e){//抛出异常,防止用户因为错误的输入而使程序停止
        System.out.println("不要乱输哦,即将为您返回主菜单");
        Thread.sleep(3000);//暂停当前线程三秒,三秒后重新进入程序
            }
        }

录入收入

System.out.println("请登记你的收入");
System.out.println("赚了多少:");
Scanner sc=new Scanner(System.in);
money[count]=sc.nextDouble();//录入double类型的数据
System.out.println("怎么赚的:");
sc.nextLine();//接受回车,防止接下的输入直接退出
explain[count]=sc.nextLine();
count++;//录入数据后索引自加
System.out.println("添加成功");

遍历

if(money[a]>=0){
    System.out.print("收入\t\t");
}else{
    System.out.print("支出\t\t");
}
basedOnMoney+=money[a];
System.out.printf("%-16.2f",basedOnMoney);//有些数据小与8字节,有点数据大于8字节,\t不好用,所以规定长度
if(money[a]>=0){
    System.out.print("+");
    System.out.printf("%-15.2f",money[a]);
}else{
    System.out.printf("%-16.2f",money[a]);
 }
System.out.print(explain[a]);
System.out.println();

完整代码

package xuexi.java.guanka7;

import java.util.Scanner;


public class FamilyGetAndPutSystem {
    public static void main(String[] args) throws InterruptedException {
        double[] money=new double[100];//初始化收入
        double basedOnMoeny=10000;//初始化金钱
        String[] explain=new String[100];//初始化原因
        int count=0;//计数器

        while (true){//当异常抛出后,在此进入程序
            try {
                zhuCaiDan(money,count,explain,basedOnMoeny);
            }catch (Exception e){//抛出异常,防止用户因为错误的输入而使程序停止
                System.out.println("不要乱输哦,即将为您返回主菜单");
                Thread.sleep(3000);//暂停当前线程三秒,三秒后重新进入程序
            }
        }

    }

    public static void zhuCaiDan(double[] money,int count,String[] explain,Double basedOnMoney){//主菜单
        System.out.println("----------------欢迎进入家庭收支系统----------------");
        System.out.println();
        System.out.println("                   1.收支明细");
        System.out.println("                   2.登记收入");
        System.out.println("                   3.登记支出");
        System.out.println("                   4.退出");
        System.out.println();
        Scanner sc = new Scanner(System.in);
        double basedOnMoeny=basedOnMoney;//传进来的参数能够使用,但是不能直接传参,所以重新定义
        System.out.println("请选择(1-4):" );
        while(true) {
            String  n = sc.nextLine();
            if (n.equals("1")) {//使用.equals来判断输入的是否是1
                detail(money,count,explain,basedOnMoeny);
            } else if (n.equals("2")) {
                shouRu(money,count,explain,basedOnMoeny);
            } else if (n.equals("3")) {
                zhiChu(money,count,explain,basedOnMoeny);
            } else if (n.equals("4")) {
                System.out.println("正在退出");
                System.out.println("退出成功");
                System.exit(0);//强制退出程序
            } else {
                System.out.println("输入有误,重新输入");
            }
        }
    }

    public static void shouRu(double[] money,int count,String[] explain,double basedOnMoney) {//录入收入的方法
        double basedOnMoeny=basedOnMoney;
        while (true){
            System.out.println("请登记你的收入");
            System.out.println("赚了多少:");
            Scanner sc=new Scanner(System.in);
            money[count]=sc.nextDouble();//录入double类型的数据
            System.out.println("怎么赚的:");
            sc.nextLine();//接受回车,防止接下的输入直接退出
            explain[count]=sc.nextLine();
            count++;//录入数据后索引自加
            System.out.println("添加成功");
            System.out.println("1.继续录入");
            System.out.println("2.返回主菜单");
            System.out.println("请选择(1-2):");
            while (true){
                String a=sc.nextLine();
                if(a.equals("1")){
                    shouRu(money,count,explain,basedOnMoeny);
                }else if(a.equals("2")){
                    zhuCaiDan(money,count,explain,basedOnMoeny);
                }else {
                    System.out.println("输入有误,请重新输入");
                }
            }
        }
    }

    public static void zhiChu(double[] money,int count,String[] explain,double basedOnMoney) {//支出方法
        double basedOnMoeny=basedOnMoney;
        while (true){
            System.out.println("请登记你的支出");
            System.out.println("花了多少:");
            Scanner sc=new Scanner(System.in);
            money[count]=-sc.nextDouble();
            System.out.println("怎么花的:");
            sc.nextLine();
            explain[count]=sc.nextLine();
            count++;
            System.out.println("添加成功");
            System.out.println("1.继续录入");
            System.out.println("2.返回主菜单");
            System.out.println("请选择(1-2):");
            while(true){
                    String a=sc.nextLine();
                    if(a.equals("1")){
                        zhiChu(money,count,explain,basedOnMoeny);
                    }else if(a.equals("2")){
                        zhuCaiDan(money,count,explain,basedOnMoeny);
                    }else{
                        System.out.println("输入有误,请重新输入");
                    }
                }
            }
        }


    public static void detail(double[] money,int count,String[] explain,double basedOnMoney){//遍历方法
        double basedOnMoeny=basedOnMoney;
        System.out.println();
        System.out.println("提示:您的起始资金为一万元");
        while(true){
            System.out.println("收入\t\t账户总金额\t\t收支金额\t\t\t说明");//用于对齐,\t会补齐8的位数的字节
            for(int a=0;a<money.length;a++){
                if(money[a]!=0){
                    if(money[a]>=0){
                        System.out.print("收入\t\t");
                    }else{
                        System.out.print("支出\t\t");
                    }
                    basedOnMoney+=money[a];
                    System.out.printf("%-16.2f",basedOnMoney);//有些数据小与8字节,有点数据大于8字节,\t不好用,所以规定长度
                    if(money[a]>=0){
                        System.out.print("+");
                        System.out.printf("%-15.2f",money[a]);
                    }else{
                        System.out.printf("%-16.2f",money[a]);
                    }
                    System.out.print(explain[a]);
                    System.out.println();
                    if(basedOnMoney<0){//遍历时发现钱不够了
                        try {
                            Thread.sleep(1000);
                            System.out.println("对不起,您已破产,哎,很抱歉现在才告诉你");
                            Thread.sleep(3000);
                            System.out.println("终究还是到了分开的时候了啊");
                            Thread.sleep(2000);
                            System.out.println("请多多努力赚钱吧,期待和您的下次相遇");
                            Thread.sleep(4000);
                            System.out.println("再见");
                            Thread.sleep(1000);
                            System.exit(0);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            System.out.println();
            System.out.println("按1返回主菜单,按2退出");
            Scanner sc=new Scanner(System.in);
            while (true){
                String b=sc.nextLine();
                if(b.equals("1")){
                    zhuCaiDan(money,count,explain,basedOnMoeny);
                }else if(b.equals("2")) {
                    System.out.println("正在退出");
                    System.out.println("退出成功");
                    System.exit(0);
                }else{
                    System.out.println("输入有误,请重新输入");
                }
            }
        }
    }

}

总结

这次写出来的程序并不是很理想,存在很多问题
①当我发现异常后,懒得每个添加,直接主函数抛出方法里面的异常,也就导致了出现异常后都会返回主菜单,有点不理想。
②这次的程序如果用二位数组的话,应该是更方便的。
③还有就是数组定义的时候已经固定了长度,导致程序一次性只能存这么多,如果能实现加一组数据,数组的最大长度加一就更好了。
④还有就是每录入一组支出数据的时候,都应该判断一下剩余资金够不够支出的,如果不够,应当驳回。而当我发现这个的时候,要改的东西有点多,就直接加载遍历里面的,懒得去一个一个方法里面改了。
⑤如果录入的数据能实现删除,改变就好了
⑥如果录入的数据能存储到一个地方就好了,那么下次再次进入的时候,就可以直接读入而不是基础状态了
⑦要是再加入一个图形化界面,是不是就更像家庭记账程序了
虽然只是一个家庭记账程序,但是能反应出来很多问题,远远不止我发现的缺陷,程序就是一步一步逐渐完善的
没有完美的程序,只有逐渐完善直至无限接近完美的程序

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值