使用java语言实现简单的收支记账软件
该项目在尚学堂进行学习,个人整理并将我遇到的问题也整合其中,力求通俗易懂。
整个软件在命令行中运行,包括有四个部分的显示:收支明细、登记收入、登记输出、退出。通过用户选择对应的数字序号,进行相应的功能使用。
该项目由两个类实现,一个是主类Account,一个是工具类Utility,接下来通过五个部分的设计实现整个软件。
1.主菜单界面设计
设计一个Account类包括有收支明细、登记收入、登记输出、退出四项功能以及让用户选择数字序号的提示语。
主菜单部分代码设计如下(代码中对应要点之后有解释):
boolean isFlag=true;
while (isFlag){//要点一
System.out.println("-------------------收支软件----------------------");
System.out.println(" 1.收支明细");
System.out.println(" 2.登记收入");
System.out.println(" 3.登记输出");
System.out.println(" 4.退 出");
System.out.println(" 请选择(1-4):");
char key=Utility.readMenu();//要点2
switch (key){//要点3
case '1':
case '2':
case '3':
case '4':
}
要点一: 为了实现用户每次选择功能执行完成后能够再次返回到主菜单界面,整个部分由一个while循环语句包裹,设定boolean型变量isFlag默认值为true是为了保持循环持续进行。那么程序如何结束?将isFlag的值变为false就好了,具体内容请看退出部分的设计。
要点二: 此处调用了Utility下的readMenu方法,该方法的作用是获取用户输入的字符,并进行判断是否符合格式,格式正确则返回一个char格式数据。该方法代码如下:
public static char readMenu(){
char c;
for(; ; ){
String str=getKeyBoard(1);//由于c是char类型,无法直接通过getKeyBoard方法赋值,故需要间接转换格式
c=str.charAt(0);
if (c !='1'&&c!='2'&&c!='3'&&c!='4' ){
System.out.println("选择错误,请重新选择!");
continue;
}else break;
}
return c;
}
其中还调用了本类下的getKeyBoard()方法,该方法同样是为了规格化输入,括号内的参数指定了可以接受的字符数,格式正确返回一个String类型的数据。该方法代码如下:
private static Scanner scanner=new Scanner(System.in);//由于之后方法调用时是静态方法,scanner对象需定义为静态。
private static String getKeyBoard(int limit){
String line="";
while (scanner.hasNext()){
line=scanner.nextLine();
if (line.length()<1||line.length() > limit){
System.out.println("输入长度(不大于"+limit+")错误,请重新输入");
continue;
}
break;
}
return line;
}
要点三: 为了实现用户选择不同功能从而出现不同结果,此处使用switch分支语句进行判定。例如,如果用户键入数字 ‘1‘’,则进入switch分支中 case’1’ 的内容中。
2.收支明细功能设计
该模块主要通过表格的形式显示,进行显示的内容有收支、账户金额、收支金额、说明。而且表格内容要随着用户的添加信息而增多,如何通过简单的方法实现表格的效果?由于表格只会增加,且随着用户的添加每次只添加一行,一个可行的办法是,设置一个字符串(这里为details),初始化时向字符串中写入表头,而随着用户每次添加数据,就顺势向details中添加内容,则该字符串中的内容就是一个不断添加的表格了。该部分代码如下:
String details="收支\t账户金额\t收支金额\t说 明\n";
case '1':
System.out.println("-----------------当前收支明细记录-----------------");
System.out.println(details);
System.out.println("-----------------------------------------------");
break;
3.登记收入功能设计
该部分主要功能是获取用户输入的金额信息和附加的说明信息,并添加到收支明细中去,代码如下:
int balance=0;//设定一个初始金额,方便之后的加减。
case '2':
System.out.print("本次收入金额:");
int i=Utility.readNumber();
balance+=i;//计算用户账户总金额
System.out.print("说明信息:");
String str=Utility.readinfo();
details+="收入\t"+balance+"\t\t"+i+"\t\t"+str+"\n";//向字符串中添加相应的信息。
break;
该方法中使用了Utility中的readNumber()方法和readinfo方法,这两个方法的作用分别是获取用户输入的数字和字符串,若符合规则则返回一个int类型数据和String类型数据。以下是代码(由于获取数字的方法使用了int类型,则必须输入一个int类型的数据,如有需要,请将方法中的类型修改。):
public static int readNumber(){//获取并规范数字格式
int n;
for(;;) {
String str = getKeyBoard(4);
try {
n=Integer.parseInt(str);//格式转换
break;
}
catch (NumberFormatException e){
System.out.println("请输入正确的数字!");
}
}
return n;
}
public static String readinfo(){//获取并规范说明信息的格式。
String str=getKeyBoard(20);
return str;
}
4.登记支出功能设计
该部分内容与登记支出部分大体类似,修改的地方是在计算账户总金额时,需要减去用户输入的数字,代码如下:
case '3':
System.out.print("本次支出金额:");
int i1=Utility.readNumber();
balance-=i1;
System.out.print("说明信息:");
String str1=Utility.readinfo();
details+="支出\t"+balance+"\t\t"+i1+"\t\t"+str1+"\n";
break;
5.退出功能设计
该模块的功能是退出软件系统,方法是终止整个主类的主体:while循环。要终止while循环就需要让括号中的参数判定为false,则只需要将isFlag变量设置为false即可。该模块为了防止用户误操作,进行了二次确定,实现思想与上述获取并规范用户输入的方法类似,以下是代码:
case '4':
System.out.println("你真的要退出吗?<Y/N>");
char b=Utility.readExit();
if (b=='Y'){
isFlag=false;
}else break;
此处调用了Utility类下的readExit方法。该方法作用是规范用户输入,确保最终传入的字母是为Y或N,为了实现无论大小写都可以识别,若是小写则转换为大写。
public static char readExit(){
char c;
String str=getKeyBoard(1).toUpperCase();
c=str.charAt(0);
return c;
}
整个项目到此设计完成。