/*
项目一:家庭记账软件:
模拟实现基于文本界面的《家庭记账软件》;
该软能记录家庭收入、支出,并能够打印收支明细表;
1.该项目采用分级菜单方式,主菜单如下:
================家庭收支记账软件===============
                    1.收支明细
                    2.登记收入
                    3.登记支出
                    4.退 出
                    
                    请选择(1-4):_

2.收支明细要求输出格式如下:
================收支明细表================
账户余额        收支明细        说明
10000        0            初始金额
9800        -200        购物
10300        +500        体力劳动

3.每次登记支出或收入完成后,控制台输出:
=================登记完成=================

4.选择4退出是,控制台输出“是否确认退出?y/n”
如果用户输入y,则退出,否则继续显示主菜单

5.如果用户输入的不是1-4,提醒用户输入错误

6.除非用户选择4退出,否则其他选项展示完成后,继续向用户展示主菜单并继续询问用户下一步的操作
                    
*/
import java.util.Scanner;
public class FamliyAccount{
    static boolean isFlag=true;
    static int balance[]= {10000,0,0,0,0,0,0,0,0,0};//暂时不知道如何定义变长度的数组,先假定这个记账软件只能显示最近十次的交易明细
    static int income[]= {0,0,0,0,0,0,0,0,0,0,0};
    static String reason[]= {"","","","","","","","","",""};
    static Scanner scan=new Scanner(System.in);
    static int count=0;
    public static void main(String[] agrs) {
        reason[0]="";
        income[0]=0;
        while(isFlag) {
            System.out.println("================家庭收支记账软件===============");
            System.out.println("                 1.收支明细");
            System.out.println("                 2.登记收入");
            System.out.println("                 3.登记支出");
            System.out.println("                 4.退 出");
            System.out.println();
            System.out.println("                 请选择(1-4):_");
            readMenuSelection() ;
            if(isFlag==false) {
                System.out.println("===============退出成功=================");
                break;
            }
        }    
    }    
    public static void readMenuSelection() {
        int selection=scan.nextInt();
        switch(selection) {
        case 1:
            ReceiptDisbursement();//收支明细
            break;
        case 2:
            RegisterIncome();//登记收入
            break;
        case 3:
            RegisterOutcome();//登记支出
            break;
        case 4:
            isFlag=Quit(isFlag);//退出;
            break;
        default:
            System.out.println("输入错误,请重新输入!");
            break;
        }
    }
    
    public static void ReceiptDisbursement() {
        System.out.println("=======================收支明细表====================");
        System.out.println("账户余额    \t收支明细\t\t说明");
        for(int i=0;i<=count;i++) {
            System.out.println(balance[i]+"\t\t"+income[i]+"\t\t"+reason[i]);
        }
    }
    
    public static void RegisterIncome() {
        count++;
        System.out.println("请输入收入金额:元");
        income[count]=scan.nextInt();
        System.out.println("请输入收入原因:");
        reason[count]=scan.next();
        balance[count]=balance[count-1]+income[count];
        System.out.println("=======================登记完成====================");
    }
    
    public static void RegisterOutcome() {
        count++;
        System.out.println("请输入支出金额:元");
        income[count]=-scan.nextInt();
        System.out.println("请输入支出原因:");
        reason[count]=scan.next();
        balance[count]=balance[count-1]+income[count];
        System.out.println("=======================登记完成====================");
    }
    public static  boolean Quit(boolean isFlag) {
        System.out.println("确定要退出吗?y/n");
        String answer=scan.next();
        char answer0=answer.charAt(0);
        if(answer0=='y')
            isFlag=false;    //需格外注意的是,isFlag只是    Quit函数的形参,函数内部形参的改变并不能改变函数外面的isFlag;又考虑到Java没有指针,
        //因此,想到可以让该函数返回一个布尔型数据,在主函数里零isFlag等于返回的false,实现了主函数里isFlag的变化。
        return isFlag;
    }
    //=======================================================本项目代码暂时存在的问题===================================================
    //1.本项目由于balance和income、reason数组都是固定十个的,只能记录九次收支变化;
    //2.本项目没有做异常处理,比如对于操作选择,如果输入的不是整数,将报异常,本项目所有scan.nextInt()都需要加异常处理
}