需求说明

  • 模拟实现基于文本界面的家庭记账软件
  • 该软件能够纪录家庭的收入、支出,并且能够打印收支明细表
  • 项目采用分级菜单方式。主菜单如下:

————————-家庭收支记账软件————————-
1.收支明细
2.登记收入
3.登记支出
4.退出

请选择(1-4):__

假设家庭起始的生活基本金为10000元。
• 每次登记收入(菜单2)后,收入的金额应累加到基本金上,并记
录本次收入明细,以便后续的查询。
• 每次登记支出(菜单3)后,支出的金额应从基本金中扣除,并记 录本次支出明细,以便后续的查询。
• 查询收支明细( 菜单1)时,将显示所有的收入、支出名细列表

“登记收入”的界面及操作过程如下所示:

————————-家庭收支记账软件————————-
1.收支明细
2.登记收入
3.登记支出
4.退出

请选择(1-4):2

本次收入金额:1000
本次收入说明:劳务费

“登记支出”的界面及操作过程如下所示:

————————-家庭收支记账软件————————-
1.收支明细
2.登记收入
3.登记支出
4.退出

请选择(1-4):3

本次支出金额:800
本次支出说明:物业费

“收支明细”的界面及操作过程如下所示:

————————-家庭收支记账软件————————-
1.收支明细
2.登记收入
3.登记支出
4.退出

请选择(1-4):1
————————-当前收支明细记录————————-
收支 账户金额 收支金额 说 明
收入 11000 1000 劳务费
支出 10200 800 物业费
—————————————————————————

• 提示:明细表格的对齐,可以简单使用制表符‘\t’来实现

“退 出”的界面及操作过程如下所示:

————————-家庭收支记账软件————————-
1.收支明细
2.登记收入
3.登记支出
4.退出

请选择(1-4):4

确认是否退出(Y/N):__


项目搭建

Utility工具类

  1. import java.util.Scanner;
  2. public class Utility {
  3. private static Scanner scanner = new Scanner(System.in);
  4. public static char readMenuSelection() {
  5. char c;
  6. for (; ; ) {
  7. String str = readKeyBoard(1);
  8. c = str.charAt(0);
  9. if (c != '1' && c != '2' && c != '3' && c != '4') {
  10. System.out.print("选择错误,请重新输入:");
  11. } else break;
  12. }
  13. return c;
  14. }
  15. public static int readNumber() {
  16. int n;
  17. for (; ; ) {
  18. String str = readKeyBoard(4);
  19. try {
  20. n = Integer.parseInt(str);
  21. break;
  22. } catch (NumberFormatException e) {
  23. System.out.print("数字输入错误,请重新输入:");
  24. }
  25. }
  26. return n;
  27. }
  28. public static String readString() {
  29. String str = readKeyBoard(8);
  30. return str;
  31. }
  32. public static char readConfirmSelection() {
  33. char c;
  34. for (; ; ) {
  35. String str = readKeyBoard(1).toUpperCase();
  36. c = str.charAt(0);
  37. if (c == 'Y' || c == 'N') {
  38. break;
  39. } else {
  40. System.out.print("选择错误,请重新输入:");
  41. }
  42. }
  43. return c;
  44. }
  45. private static String readKeyBoard(int limit) {
  46. String line = "";
  47. while (scanner.hasNext()) {
  48. line = scanner.nextLine();
  49. if (line.length() < 1 || line.length() > limit) {
  50. System.out.print("输入长度大于" + limit + ",请重新输入:\n");
  51. continue;
  52. }
  53. break;
  54. }
  55. return line;
  56. }
  57. }

整体框架的搭建

  1. public class FamilyAccount {
  2. public static void main(String[] args){
  3. boolean flag = true;
  4. while(flag){
  5. System.out.println("-----------------家庭收支记账软件-----------------\n");
  6. System.out.println(" 1.收支明细");
  7. System.out.println(" 2.登记收入");
  8. System.out.println(" 3.登记支出");
  9. System.out.println(" 4.退出\n");
  10. System.out.println(" 请选择(1-4):____");
  11. // 获取用户的输入
  12. char selection = Utility.readMenuSelection();
  13. switch (selection){
  14. case '1':
  15. System.out.println("1.收支明细");
  16. break;
  17. case '2':
  18. System.out.println("2.登记收入");
  19. break;
  20. case '3':
  21. System.out.println("3.登记支出");
  22. break;
  23. case '4':
  24. System.out.println("4.退出");
  25. break;
  26. }
  27. }
  28. }
  29. }

退出功能的实现

  • case ‘4’ 模块

    1. public class FamilyAccount {
    2. public static void main(String[] args){
    3. boolean flag = true;
    4. while(flag){
    5. System.out.println("-----------------家庭收支记账软件-----------------\n");
    6. System.out.println(" 1.收支明细");
    7. System.out.println(" 2.登记收入");
    8. System.out.println(" 3.登记支出");
    9. System.out.println(" 4.退出\n");
    10. System.out.println(" 请选择(1-4):____");
    11. // 获取用户的输入
    12. char selection = Utility.readMenuSelection();
    13. switch (selection){
    14. case '1':
    15. System.out.println("1.收支明细");
    16. break;
    17. case '2':
    18. System.out.println("2.登记收入");
    19. break;
    20. case '3':
    21. System.out.println("3.登记支出");
    22. break;
    23. case '4':
    24. System.out.println("确认是否退出(Y|N)");
    25. char isExit = Utility.readConfirmSelection();
    26. if(isExit == 'Y'){
    27. flag = false;
    28. }
    29. break;
    30. }
    31. }
    32. }
    33. }

