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





