iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

Maker making IoT !!系列 第 9

[Day8] IoT Maker之Coding知識科普 - (縮排&條件邏輯判斷)

1.前言

在各式各樣的程式語言中,都有屬於自己的語系,像是Arduino就偏向於C語言,而每種語言都有許於各自的語法,但是熟悉了一款語言的基本,就可以令自己在學習下款語言時更加便利,畢竟程式語言(Programming language)的基本概念都大同小異,而轉到別的語言時就只需要知道些許不同的語法怎麼寫,就能夠輕鬆上手了,因為你懂了基本架構,後面的變化就相對容易。

這些應該在前面那張講齁,但我忘了(笑,沒關係各位,下一個也是我忘記講的,我自己自首。

2.區塊(block) & 縮排

認識區塊跟良好的縮排都是必學的,我所說的區塊就是左右大誇號{}的內容部分、而在打開Arduino IDE預設就是最為乾淨的初始畫面,而這邊也要多說明,當你出現 { 那就會有對應它的 },所以{}、()及[]都是一組,成雙成對,如果你給它們分開,它們會生氣,就不給你執行程式了 。

void setup(){
    //setup如名稱所說,就是設定一些腳位狀態及一些設定,但只跑一次
}
void loop(){
    //loop如名稱所說,loop會一直重複執行
}

當沒區塊時,縮排就是成功與失敗的關鍵,像是Python屬於沒區塊,但是縮排卻是很關鍵,當你一段程式碼放錯位置,產出結果可能就大大不同,但不管是打Arduino或是Python,都是需要保持良好的縮排,因為良好的縮排可以讓除了自己以外的人,更好觀看及更看得清楚程式結構,才比較方便修改錯誤,而如果沒有縮排別人則會看不懂這是什麼,還可能需要花時間幫你做縮排的作棟,可讀性較差,下面以上次教學的呼吸燈程式碼作範例。

const int ledPin = 23;  // Esp32 23腳 
const int freq = 5000;       //頻率
const int ledChannel = 0;    //通道
const int resolution = 8;    //每次多少

void setup(){
ledcSetup(ledChannel, freq, resolution);  //設定哪個通道開始多久依次每次多少
ledcAttachPin(ledPin, ledChannel);        //設定腳位和通道
}
void loop(){
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){  
ledcWrite(ledChannel, dutyCycle);       //由通道控制暗到亮
delay(15);
}
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
ledcWrite(ledChannel, dutyCycle);       //由通道控制亮到暗
delay(15);
}
}

看完這個例子有沒有覺得很痛苦,根本不知道{}哪個是對應哪個,所以記得要縮排,保持習慣,尤其是這還算是短短幾行的程式碼,如果遇到上千行甚至上萬行的程式碼,那該會是何種恐怖景象,不想了,一想到就覺得可怕,那繼續講下去囉。

3.算數運算子?比對運算子?

算數運算子?比對運算子?這些都是什麼?接下來就帶大家探討何謂是算數運算子及比較運算子的不同之處。

算數運算子就像是程式中看見的=、+、-、*、/、%(mod),這六種都是對數值進行計算,下面簡單介紹幾個例子。

int a = 5;  //=將右方值帶入左方,將5這數值裝至a變數中
int b = 10; //=將右方值帶入左方,將10這數值裝至b變數中
int c = a+b; //c = 15
Serial.println(a+b); //+為加法,則輸出為15
Serial.println(a-b); //-為減法,輸出為-5
Serial.println(a*b); //*為乘法,輸出為50
Serial.println(a/b); ///為除法(只看商),輸出為0
Serial.println(a%b); //%為取餘數,輸出為5

※有些程式語言會把%(取餘數)的寫法轉成mod,但只是寫法改變,功能相同。

比對運算子就是比較左右方的數值是否是相符的,a是否等於b,如果今天a=15,b=15,那比對結果就會為真(true),如果a=15、b=20,那比對結果為假(false),各位可能都稍微對比對運算子有所概念,那下面就直接進範例,各位可以稍微猜一下每個範例的比對運算子是什麼。

int a=15;
int b=15;
Serial.println(a==b); //a是否等於b    
Serial.println(a>=b); //a是否大於等於b 
Serial.println(a>b);  //a是否大於b     
Serial.println(a<=b); //a是否小於等於b
Serial.println(a<b);  //a是否小於b
Serial.println(a!=b); //a是否不等於b

答案為

a == b:true
a >= b:true
a > b :false
a <= b:true
a < b:false
a != b:false

那看了上述範例,是否各位都明白比對運算子的用途了呢?那就繼續往迴圈走囉~

4.for迴圈

for(initialization;condition;increment)
initialization 定義初始值,例如int i=0,或者i = 0等等。
condition 條件判斷,例如i<=255,所以只要當i小於且等於255就會持續執行for裡面的指令,反之則離開迴圈繼續向下執行。
increment 間距,當執行完一次指令時該將i值增加多少,例如初始值設i=0,間距設i+=2則跑完一次迴圈則i會增加2,所以i=2。

