iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
自我挑戰組

Java 程式設計與實作:30 天打造個人記帳系統系列 第 20 篇

記帳系統實作:加入「消費預算」與超支提醒

  • 分享至 

  • xImage
  •  

昨天完成了「修改消費紀錄」功能,目前記帳系統已經可以新增、查看、修改、刪除和統計消費。

今天剛好來到 Day 20,我想加入一個更接近真正記帳軟體的功能:

設定消費預算,並自動判斷目前有沒有超支。

例如設定:

預算:5000 元

目前已經花了:

4200 元

程式就可以告訴我:

剩餘預算:800 元

如果已經花了 5300 元,就提醒:

已超出預算 300 元!

今天要完成的功能

昨天的選單:

===== 個人記帳系統 =====

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出
  4. 分類支出統計
  5. 刪除消費紀錄
  6. 修改消費紀錄
  7. 離開

今天加入兩個功能:

===== 個人記帳系統 =====

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出
  4. 分類支出統計
  5. 刪除消費紀錄
  6. 修改消費紀錄
  7. 設定預算
  8. 查看預算狀況
  9. 離開

這樣使用者可以先設定預算,再隨時查看目前的支出狀況。

第一步:建立 budget 變數

首先建立:

static int budget = 0;

budget 用來保存目前設定的預算。

例如:

budget = 5000;

代表:

目前預算:5000 元

因為不同 Method 都需要使用這個預算,所以我把它放在:

public class Main

裡面,和:

static Scanner scanner
static ArrayList expenses

放在一起。

第二步:建立設定預算功能

建立新的 Method:

public static void setBudget()

內容:

public static void setBudget() {
System.out.println();
System.out.println("===== 設定預算 =====");
System.out.print("請輸入預算金額:");
budget = scanner.nextInt();
scanner.nextLine();
System.out.println(
"預算設定成功:" + budget + " 元"
);
}

假設輸入:

請輸入預算金額:5000

程式就會顯示:

預算設定成功:5000 元

第三步:計算目前支出

之前 Day 16 已經做過總支出統計:

int total = 0;
for (int i = 0; i < expenses.size(); i++) {
total += expenses.get(i).getAmount();
}

今天可以再次使用相同概念。

例如目前有:

早餐:60 元
午餐:150 元
電影:300 元

程式就會算:

60 + 150 + 300 = 510

所以:

目前支出:510 元

第四步:計算剩餘預算

只需要:

int remaining = budget - total;

例如:

budget = 5000
total = 4200

計算:

remaining = 5000 - 4200

結果:

remaining = 800

所以顯示:

剩餘預算:800 元

第五步:使用 if / else 判斷是否超支

這裡就可以重新使用 Day 4 學過的 if / else。

if (total > budget) {
System.out.println("已超出預算!");
} else {
System.out.println("目前仍在預算範圍內。");
}

如果:

預算:5000
支出:5300

因為:

5300 > 5000

所以會進入:

if

顯示超支提醒。

超支多少也可以算出來

如果已經超過預算:

int over = total - budget;

例如:

5300 - 5000 = 300

就可以顯示:

已超出預算 300 元!

建立 checkBudget() Method

把上面的功能整理成:

public static void checkBudget() {
System.out.println();
System.out.println("===== 預算狀況 =====");
if (budget <= 0) {
System.out.println("尚未設定預算。");
return;
}
int total = 0;
for (int i = 0; i < expenses.size(); i++) {
total += expenses.get(i).getAmount();
}
System.out.println("目前預算:" + budget + " 元");
System.out.println("目前支出:" + total + " 元");
if (total > budget) {
int over = total - budget;
System.out.println(
"已超出預算 " + over + " 元!"
);
} else {
int remaining = budget - total;
System.out.println(
"剩餘預算:" + remaining + " 元"
);
}
}

Day 20 完整程式

今天把預算功能整合進目前的記帳系統:

