所謂程式流程控制,是在控制程式執行的方向,Arduino 程式流程控制可分成三大類,即迴圈控制指令:for、while、do …. while,條件控制指令:if、switch case 及無條件跳躍指令:goto、break、continue。

☛ 迴圈控制指令

㈠ for 迴圈

for 迴圈是由初值運算式、條件運算式與增量或減量運算式三部分組成,彼此之間以分號隔開。

① 初值:設定初值,可由任何數值開始。

② 條件:若條件為真,則執行括弧 ” { } ” 中的敘述,否則離開迴圈。

③ 增量 ( 或減量 ):每執行一次迴圈內的動作後,依增量 ( 或減量 ) 遞增 ( 或遞減 )。

指令格式:

for(初值;條件;增量或減量)
{
    //動作敘述
}

程式範例:

void setup() {

}

void loop() {
    int i,s=0;
    for(i=0;i<=10;i++)   // 當 i<=10 時,執行迴圈
        s=s+i;           //s=1+2+3+ ... +10
}

㈡ while 迴圈

while 為先判斷型迴圈,當條件為真時,則執行大括弧 ” { } ” 中的敘述,直到條件為假不成立時,才結束 while 迴圈。 在 while 條件式中沒有初值運算式及增量 ( 或減量 ) 運算式,因此必須在敘述中設定。

指令格式:

while(條件式)
{
    //動作敘述
}

程式範例:

void setup() {

}

void loop() {
    int i=0,s=0;   //宣告整數變數

    while(i<=10)   //當 i<=10 時,執行迴圈
    {
        s=s+i;     //s=1+2+3+....+10
        i++;       //i 遞增
    }
}

㈢ do-while 迴圈

do-while 為後判斷型迴圈,會先執行大括弧 ” { } ” 中的敘述一次,然後再判斷條件式,當條件式為真時,則繼續執行大括弧 ” { } ” 中的動作,直到條件式為假時,才結束 do-while 迴圈。 因此 do-while 迴圈至少執行一次。

指令格式:

do {          //先執行一次敘述
   //動作敘述
}
while(條件式)  //後判斷型迴圈

程式範例:

void setup() {

}

void loop() {

     int i=0,s=0;  //宣告整數變數
     do {
           s=s+i;  //s=1+2+3+...+10
           i++;    //i 遞增
     }
     while(i<=10)  //當 i <=10 時,繼續執行迴圈
}

☛ 條件控制指令

㈠ if 敘述

if 敘述會先判斷條件式,若條件式為真時,則執行一次大括弧 { } 中的敘述,若條件式為假時,則不執行。 if 敘述內如果只有一行敘述時,可以不用加大括弧 ” { } “,但如果有一行以上敘述時,一定要加上大括弧 ” { } “,否則在 if 敘述內只會執行第一行敘述,其餘敘述則視為在 if 敘述之外。

指令格式:

if(條件式)
{
   //動作敘述
}

程式範例:

void setup() {

}

void loop() {
     int a=2,b=3,c=0;  //宣告整數變數
     if(a>b)           // a>b ?
     {
        c=a;           //若 a>b, c=a
     }
}

㈡ if-else 敘述

if-else 敘述會先判斷條件式,若條件為真時,則執行敘述 1,若條件為假時,則執行敘述 2。 在  if  敘述或 else 敘述內,如果只有一行敘述時,可以不用加大括弧 ” { } “,但如果有一行以上敘述時,一定要加上大括弧 ” { } “。

指令格式:

if(條件式)
{
   //動作敘述 1
}
else
{
   //動作敘述 2
}

程式範例:

void setup() {

}

void loop() {
     int a=2,b=3,c=0;  //宣告整數變數
     if(a>=b)          // a>=b ?
     {
        c=a;           //若 a>=b, c=a
     }
     else
     {
        c=b;           //若 a<b, c=b
     }
}

㈢ 巢狀 if-else 敘述

使用巢狀 if-else 敘述時,必須注意 if 與 else 的配合,其原則是 else 要與最接近且未配對的 if 配成一對,如此才不會有錯誤動作出現。 在 if 敘述或 else 敘述內,如果只有一行敘述時,可以不用加大括弧 ” { } “,但如果有一行以上敘述時,一定要加上大括弧 ” { } “。

指令格式:

