一起玩Python程式:新手寫程式也可以這麼簡單!

課程檢視、回顧與統整

張傑帆

National Taiwan University

課程檢視、回顧與統整

目錄

Alt1

🎯 學習目標

今天我們要當程式設計的建築師,整合前四週的學習成果!

✅ 複習重點

  • 迴圈 (while/for) 的靈活運用
  • 清單 (List) 的完整操作
  • 字典 (Dictionary) 的進階應用
  • 函式 (Function) 的設計思維

✅ 整合能力

  • 將不同概念組合運用
  • 建立程式設計的系統思維
  • 完成中期綜合專題

準備好回顧並超越自己了嗎?

Let's Review & Integrate! 🐍🔧

📍 第一階段

迴圈與容器的回顧

讓我們先回顧 Week 6 和 Week 7 的核心概念!

🔄 迴圈複習:重複的魔法

While 迴圈 - 條件式重複

概念回顧:當條件為 True 時持續執行

# 基本結構
counter = 0
while counter < 5:
    print(f"第 {counter + 1} 次執行")
    counter += 1

常見應用場景

  • 遊戲主循環 (持續運行直到結束)
  • 使用者輸入驗證 (重複要求直到正確)
  • 搜尋任務 (找到目標才停止)

For 迴圈 - 次數式重複

概念回顧:遍歷序列中的每個元素

# range() 用法
for i in range(5):  # 0, 1, 2, 3, 4
    print(f"數字: {i}")

# 遍歷清單
fruits = ["蘋果", "香蕉", "橘子"]
for fruit in fruits:
    print(f"我喜歡吃{fruit}")

常見應用場景

  • 處理清單中的每個項目
  • 執行固定次數的操作
  • 製作倒數計時器

迴圈控制:break 與 continue

指令 功能 使用時機
break 立即跳出迴圈 找到目標、達成條件
continue 跳過本次,繼續下次 過濾特定情況
# break 範例:找到目標就停止
for num in range(1, 11):
    if num == 5:
        print("找到 5 了!")
        break
    print(num)

# continue 範例:跳過偶數
for num in range(1, 6):
    if num % 2 == 0:
        continue
    print(f"奇數: {num}")

📋 List複習:資料容器的魔法

List基本操作回顧

# 建立List
inventory = ["劍", "盾", "藥水"]

# 新增項目
inventory.append("弓箭")        # 加在最後
inventory.insert(1, "頭盔")     # 插入指定位置

# 刪除項目
inventory.remove("藥水")        # 刪除指定項目
last_item = inventory.pop()    # 取出最後一個

# 修改項目
inventory[0] = "神劍"

print(inventory)

List常用方法整理表

方法 功能 範例
len() 取得長度 len(inventory)
sort() 排序(改變原清單) numbers.sort()
reverse() 反轉順序 items.reverse()
count() 計算出現次數 items.count("劍")
index() 找出索引位置 items.index("盾")
# 實用範例
scores = [85, 92, 78, 95, 88]

print(f"最高分: {max(scores)}")
print(f"平均分: {sum(scores) / len(scores)}")
print(f"90分以上: {[s for s in scores if s >= 90]}")

清單切片:靈活取值

items = ["A", "B", "C", "D", "E", "F"]

print(items[1:4])      # ['B', 'C', 'D']
print(items[:3])       # ['A', 'B', 'C']
print(items[3:])       # ['D', 'E', 'F']
print(items[::2])      # ['A', 'C', 'E']  每2個取1個
print(items[::-1])     # ['F', 'E', 'D', 'C', 'B', 'A']  反轉

實用技巧

  • [start:end:step] - start 包含,end 不包含
  • 省略 start 表示從頭開始
  • 省略 end 表示到結尾
  • step 為負數表示反向

🎮 小練習 1:迴圈與清單整合

任務:打造一個寶物管理系統

需求

  1. 建立一個寶物清單
  2. 使用迴圈顯示所有寶物 (附編號)
  3. 讓使用者選擇要移除的寶物
  4. 使用 while 迴圈重複直到使用者選擇離開
# 提示程式碼框架
treasures = ["金幣", "寶石", "魔法書", "鑽石", "古董"]

while True:
    print("\n=== 寶物清單 ===")
    # TODO: 用 for 迴圈顯示所有寶物及編號
    
    choice = input("\n請選擇操作 (1-移除, 0-離開): ")
    
    if choice == "0":
        break
    elif choice == "1":
        # TODO: 讓使用者選擇要移除哪個寶物
        pass
    
