本次项目主要要求是模拟实现一个基于文本界面的《家庭记账软件》,该程序能够记录家庭的收入、支出,并能够打印收支明细表。
一、项目采用分级菜单方式。
主菜单如下:
-----------------家庭收支记账软件-----------------
1 收支明细
2 登记收入
3 登记支出
4 退 出
请选择(1-4):_
- 假设家庭起始的生活基本金为10000元
- 菜单2:每次登记收入后, 收入的金额应累加到基本金上,并记录本次收入明细, 以便后续的查询。
- 菜单3:每次登记支出后, 支出的金额应从基本金中扣除,并记 录本次支出明细,以便后续的查询。
- 菜单1:查询收支明细时, 将显示所有的收入、支出名细列表
二、实现流程
具体操作的主活动流程图如下图所示:
1、实现界面展示功能
-------------------家庭收支记账软件---------------------
1.收支明细
2.登记收入
3.登记支出
4.退 出
请选择(1-4):
2、完成主要的“收入”,“支出”功能
- 从键盘读取收入的金额(int)
- 从键盘读取收入的原因(String)
- 按照要求存储数据(数组)
- 添加成功
3、显示账单明细
三、实现代码
主程序流程:
package txt;
import java.util.Scanner;
public class table {
static int r = 0, count = 10000;
static String[][] arr = new String[10][4];
public static void main(String[] args) {
init();
boolean loopFlag = true;
while(loopFlag){
System.out.println("-------------------家庭收支记账软件---------------------\n");
System.out.println(" 1.收支明细");
System.out.println(" 2.登记收入");
System.out.println(" 3.登记支出");
System.out.println(" 4.退 出\n");
System.out.println();
System.out.print("请选择(1-4):");
char n= Utility.readMenuSelection();
switch(n){
case '1':
list();
System.out.println();
break;
case '2':
income();
break;
case '3':
expend();
break;
case '4':
System.out.print("是否确认退出(Y/N):");
char selsect= Utility.readConfirmSelection();
if(selsect=='Y')
loopFlag=false;
break;
}
}
}
public static void init() {
arr[r][0]="收支";
arr[r][1]="账号总金额";
arr[r][2]="收支金额";
arr[r][3]="说明";
}
public static void list() {
for(int i=0;i<=r;i++){
for(int j=0;j<4;j++){
if(i==0)
System.out.print(arr[i][j]+"\t\t");
else
System.out.print(arr[i][j]+"\t\t ");
}
System.out.println();
}
}
public static void income() {
System.out.print("收入金额:");
int amount=Utility.readNumber();
System.out.print("收入原因");
String reason = Utility.readString();
storage("收入",amount,reason);
System.out.println("添加成功!");
}
public static void storage(String type,int amount,String reason) {
r++;
arr[r][0]=type;
if(type=="收入"){
arr[r][1]=(count+amount)+"";
count+=amount;
arr[r][2]="+"+amount;
}
if(type=="支出"){
arr[r][1]=(count-amount)+"";
count-=amount;
arr[r][2]="+"+amount;
}
arr[r][3]=reason;
}
public static void expend() {
System.out.print("支出金额:");
int amount=Utility.readNumber();
System.out.print("支出原因");
String reason = Utility.readString();
storage("支出",amount,reason);
System.out.println("添加成功!");
}
}
Utility工具类:
package txt;
import java.util.Locale;
import java.util.Scanner;
public class Utility {
private static Scanner scanner=new Scanner(System.in);
public static char readMenuSelection() {
char c;
for(;;){
String str=readKeyBoard(1);
c=str.charAt(0);//取字符串第一个字符
if(c!='1'&&c!='2'&&c!='3'&&c!='4'){
System.out.print("选择错误请重新熟人:");
}else break;
}
return c;
}
public static String readKeyBoard(int limit) {
String line="";
while(scanner.hasNext()){ //hasNext()方法判断输入(文件、字符串、键盘等输入流)是否还有下一个输入项,若有,返回true,反之false。
line=scanner.nextLine();
if(line.length()<1||line.length()>limit){ //limit:输入字符串长度限制
System.out.print("输入长度(不大于"+limit+")错误,请从新输入:");
continue;
}
break;
}
return line;
}
public static int readNumber() {
int n;
for(;;){
String str=readKeyBoard(4);
try{
n=Integer.parseInt(str);//Integer.parseInt() 是Integer包装类下的一个方法,作用是将()内的String类型字符串转化为int类型
break;
}catch(NumberFormatException e){
System.out.print("数字有误请重新输入:");
}
/*try {
} {
可能出现异常的代码
} catch(异常类名A e){
如果出现了异常类A类型的异常,那么执行该代码
}*/
}
return n;
}
public static String readString() {
String str=readKeyBoard(8);//判断字符串长度不大于8
return str;
}
public static char readConfirmSelection() {
char c;
for(;;){
String str=readKeyBoard(1).toUpperCase();//将字母小写转换为大写
c=str.charAt(0);
if(c=='Y'||c=='N'){
break;
}else{
System.out.print("选择错误请从新输入:");
}
}
return c;
}
}
四、代码实现结果
-------------------家庭收支记账软件---------------------
1.收支明细
2.登记收入
3.登记支出
4.退 出
请选择(1-4):2
收入金额:100
收入原因工资
添加成功!
-------------------家庭收支记账软件---------------------
1.收支明细
2.登记收入
3.登记支出
4.退 出
请选择(1-4):3
支出金额:150
支出原因吃饭
添加成功!
-------------------家庭收支记账软件---------------------
1.收支明细
2.登记收入
3.登记支出
4.退 出
请选择(1-4):1
收支 账号总金额 收支金额 说明
收入 10100 +100 工资
支出 9950 +150 吃饭
-------------------家庭收支记账软件---------------------
1.收支明细
2.登记收入
3.登记支出
4.退 出
请选择(1-4):4
是否确认退出(Y/N):y