import java.util.Scanner;
import java.util.ArrayList;
import java.util.InputMismatchException;
class Expense {
private String item;
private int amount;
private String category;
Expense(String item, int amount, String category) {
this.item = item;
this.amount = amount;
this.category = category;
}
public String getItem() {
return item;
}
public int getAmount() {
return amount;
}
public String getCategory() {
return category;
}
public void setItem(String item) {
this.item = item;
}
public void setAmount(int amount) {
if (amount >= 0) {
this.amount = amount;
}
}
public void setCategory(String category) {
this.category = category;
}
}
public class Main {
static Scanner scanner = new Scanner(System.in);
static ArrayList expenses = new ArrayList<>();
static int budget = 0;
public static void main(String[] args) {
boolean running = true;
while (running) {
showMenu();
try {
System.out.print("請選擇功能:");
int choice = scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1:
addExpense();
break;
case 2:
showExpenses();
break;
case 3:
calculateTotal();
break;
case 4:
categoryStatistics();
break;
case 5:
deleteExpense();
break;
case 6:
editExpense();
break;
case 7:
setBudget();
break;
case 8:
checkBudget();
break;
case 9:
running = false;
System.out.println("已離開個人記帳系統!");
break;
default:
System.out.println("沒有這個選項!");
}
} catch (InputMismatchException e) {
System.out.println("輸入錯誤,請輸入數字!");
scanner.nextLine();
}
}
scanner.close();
}
public static void showMenu() {
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("5. 刪除消費紀錄");
System.out.println("6. 修改消費紀錄");
System.out.println("7. 設定預算");
System.out.println("8. 查看預算狀況");
System.out.println("9. 離開");
}
public static void addExpense() {
System.out.println();
System.out.println("===== 新增消費 =====");
System.out.print("請輸入消費項目:");
String item = scanner.nextLine();
System.out.print("請輸入消費金額:");
int amount = scanner.nextInt();
String category = chooseCategory();
Expense expense =
new Expense(item, amount, category);
expenses.add(expense);
System.out.println("記帳成功!");
}
public static String chooseCategory() {
System.out.println();
System.out.println("請選擇消費分類:");
System.out.println("1. 飲食");
System.out.println("2. 交通");
System.out.println("3. 購物");
System.out.println("4. 娛樂");
System.out.print("請輸入選項:");
int choice = scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1:
return "飲食";
case 2:
return "交通";
case 3:
return "購物";
case 4:
return "娛樂";
default:
return "其他";
}
}
public static void showExpenses() {
System.out.println();
System.out.println("===== 消費紀錄 =====");
if (expenses.size() == 0) {
System.out.println("目前沒有消費紀錄。");
return;
}
for (int i = 0; i < expenses.size(); i++) {
Expense expense = expenses.get(i);
System.out.println(
(i + 1) + ". "
+ expense.getItem()
+ "|" + expense.getAmount() + " 元"
+ "|" + expense.getCategory()
);
}
}
public static void calculateTotal() {
System.out.println();
System.out.println("===== 支出統計 =====");
int total = 0;
for (int i = 0; i < expenses.size(); i++) {
total += expenses.get(i).getAmount();
}
System.out.println(
"目前共有 " + expenses.size() + " 筆消費"
);
System.out.println("總支出:" + total + " 元");
}
public static void categoryStatistics() {
System.out.println();
System.out.println("===== 分類支出統計 =====");
int foodTotal = 0;
int transportTotal = 0;
int shoppingTotal = 0;
int entertainmentTotal = 0;
for (int i = 0; i < expenses.size(); i++) {
Expense expense = expenses.get(i);
switch (expense.getCategory()) {
case "飲食":
foodTotal += expense.getAmount();
break;
case "交通":
transportTotal += expense.getAmount();
break;
case "購物":
shoppingTotal += expense.getAmount();
break;
case "娛樂":
entertainmentTotal += expense.getAmount();
break;
}
}
System.out.println("飲食:" + foodTotal + " 元");
System.out.println("交通:" + transportTotal + " 元");
System.out.println("購物:" + shoppingTotal + " 元");
System.out.println("娛樂:" + entertainmentTotal + " 元");
}
public static void deleteExpense() {
System.out.println();
System.out.println("===== 刪除消費紀錄 =====");
if (expenses.size() == 0) {
System.out.println("目前沒有可以刪除的紀錄。");
return;
}
showExpenses();
System.out.print("請輸入要刪除的紀錄編號:");
int number = scanner.nextInt();
scanner.nextLine();
if (number >= 1 && number <= expenses.size()) {
Expense deletedExpense =
expenses.remove(number - 1);
System.out.println(
"已刪除:" + deletedExpense.getItem()
);
} else {
System.out.println("沒有這筆紀錄!");
}
}
public static void editExpense() {
System.out.println();
System.out.println("===== 修改消費紀錄 =====");
if (expenses.size() == 0) {
System.out.println("目前沒有可以修改的紀錄。");
return;
}
showExpenses();
System.out.print("請輸入要修改的紀錄編號:");
int number = scanner.nextInt();
scanner.nextLine();
if (number >= 1 && number <= expenses.size()) {
Expense expense =
expenses.get(number - 1);
System.out.print("請輸入新的消費項目:");
String newItem = scanner.nextLine();
System.out.print("請輸入新的消費金額:");
int newAmount = scanner.nextInt();
String newCategory = chooseCategory();
expense.setItem(newItem);
expense.setAmount(newAmount);
expense.setCategory(newCategory);
System.out.println("修改成功!");
} else {
System.out.println("沒有這筆紀錄!");
}
}
public static void setBudget() {
System.out.println();
System.out.println("===== 設定預算 =====");
System.out.print("請輸入預算金額:");
budget = scanner.nextInt();
scanner.nextLine();
System.out.println(
"預算設定成功:" + budget + " 元"
);
}
public static void checkBudget() {
System.out.println();
System.out.println("===== 預算狀況 =====");
if (budget <= 0) {
System.out.println("尚未設定預算。");
return;
}
int total = 0;
for (int i = 0; i < expenses.size(); i++) {
total += expenses.get(i).getAmount();
}
System.out.println("目前預算:" + budget + " 元");
System.out.println("目前支出:" + total + " 元");
if (total > budget) {
int over = total - budget;
System.out.println(
"已超出預算 " + over + " 元!"
);
} else {
int remaining = budget - total;
System.out.println(
"剩餘預算:" + remaining + " 元"
);
}
}
}

