在ObJC中,有若干方法可以重復執行一系列代碼,這些重復執行的功能稱之為循環功能,它們由以下幾部分構成:
舉一個簡單的例子,如果想求10以內所有整數之和:(代碼如下)
只需要將十以內的整數進行相加運算就可以,甚至在大腦中進行運算就可以。但是如果是100以內的整數相加,那麼大部分人都會感到頭疼,這時候就可以通過一些特殊的方法來解決如下問題。
至此引入循環結構——計算機的基本屬性之一就是它可以重復執行一組語句。這種循環能力讓程序員能夠開發出包含重復過程的簡潔程序,這些過程能夠以不同的方式執行成百上千的程序語句。ObJC中包含3種用於編寫循環結構的程序語句。
------for語句
計算100以內所有整數之和。
打印結束後 結果為:5050.
從中我們可以看到,由於引用了for()循環語句,相當於計算機自動幫助我們疊加n的值,直到n<101(n=100),而計算機一邊幫我們疊加n的值,一邊幫我們計算sum的值。
那麼sum的值是如何計算的呢。首先先解釋for語句的一般格式:
for(init_expression;loop_condition;loop_expression)
program statement
圓括號中的三個表達式,建立了程序循環的“環境”。其後的program statement(要以分號結尾),可以是任何ObJC語句,但是必須是合法的。它們組成循環體。這條語句執行的次數由for語句中設置的參數決定。
for語句的第一部分標著init_expression用於再循環開始之前設置初始值;第二部分標著loop_condition用於指定繼續執行循環所需的條件(只要滿足既定的條件,那麼程序就會繼續執行),如果循環不在滿足既定的條件,那麼程序就會停止循環,跳出循環之後繼續執行循環體外的程序(在上個代碼中就會繼續執行NSlog(@"SUM=%d",sum);)。到這,關於sum的值是如何計算的,應該已經非常明確了,
(sum+=n)等價於(sum=sum+n),循環滿足條件,n每次循環都會增加1(n++),那麼每一次新的循環後等待求和的sum就等於上次循環得到的sum值加上新n值。
直到滿足循環條件,循環結束。
總之,for語句將按以下步驟執行:
代碼:生成三角數表的程序
打印結果:
在上個代碼中,前三個NSlog語句的目的僅僅是提供總標題和輸出列的標題。在顯示適當的標題後,程序將計算前10個三角數,在你計算1-n的和時,使用變量n記錄當前的數字,使用變量sum存儲n的三角數值。(最後一行沒對齊,如果想對齊,可將最後的NSlog修改為:NSlog(@"%2i %i",n,sum);)
鍵盤輸入:如果我們不想計算前100個整數的和,改為計算前200,前500的整數之和,除了去代碼中修改,還有一個更簡單的方法,就是自己控制想要求多少以內的數的和,用鍵盤輸入。
打印結果為:
本人輸入的是59,那麼計算機將計算1-59的和=1770。
那麼問題又來了,如果我想要不斷的計算不同的數,該怎麼辦?我們引入嵌套循環。
在循環中,考慮到需要人為終止循環,否則將會一直無休止的循環下去,所以我添加了變量stop並設置初值為1,也就是說循環開始只循環一次,然後在循環中加入stop++,這樣每次循環結束,都會開始新一輪循環直到你感到厭煩想要終止這一切,按照本人現在的水平,只能寫出按0退出的程度,不過也大體上符合了人道主義精神(我十分相信,如果我不加終止,那麼如果有人看到這個程序,並且嘗試了那麼肯定有那麼一個執著的人相信循環會有盡頭。。。)
言歸正傳,第一個for循環主要解決用戶要計算多少個整數之和的問題,而第二個for循環解決這個整數的和是多少的問題。
該程序的其他位置都沒有使用counter這個變量,它的作用僅僅是充當循環計數器,但是,因為它是一個變量,所以必須在程序中聲明。
如果將該程序轉變成我們都能看得懂的語言那麼就是:
一共循環運行5次!{
讓用戶輸入他想計算的整數,如果他不想輸入了就按0退出。
得到他輸入的整數,並且計算出結果。
將結果打印出來。
}
------while語句
while語句進一步擴展了ObJC語言中得循環功能指令系統。while語句經常使用的語句語法如下:
while(expression)
program statement
圓括號中得expression將被求值。如果表達式求值的結果為true,則執行隨後的語句(program statement),執行完這條語句(或位於花括號中得一組語句之後),將再次對表達式求值,若果求值結果為true,將再次執行循環語句。直到表達式的最終求值結果為false時,循環終止,然後執行program statement之後的語句。
試著用while語句求1-100的整數和:
打印結果為5050。
從以上程序中會發現,使用for語句同樣可以方便的完成該任務。事實上,for語句都可轉換成等價的while語句,反之亦然。比如說,下面的這個for語句語法結構可以轉換成while語句語法結構
for(init_expression;loop_condition;loop_expression)
program statement
改為while語句後:
init_expression;
while(loop_condition){
program statement
loop_expression;
}
來一個求兩個數最大公約數(greatest common divisor)的代碼:
不說明最大公約數(簡稱為gcd)是什麼,只說明求出gcd的步驟:
首先我們需要兩個非負整數:c 和 d。 若c=0,結束,即gcd=u。 計算temp=c%d,c=d,d=temp,並回到步驟2.
搞定,運行結果是如圖所示。
繼續來一個,打印一個數字各位數的程序。