iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
自我挑戰組

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

記帳系統實作:加入「總支出統計」功能

  • 分享至 

  • xImage
  •  

前 15 天已經學習了不少 Java 基礎,包括變數、Scanner、條件判斷、迴圈、ArrayList、Method,以及 Class、Constructor、Encapsulation、Inheritance 和 Exception Handling。

從今天開始,我想把前面學過的東西真正整合起來,繼續完善自己的 Java 個人記帳系統。

目前系統已經可以新增消費和查看紀錄,今天要加入第一個統計功能:

自動計算目前所有消費的總金額。

目前的記帳系統

目前選單大概是:

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

  1. 新增消費
  2. 查看紀錄
  3. 離開

今天希望增加:

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

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出
  4. 離開

例如已經有:

早餐:60 元
午餐:120 元
捷運:30 元

選擇「查看總支出」之後,希望程式可以自動算出:

總支出:210 元

要怎麼計算總支出?

我們的消費紀錄目前保存在:

ArrayList expenses = new ArrayList<>();

所以可以利用之前學過的 for 迴圈,把每一筆 Expense 拿出來。

先準備:

int total = 0;

接著:

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

假設金額分別是:

60
120
30

程式計算的過程就是:

一開始 total = 0
0 + 60 = 60
60 + 120 = 180
180 + 30 = 210
最後 total = 210

這就是今天最主要的功能。

建立 calculateTotal() Method

因為 Day 10 學過 Method,所以今天不想把所有程式都塞進 main。

可以另外建立:

public static void calculateTotal() {
int total = 0;
for (int i = 0; i < expenses.size(); i++) {
Expense expense = expenses.get(i);
total = total + expense.getAmount();
}
System.out.println("總支出:" + total + " 元");
}

之後只要呼叫:

calculateTotal();

就可以計算目前所有紀錄的金額。

修改主選單

原本:

System.out.println("1. 新增消費");
System.out.println("2. 查看紀錄");
System.out.println("3. 離開");

今天改成:

System.out.println("1. 新增消費");
System.out.println("2. 查看紀錄");
System.out.println("3. 查看總支出");
System.out.println("4. 離開");

switch 也要跟著修改:

switch (choice) {
case 1:
addExpense();
break;
case 2:
showExpenses();
break;
case 3:
calculateTotal();
break;
case 4:
running = false;
System.out.println("已離開個人記帳系統!");
break;
default:
System.out.println("沒有這個選項!");
}

Day 16 完整程式

把目前學過的內容整合起來:

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 class Main {
static Scanner scanner = new Scanner(System.in);
static ArrayList expenses = new ArrayList<>();
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:
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. 離開");
}
public static void addExpense() {
System.out.println();
System.out.println("===== 新增消費 =====");
System.out.print("請輸入消費項目:");
String item = scanner.nextLine();
try {
System.out.print("請輸入消費金額:");
int amount = scanner.nextInt();
scanner.nextLine();
System.out.print("請輸入消費分類:");
String category = scanner.nextLine();
Expense expense =
new Expense(item, amount, category);
expenses.add(expense);
System.out.println("記帳成功!");
} catch (InputMismatchException e) {
System.out.println("金額輸入錯誤,請輸入數字!");
scanner.nextLine();
}
}
public static void showExpenses() {
System.out.println();
System.out.println("===== 消費紀錄 =====");
if (expenses.size() == 0) {
System.out.println("目前沒有消費紀錄。");
} else {
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("===== 支出統計 =====");
if (expenses.size() == 0) {
System.out.println("目前沒有消費紀錄。");
} else {
int total = 0;
for (int i = 0; i < expenses.size(); i++) {
Expense expense = expenses.get(i);
total = total + expense.getAmount();
}
System.out.println(
"目前共有 " + expenses.size() + " 筆消費"
);
System.out.println(
"總支出:" + total + " 元"
);
}
}
}

實際執行看看

先新增第一筆:

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

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出
  4. 離開
    請選擇功能:1
    ===== 新增消費 =====
    請輸入消費項目:早餐
    請輸入消費金額:60
    請輸入消費分類:飲食
    記帳成功!

再新增:

請輸入消費項目:午餐
請輸入消費金額:120
請輸入消費分類:飲食
記帳成功!

最後再新增:

請輸入消費項目:捷運
請輸入消費金額:30
請輸入消費分類:交通
記帳成功!

現在選擇:

請選擇功能:3

程式就會顯示:

===== 支出統計 =====
目前共有 3 筆消費
總支出:210 元

成功!

今天其實整合了很多前面學過的東西

做到今天之後,我發現這個功能雖然看起來不複雜,但其實已經同時用到前面很多天的內容。

像是:

ArrayList expenses

使用了 ArrayList 和 Object。

for (int i = 0; i < expenses.size(); i++)

使用了 for 迴圈。

expense.getAmount()

使用了 Class、Object 和 Encapsulation。

calculateTotal()

使用了 Method。

if (expenses.size() == 0)

則使用了條件判斷。

所以現在已經不是單獨練習某一個 Java 語法,而是開始把不同觀念組合起來完成一個真正的功能。

可以讓程式更簡潔嗎?

今天還發現這行:

total = total + expense.getAmount();

其實可以縮寫成:

total += expense.getAmount();

兩個意思完全一樣。

例如:

int total = 100;
total += 50;

就相當於:

total = total + 50;

最後:

total = 150

所以統計程式也可以寫成:

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

不過目前我還是比較喜歡把步驟寫清楚,因為比較容易看懂每一步在做什麼。

Day 16 學習心得

今天開始進入記帳系統的實際功能開發,利用前面學過的 ArrayList、for 迴圈、Method 和 Object,完成了「總支出統計」功能。

和前幾天學習新的 Java 語法不同,今天比較像是在練習怎麼把已經學過的東西組合起來。原本只會一筆一筆顯示消費紀錄,現在程式已經可以把所有金額加總,並顯示目前的消費筆數和總支出。

做到第 16 天後,我開始覺得前面學過的內容不是分開的知識,而是可以互相搭配來完成真正的功能。記帳系統也開始從單純的練習程式,慢慢變成比較完整的小專案。


上一篇
Exception Handling 例外處理:避免輸入錯誤讓程式當掉
下一篇
記帳系統實作:依照消費分類統計金額
系列文
Java 程式設計與實作:30 天打造個人記帳系統 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言