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