家庭记账程序(第二版 加入了循环)

本文档展示了一个家庭收支记账软件的开发过程,包括初始资金设定、收入和支出的登记以及查询功能。作者通过使用Java的Scanner类获取用户输入,采用switch语句实现菜单选择,并通过死循环实现连续操作。在代码迭代中,解决了只能执行单次操作的问题,增加了收支明细的查询和界面美化。最终,用户可以多次登记收支并查看详细记录,直至选择退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目要求:


/*1.假设家庭起始的生活基本金为10000元

2.每次登记收入(菜单2)后,收入的金额应累加到基本金上,并记录本次收入明细,以便后续的查询

3.每次登记支出(菜单3)后,支出的金额应从基本金中扣除,并记录本次支出明细,以便后续的查询。

4.查询收支明细( 菜单1)时,将显示所有的收入、支出名细列表 */

我的构思过程:

先展示家庭收支记账软件的功能及菜单序号,引入Scanner类

因为涉及跳转对应菜单,这里选择流程控制语句中的switch语句

在每一个操作对应序号下进行相应操作,输出对应内容,

出现的问题:

初版的代码一次运行只能执行一个操作,但是我们需要一次运行执行所有操作,

改进初版代码,加入一个外部死循环,在一个控制台里实现所有命令:

 将全局变量放到循环外,“死循环”:单一程序在某一环节由于未满足脱离循环的条件而出现的持续进行循环操作的现象。

import java.util.Objects;
import java.util.Scanner;

/*1.假设家庭起始的生活基本金为10000元
2.每次登记收入(菜单2)后,收入的金额应累加到基本金上,并记录本次收入明细,以便后续的查询
3.每次登记支出(菜单3)后,支出的金额应从基本金中扣除,并记录本次支出明细,以便后续的查询。
4.查询收支明细( 菜单1)时,将显示所有的收入、支出名细列表 */
public class FamilyLedger_2 {
    public static void main(String[] args) {
// 因为使用分级目录,所以会在控制台输入想进入的步骤,导入Scanner
        Scanner sc = new Scanner(System.in);
        int choice = 0; //菜单选项
        int start = 10000;  //初始资金
        int income = 0;  //收入金额
        String source = "";   //收入来源
        int expenditure = 0;  //支出金额
        String reason = "";   //支出原因
        int temp = start;    //定义一个临时变量暂存变化后的资金
        int sum = temp;     //每次计算后的结果

        while (true) {    //大的循环体,用死循环实现
            System.out.println("----------------家庭收支记账软件-----------------");
            System.out.println("\t\t\t\t1 收支明细");
            System.out.println("\t\t\t\t2 登记收入");
            System.out.println("\t\t\t\t3 登记指出");
            System.out.println("\t\t\t\t4 退 出");
            System.out.println("请选择(1-4):");
            choice = sc.nextInt();

            // 限定范围
            if (choice < 1 || choice > 4) {
                System.out.println("您输入的内容有误!");
            }

            //因为除了一开始初始资金固定,后面都会有动态变化
            //初始账单
            if (choice == 1) {
                Scanner a = new Scanner(System.in);
                System.out.println("请输入初始金额:");
                start = a.nextInt();
            }

            //收入账单
            if (choice == 2) {
                Scanner a = new Scanner(System.in);
                System.out.println("请输入收入金额:");
                income = a.nextInt();
                System.out.println("请输入收入来源:");
                source = a.next();
            }

            //支出账单
            if (choice == 3) {
                Scanner b = new Scanner(System.in);
                System.out.println("请输入支出金额:");
                expenditure = b.nextInt();
                System.out.println("请输入支出原因:");
                reason = b.next();
            }


            //因为涉及跳转对应菜单,这里选择流程控制语句中的switch语句
            switch (choice) {
                case 1:
                    System.out.println("----------------您的收支明细----------------");
                    System.out.println("\t\t\t\t初始资金" + start + "元");
                    break;
                case 2:
                    System.out.println("收支\t" + "账户总金额\t\t" + "收支金额\t\t" + "说明");
                    temp = start + income;
                    System.out.println("收入\t" + (temp) + "\t\t\t" + (+income) + "\t\t\t" + source);
                    break;
                case 3:
                    System.out.println("收支\t" + "账户总金额\t\t" + "收支金额\t\t" + "说明");
                    sum = temp - expenditure;
                    System.out.println("收入\t" + sum
                            + "\t\t\t" + (-expenditure) + "\t\t" + reason);
                    break;
                case 4:
                    //退出界面
                    String exit = "";
                    Scanner c = new Scanner(System.in);
                    System.out.println("请问您确定要退出此登录界面吗?");
                    System.out.println("确定退出(y)/不,我再想想(n):");
                    exit = c.next();
                    if (Objects.equals(exit, "y")) {
                        System.out.println("您已退出菜单!");
                        return;
                    } else if (Objects.equals(exit, "n")) {
                        System.out.println("您已进入菜单!");
                        break;
                    }
            }
            
        }

    }
}