if(條件 1)
   if(條件 2)
      if(條件 3)
      { //動作敘述 1 }
      else
      { //動作敘述 2 }
    else
    { //動作敘述 3 }
else
{ //動作敘述 4 }

程式範例:

void setup() {

}

void loop()
{
     int score=73;
     char grade;

     if(score>=60)           //成績大於等於 60 分?
        if(score>=70)        //成績大於等於 70 分?
           if(score>=80)     //成績大於等於 80 分?
              if(score>=90)  //成績大於等於 90 分?
                 grade='A';  //成績大於等於 90 分,等級 A
              else
                 grade='B';  //成績在 80-90 分之間,等級 B
           else
              grade='C';     //成績在 70-80 分之間,等級 C
        else
           grade='D';        //成績在 60-70 分之間,等級 D
     else
         grade='E';          //成績低於60 分,等級 E
}

㈣ if-else if 敘述

使用 if-else if 敘述時,必須注意 if 與 else 的配合,其原則是 else if 要與最接近且未配對的 if 配成一對,才不會有錯誤的動作出現。 在 if 敘述或 else 敘述內,如果只有一行敘述時,可以不用加大括弧 ” { } “,但如果有一行以上敘述時,一定要加上大括弧 ” { } “。

指令格式:

if(條件 1)            //條件 1 成立?
{                    //條件 1 成立,執行動作敘述 1
   //動作敘述 1
}
else if(條件 2)       //條件 2 成立?
     {               //條件 2 成立,執行動作敘述 2
        //動作敘述 2
     }
     else if(條件 3)  //條件 3 成立?
         {           //條件 3 成立,執行動作敘述 3
            //動作敘述 3
         }
else                 //條件 1、2、3 皆不成立?
{                    //條件 1、2、3 皆不成立,執行動作敘述 4
    //動作敘述 4
}

程式範例:

void setup() {

}

void loop() {
     int score=73;                      //成績
     char grade;                        //等級

     if(score>=90 && score<=100)        //成績大於等於 90 分?
          grade='A';                    //成績大於等於 90 分,等級 A
     else if(score>=80 && score<90)     //成績在 80 ~ 90 分?
          grade='B';                    //成績在 80 ~ 90 分之間,等級 B
     else if(score>=70 && score<80)     //成績在 70 ~ 80 分?
          grade='C';                    //成績在 70 ~ 80 分之間,等級 C
     else if(score>=60 && score<70)     //成績在 60 ~ 70 分?
          grade='D';                    //成績在 60 ~ 70 分之間,等級 D
     else                               //成績小於 60 分
          grade='E';                    //成績小於 60 分,等級 E
}

㈤ switch-case 敘述

switch-case 敘述與 if-else if 敘述類似,但 switch-case 敘述格式較清楚且有彈性。 if-else if 是二選一的程式控制流程指令,而 switch-case 則是多選一的程式控制流程指令。 switch 以條件式運算結果與 case 所指定的條件值比對,若某個 case 中的條件值相同,則執行該 case 所指定的敘述,若所有條件值都不符合,則執行 default 所指定的敘述,在 switch 內的條件式運算結果必須是整數或字元。 如果要結束 case 中的動作,可以使用 break 敘述,但是一次只能跳出一層迴圈,如果要一次結束多個迴圈,可以使用 goto 指令,但程式的流程將變得淩亂,所以盡量少用或不用 goto 指令。

指令格式:

switch(條件式)
{
    case 條件值 1:         //條件式等於條件 1 時,執行動作敘述 1
         { //動作敘述1; }
         break;
    case 條件值 2:         //條件式等於條件 2 時,執行動作敘述 2
         { //動作敘述2; }
         break;
    case 條件值 3:         //條件式等於條件 3 時,執行動作敘述 3
         { //動作敘述3; }
         break;
    default:              //所有條件式值都不等於條件式時,執行動作敘述 n
         { //動作敘述n; }
         break;
}

程式範例:

void setup() {

}

void loop() {
     int score=73;       //成績
     int value;          //數值
     char grade;         //等級
     value = scroe/10;   //取出成績十位數值

     switch(value)       //以成績十位數值作為判斷條件
     case 10:            //成績為 100 分
          grade='A';     //成績為 100 分, 等級為 A
          break;         //結束迴圈
     case 9:             //成績為大於等於 90 分
          grade='A';     //成績為大於等於 90 分,等級為 A
          break;         //結束迴圈
     case 8:             //成績介於 80 - 90 分之間
          grade='B';     //成績介於 80 - 90 分之間,等級為 B
          break;         //結束迴圈
     case 7:             //成績介於 70 - 80 分之間
          grade='C';     //成績介於 70 - 80 分之間,等級為 C
          break;
     case 6:             //成績介於 60 - 70 分之間
          grade='D';     //成績介於 60 - 70 分之間,等級為 D
          break;
     default:            //成績為小於 60 分
          grade='E';     //成績為小於 60 分,等級為 C
          break;
     }
}

㈥ goto 敘述

goto 敘述可以結束所有迴圈執行,但是為了程式的結構化,應盡量少用 goto 敘述,因為使用 goto 敘述會造成程式流程的混亂,使得程式閱讀更加困難。 goto 敘述所指定的標記名稱必須與 goto 敘述在同一個函式內,不能跳到其它的函式內。 標記名稱與變數寫法相同,唯一的區別是標記名稱後面須再加上一個冒號。

指令格式:

goto 標記名稱

程式範例:

void setup() {

}

void loop() {
     int i,j,k;                          // 宣告整數變數 i,j,k
     for(i=0;i<1000;i++)                 // i 迴圈
         for(j=0;j<1000;j++)             // j 迴圈
             for(k=0;k<1000;k++)         // k 迴圈
                 if(analogRead(0)>500)   // 類比接腳 0 讀取值大於 500?
                    goto exit;           // 類比接腳 0 讀取值大於 500 ,結束 i,j,k 迴圈
     exit;
}