初學者最痛恨的 For 迴圈來了,它長得好複雜呀! 別擔心,跟著番茄一起健身,你會發現原來 For 迴圈這麼簡單!
上一堂課程,我們介紹了非常適合處理「多選一」問題的 switch-case 判斷式 。今天,我們要來談談「重複執行」的專家:For 迴圈。For 迴圈是讓很多初學者卡關的地方,因為他的邏輯跟結構都蠻特別的。我們先來看看 For 迴圈長什麼樣子吧!
For 迴圈主要由一組小括號,與一組大括號構成。在小括號當中,分別以兩個「分號」區隔出三個位置,並依序放上「初始化」、「重複條件」以及「變數增減」三個參數;而大括號當中,則放上我們想重複執行的工作。看起來很複雜對不對?沒關係!先對它有個粗淺的印象就可以了!
使用情境與邏輯
假設我們有一個健身計畫,要來「舉啞鈴」,而今天的目標是要舉 10 次。這時候,我們的腦子裡可能會幻想一個計數器,來提醒我們,目前舉了多少次啞鈴。
而在每一次舉啞鈴之前,我們都會先比對一下目標次數跟計數器裡的數字;只要計數器的數字「小於」目標次數,就代表舉啞鈴的次數還不夠。這時候,我們就舉一下啞鈴,然後把計數器的數字加上一。
就這樣,不斷重複「比對」、「舉啞鈴」、還有「加一」這三個步驟,一直到計數器的數字等於目標次數的那個瞬間,今天的番茄健身計畫就完成了!
你知道嗎,剛才這個健身計畫進行的方式,其實就是 For 迴圈運作的邏輯喔!更具體的來說,如果把整個健身的過程寫成程式碼,應該會長得很像這個樣子:
現在我要把健身過程進行拆解,請大家跟我一起觀察 For 迴圈是怎麼用這三行程式碼,來完成這個任務的。首先,我在腦子裡幻想一個初始值為 0 的計數器,用來記錄目前舉啞鈴的次數。這就是 For 迴圈第一個執行的參數,我們稱它叫做「初始化」。通常我們會在這裡設定計數器的初始值,所以這個初始化的工作只會被執行一次喔!
接下來,我要比對計數器的數字是不是「小於」目標次數。這就是 For 迴圈的第二個參數,叫做「重複條件」。只要這個條件是「成立」的,或者說,我們還沒有達到 10 次這個目標,For 迴圈就會跑去大括號裡面,執行舉啞鈴的動作「一次」。
舉完啞鈴之後,我們要把計數器的數字加上一。這就是 For 迴圈的第三個參數,叫做「變數增減」。只要大括號裡的工作一完成,程式就會來到這個地方更新我們的計數器。
就這樣,不斷重複「比對」、「舉啞鈴」、「更新計數器」、「比對」、「舉啞鈴」、「更新計數器」,一直到我們舉完第 10 次啞鈴,然後計數器更新變成了 10。這時候,For 迴圈發現它的重複條件已經「不成立」了,程式就會立刻跳出迴圈,結束我們的任務。
只要你幫 For 迴圈制定好這些參數規則,他就能自動又精準地執行「舉啞鈴」這個任務 10 次,很神奇對吧!
小專案:控制 LED 閃爍 10 次
現在,讓我們把概念轉換成 Arduino 的程式碼!初始化,就相當於宣告一個整數 ,把它當作計數器來使用。這邊我把它取名叫做 counter,當然,這個名稱可以更換,隨你高興。而「重複條件」則是 counter < 10。只要計數器還沒數到 10,重複的工作就得持續進行。最後一項「變數增減」,則是把目前計數器的數值加上一。
而「舉啞鈴一次」這個任務,如果我們把他替換成「讓接腳 13 的 LED 閃爍一次」的程式碼:
再將整段程式放進 setup() 區塊,設定好接腳 13 的模式與初始狀態,燒錄程式,你就能看到 LED 不多不少的閃爍 10 次囉!
值得一提的是「把 counter 加上一」這個變數增減的步驟,其實也經常被縮寫成 counter++。下次如果遇到這種寫法,就不必覺得恐慌啦!
小專案:重複印出字串
好了!現在我們知道 for 迴圈可以精準地執行「指定次數」的重複工作。也就是說,如果我想在序列埠監控視窗 上印出「LazyTomato Lab」這個字串 10 次,我就只需要把剛才閃爍 LED 的工作替換成 Serial.println(),並在前面設定 Serial 的傳輸鮑率即可。
小專案:依序印出數字
不過 For 迴圈真正厲害的地方,是它能用 counter 這個計數器來依序地完成一系列的工作,比如說在「序列埠監控視窗」上印出數字 0-9。本來我們得列出 10 個 Serial.println() 的指令,才能完成這樣的工作:
但現在,我們只需要把程式裡的 LazyTomato Lab 字串拿掉,換成 counter 這個變數就完成了。
當然,這邊就有很多種玩法值得你嘗試看看啦!像是把 counter 的初始值從 0 更改為 1,讓監控視窗上印出數字 1-9。
或者,你也可以把「變數增減」的設定修改成:每次工作完成以後,都把計數器加上 2。這樣一來,視窗上印出的就會是數字 1, 3, 5, 7, 9。
你甚至還能把 counter 的初始值設定為 9,然後將「重複條件」修改為 counter > 0,「變數增減」修改為「把計數器減掉一」的 counter–,讓計數器從 9 開始往下數,一直到 counter 印出數字 1 才停止。
總結來說,只要在 For 迴圈的小括號裡使用適當的數值跟運算符號,你就可以設計出符合需求的「重複執行」或是「依序執行」的功能囉!
小專案:霹靂燈製作
最後,我還要介紹一個很實用的 For 迴圈用法:大量接腳的快速設定。像是 Arduino IDE 內建的「霹靂燈」範例,就是透過 for 迴圈,讓 Arduino 的接腳 2 到接腳 7,可以輪流控制 6 顆 LED 的亮滅狀態。這個範例,我們可以從 Arduino IDE 的 檔案 / 範例 / Control / ForLoopIteration 呼叫出來。
程式在 setup() 區塊中,透過 for 迴圈設定 2, 3, 4, 5, 6, 7 這六隻接腳為輸出模式。然後,在 loop() 區塊使用兩個 For 迴圈,依序點亮並熄滅這六隻接腳所連接的 LED 燈。
就這樣,整段程式只使用三個 for 迴圈就完成了霹靂燈的功能,是不是很方便啊!有興趣的朋友們也可以自己動手試試看唷!
ONE LAST THING
除了今天介紹的 For 迴圈之外,在下一堂課程 ,我們還要介紹另一個處理「重複工作」的好幫手:While 迴圈,讓你在面對不確定重複次數的工作時,更加得心應手啦!
這一集的 Arduino SpeedUp 在這裡告一個段落!我們下一堂課程再與各位見面,掰掰!