在ObJC中,有若干方法可以重復(fù)執(zhí)行一系列代碼,這些重復(fù)執(zhí)行的功能稱之為循環(huán)功能,它們由以下幾部分構(gòu)成:
舉一個(gè)簡(jiǎn)單的例子,如果想求10以內(nèi)所有整數(shù)之和:(代碼如下)

只需要將十以內(nèi)的整數(shù)進(jìn)行相加運(yùn)算就可以,甚至在大腦中進(jìn)行運(yùn)算就可以。但是如果是100以內(nèi)的整數(shù)相加,那么大部分人都會(huì)感到頭疼,這時(shí)候就可以通過一些特殊的方法來(lái)解決如下問題。
至此引入循環(huán)結(jié)構(gòu)——計(jì)算機(jī)的基本屬性之一就是它可以重復(fù)執(zhí)行一組語(yǔ)句。這種循環(huán)能力讓程序員能夠開發(fā)出包含重復(fù)過程的簡(jiǎn)潔程序,這些過程能夠以不同的方式執(zhí)行成百上千的程序語(yǔ)句。ObJC中包含3種用于編寫循環(huán)結(jié)構(gòu)的程序語(yǔ)句。
------for語(yǔ)句
計(jì)算100以內(nèi)所有整數(shù)之和。

打印結(jié)束后 結(jié)果為:5050.
從中我們可以看到,由于引用了for()循環(huán)語(yǔ)句,相當(dāng)于計(jì)算機(jī)自動(dòng)幫助我們疊加n的值,直到n<101(n=100),而計(jì)算機(jī)一邊幫我們疊加n的值,一邊幫我們計(jì)算sum的值。
那么sum的值是如何計(jì)算的呢。首先先解釋for語(yǔ)句的一般格式:
for(init_exPRession;loop_condition;loop_expression)
program statement
圓括號(hào)中的三個(gè)表達(dá)式,建立了程序循環(huán)的“環(huán)境”。其后的program statement(要以分號(hào)結(jié)尾),可以是任何ObJC語(yǔ)句,但是必須是合法的。它們組成循環(huán)體。這條語(yǔ)句執(zhí)行的次數(shù)由for語(yǔ)句中設(shè)置的參數(shù)決定。
for語(yǔ)句的第一部分標(biāo)著init_expression用于再循環(huán)開始之前設(shè)置初始值;第二部分標(biāo)著loop_condition用于指定繼續(xù)執(zhí)行循環(huán)所需的條件(只要滿足既定的條件,那么程序就會(huì)繼續(xù)執(zhí)行),如果循環(huán)不在滿足既定的條件,那么程序就會(huì)停止循環(huán),跳出循環(huán)之后繼續(xù)執(zhí)行循環(huán)體外的程序(在上個(gè)代碼中就會(huì)繼續(xù)執(zhí)行NSlog(@"SUM=%d",sum);)。到這,關(guān)于sum的值是如何計(jì)算的,應(yīng)該已經(jīng)非常明確了,
(sum+=n)等價(jià)于(sum=sum+n),循環(huán)滿足條件,n每次循環(huán)都會(huì)增加1(n++),那么每一次新的循環(huán)后等待求和的sum就等于上次循環(huán)得到的sum值加上新n值。
直到滿足循環(huán)條件,循環(huán)結(jié)束。
總之,for語(yǔ)句將按以下步驟執(zhí)行:
代碼:生成三角數(shù)表的程序

打印結(jié)果:

在上個(gè)代碼中,前三個(gè)NSlog語(yǔ)句的目的僅僅是提供總標(biāo)題和輸出列的標(biāo)題。在顯示適當(dāng)?shù)臉?biāo)題后,程序?qū)⒂?jì)算前10個(gè)三角數(shù),在你計(jì)算1-n的和時(shí),使用變量n記錄當(dāng)前的數(shù)字,使用變量sum存儲(chǔ)n的三角數(shù)值。(最后一行沒對(duì)齊,如果想對(duì)齊,可將最后的NSlog修改為:NSlog(@"%2i %i",n,sum);)
鍵盤輸入:如果我們不想計(jì)算前100個(gè)整數(shù)的和,改為計(jì)算前200,前500的整數(shù)之和,除了去代碼中修改,還有一個(gè)更簡(jiǎn)單的方法,就是自己控制想要求多少以內(nèi)的數(shù)的和,用鍵盤輸入。

