條件語(yǔ)句 -- 北太天元學(xué)習(xí)8
條件語(yǔ)句
算法的三種基本結(jié)構(gòu)是順序結(jié)構(gòu),循環(huán)結(jié)構(gòu) 和 分支結(jié)構(gòu)。北太天元學(xué)習(xí)2
講了順序結(jié)構(gòu)(這個(gè)沒(méi)有強(qiáng)調(diào),就是按照順序一個(gè)一個(gè)地執(zhí)行語(yǔ)句), 北太天元5和7講
循環(huán)結(jié)構(gòu)(for循環(huán)和while循環(huán))。 這個(gè)短文,我們講分支結(jié)構(gòu).
分支實(shí)現(xiàn)的方式包括 if條件語(yǔ)句和 switch條件語(yǔ)句. 條件語(yǔ)句也被稱(chēng)為選擇語(yǔ)句.

if語(yǔ)句的形式是“如果A,那么B”。在北太天元中,基本的if語(yǔ)句如下所示:
if? 邏輯表達(dá)式
? 特定代碼段
end
只有當(dāng)邏輯表達(dá)式為true時(shí),才運(yùn)行if 和 end 圈定的特定代碼段.
通常,當(dāng)邏輯表達(dá)式為假時(shí),我們希望執(zhí)行一些不同的操作。在這種情況下,我們可能需要
if-else語(yǔ)句, 如下所示:
if 邏輯表達(dá)式
?? ?特定代碼段A
else
?? ?特定代碼段B
end
如果邏輯表達(dá)式為true,則執(zhí)行特定代碼段A。如果邏輯表達(dá)式不為真,那么
則執(zhí)行特定代碼段B。
例如,我們?cè)诿钚写翱谳斎肴缦碌拇a
if pi > 2
?? ?disp("pi > 2 是真的");
else
?? ?fprintf("pi > 2 是假的\n");
end
得到的輸出是
? 1x1 string
??? "pi > 2 是真的"
這是因?yàn)?pi > 2 返回的是 true,? 北太天元執(zhí)行disp("pi >2 是真的")這個(gè)語(yǔ)句。
如果要編寫(xiě)一個(gè)具有兩種以上可能性的條件語(yǔ)句,我們可能需要在if和else中間
插入一個(gè)或者多個(gè)elseif, 例如
if 邏輯表達(dá)式1
?? ?特定代碼段A
elseif 邏輯表達(dá)式2
?? ?特定代碼段B
elseif 邏輯表達(dá)式3
?? ?特定代碼段C
else
?? ?特定代碼段D
end
對(duì)于本例,如果 邏輯表達(dá)式1 為真,則執(zhí)行特定代碼段A。否則,如果邏輯表達(dá)式2為真,
則執(zhí)行特定代碼段B。如果邏輯表達(dá)式1和邏輯表達(dá)式2都為false,并且邏輯表達(dá)式3為true,
則執(zhí)行特定代碼段C。如果這些邏輯表達(dá)式中沒(méi)有一個(gè)為真則執(zhí)行特定代碼段D。請(qǐng)注意,這個(gè)例子中特定代碼段A、B、C和D中有且僅有一個(gè)會(huì)被執(zhí)行到.
此外,最后一個(gè)else語(yǔ)句不是必須的。如果沒(méi)有else和后面的特定代碼段D,那么在前面的邏輯表達(dá)式1,2,3都是假的時(shí)候,北太天元就什么都不做,直接去執(zhí)行與if配對(duì)的 end 之后的語(yǔ)句。
條件語(yǔ)句有一個(gè)很重要的應(yīng)用就是用在for循環(huán)或while循環(huán)中,當(dāng)滿(mǎn)足某個(gè)條件的時(shí)候,
選擇使用關(guān)鍵詞 break 或者 return 來(lái)跳出循環(huán)。
信息下面的代碼段取1到10之間的每個(gè)數(shù)字,并顯示它是否能夠被2、3或者5整除
然而,如果這個(gè)數(shù)字可以被其中多個(gè)整除,那么它只顯示它是可被其中最小的一個(gè)整除。
例如,如果i是6,那么它將顯示它可以被2整除,雖然它也能被3整除,但是沒(méi)有被檢查到.
n=10;
for i=2:n
?? ?if rem(i, 2) == 0
?? ??? ?disp([num2str(i), '可被2整除']);
?? ?elseif rem(i, 3) == 0
?? ??? ?disp([num2str(i), '可被3整除']);
?? ?elseif rem(i, 5) == 0
?? ??? ?disp([num2str(i), '可被5整除']);
?? ?else
?? ??? ?break;
?? ?end
end
請(qǐng)注意,內(nèi)置函數(shù)disp命令有一個(gè)參數(shù),它的參數(shù)是是一個(gè)char matrix,
這個(gè)char matrix 實(shí)際上只有一行,是一個(gè)char行向量,
[num2str(i), '可被2整除'] 這里的逗號(hào)前后都是char向量, 然后
被連接成了一個(gè)更長(zhǎng)的char向量。 numstr也是一個(gè)內(nèi)置函數(shù),把一個(gè)數(shù)轉(zhuǎn)成char mat.
當(dāng)存在許多個(gè)條件時(shí),還可以使用switch語(yǔ)句,而且此時(shí)switch代碼閱讀起來(lái)更加簡(jiǎn)單。
假設(shè)我們有一個(gè)開(kāi)關(guān)變量,希望根據(jù)這個(gè)變量的值運(yùn)行不同的代碼段。
每個(gè)變量的每個(gè)特定值稱(chēng)為一個(gè)case。 switch語(yǔ)句的樣式如下:
swithc? s %開(kāi)關(guān)變量
?? ?case A
?? ??? ?特定代碼段A
?? ?case B
?? ??? ?特定代碼段B
?? ?case {C1,C2,C3} % 用{ } 把C1,C2,C3做成case的集合
?? ??? ?特定代碼段C
?? ?otherwise
?? ??? ?特定代碼段D
end
如果開(kāi)關(guān)變量s的值匹配了 A 那么執(zhí)行特定代碼段A后程序不再檢查別的case,直接跳到
與switch配對(duì)的end后的語(yǔ)句執(zhí)行。 case 后面的值可以是一個(gè)值的集合,開(kāi)關(guān)變量s
的值如果在這個(gè)集合中,例如對(duì)于 case {C1,C2,C3} ,在前面s與A和B都不匹配的時(shí)候,
只要 s == C1 或者 s==C2或者s==C3成立,則執(zhí)行 特定代碼段C, 前面所有的case都不匹配,
執(zhí)行otherwise關(guān)鍵詞之后的特定代碼段D. 這里的otherwise 語(yǔ)句不是必須的,
如果沒(méi)有otherwise 語(yǔ)句,則前面的case如果都不匹配,那么北太天元什么都不干,
直接跳到與switch配對(duì)的end后面的語(yǔ)句去執(zhí)行。
看看下面這段代碼輸出的是什么?
name =? 'Jack' ;
switch name
case {'Rose', 'Jack'}
?? ?fprintf("My name is Rose or Jack\n");
case 'Jack'
?? ?fprintf("My name is Jack\n");
end
答案:是輸出 "My name is Rose or Jack", 原因是在 Jack 與 {'Rose', 'Jack'}中的'Jack'
匹配,執(zhí)行了 fprintf("My name is Rose or Jack\n"); 之后就跳到end之后了, 不會(huì)
再檢查 case 'Jack' 是否匹配。
