Arduino編程基礎(chǔ)(二)——C\\C++語言基礎(chǔ)(下)
用流程圖來表示你的程序
流程圖是用一些圖框來表示各種操作。用圖形表示算法,直觀形象,易于理解。特別是對于初學(xué)者來,使用流程圖能幫你更好的理清思路,從而順利編寫出相應(yīng)的程序。ANSI規(guī)定了一些常用的流程圖符號,如圖所示:
順序結(jié)構(gòu)
順序結(jié)構(gòu)是三種基本結(jié)構(gòu)之一,也是最基本、最簡單的程序組織結(jié)構(gòu)。在順序結(jié)構(gòu)中程序按語句先后順序依次執(zhí)行。一個程序或者一個函數(shù),整體上是一個順序結(jié)構(gòu),它是由一系列的語句或者控制結(jié)構(gòu)組成,這些語句與結(jié)構(gòu)都按先后順序運行。
如圖所示,虛線框內(nèi)是一個順序結(jié)構(gòu),其中A、B兩個框是順序執(zhí)行的。即:在執(zhí)行完A框中的操作后,接著會執(zhí)行B框中的操作。
選擇結(jié)構(gòu)
選擇結(jié)構(gòu)又稱選取結(jié)構(gòu)或分支結(jié)構(gòu)。在編程中,我們經(jīng)常需要根據(jù)當(dāng)前數(shù)據(jù)做出判斷,決定下一步的操作。例如,Arduino可以通過溫度傳感器檢測出環(huán)境溫度,在程序中對溫度做出判斷,如果溫度過高,就發(fā)出警報信號,這時便會用到選擇結(jié)構(gòu)。
如圖所示,虛線框中是一個選擇結(jié)構(gòu)。該結(jié)構(gòu)中包含一個判斷框。根據(jù)判斷框中的條件p是否成立,而選擇執(zhí)行A框或者B框。執(zhí)行完A框或者B框操作后,都會經(jīng)過b點,脫離該選擇結(jié)構(gòu)。
If語句
if語句是最常用的選擇結(jié)構(gòu)實現(xiàn)方式,當(dāng)給定表達式為真時,就會運行其后的語句,其有三種結(jié)構(gòu):
簡單分支結(jié)構(gòu)
[C++] 純文本查看 復(fù)制代碼
?
|
001
002
003
004
|
if(表達式){語句;} |
雙分支結(jié)構(gòu)
雙分支結(jié)構(gòu)增加了一個else語句,當(dāng)給定表達式結(jié)果為假時,便運行else后的語句。
[C++] 純文本查看 復(fù)制代碼
?
|
001
002
003
004
005
006
007
008
|
if(表達式){語句1;}else{語句2;} |
多分支結(jié)構(gòu)
使用多個if語句,可以形成多分支結(jié)構(gòu),用以判斷多種不同的情況。
[C++] 純文本查看 復(fù)制代碼
?
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
|
if(表達式1){語句1;}else if(表達式2){語句2;}else if(表達式3){語句3;}else if(表達式4){語句4;}…… |
switch…case語句
處理比較復(fù)雜的問題,可能會存在有很多選擇分支的情況,如果還使用if…else的結(jié)構(gòu)編寫程序,會使程序顯得冗長,且可讀性差。
此時我們可以使用switch,其一般形式為:
[C++] 純文本查看 復(fù)制代碼
?
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
|
switch(表達式){case 常量表達式1:語句1 break;case 常量表達式2:語句2 break;case 常量表達式3:語句3 break;……default :語句n break;} |
需要注意的是,Switch后的表達式結(jié)果只能是整形或字符型。如果要使用其他類型,則必須使用if語句。
switch結(jié)構(gòu)會將switch語句后的表達式與case后的常量表達式比較,如果符合就運行常量表達式所對應(yīng)的語句;如果都不相符,則會運行default后的語句,如果不存在default部分,程序?qū)⒅苯油顺鰏witch結(jié)構(gòu)。
在進入case判斷,并執(zhí)行完相應(yīng)程序后,一般要使用break退出switch結(jié)構(gòu)。如果沒有使用break語句,程序則會一直執(zhí)行到有break的位置退出或運行完該switch結(jié)構(gòu)退出。
switch...case結(jié)構(gòu)在流程圖中,表示方法如圖:
循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)又稱重復(fù)結(jié)構(gòu),即反復(fù)執(zhí)行某一部分的操作。有兩類循環(huán)結(jié)構(gòu),當(dāng)(while)循環(huán)和直到(until)循環(huán)。
如圖2-5所示。當(dāng)型循環(huán)結(jié)構(gòu)會先判斷給定條件,當(dāng)給定條件p1不成立時,即從b點退出該結(jié)構(gòu),當(dāng)p1成立時,執(zhí)行A框,執(zhí)行完A框操作后,再次判斷條件 p1是否成立,如此反復(fù);直到型循環(huán)結(jié)構(gòu)會先執(zhí)行A框,然后判斷給定的條件p2是否成立,成立即從b點退出循環(huán),不成立則返回該結(jié)構(gòu)起始位置a點,重新執(zhí)行A框,如此反復(fù)。
(1)循環(huán)語句
while循環(huán)
while循環(huán)是一種當(dāng)型循環(huán)。當(dāng)滿足一定條件后,才會執(zhí)行循環(huán)體中的語句,其一般形式為:
[C++] 純文本查看 復(fù)制代碼
?
|
001
002
003
004
|
while(表達式){語句;} |
在某些Arduino應(yīng)用中,你可能需要建立一個死循環(huán)(無限循環(huán))。當(dāng)while后的表達式永遠為真或者為1時,便是一個死循環(huán)。
[C++] 純文本查看 復(fù)制代碼
?
|
001
002
003
004
|
while(1){語句;} |
do…while循環(huán)
do…while與while循環(huán)不同,是一種直到循環(huán),它會一直循環(huán)到給定條件不成立時為止。它會先執(zhí)行一次do語句后的循環(huán)體,再判斷是否進行下一次循環(huán)。
[C++] 純文本查看 復(fù)制代碼
?
|
001
002
003
004
005
|
do{語句;}while(表達式); |
for循環(huán)
for循環(huán)比while循環(huán)更靈活,且應(yīng)用廣泛,它不僅適用于循環(huán)次數(shù)確定的情況,也適用于循環(huán)次數(shù)不確定的情況。while和do…while都可以替換為for循環(huán)。
一般形式為:
[C++] 純文本查看 復(fù)制代碼
?
|
001
002
003
004
|
for(表達式1;表達式2;表達式3){語句;} |
一般情況下,表達式1為for循環(huán)初始化語句,表達式2為判斷語句,表達式3為增量語句。如
[C++] 純文本查看 復(fù)制代碼
?
|
001
|
for (i=0; i<5; i++) { } |
表示初始值i為0,當(dāng)i小于5時運行循環(huán)體中的語句,每循環(huán)完一次,i自加1,因此這個循環(huán)會循環(huán)5次
for循環(huán)流程圖表示圖所示:
圖 2 6 for循環(huán)流程圖
(2)循環(huán)控制語句
在循環(huán)結(jié)構(gòu)中,都有一個表達式用于判斷是否進入循環(huán)。通常情況下,當(dāng)該表達式結(jié)果為false(假)時,會結(jié)束循環(huán)。有時候,需要提前結(jié)束循環(huán),或是已經(jīng)達到了一定條件,可以跳過本次循環(huán)余下的語句,那么可以使用循環(huán)控制語句break和continue。
break
break語句只能用于switch多分支選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)中,使用它可以終止當(dāng)前的選擇結(jié)構(gòu)或者循環(huán)結(jié)構(gòu),使程序轉(zhuǎn)到后續(xù)的語句運行。break一般會搭配if語句使用。
一般形式為:
if(表達式)
{
break;
}
continue
continue語句用于跳過本次循環(huán)中剩下的語句,并判斷是否開始下一次循環(huán)。同樣,continue一般搭配if語句使用
一般形式為:
if(表達式)
{
continue;
}
在編寫程序前,你可以先畫出流程圖,幫助你理清思路。在上一章中,我們所看到的例程Blink,用流程圖可表示為圖2-7的形式:





