所謂程式流程控制,是在控制程式執行的方向,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; }