print("系統已關閉!")

練習 1 參考解答

treasures = ["金幣", "寶石", "魔法書", "鑽石", "古董"]

while True:
    print("\n=== 寶物清單 ===")
    for i, treasure in enumerate(treasures, 1):
        print(f"{i}. {treasure}")
    
    choice = input("\n請選擇操作 (1-移除, 0-離開): ")
    
    if choice == "0":
        print("感謝使用!")
        break
    elif choice == "1":
        if len(treasures) == 0:
            print("清單已空!")
            continue
        
        index = int(input(f"請輸入要移除的編號(1-{len(treasures)}): ")) - 1
        if 0 <= index < len(treasures):
            removed = treasures.pop(index)
            print(f"已移除: {removed}")
        else:
            print("無效的編號!")
    else:
        print("無效的選擇!")

休息時間 ☕

放鬆一下,準備迎接後半場!

思考問題

  • 你能想出迴圈和清單的3個組合應用嗎?
  • 生活中有哪些情境適合用清單管理?

小提示:待會我們要學習更強大的字典和函式!

📍 第二階段

字典與函式的回顧

讓我們複習 Week 8 和 Week 9 的進階概念!

📚 Dict複習:鍵值對的奧秘

為什麼需要Dict?

List的限制:只能用數字索引

student_list = ["小明", 85, "台北"]  # 不直觀

Dict的優勢:用有意義的鍵值來存取

student = {
    "name": "小明",
    "score": 85,
    "city": "台北"
}
print(student["name"])  # 清楚明瞭

字典基本操作回顧

# 建立字典
player = {
    "name": "勇者",
    "hp": 100,
    "mp": 50,
    "level": 5
}

# 存取值
print(player["name"])           # 勇者
print(player.get("exp", 0))    # 0 (不存在時回傳預設值)

# 新增/修改
player["weapon"] = "神劍"       # 新增
player["hp"] = 120              # 修改

# 刪除
del player["mp"]                # 刪除 mp
gold = player.pop("gold", 0)   # 取出 gold (不存在回傳 0)

字典常用方法整理表

方法 功能 回傳值
keys() 取得所有鍵 dict_keys
values() 取得所有值 dict_values
items() 取得所有鍵值對 dict_items
get(key, default) 安全取值 值或預設值
update(dict2) 合併字典 None
# 遍歷字典
player = {"name": "勇者", "hp": 100, "level": 5}

# 遍歷鍵
for key in player.keys():
    print(key)

# 遍歷值
for value in player.values():
    print(value)

# 遍歷鍵值對
for key, value in player.items():
    print(f"{key}: {value}")

字典的進階應用:巢狀結構

# 遊戲背包系統
backpack = {
    "武器": {
        "劍": {"數量": 2, "攻擊": 50},
        "弓": {"數量": 1, "攻擊": 40}
    },
    "道具": {
        "藥水": {"數量": 5, "效果": "回復HP"},
        "解毒劑": {"數量": 3, "效果": "解除中毒"}
    }
}

# 存取巢狀資料
print(backpack["武器"]["劍"]["攻擊"])  # 50

# 修改數量
backpack["道具"]["藥水"]["數量"] -= 1

# 新增物品
backpack["武器"]["斧頭"] = {"數量": 1, "攻擊": 60}

🧩 函式複習:程式積木的藝術

為什麼需要函式?

沒有函式的程式碼:重複、難維護

# 計算攻擊傷害 (重複3次)
damage1 = 50 * 1.5 - 10
damage2 = 40 * 1.5 - 10
damage3 = 60 * 1.5 - 10

使用函式的程式碼:簡潔、可重用

def calculate_damage(attack, defense):
    return attack * 1.5 - defense

damage1 = calculate_damage(50, 10)
damage2 = calculate_damage(40, 10)
damage3 = calculate_damage(60, 10)

函式基本結構回顧

# 基本函式定義
def function_name(parameter1, parameter2):
    """函式說明文件"""
    # 函式內容
    result = parameter1 + parameter2
    return result

# 呼叫函式
output = function_name(5, 3)

函式的四個要素

  1. 函式名稱:描述功能的動詞
  2. 參數 (Parameters):輸入的資料
  3. 函式體:處理邏輯
  4. 回傳值 (Return):輸出的結果