//遞增
int i = 0;
for(i;i<=255;i+=2){
    Serial.println(i);//i值會0 2 4 6 8 10的遞增,直到條件不符合
}
//遞減
i = 256;    //可忽略,因上方迴圈執行完後i值會至256
for(i;i>=0;i--){
    Serial.println(i);//i值會255 254 253 252的遞減,直到條件不符合
}
//另種寫法,在for裡面定義初始值
for(int j=1;i<=10;j++){
    Serial.println(j);//j值會1 2 3 4 5 6的遞增
}

5.if判斷

接下來接續到if判斷,那說到if那可能有些人會想把英文轉成中文說法,所以把if轉成中文就變成如果,說到如果呢,許多人可能就會想到小時候都會用如果來造樣造句,像是:如果我今天中樂透,就會環遊世界,沒有就繼續上班上課,相信這是許多人都會經歷過的,那寫程式也是如此,透過空閒之餘多打點程式,相信程式也會變成造樣造句一樣簡單,接下來就繼續往下走囉Go~。
if判斷,就像上面有提到一樣,就是造樣造句,如果我今天中樂透就環遊世界,沒有就繼續上班上課。那這樣大家都完成一個屬於自己的判斷式了,為甚麼呢?各位可以看看下面那張圖。

各位看到上面的例子應該會想,啊我不是說完一句了,為甚麼多出沒有(else),這又是甚麼,各位先別慌張,等等跟你們說那是蝦米碗糕(什麼東西),現在看如果 我今天中樂透,就環遊世界,這部分先看就好,下面的部分等等在說明,那接下來開始真正介紹if判斷式怎麼寫。

if(condition){
code...
}
condition 條件式,將想比對的值放入比較,就可為條件式,範例:a==b,這就是個條件式。

if(a==b){
    //程式碼...
}

實際寫出來:if(a == b) ...,就會變成這樣,那如果套用上面的,if(我買的樂透號碼==樂透開獎號碼),這樣是不是就把中樂透這句話改成if的判斷式了,那如果各位理解那我們繼續下一個。

那如果我今天條件不成立呢?假設我沒中樂透,因為上面那種寫法只會判斷我一定有中的情況及中獎後續狀況,但卻沒說明如果沒中獎該怎麼辦,也就是說,沒中獎就繼續上班上課,這句話還沒被翻譯出來,所以接下來要講解到else(否則),那我先講語句。

if(condition)
else

if(我買的樂透號碼==樂透開獎號碼){
    //世界旅遊
}
else{
    //上班上課
}

那會發現else怎麼後面跟if後面不同,if後面還需要條件式,那else會什麼後面空空如也?這就牽扯到我剛剛有稍微提到的了,else被稱做否則,請問各位有聽過有人講話一直講如果xxx就xxx否則就xxx否則就xxx的嗎?一堆否則,都不知道他在講什麼了,所以呢看到else出現就會知道,他就是if的最終結尾了,所以呢if不一定要有else,但else定需要搭配if,那現在在回去看上面的圖就看得懂了吧,那就代表各位都學會了if的用法,恭喜各位٩(๑❛ᴗ❛๑)۶。

但是,接下來繼續講解if的另一種用法。是不是都以為我講完if了阿 ლ(`∀´ლ)。

現在要講的是if的多重判斷式,那我就先介紹寫法啦~

if(condition)
else if(condition)
else

if(我買的樂透號碼==樂透頭獎號碼){
    //中樂透後程式碼
}
else if(我的發票號碼==發票六獎號碼){
    //買餅乾吃
}
else{
    //上班上課
}

看來上面的範例,各位應該都會明白else if的用法,那就是增加if的條件,可以多新增判斷語句,去判斷更多事情,但這邊也需要注意如果你第一個條件式成立,那他就不會繼續向下跑,也就是說當你樂透中獎去環遊世界時,就不會觸發到中了發票六獎吃餅乾的事件。

歡迎交流

好了,希望今天透過這些有趣的比較可以讓各位更清楚瞭解到,條件式、迴圈及判斷的關係是如何。原本是安排2天的基礎科普知識,不過每個人背景不太一樣,一下子講太多怕各位會腦袋裝不下,因此明天會繼續Coding知識科普,來說說另一種的迴圈、判斷及一些簡化寫法的介紹,為後續的實作案例打好基礎,那就下回見啦( ̄▽ ̄)~*。


上一篇
[Day7] IoT Maker之Coding知識科普 - (Variable)
下一篇
[Day9] IoT Maker之Coding知識科普 - (條件判斷&迴圈)
系列文
Maker making IoT !!30

尚未有邦友留言

立即登入留言