A2: 月球導航系統:邏輯控制與條件判斷
任務背景
在月球表面執行任務時,你的月球車需要根據不同的地形和環境條件做出正確的決策。是繼續前進?轉向?還是停止?這些決策都依賴於精確的邏輯判斷系統。
作為探險隊的導航員,你需要掌握:- 如何根據感測器數據做出決策(條件判斷)
- 如何處理複雜的多重條件(巢狀判斷)
- 如何重複執行任務直到達成目標(迴圈控制)
知識點說明
三大控制結構
在太空任務中,所有的決策系統都基於三種基本結構:
- 循序(Sequence):按順序執行指令
- 選擇(Selection):根據條件選擇執行路徑
- 重複(Repetition):重複執行直到滿足條件
條件判斷:if / elif / else
# 基本結構
if 條件1:
# 條件1為真時執行
elif 條件2:
# 條件1為假且條件2為真時執行
else:
# 所有條件都為假時執行
布林邏輯運算子
and:兩個條件都必須為真or:至少一個條件為真not:反轉條件
迴圈結構
for 迴圈:已知次數的重複for i in range(5): # 執行 5 次,i = 0, 1, 2, 3, 4
print(i)
while 迴圈:條件控制的重複
while 條件:
# 當條件為真時持續執行
範例程式碼
範例 1:月球車地形判斷系統
import sys
# 任務:根據地形類型決定行駛速度
terrain = sys.stdin.readline().strip()
if terrain == "平原":
speed = 50
print(f"地形:{terrain},建議速度:{speed} km/h")
elif terrain == "隕石坑":
speed = 20
print(f"地形:{terrain},建議速度:{speed} km/h(小心駕駛)")
elif terrain == "懸崖":
speed = 0
print(f"地形:{terrain},建議速度:{speed} km/h(停止前進!)")
else:
speed = 30
print(f"地形:未知,建議速度:{speed} km/h(謹慎前進)")
範例 2:氧氣警報系統
import sys
# 任務:根據氧氣含量和電池電量發出警報
oxygen = int(sys.stdin.readline()) # 氧氣百分比
battery = int(sys.stdin.readline()) # 電池百分比
print(f"氧氣:{oxygen}%,電池:{battery}%")
if oxygen < 20 and battery < 30:
print("🚨 緊急警報:氧氣和電池都不足!立即返回基地!")
elif oxygen < 20:
print("⚠️ 警告:氧氣不足!")
elif battery < 30:
print("⚠️ 警告:電池不足!")
else:
print("✅ 系統正常,可以繼續任務")
範例 3:隕石雨倒數系統
import sys
# 任務:倒數計時並在特定時刻發出警報
countdown = int(sys.stdin.readline())
for i in range(countdown, 0, -1): # 從 countdown 倒數到 1
if i == 10:
print(f"{i} - 準備啟動防護罩")
elif i == 5:
print(f"{i} - 防護罩充能中")
elif i == 1:
print(f"{i} - 防護罩啟動!")
else:
print(i)
print("🛡️ 防護罩已啟動,隕石雨來襲!")
範例 4:尋找最佳著陸點
import sys
# 任務:在 N 個候選點中找到坡度最小的著陸點
n = int(sys.stdin.readline())
best_slope = float('inf') # 初始化為無限大
best_location = -1
for i in range(n):
slope = int(sys.stdin.readline())
if slope < best_slope:
best_slope = slope
best_location = i + 1 # 位置從 1 開始編號
print(f"最佳著陸點:位置 {best_location},坡度:{best_slope}°")
範例 5:進階流程控制 - break 與 continue
import sys
# 任務:掃描隕石樣本,找到第一個含有水冰的樣本
n = int(sys.stdin.readline())
for i in range(1, n + 1):
sample_type = sys.stdin.readline().strip()
if sample_type == "空樣本":
continue # 跳過空樣本,繼續下一個
if sample_type == "水冰":
print(f"✅ 在樣本 {i} 發現水冰!任務完成!")
break # 找到目標,立即結束搜索
print(f"樣本 {i}:{sample_type}(繼續搜索)")
else:
# 只有在迴圈正常結束(沒有 break)時才執行
print("❌ 所有樣本都不含水冰")
程式碼解說
關鍵技術點
- elif 的優勢
- 比多個獨立的
if更高效 - 一旦某個條件為真,後續條件不再檢查
- 邏輯更清晰,避免重複判斷
- range() 函數
range(5) # 0, 1, 2, 3, 4
range(1, 6) # 1, 2, 3, 4, 5
range(10, 0, -1) # 10, 9, 8, ..., 1
⚠️ 注意:stop 參數本身不包含在序列中!
- break vs continue
break:立即跳出整個迴圈continue:跳過本次迭代,進入下一次
- for...else 結構
else區塊只在迴圈正常結束時執行- 如果迴圈被
break中斷,else不執行 - 非常適合「搜索失敗」的處理
Quiz: 火星探測器路徑規劃
題目:障礙物迴避系統
你的火星探測器正在執行路徑掃描任務。探測器會掃描前方 N 個位置,每個位置可能是:0:安全路徑1:小型障礙物(可以繞過)2:大型障礙物(必須停止)
- 如果遇到大型障礙物(2),立即停止並報告位置
- 統計有多少個小型障礙物
- 如果沒有大型障礙物,報告路徑安全
- 第一行:整數 N(掃描位置數量,1 ≤ N ≤ 100)
- 第二行:N 個整數,用空格分隔,每個整數為 0、1 或 2
8
0 1 0 0 1 2 0 1
輸出範例 1:
⚠️ 在位置 6 發現大型障礙物!
已掃描:5 個位置
小型障礙物:2 個
輸入範例 2:
6
0 1 0 1 0 0
輸出範例 2:
✅ 路徑安全!
總掃描:6 個位置
小型障礙物:2 個
💡 提示
- 使用
enumerate()可以同時獲得索引和值 - 記得位置編號從 1 開始(對使用者友善)
- 使用
break在遇到大型障礙物時立即停止
---
Quiz 解答
import sys
# 讀取掃描位置數量
n = int(sys.stdin.readline())
# 讀取所有位置的障礙物數據
obstacles = list(map(int, sys.stdin.readline().strip().split()))
# 初始化計數器
small_obstacles = 0
scanned = 0
# 掃描每個位置
for position, obstacle_type in enumerate(obstacles, start=1):
scanned = position # 記錄已掃描的位置
if obstacle_type == 1:
small_obstacles += 1 # 統計小型障礙物
elif obstacle_type == 2:
# 發現大型障礙物,立即停止
print(f"⚠️ 在位置 {position} 發現大型障礙物!")
print(f"已掃描:{scanned - 1} 個位置")
print(f"小型障礙物:{small_obstacles} 個")
break
else:
# 迴圈正常結束,沒有遇到大型障礙物
print("✅ 路徑安全!")
print(f"總掃描:{scanned} 個位置")
print(f"小型障礙物:{small_obstacles} 個")
解答說明
- enumerate() 的使用
for position, obstacle_type in enumerate(obstacles, start=1):
enumerate()同時提供索引和值start=1讓位置編號從 1 開始(更符合人類習慣)
- 條件判斷邏輯
- 先檢查是否為小型障礙物(1),累加計數
- 再檢查是否為大型障礙物(2),立即
break - for...else 的妙用
- 如果迴圈被
break中斷,else不執行 - 如果迴圈正常結束,
else執行,表示路徑安全 - 變數追蹤
scanned記錄當前掃描到的位置- 在
break時,scanned - 1是實際完成掃描的位置數 - 時間複雜度:O(N) - 最多掃描 N 個位置
- 空間複雜度:O(N) - 儲存 N 個障礙物數據
- 最佳情況:O(1) - 第一個位置就是大型障礙物
- 最壞情況:O(N) - 沒有大型障礙物,掃描全部
效能分析
---
訓練完成!
恭喜你完成 導航邏輯與條件判斷 訓練!