iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
自我挑戰組

Maker making IoT !!系列 第 10

[Day9] IoT Maker之Coding知識科普 - (條件判斷&迴圈)

1.前言

這篇呢主要還是介紹判斷及迴圈,但是說實話上一篇講到的for跟if就可以應付很多狀況了,但另外這些也需要好好介紹一下,因為各有優缺點,那廢話不多說就開始囉。

2.while迴圈

while在Arduino程式撰寫中扮演一名相當重要角色,很多時候需要不斷進行監控的動作都需要使用它,例如我可以使用
while迴圈去偵測按鈕是否被按下,就讓LED燈重複閃爍,而while還有分為前偵測跟後偵測,或者在while裡面塞true也可以,而如果看到while先就代表這是前偵測,而如果先看到do後面又接個while代表這是後偵測(晚點說明),那這邊須注意一下while的迴圈不像for一樣,for會自己計算次數,而while不會,看過範例會更懂一點。

while(condition){
//執行內容
}
condition 條件式,將想比對的值放入比較,就可為條件式,範例:a==b,這個就是條件式。

int a = 1;
int b = 10;

while(a!=b){
    //無窮迴圈,因為a不會自己遞增
}

while(a!=b){
    a++; //不會造成無窮迴圈,因為a會遞增上去,直到a=10與b相符,就離開迴圈
}

//當按鈕按下則讓LED閃爍一下
while(digitalRead(button)==HIGH){
    digital.Write(LEDPin,HIGH);
    delay(1000);
    digital.Write(LEDPin,LOW);
    delay(1000);
}

※此都只為介紹,如程式碼無法執行為正常現象

3.do while迴圈

do while為後偵測,而此會在跑第一次迴圈時,就先進入,因為沒偵測擋住,直到迴圈內程式跑完後遇到while才偵測,那do while也和while相同,不會自動記次數,所以要記住不要忘記添加記次數而導致無窮迴圈

do{
//執行內容
}while(condition)
condition 條件式,將想比對的值放入比較,就可為條件式,範例:a==b,這個就是條件式。

int a = 0;
int b = 10;

do{
    a++; //1 2 3 4 5 6 7 8 9 10
}while(a!=b);

像是do while的寫法,可以適合用在註冊系統或是格式有沒有符合...等的情況中,就是先讓使用者輸入在偵測,如輸入格式有誤就可以自動重新輸入了,不必多寫好幾次。

4.switch判斷

switch就像使用了if、else if、else的判斷,直接看例子吧。

switch(var){
case label1:
//執行內容1
case label2:
//執行內容2
default:
//默認執行內容
}

var 變數,可以填入處理完後的變數。
lable1、label2 放入處理完後可能答案。

int a = 10;
int b = a + 20;

switch(b){
    case 30:
        //code...;
        break; //跳出switch判斷
    case 20:
        //code...;
        break;
    case 10:
        //code...;
        break;
    default:
        //當b與上面case都沒不符合則會進default,default類似if中的else腳色
}

上方為switch範例,而各位都會有些許疑問,為甚麼case裡面都要在最下方增加break,而這邊加一下,當執行到break這個指令就會跳出該層地方,如該層迴圈或該層判斷,如上面範例就是跳出該次switch判斷,而break要寫在最下面是因為,如果我寫在前面那我執行到break時,就會跳出該次執行了,而且break下方指令也不會被執行到,向下方程式碼,case 30進入後就執行到break,假如break下面是有程式,那那些程式都不會被執行到(正常來說編譯時會出錯)。

switch(20){
    case 30:
        break;
        //code...
    case 20:
        break;
        //code...
}

在寫switch要注意case後面是:而不是;,且break一定要加,因為如果沒加就會變成很好玩的一件事。

switch(20){
    case 30:
        Serial.println("20");
    case 20:
        Serial.println("80");
}

執行完後會變成

20
80

所以如果沒加break會直直跑下去,直到switch跑完,一路從北向南跑,十分通順0u0b。

5.簡化的寫法

這幾天有仔細看範例的小夥伴,應該都會看到範例中有許多i++,i- -,i+=2,那我這邊要稍微解釋一下這是什麼意思。

i++;//i+1
i--;//i-1

+1-1十分簡單,那這只能+1-1,那如果我要+2呢

i+=2;//i=i+2
i-=2;//i=i-2

+2-2以上都是這種方法,乘法、除法及取餘數呢?

i*=2;i=i*2
i/=2;i=i/2
i%=2;i=i%2

那精簡寫法就這樣,那判斷中的條件式也可以含括多種條件,那介紹之前,我先稍微講一下||、&&,那這兩種符號,分別是或、及,那這兩種的記法,我都是記 當a"或"b何者為1則輸出為1,當a"及"b為1則輸出為1,那看到這裡應該會有一些人很眼熟,沒錯這就是數位邏輯中的OR Gate(閘)、AND Gate(閘),範例到~~。

if(a==10 || b!=30 || c>=70)
if(a<=20 && c>=30 || b<a)

歡迎交流

好了,終於花了這幾天把前面忘了交代的Coding注意與常用的條件判斷、迴圈...跟大家科普完畢了。希望大家看完這三篇能對迴圈、判斷及各個基本觀念有概念,下一篇將會進入到我們主要的ST01擴充板介紹,我們根據自己使用的經驗覺得這塊板子相當適合用在教學上面,希望大家接下來跟著我們一起接觸ST01後也會喜歡它,那下一篇再會~


上一篇
[Day8] IoT Maker之Coding知識科普 - (縮排&條件邏輯判斷)
下一篇
[Day10] ST01感測擴充板-(介紹)
系列文
Maker making IoT !!30

尚未有邦友留言

立即登入留言