打印結(jié)果為:

本人輸入的是59,那么計(jì)算機(jī)將計(jì)算1-59的和=1770。
那么問題又來(lái)了,如果我想要不斷的計(jì)算不同的數(shù),該怎么辦?我們引入嵌套循環(huán)。

在循環(huán)中,考慮到需要人為終止循環(huán),否則將會(huì)一直無(wú)休止的循環(huán)下去,所以我添加了變量stop并設(shè)置初值為1,也就是說(shuō)循環(huán)開始只循環(huán)一次,然后在循環(huán)中加入stop++,這樣每次循環(huán)結(jié)束,都會(huì)開始新一輪循環(huán)直到你感到厭煩想要終止這一切,按照本人現(xiàn)在的水平,只能寫出按0退出的程度,不過也大體上符合了人道主義精神(我十分相信,如果我不加終止,那么如果有人看到這個(gè)程序,并且嘗試了那么肯定有那么一個(gè)執(zhí)著的人相信循環(huán)會(huì)有盡頭。。。)
言歸正傳,第一個(gè)for循環(huán)主要解決用戶要計(jì)算多少個(gè)整數(shù)之和的問題,而第二個(gè)for循環(huán)解決這個(gè)整數(shù)的和是多少的問題。
該程序的其他位置都沒有使用counter這個(gè)變量,它的作用僅僅是充當(dāng)循環(huán)計(jì)數(shù)器,但是,因?yàn)樗且粋€(gè)變量,所以必須在程序中聲明。
如果將該程序轉(zhuǎn)變成我們都能看得懂的語(yǔ)言那么就是:
一共循環(huán)運(yùn)行5次!{
讓用戶輸入他想計(jì)算的整數(shù),如果他不想輸入了就按0退出。
得到他輸入的整數(shù),并且計(jì)算出結(jié)果。
將結(jié)果打印出來(lái)。
}
------while語(yǔ)句
while語(yǔ)句進(jìn)一步擴(kuò)展了ObJC語(yǔ)言中得循環(huán)功能指令系統(tǒng)。while語(yǔ)句經(jīng)常使用的語(yǔ)句語(yǔ)法如下:
while(expression)
program statement
圓括號(hào)中得expression將被求值。如果表達(dá)式求值的結(jié)果為true,則執(zhí)行隨后的語(yǔ)句(program statement),執(zhí)行完這條語(yǔ)句(或位于花括號(hào)中得一組語(yǔ)句之后),將再次對(duì)表達(dá)式求值,若果求值結(jié)果為true,將再次執(zhí)行循環(huán)語(yǔ)句。直到表達(dá)式的最終求值結(jié)果為false時(shí),循環(huán)終止,然后執(zhí)行program statement之后的語(yǔ)句。
試著用while語(yǔ)句求1-100的整數(shù)和:

打印結(jié)果為5050。
從以上程序中會(huì)發(fā)現(xiàn),使用for語(yǔ)句同樣可以方便的完成該任務(wù)。事實(shí)上,for語(yǔ)句都可轉(zhuǎn)換成等價(jià)的while語(yǔ)句,反之亦然。比如說(shuō),下面的這個(gè)for語(yǔ)句語(yǔ)法結(jié)構(gòu)可以轉(zhuǎn)換成while語(yǔ)句語(yǔ)法結(jié)構(gòu)
for(init_expression;loop_condition;loop_expression)
program statement
改為while語(yǔ)句后:
init_expression;
while(loop_condition){
program statement
loop_expression;
}
來(lái)一個(gè)求兩個(gè)數(shù)最大公約數(shù)(greatest common divisor)的代碼:
不說(shuō)明最大公約數(shù)(簡(jiǎn)稱為gcd)是什么,只說(shuō)明求出gcd的步驟:


搞定,運(yùn)行結(jié)果是如圖所示。
繼續(xù)來(lái)一個(gè),寫一個(gè)能夠?qū)⑤斎氲臄?shù)倒過來(lái)分行輸出的程序。


OK,成功。
------do語(yǔ)句
上面介紹的兩個(gè)循環(huán)語(yǔ)句(for and while)都是需要在循環(huán)開始前測(cè)試一組條件。因此,如果條件不滿足,則可能永遠(yuǎn)都不會(huì)執(zhí)行循環(huán)體。開發(fā)程序時(shí),有時(shí)需要在循環(huán)結(jié)尾處(而不是在開始)處執(zhí)行測(cè)試。自然而然,ObJC語(yǔ)言也提供了專門的語(yǔ)言結(jié)構(gòu)用于處理這種情況,即do語(yǔ)句,該語(yǔ)句的語(yǔ)法如下:
do
program statement
while (expression);
do語(yǔ)句的執(zhí)行過程為:首先,執(zhí)行程序語(yǔ)句(program statement)。其次,求(expression)中得值,如果表達(dá)式的求之結(jié)果為true,循環(huán)將繼續(xù),并再次執(zhí)行程序語(yǔ)句。只要表達(dá)式的計(jì)算結(jié)果始終為true,就將重復(fù)執(zhí)行程序語(yǔ)句。當(dāng)表達(dá)式求出的值為false時(shí),循環(huán)將終止并以正常順序執(zhí)行程序中的下一條語(yǔ)句。
do語(yǔ)句只是while語(yǔ)句的簡(jiǎn)單轉(zhuǎn)置,它把循環(huán)條件放在循環(huán)的末尾,而不是放在開頭。上文編寫的把數(shù)翻轉(zhuǎn)過來(lái)的程序,如果輸入的為0,那么程序?qū)⒂肋h(yuǎn)不會(huì)執(zhí)行循環(huán)語(yǔ)句,但是使用do循環(huán)語(yǔ)句代替while語(yǔ)句,至少可以讓程序執(zhí)行一次,從而保證在所有的情況下都至少顯示一個(gè)數(shù)字。
代碼如下:

即使 你輸入的是0,那么也會(huì)有一次輸出,也就是說(shuō),運(yùn)行此程序即使你不按常理出牌,循環(huán)也會(huì)為你做一次~。
-------break語(yǔ)句
在循環(huán)過程中,有時(shí)候希望只要發(fā)生特定的條件(例如發(fā)生了錯(cuò)誤條件或者遍歷一列數(shù)據(jù)時(shí)查找到了)就立即退出循環(huán)。break語(yǔ)句就是實(shí)現(xiàn)這個(gè)目的的,只要執(zhí)行break語(yǔ)句,程序?qū)⒘⒓赐顺稣趫?zhí)行的循環(huán),無(wú)論此循環(huán)是for while or do。循環(huán)內(nèi)break之后的語(yǔ)句將被跳過,并且該循環(huán)的執(zhí)行也將終止,而轉(zhuǎn)去執(zhí)行循環(huán)外的其他語(yǔ)句。
如果在一組嵌套循環(huán)中執(zhí)行break語(yǔ)句,僅會(huì)退出執(zhí)行break語(yǔ)句的最內(nèi)層循環(huán)。
break語(yǔ)句的格式僅是在關(guān)鍵字break之后添加一個(gè)分號(hào),形式如下:
break;
------continue語(yǔ)句
continue語(yǔ)句和break語(yǔ)句類似,但它并不會(huì)使循環(huán)結(jié)束。執(zhí)行continue語(yǔ)句時(shí),循環(huán)會(huì)跳過該語(yǔ)句之后直到循環(huán)結(jié)尾處之間的所有語(yǔ)句。除此之外,循環(huán)將和平常一樣執(zhí)行。
continue通常用來(lái)根據(jù)某個(gè)條件繞過循環(huán)中的一組語(yǔ)句,除此之外,循環(huán)會(huì)繼續(xù)執(zhí)行。continue語(yǔ)句的格式如下:
continue;
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注