代码运行后得到:

"E:\IntelliJ IDEA 2019.3.3\jbr\bin\java.exe" "-javaagent:E:\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=49784:E:\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\IdeaProjects\firstProject\out\production\firstProject FamilyLedger_1
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
1
请输入初始金额:
10000
----------------您的收支明细----------------
				初始资金10000元
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
2
请输入收入金额:
请输入收入来源:
200
搬砖
收支	账户总金额		收入金额		说明
收入	10200			200			搬砖
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
3
请输入支出金额:
请输入支出原因:
100
点外卖
收支	账户总金额		收入金额		说明
收入	10100			-100		点外卖
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
4
请问您确定要退出此登录界面吗?
确定退出(y)/不,我再想想(n):
y
您已退出菜单!

进程已结束,退出代码 0

 改进的2.0版本:

import java.util.Objects;
import java.util.Scanner;

/*1.假设家庭起始的生活基本金为10000元
2.每次登记收入(菜单2)后,收入的金额应累加到基本金上,并记录本次收入明细,以便后续的查询
3.每次登记支出(菜单3)后,支出的金额应从基本金中扣除,并记录本次支出明细,以便后续的查询。
4.查询收支明细( 菜单1)时,将显示所有的收入、支出名细列表 */
public class FamilyLedger_2 {
    public static void main(String[] args) {
// 因为使用分级目录,所以会在控制台输入想进入的步骤,导入Scanner
        Scanner sc = new Scanner(System.in);
        int choice = 0; //菜单选项
        int start = 10000;  //初始资金
        int income = 0;  //收入金额
        String source = "";   //收入来源
        int expenditure = 0;  //支出金额
        String reason = "";   //支出原因
        int temp = start;    //定义一个临时变量暂存变化后的资金
        int sum = temp;     //每次计算后的结果

        while (true) {    //大的循环体,用死循环实现
            System.out.println("----------------家庭收支记账软件-----------------");
            System.out.println("\t\t\t\t1 收支明细");
            System.out.println("\t\t\t\t2 登记收入");
            System.out.println("\t\t\t\t3 登记指出");
            System.out.println("\t\t\t\t4 退 出");
            System.out.println("请选择(1-4):");
            choice = sc.nextInt();

            // 限定范围
            if (choice < 1 || choice > 4) {
                System.out.println("您输入的内容有误!");
            }

            //因为除了一开始初始资金固定,后面都会有动态变化
            //初始账单
         /*   if (choice == 1) {
                Scanner a = new Scanner(System.in);
                System.out.println("请输入初始金额:");
                start = a.nextInt();
            }*/

            //收入账单
            if (choice == 2) {
                Scanner a = new Scanner(System.in);
                System.out.println("请输入收入金额:");
                income = a.nextInt();
                System.out.println("请输入收入来源:");
                source = a.next();
            }

            //支出账单
            if (choice == 3) {
                Scanner b = new Scanner(System.in);
                System.out.println("请输入支出金额:");
                expenditure = b.nextInt();
                System.out.println("请输入支出原因:");
                reason = b.next();
            }


            //因为涉及跳转对应菜单,这里选择流程控制语句中的switch语句
            switch (choice) {
                case 1:
                    System.out.println("----------------您的收支明细----------------");
                    System.out.println("收支\t" + "账户总金额\t\t" + "收支金额\t\t" + "说明");
                    System.out.println("收入\t" + (temp) + "\t\t\t" + (+income) + "\t\t\t" + source);
                    System.out.println("收入\t" + sum + "\t\t\t" + (-expenditure) + "\t\t" + reason);
                    break;
                case 2:
                    System.out.println("收支\t" + "账户总金额\t\t" + "收支金额\t\t" + "说明");
                    temp = start + income;
                    System.out.println("收入\t" + (temp) + "\t\t\t" + (+income) + "\t\t\t" + source);
                    break;
                case 3:
                    System.out.println("收支\t" + "账户总金额\t\t" + "收支金额\t\t" + "说明");
                    sum = temp - expenditure;
                    System.out.println("收入\t" + sum + "\t\t\t" + (-expenditure) + "\t\t" + reason);
                    break;
                case 4:
                    //退出界面
                    String exit = "";
                    Scanner c = new Scanner(System.in);
                    System.out.println("请问您确定要退出此登录界面吗?");
                    System.out.println("确定退出(y)/不,我再想想(n):");
                    exit = c.next();
                    if (Objects.equals(exit, "y")) {
                        System.out.println("您已退出菜单!");
                        return;
                    } else if (Objects.equals(exit, "n")) {
                        System.out.println("您已进入菜单!");
                        break;
                    }
            }

        }

    }
}


