项目目标
- 模拟实现一个基于文本界面的《家庭收支记账软件》
- 掌握初步的编程技巧和调试技巧
- 主要涉及以下知识点:
- 变量的定义
- 基本数据类型的使用
- 循环语句
- 分支语句
- 方法声明、调用和返回值的接收
- 简单的屏幕输出格式控制
需求说明
- 模拟实现基于文本界面的《家庭收支记账软件》。
- 该软件能够记录家庭的收入、支出,并能够打印收支明细表。
- 项目采用分级菜单方式。主菜单如下:
1 2 3 4 5 6 7 8
| -----------------家庭收支记账软件-----------------
1 收支明细 2 登记收入 3 登记支出 4 退 出
请选择(1-4):_
|
- 假设家庭起始的生活基本金为10000元。
- 每次登记收入(菜单2)后,收入的金额应累加到基本金上,并记录本次收入明细,以便后续的查询。
- 每次登记支出(菜单3)后,支出的金额应从基本金中扣除,并记录本次支出明细,以便后续的查询。
- 查询收支明细( 菜单1)时,将显示所有的收入、支出名细列表
登记收入
- “登记收入”的界面及操作过程如下所示:
1 2 3 4 5 6 7 8 9 10 11
| -----------------家庭收支记账软件-----------------
1 收支明细 2 登记收入 3 登记支出 4 退 出
请选择(1-4):2
本次收入金额:1000 本次收入说明:劳务费_
|
登记支出
1 2 3 4 5 6 7 8 9 10 11
| -----------------家庭收支记账软件-----------------
1 收支明细 2 登记收入 3 登记支出 4 退 出
请选择(1-4):3
本次支出金额:800 本次支出说明:物业费_
|
收支明细
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| -----------------家庭收支记账软件-----------------
1 收支明细 2 登记收入 3 登记支出 4 退 出
请选择(1-4):1
-----------------当前收支明细记录----------------- 收支 账户金额 收支金额 说 明 收入 11000 1000 劳务费 支出 10200 800 物业费
-----------------------------------------------
|
提示:明细表格的对齐,可以简单使用制表符\t来实现
退出
- “退 出”的界面及操作过程如下所示:
1 2 3 4 5 6 7 8 9 10
| -----------------家庭收支记账软件-----------------
1 收支明细 2 登记收入 3 登记支出 4 退 出
请选择(1-4):4
确认是否退出(Y/N):_
|
代码实现
CMUtility 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
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 int readNumber() { int n; for (; ; ) { String str = readKeyBoard(4); try { n = Integer.parseInt(str); break; } catch (NumberFormatException e) { System.out.print("数字输入错误,请重新输入:"); } } return n; }
public static String readString() { String str = readKeyBoard(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; } private static String readKeyBoard(int limit) { String line = "";
while (scanner.hasNext()) { line = scanner.nextLine(); if (line.length() < 1 || line.length() > limit) { System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:"); continue; } break; }
return line; } }
|
FamilyAccount 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
public class FamilyAccount{ public static void main(String[] args){ String details = "收支\t账户金额\t收支金额\t说 明\n"; int balance = 10000; boolean isFlag = true;
do{ System.out.println("\n-----------------家庭收支记账软件-----------------\n"); System.out.println(" 1 收支明细"); System.out.println(" 2 登记收入"); System.out.println(" 3 登记支出"); System.out.println(" 4 退 出\n"); System.out.print(" 请选择< 1~4 > "); char menu = Utility.readMenuSelection(); switch(menu){ case '1': System.out.println("-----------------当前收支明细记录-----------------"); System.out.println(details); System.out.println("-----------------------------------------------"); break; case '2': System.out.print("本次收入金额:"); int money1 = Utility.readNumber(); System.out.print("本次收入说明:"); String info1 = Utility.readString(); balance += money1; details += "收入\t" + balance + "\t\t" + money1 + "\t\t" + info1 + "\n"; System.out.println("--------------------登记完成--------------------"); break; case '3': System.out.print("本次支出金额:"); int money2 = Utility.readNumber(); if(balance > money2){ balance -= money2; }else{ System.out.println("支出超出账户可用额度!!!"); break; } System.out.print("本次支出说明:"); String info2 = Utility.readString(); details += "支出\t" + balance + "\t\t" + money2 + "\t\t" + info2 + "\n"; System.out.println("--------------------登记完成--------------------"); break; case '4': System.out.print("请确认是否退出(Y/N): "); char exit = Utility.readConfirmSelection(); if(exit == 'Y') isFlag = false; break; } }while(isFlag); } }
|