這個也好,那個也好,但就只能選一個,該選誰好呢? 多選一的問題,就交給最專業的 switch-case 判斷敘述來完成吧!
上一堂課程中,我們介紹了 Serial monitor,一種與 Arduino 進行文字互動的方法。今天,我們要介紹一個叫作 switch-case 的選擇性敘述,讓你體驗全新的決策技巧!
我們曾經在 Class 4 的課程當中,介紹了 if-else 判斷式,讓 Arduino 擁有「做決定」的能力。雖然它是一個很棒的工具,但在面對某些情況的時候,if-else 就不這麼好用了,比如說:我想製作一個數字轉換為字母的轉換器,把輸入的 1, 2, 3, 4, 5 這 5 個數字,轉換成英文字母 A, B, C, D, E,然後印在監控視窗當中。
在這種條件下,當我們每次輸入數字以後,Arduino 都要從這 5 個候選的英文字母中,挑選出一個正確對應的字母。如果我使用 if-else 判斷式來撰寫,你會發現這一大群的程式,不但在語法上的重複性很高,而且閱讀起來也不那麼容易:
面對這種根據輸入的資料,從一堆候選的答案裡,挑出一個正確解答的問題,就非常適合使用 switch-case 來處理。
SWITCH CASE 語法結構
switch-case 的完整結構如下圖,由一個帶著小括號的 switch,很多的 case 與 break,以及一個 default 所組成。
它是怎麼運作的呢?首先,Arduino 會先讀取 switch 小括號中的資料,然後由上而下依序地與 case 當中的條件進行比對。一旦匹配成功,就會進入對應的 case,執行冒號下面的工作。
當工作完成時,我們會使用 break 指令,跳出判斷式。這等於是告訴 Arduino,不用再繼續花時間比較剩下的 case 條件了,可以增加程式執行的效率。
這裡要注意的是,如果你不小心忘記在一個 case 的工作結束時加上 break 指令,當程式執行完一個 case 的工作時,會直接無視後面的 case 判斷條件,執行所有 case 當中的工作,一直到出現 break 或是右大括號為止。所以,除非你有特殊的使用目的,不然在一般的情況下,一個 case 都會搭配一個 break 來使用。
當然,如果 switch 小括號中的資料,沒辦法跟任何一個 case 匹配,程式就會進入 default 當中,執行對應的工作。這個 default 跟我們之前介紹的 else 一樣,是可有可無的。
小專案:數字轉換為字母
今天的小專案,我們要把剛才示範的數字轉換器,使用 switch-case 來完成!還記得在上一堂課程,我們介紹了如何從 Serial monitor 讀取數字並計算出華氏溫度的方法 嗎?先把「讀取數字」的這段程式碼塞進 setup() 與 loop() 當中。
接下來,我們要放上 switch,然後把要用來比對的資料,也就是從 Serial monitor 讀取到的整數 num 放在 switch 的小括號當中。然後,我們要列出 5 個 case,分別填入數字 1-5,來表示整數 num 有可能出現的 5 種情況。當第一個 case 成立,也就是 num 等於數字 1 的時候,我們要在 Serial monitor 上印出字母 A,然後放上非常重要的 break 指令。當然,剩下的四種情況也依此類推。
最後,我們可以放上一個 default,來應對輸入的文字不在 1-5 之間的問題。如果上面的 case 都不成立,我們就讓 Serial monitor 印出一行 Invalid number 的提示句,告訴使用者,您輸入的文字並不符合這個轉換工具的規則!
完成啦!使用 switch-case 來處理「多選一」的問題,可以讓我們設計出更直覺,也更容易閱讀的程式!
IF 與 SWITCH 比較
接下來,我們來談談 if-else 與 switch-case 的使用時機吧!在前面的課程中,我們不斷強調,面對「多選一」的問題時,使用 switch-case 能幫助我們簡化程式,降低閱讀的困難性,同時增加執行的效率。但是,switch-case 有兩個最致命的缺點,讓它沒辦法完全取代 if-else 的地位。
首先,通常只有「整數」或是「字元」類型的資料才適合讓 switch 進行處理。也就是說,只有 1234 或是 ABCD 這類的符號,才適合放在 switch 與 case 中進行比對。如果我想檢查某個接腳的電位狀態,或是比對複雜的邏輯運算結果,基本上還是得依靠 if-else 判斷式來執行。這是它的第一個缺點。
第二個缺點,就是 switch-case 判斷式沒有辦法處理「數值範圍」的問題。比如說,我想做一個環境溫度檢測的程式,當使用者輸入的室溫大於或等於 32 度時,我就顯示 “It’s too hot.”;小於 18 度時,我就顯示 “It’s too cold”;而介於 18 到 31 度之間的室溫,就代表適合人體的溫度,顯示 “It’s comfortable.”。
這時候,除了原本我們介紹過的 == 或 != 之外,我們還可以從「大於」、「小於」、「大於或等於」以及「小於或等於」這四個比較運算子中,挑選對應的運算子,搭配 if-else 判斷式,來輕鬆完成這些工作。
但對於 switch-case 來說,要設計類似的功能,你只能把每一種可能的溫度,都列出一個對應的 case 來處理。換句話說,如果我們要設計一個,可以檢測 1 度到 100 度的溫度檢測程式,我們就必須列出 100 種 case 才能應付,這絕對不是一個聰明的方法。
所以囉!針對不同的情況,我們還是得挑選最適合的判斷式工具,才能事半功倍唷!
ONE LAST THING
下一堂課程 ,我們要介紹一個超級重要,卻又讓初學者超級頭痛的「For 迴圈」,讓你用輕鬆的心情,處理高重複性的工作。這麼實用的工具,怎麼能錯過呢?記得按下追蹤或關注,隨時鎖定最新的精彩課程喔!這一集的 Arduino SpeedUp 在這裡告一個段落!我們下一堂課程再與各位見面,掰掰!
終於完成遙控車了!!!!!!!!!!!!!!!!!!!!
謝謝~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~