运行后的结果:

"E:\IntelliJ IDEA 2019.3.3\jbr\bin\java.exe" "-javaagent:E:\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=50160:E:\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\IdeaProjects\firstProject\out\production\firstProject FamilyLedger_2
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
2
请输入收入金额:
200
请输入收入来源:
搬砖
收支	账户总金额		收支金额		说明
收入	10200			200			搬砖
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
3
请输入支出金额:
500
请输入支出原因:
买棉花娃娃
收支	账户总金额		收支金额		说明
收入	9700			-500		买棉花娃娃
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
1
----------------您的收支明细----------------
收支	账户总金额		收支金额		说明
收入	10200			200			搬砖
收入	9700			-500		买棉花娃娃
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
4
请问您确定要退出此登录界面吗?
确定退出(y)/不,我再想想(n):
y
您已退出菜单!

进程已结束,退出代码 0

 但是间隔太近,加入分隔

import java.util.Objects;
import java.util.Scanner;

/*1.假设家庭起始的生活基本金为10000元
2.每次登记收入(菜单2)后,收入的金额应累加到基本金上,并记录本次收入明细,以便后续的查询
3.每次登记支出(菜单3)后,支出的金额应从基本金中扣除,并记录本次支出明细,以便后续的查询。
4.查询收支明细( 菜单1)时,将显示所有的收入、支出名细列表 */
public class FamilyLedger_2 {
    public static void main(String[] args) {
// 因为使用分级目录,所以会在控制台输入想进入的步骤,导入Scanner
        Scanner sc = new Scanner(System.in);
        int choice = 0; //菜单选项
        int start = 10000;  //初始资金
        int income = 0;  //收入金额
        String source = "";   //收入来源
        int expenditure = 0;  //支出金额
        String reason = "";   //支出原因
        int temp = start;    //定义一个临时变量暂存变化后的资金
        int sum = temp;     //每次计算后的结果

        while (true) {    //大的循环体,用死循环实现
            System.out.println("----------------家庭收支记账软件-----------------");
            System.out.println("\t\t\t\t1 收支明细");
            System.out.println("\t\t\t\t2 登记收入");
            System.out.println("\t\t\t\t3 登记指出");
            System.out.println("\t\t\t\t4 退 出");
            System.out.println("请选择(1-4):");
            choice = sc.nextInt();

            // 限定范围
            if (choice < 1 || choice > 4) {
                System.out.println("您输入的内容有误!");
            }

            //因为除了一开始初始资金固定,后面都会有动态变化
            //初始账单
         /*   if (choice == 1) {
                Scanner a = new Scanner(System.in);
                System.out.println("请输入初始金额:");
                start = a.nextInt();
            }*/

            //收入账单
            if (choice == 2) {
                Scanner a = new Scanner(System.in);
                System.out.println("请输入收入金额:");
                income = a.nextInt();
                System.out.println("请输入收入来源:");
                source = a.next();
            }

            //支出账单
            if (choice == 3) {
                Scanner b = new Scanner(System.in);
                System.out.println("请输入支出金额:");
                expenditure = b.nextInt();
                System.out.println("请输入支出原因:");
                reason = b.next();
            }


            //因为涉及跳转对应菜单,这里选择流程控制语句中的switch语句
            switch (choice) {
                case 1:
                    System.out.println("----------------您的收支明细----------------");
                    System.out.println("收支\t" + "账户总金额\t\t" + "收支金额\t\t" + "说明");
                    System.out.println("收入\t" + (temp) + "\t\t\t" + (+income) + "\t\t\t" + source);
                    System.out.println("支出\t" + sum + "\t\t\t" + (-expenditure) + "\t\t" + reason);
                    break;
                case 2:
                    System.out.println("收支\t" + "账户总金额\t\t" + "收支金额\t\t" + "说明");
                    temp = start + income;
                    System.out.println("收入\t" + (temp) + "\t\t\t" + (+income) + "\t\t\t" + source);
                    System.out.println("*******************************************************");
                    System.out.println("\t");
                    break;
                case 3:
                    System.out.println("收支\t" + "账户总金额\t\t" + "收支金额\t\t" + "说明");
                    sum = temp - expenditure;
                    System.out.println("支出\t" + sum + "\t\t\t" + (-expenditure) + "\t\t" + reason);
                    System.out.println("*******************************************************");
                    System.out.println("\t");
                    break;
                case 4:
                    //退出界面
                    String exit = "";
                    Scanner c = new Scanner(System.in);
                    System.out.println("请问您确定要退出此登录界面吗?");
                    System.out.println("确定退出(y)/不,我再想想(n):");
                    exit = c.next();
                    if (Objects.equals(exit, "y")) {
                        System.out.println("您已退出菜单!");
                        return;
                    } else if (Objects.equals(exit, "n")) {
                        System.out.println("您已进入菜单!");
                        break;
                    }
            }

        }

    }
}


最终运行:

"E:\IntelliJ IDEA 2019.3.3\jbr\bin\java.exe" "-javaagent:E:\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=50315:E:\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\IdeaProjects\firstProject\out\production\firstProject FamilyLedger_2
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
2
请输入收入金额:
200
请输入收入来源:
搬砖
收支	账户总金额		收支金额		说明
收入	10200			200			搬砖
*******************************************************
	
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
3
请输入支出金额:
100
请输入支出原因:
干饭
收支	账户总金额		收支金额		说明
支出	10100			-100		干饭
*******************************************************
	
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
1
----------------您的收支明细----------------
收支	账户总金额		收支金额		说明
收入	10200			200			搬砖
支出	10100			-100		干饭
----------------家庭收支记账软件-----------------
				1 收支明细
				2 登记收入
				3 登记指出
				4 退 出
请选择(1-4):
4
请问您确定要退出此登录界面吗?
确定退出(y)/不,我再想想(n):
y
您已退出菜单!

进程已结束,退出代码 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值