參數的多種用法

# 1. 位置參數 (必填)
def greet(name, age):
    print(f"{name} 今年 {age} 歲")

greet("小明", 15)

# 2. 預設參數 (選填)
def power_up(attack, bonus=10):
    return attack + bonus

print(power_up(50))      # 60
print(power_up(50, 20))  # 70

# 3. 關鍵字參數 (明確指定)
def create_player(name, hp, mp):
    return {"name": name, "hp": hp, "mp": mp}

player = create_player(name="法師", mp=100, hp=80)

# 4. 不定數量參數
def sum_all(*numbers):
    return sum(numbers)

print(sum_all(1, 2, 3, 4, 5))  # 15

變數作用域:區域與全域

# 全域變數
game_title = "冒險王國"

def show_status():
    # 區域變數
    player_hp = 100
    print(f"遊戲: {game_title}")
    print(f"HP: {player_hp}")

show_status()
# print(player_hp)  # 錯誤!區域變數在外部無法存取

# 修改全域變數需要 global 關鍵字
level = 1

def level_up():
    global level
    level += 1
    print(f"升級到 Lv.{level}")

level_up()

重點整理

  • 區域變數:只在函式內有效
  • 全域變數:在整個程式都有效
  • 優先使用區域變數 (避免干擾)

🚀 小練習 2:字典與函式整合

任務:打造一個角色管理系統

需求

  1. 使用字典儲存多個角色的資訊
  2. 設計函式來新增、顯示、升級角色
  3. 整合清單與迴圈來管理多個角色
# 提示程式碼框架
characters = []

def add_character(name, job, hp, mp):
    """新增角色"""
    # TODO: 建立角色字典並加入 characters
    pass

def show_all_characters():
    """顯示所有角色"""
    # TODO: 用迴圈顯示所有角色資訊
    pass

def level_up_character(index):
    """角色升級"""
    # TODO: 提升指定角色的屬性
    pass

# 測試程式碼
add_character("戰士", "戰士", 150, 30)
add_character("法師", "法師", 80, 120)
show_all_characters()

練習 2 參考解答

characters = []

def add_character(name, job, hp, mp):
    """新增角色到清單"""
    character = {
        "name": name,
        "job": job,
        "hp": hp,
        "mp": mp,
        "level": 1
    }
    characters.append(character)
    print(f"✅ 角色 {name} 已建立!")

def show_all_characters():
    """顯示所有角色資訊"""
    if not characters:
        print("目前沒有角色!")
        return
    
    print("\n=== 角色列表 ===")
    for i, char in enumerate(characters, 1):
        print(f"{i}. {char['name']} ({char['job']}) - Lv.{char['level']}")
        print(f"   HP: {char['hp']} | MP: {char['mp']}")

def level_up_character(index):
    """角色升級:提升屬性"""
    if 0 <= index < len(characters):
        char = characters[index]
        char["level"] += 1
        char["hp"] += 20
        char["mp"] += 10
        print(f"🎉 {char['name']} 升級到 Lv.{char['level']}!")
    else:
        print("❌ 無效的角色編號!")

# 測試程式碼
add_character("亞瑟", "戰士", 150, 30)
add_character("梅林", "法師", 80, 120)
add_character("蘿賓", "弓手", 100, 60)
show_all_characters()
level_up_character(0)
show_all_characters()

🧠 運算思維總整理

1️⃣ 問題分解 (Decomposition)

將複雜問題拆解成小步驟

  • 範例:角色系統 = 新增 + 顯示 + 升級 + 刪除

2️⃣ 模式識別 (Pattern Recognition)

找出問題中的共同模式

  • 範例:所有角色都有 name, hp, mp → 用字典結構

3️⃣ 抽象化 (Abstraction)

聚焦核心概念,忽略細節

  • 範例:函式封裝細節,呼叫時只需知道輸入輸出

4️⃣ 演算法設計 (Algorithm Design)

設計解決問題的步驟流程

  • 範例:升級流程 → 檢查索引 → 取出角色 → 修改屬性 → 顯示結果

本週總結 🎉

✅ 你已經掌握了

Week 6-7 基礎

  • ✨ While 迴圈:條件式重複
  • ✨ For 迴圈:遍歷式重複
  • ✨ 清單:資料的有序集合
  • ✨ 切片:靈活擷取資料