實際執行看看

首先設定預算:

===== 個人記帳系統 =====

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出
  4. 分類支出統計
  5. 刪除消費紀錄
  6. 修改消費紀錄
  7. 設定預算
  8. 查看預算狀況
  9. 離開
    請選擇功能:7

輸入:

===== 設定預算 =====
請輸入預算金額:5000
預算設定成功:5000 元

假設目前已經記錄:

  1. 房租|3500 元|其他
  2. 午餐|150 元|飲食
  3. 電影|300 元|娛樂
  4. 捷運|30 元|交通

目前總支出:

3980 元

選擇:

請選擇功能:8

結果:

===== 預算狀況 =====
目前預算:5000 元
目前支出:3980 元
剩餘預算:1020 元

如果超過預算呢?

假設後來又新增:

購物|1500 元|購物

總支出就變成:

5480 元

再次查看:

===== 預算狀況 =====
目前預算:5000 元
目前支出:5480 元
已超出預算 480 元!

這樣程式就開始具有「提醒」功能,而不只是單純記錄資料。

還可以判斷剛好用完預算

目前的程式:

if (total > budget) {
// 超過預算
} else {
// 還有剩餘預算
}

如果:

預算:5000
支出:5000

就會顯示:

剩餘預算:0 元

這其實沒有錯。

不過如果想讓提示更清楚,也可以使用:

if (total > budget) {
System.out.println("已超出預算!");
} else if (total == budget) {
System.out.println("預算剛好全部使用完!");
} else {
System.out.println("目前仍在預算範圍內。");
}

這就再次使用到 Day 4 學過的 if / else if / else。

Day 20 學習心得

今天完成了記帳系統的預算功能,可以自己設定消費預算,並讓程式根據目前所有消費紀錄自動計算剩餘金額。如果支出超過預算,也會顯示超支提醒。

做到今天,我發現前面學過的基礎語法開始一直重複出現在真正的功能裡。例如 if / else 一開始只是簡單的條件判斷練習,現在已經可以拿來判斷預算是否超支;for 迴圈則可以用來計算所有消費的總金額。

目前已經完成 30 天挑戰的三分之二,記帳系統也從最初只能顯示一筆消費,慢慢增加到新增、查看、修改、刪除、分類統計和預算管理。接下來希望解決另一個很重要的問題:關掉程式之後,資料就全部消失了。


上一篇
記帳系統實作:新增「修改消費紀錄」功能
下一篇
File 檔案寫入:讓記帳紀錄可以真正保存
系列文
Java 程式設計與實作:30 天打造個人記帳系統 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言