前 15 天已經學習了不少 Java 基礎,包括變數、Scanner、條件判斷、迴圈、ArrayList、Method,以及 Class、Constructor、Encapsulation、Inheritance 和 Exception Handling。
從今天開始,我想把前面學過的東西真正整合起來,繼續完善自己的 Java 個人記帳系統。
目前系統已經可以新增消費和查看紀錄,今天要加入第一個統計功能:
自動計算目前所有消費的總金額。
目前的記帳系統
目前選單大概是:
===== 個人記帳系統 =====
今天希望增加:
===== 個人記帳系統 =====
例如已經有:
早餐: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 + " 元"
);
}
}
}
實際執行看看
先新增第一筆:
===== 個人記帳系統 =====
再新增:
請輸入消費項目:午餐
請輸入消費金額: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 天後,我開始覺得前面學過的內容不是分開的知識,而是可以互相搭配來完成真正的功能。記帳系統也開始從單純的練習程式,慢慢變成比較完整的小專案。