Week 8-9 進階

  • 🎯 字典:鍵值對資料結構
  • 🎯 函式:功能封裝與重用
  • 🎯 參數:資料傳遞機制
  • 🎯 作用域:變數生命週期

整合能力

  • 🚀 組合不同資料結構解決問題
  • 🚀 用函式組織程式邏輯
  • 🚀 建立系統化的思維模式

📊 學習進度檢核表

概念 理解程度 需要加強
While 迴圈 ⭐⭐⭐⭐⭐ 條件設計
For 迴圈 ⭐⭐⭐⭐⭐ 巢狀迴圈
清單操作 ⭐⭐⭐⭐⭐ 切片應用
字典操作 ⭐⭐⭐⭐⭐ 巢狀字典
函式設計 ⭐⭐⭐⭐⭐ 參數設計
整合應用 ⭐⭐⭐⭐⭐ 系統思維

自我評估問題

  1. 我能獨立設計迴圈邏輯嗎?
  2. 我能靈活運用清單和字典嗎?
  3. 我能將功能封裝成函式嗎?
  4. 我能組合這些概念解決實際問題嗎?

🌟 最後的話

恭喜你完成了前半學期的學習!🎊

你已經從完全不會寫程式,到現在能夠:

  • 🔄 用迴圈處理重複任務
  • 📋 用清單管理大量資料
  • 📚 用字典組織複雜資訊
  • 🧩 用函式建立可重用的程式模組

這些是所有程式語言的核心概念!

接下來的課程,我們會學習:

  • 更進階的函式設計
  • 檔案讀寫
  • 錯誤處理
  • 物件導向程式設計

程式設計就像學樂器/騎自行車/游泳,需要不斷練習!
每天寫一點程式,你會越來越厲害!💪

感謝大家的參與!

下週見!Keep Coding! 🐍✨

-----------------------------------------

圖片放大特效

table樣式

![Alt1](../images/1200px-National_Taiwan_University_logo.svg.png)![Alt2](../images/Python-logo-notext.svg.png) <style scoped> img[alt="Alt1"]{ background: rgba(255, 255, 255, 0); position: absolute; top: 10%; left: 10%; /* transform: translate(-50%, -50%); */ width: 200px; /* 調整圖片寬度 */ height: auto; /* 保持原始比例 */ padding:0; margin:0; z-index: 1; } img[alt="Alt2"]{ background: rgba(255, 255, 255, 0); position: absolute; top: 10%; left: 75%; /* transform: translate(-50%, -50%); */ width: 200px; /* 調整圖片寬度 */ height: auto; /* 保持原始比例 */ padding:0; margin:0; z-index: 2; } </style>