收支明细功能的实现

  • case ‘1’ 模块

    1. public class FamilyAccount {
    2. public static void main(String[] args){
    3. boolean flag = true;
    4. // 记录用户的收入支出
    5. String details = "收支\t账户金额\t收支金额\t说 明\n";
    6. while(flag){
    7. System.out.println("-----------------家庭收支记账软件-----------------\n");
    8. System.out.println(" 1.收支明细");
    9. System.out.println(" 2.登记收入");
    10. System.out.println(" 3.登记支出");
    11. System.out.println(" 4.退出\n");
    12. System.out.println(" 请选择(1-4):____");
    13. // 获取用户的输入
    14. char selection = Utility.readMenuSelection();
    15. switch (selection){
    16. case '1':
    17. System.out.println("-----------------当前收支明细记录-----------------");
    18. System.out.println(details);
    19. System.out.println("------------------------------------------------");
    20. break;
    21. case '2':
    22. System.out.println("2.登记收入");
    23. break;
    24. case '3':
    25. System.out.println("3.登记支出");
    26. break;
    27. case '4':
    28. System.out.println("确认是否退出(Y|N)");
    29. char isExit = Utility.readConfirmSelection();
    30. if(isExit == 'Y'){
    31. flag = false;
    32. }
    33. break;
    34. }
    35. }
    36. }
    37. }

登记收入功能的实现

  • case ‘2’ 模块

    1. public class FamilyAccount {
    2. public static void main(String[] args){
    3. boolean flag = true;
    4. int balance = 100000;
    5. // 记录用户的收入支出
    6. String details = "收支\t账户金额\t收支金额\t说 明\n";
    7. while(flag){
    8. System.out.println("-----------------家庭收支记账软件-----------------\n");
    9. System.out.println(" 1.收支明细");
    10. System.out.println(" 2.登记收入");
    11. System.out.println(" 3.登记支出");
    12. System.out.println(" 4.退出\n");
    13. System.out.println(" 请选择(1-4):____");
    14. // 获取用户的输入
    15. char selection = Utility.readMenuSelection();
    16. switch (selection){
    17. case '1':
    18. System.out.println("-----------------当前收支明细记录-----------------");
    19. System.out.println(details);
    20. System.out.println("------------------------------------------------");
    21. break;
    22. case '2':
    23. System.out.println("本次收入金额:");
    24. int money = Utility.readNumber();
    25. System.out.println("本次收入说明:");
    26. String info = Utility.readString();
    27. // 更新balance
    28. balance += money;
    29. // 更新details
    30. details += ("收入\t" + balance + "\t\t" + money + "\t\t" + info + "\n");
    31. System.out.println("-----------------登记完成-----------------\n");
    32. break;
    33. case '3':
    34. System.out.println("3.登记支出");
    35. break;
    36. case '4':
    37. System.out.println("确认是否退出(Y|N)");
    38. char isExit = Utility.readConfirmSelection();
    39. if(isExit == 'Y'){
    40. flag = false;
    41. }
    42. break;
    43. }
    44. }
    45. }
    46. }

登记支出功能的实现

  • case ‘3’ 模块

    1. public class FamilyAccount {
    2. public static void main(String[] args){
    3. boolean flag = true;
    4. int balance = 100000;
    5. // 记录用户的收入支出
    6. String details = "收支\t账户金额\t收支金额\t说 明\n";
    7. while(flag){
    8. System.out.println("-----------------家庭收支记账软件-----------------\n");
    9. System.out.println(" 1.收支明细");
    10. System.out.println(" 2.登记收入");
    11. System.out.println(" 3.登记支出");
    12. System.out.println(" 4.退出\n");
    13. System.out.println(" 请选择(1-4):____");
    14. // 获取用户的输入
    15. char selection = Utility.readMenuSelection();
    16. switch (selection){
    17. case '1':
    18. System.out.println("-----------------当前收支明细记录-----------------");
    19. System.out.println(details);
    20. System.out.println("------------------------------------------------");
    21. break;
    22. case '2':
    23. System.out.println("本次收入金额:");
    24. int addMoney = Utility.readNumber();
    25. System.out.println("本次收入说明:");
    26. String addInfo = Utility.readString();
    27. // 更新balance
    28. balance += addMoney;
    29. // 更新details
    30. details += ("收入\t" + balance + "\t\t" + addMoney + "\t\t" + addInfo + "\n");
    31. System.out.println("-----------------登记完成-----------------\n");
    32. break;
    33. case '3':
    34. System.out.println("本次支出金额:");
    35. int minusMoney = Utility.readNumber();
    36. System.out.println("本次支出说明:");
    37. String minusInfo = Utility.readString();
    38. // 处理balance
    39. if(balance >= minusMoney){
    40. balance -= minusMoney;
    41. details += ("支出\t" + balance + "\t\t" + minusMoney + "\t\t" + minusInfo + "\n");
    42. }else{
    43. System.out.println();
    44. }
    45. System.out.println("-----------------登记完成-----------------\n");
    46. break;
    47. case '4':
    48. System.out.println("确认是否退出(Y|N)");
    49. char isExit = Utility.readConfirmSelection();
    50. if(isExit == 'Y'){
    51. flag = false;
    52. }
    53. break;
    54. }
    55. }
    56. }
    57. }

备注