/*
项目一:家庭记账软件:
模拟实现基于文本界面的《家庭记账软件》;
该软能记录家庭收入、支出,并能够打印收支明细表;
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()都需要加异常处理
}