--- # 每周課程內容 ## Week 01: 課程介紹 - **課程內容**: 說明課程目標、課程實作環境操作、評量評分標準 - **運算思維**: - **抽象化**: 理解程式設計的基本概念與目標 - **模式識別**: 認識程式開發環境的操作模式 ## Week 02: 認識Python世界 - 開啟Python神奇寶盒! - **生活議題**: 與電腦成為好朋友!讓我們用Python和它打招呼吧 - **課程內容**: - Python簡介與環境設置 - 第一個Python程式:Hello World - 基本輸入與輸出 (input/print) - 用print變出炫酷圖案 - Time套件:基本時間顯示 - **運算思維**: - **抽象化**: 理解程式語言作為人機溝通的橋樑 - **演算法思維**: 學習基本的輸入→處理→輸出流程 - **模式識別**: 認識程式碼的基本結構模式 ## Week 03: 資料型態與變數 - 掌握變數的藝術! - **生活議題**: 讓數字和文字變得生動有趣,做一個超實用的溫度轉換器! - **課程內容**: - 認識Python基本資料型態 (int, float, str, bool) - 變數的命名規則與使用方法 - 數學運算符號實戰 (+, -, *, /, //, %, **) - 字串的基本操作與格式化 - 實作溫度轉換計算器 (攝氏/華氏互轉) - **運算思維**: - **抽象化**: 理解變數作為資料容器的概念 - **模式識別**: 識別不同資料型態的特性與用途 - **演算法思維**: 設計數學運算的邏輯步驟 ## Week 04: 流程控制(上) - 程式的決策之道! - **生活議題**: 讓程式為你做選擇,打造一個智慧選擇器 - **課程內容**: - if-else條件判斷的基礎語法 - 比較運算符號應用 (==, !=, >, <, >=, <=) - 邏輯運算符號 (and, or, not) - 多重條件判斷(elif) - 結合input製作互動式選單 - 加入random模組增添趣味性 - **運算思維**: - **演算法思維**: 學習條件分支的邏輯結構 - **問題分解**: 將複雜決策拆解為條件判斷 - **模式識別**: 識別不同情境下的判斷模式 ## Week 05: 課程檢視、回顧與統整 - **課程內容**: 前四週課程內容複習與問題解答,小型綜合練習 - **運算思維**: - **模式識別**: 回顧並總結學習模式 - **抽象化**: 整合基礎概念形成知識架構 ## Week 06: 流程控制(下) - 程式的重複魔法! - **生活議題**: 打造一個尋寶冒險遊戲,體驗程式的循環樂趣 - **課程內容**: - while迴圈的基本結構與應用 - for迴圈與range()函式 - break與continue的流程控制 - 巢狀迴圈基礎概念 - 運用while迴圈製作遊戲主循環 - 使用for迴圈處理道具清單 - 加入計分系統與遊戲存檔功能 - **運算思維**: - **演算法思維**: 掌握重複執行的邏輯結構 - **問題分解**: 將遊戲功能分解為循環處理步驟 - **模式識別**: 識別適合使用迴圈的情境模式 ## Week 07: 資料容器(上) - 清單的魔法世界! - **生活議題**: 成為寶物收集家,打造你的收藏清單 - **課程內容**: - 清單(List)的基本概念與建立方法 - 清單的新增(append, insert)、刪除(remove, pop)、修改操作 - 清單切片與索引使用 ([start:end:step]) - 清單的常用方法 (len, sort, reverse, count, index) - 建立寶物收集系統 - 實作新增寶物功能與搜尋功能 - **運算思維**: - **抽象化**: 理解清單作為資料集合的抽象概念 - **演算法思維**: 學習資料的增刪查改操作邏輯 - **問題分解**: 將資料管理需求分解為基本操作 ## Week 08: 資料容器(下) - 字典的奧秘寶庫! - **生活議題**: 打造遊戲背包系統,管理你的物品 - **課程內容**: - 字典(Dictionary)基礎概念與語法 - 字典的鍵值配對操作 - 字典的新增、刪除、修改方法 (keys, values, items) - 設計物品屬性結構 (名稱、類型、數量、價值) - 建立物品分類與數量管理系統 - 實作背包容量限制與物品排序功能 - **運算思維**: - **抽象化**: 理解鍵值對應的資料結構概念 - **模式識別**: 識別適合使用字典的資料組織模式 - **演算法思維**: 設計高效的資料查找與管理邏輯 ## Week 09: 函式設計(上) - 打造程式積木樂園! - **生活議題**: 建立自己的魔法咒語庫,讓程式變得更有趣 - **課程內容**: - 函式的基本概念與定義語法 (def) - 參數傳遞的基礎用法 (位置參數、關鍵字參數) - 函式回傳值的運用 (return) - 區域變數與全域變數概念 - 設計基礎魔法函式 (攻擊、治療、防禦) - 製作參數可調整的咒語系統 - **運算思維**: - **問題分解**: 將複雜功能分解為可重複使用的函式 - **抽象化**: 理解函式作為功能封裝的抽象概念 - **模式識別**: 識別可以模組化的程式模式 ## Week 10: 課程檢視、回顧與統整 - **課程內容**: 第6-9週課程內容複習與問題解答,中期綜合專題練習 - **運算思維**: - **模式識別**: 整合資料結構與函式設計的學習模式 - **抽象化**: 建立更高層次的程式設計思維架構

10. 📝 中期專題

(20分鐘)

(20分鐘)

--- ### 整合運算思維:實戰案例 **問題**:設計一個學生成績管理系統 ````python # 1. 問題分解 # - 新增學生 # - 記錄成績 # - 計算平均 # - 顯示排名 # 2. 模式識別 # - 每個學生都有:姓名、學號、成績清單 # - 都需要:建立、修改、查詢功能 # 3. 抽象化 students = [] # 用清單存所有學生 def add_student(name, student_id): """抽象化:新增學生的細節""" return {"name": name, "id": student_id, "scores": []} def calculate_average(scores): """抽象化:計算平均的細節""" return sum(scores) / len(scores) if scores else 0 # 4. 演算法設計 def show_ranking(): """演算法:排序並顯示排名""" # 步驟1:計算每位學生平均 for student in students: student["avg"] = calculate_average(student["scores"]) # 步驟2:按平均分數排序 sorted_students = sorted(students, key=lambda s: s["avg"], reverse=True) # 步驟3:顯示排名 for rank, student in enumerate(sorted_students, 1): print(f"第{rank}名: {student['name']} - 平均: {student['avg']:.1f}") ````

--- ## 作業:中期綜合專題 🎯 請從以下三個選項中選擇一個完成: --- #### 📝 **選項一:基礎整合** (適合初學者) **任務**:打造一個「班級通訊錄系統」 **功能需求**: 1. 使用**清單**儲存多位同學的資料 2. 每位同學用**字典**記錄:姓名、電話、email、生日 3. 設計**函式**實現: - `add_contact(name, phone, email, birthday)` - 新增聯絡人 - `show_all_contacts()` - 顯示所有聯絡人 - `search_contact(name)` - 搜尋特定聯絡人 - `delete_contact(name)` - 刪除聯絡人 4. 使用 **while 迴圈**建立主選單 5. 使用 **for 迴圈**顯示聯絡人清單 **評分標準**: - 資料結構正確 (30%) - 函式設計合理 (30%) - 迴圈運用得當 (20%) - 程式可正常執行 (20%) --- #### 🔧 **選項二:進階應用** (有點挑戰性) **任務**:開發一個「簡易RPG角色管理系統」 **功能需求**: 1. 使用**巢狀字典**設計角色屬性: - 基本資料:name, job, level - 能力值:hp, mp, attack, defense - 裝備欄:weapon, armor, accessory (字典) - 背包:items (清單) 2. 設計**函式**實現: - `create_character(name, job)` - 建立角色 (根據職業給予初始值) - `show_character_info(character)` - 顯示角色詳細資訊 - `equip_item(character, item_type, item_name)` - 裝備物品 - `use_item(character, item_name)` - 使用道具 - `level_up(character)` - 角色升級 (自動提升能力值) - `save_characters()` - 儲存所有角色資料 3. 特殊功能: - 裝備物品會影響角色能力值 - 使用藥水會回復 HP/MP - 支援多個角色切換管理 --- **評分標準**: - 資料結構設計 (25%) - 函式功能完整性 (25%) - 邏輯正確性 (25%) - 程式碼品質 (組織、註解) (15%) - 創意與額外功能 (10%) **加分項目**: - 錯誤處理 (輸入驗證) - 使用者介面美化 - 資料持久化 (檔案讀寫) --- #### 🚀 **選項三:創意專題** (自由發揮) **任務**:設計一個你感興趣的系統 **必須包含的元素**: - ✅ **至少使用 2 種迴圈** (while, for) - ✅ **清單與字典的組合運用** - ✅ **設計至少 5 個自訂函式** - ✅ **完整的主選單系統** - ✅ **資料的增刪查改功能** **專題建議方向**: 1. 📚 **圖書管理系統** - 書籍借閱、歸還、搜尋 2. 🎮 **遊戲存檔管理器** - 多存檔、讀取、備份 3. 💰 **個人記帳本** - 收支記錄、分類統計、月報表 4. 🎵 **音樂播放清單** - 歌曲管理、播放清單、排序 5. 📝 **待辦事項管理** - 任務新增、優先級、完成度追蹤 6. 🍔 **餐廳點餐系統** - 菜單管理、訂單處理、結帳 7. 其他你有興趣的主題! --- **評分標準**: - 創意與實用性 (20%) - 功能完整度 (25%) - 程式設計技巧 (25%) - 程式碼品質 (20%) - 報告與展示 (10%) **繳交內容**: 1. 完整的 Python 程式碼 (.py 檔) 2. 專題說明文件 (功能介紹、使用說明) 3. 執行畫面截圖 (至少 3 張) 4. 程式碼註解要清楚 **繳交期限**:下週上課前 **繳交方式**:上傳至課程平台 **溫馨提醒**: - 先畫出系統架構圖 - 分步驟實作,逐一測試 - 遇到問題可以詢問老師或同學 - 記得備份你的程式碼!

## 期待你的中期專題作品!🚀