在平常生活中,會有不少須要反覆執行的事情,好比:每年的4個季節,每一週的7天,每日的3餐,打印機每份文檔打印50份,一圈跑道400米跑3圈,都是在反覆執行的。學習
再看軟件系統中的需求:spa
問題1:輸出100行語句,每行語句都同樣,即:設計
…code
問題2:輸出100行語句,每行語句都相似,即:blog
問題3:計算1到50乘以8.88的結果ip
諸如此類問題都是在反覆執行的,在軟件系統中能夠經過循環這種語法結構來解決。循環是程序設計語言中反覆執行某些代碼的一種計算機處理過程, 是一組相同或類似語句被有規律的重複性執行。ci
對於循環來講,須要考慮兩個要素,其一要素爲循環體, 也就是被反覆執行的相同或類似的語句,其二要素爲循環的條件,也就是循環得以繼續執行下去的條件,經常以循環次數的方式體現。文檔
經常使用的循環結構有:while、do-while、for。it
while語句是循環的一種常見語法結構,語法以下:for循環
while語句的執行過程爲,首先計算boolean表達式的值,然後進行判斷,若值爲true則執行語句塊,語句塊執行完後再次判斷boolean表達式的值,若是爲true則繼續執行語句塊,如此循環往復,直到boolean表達式的值爲false時退出while循環而執行while以後的語句。
while語句的流程圖如圖 - 11所示,須要注意的是,通常狀況下,循環操做中會存在使得循環條件不知足的可能性,不然該循環將成爲「死循環」。「死循環」意味着會一直執行循環體操做,循環後面的語句永遠不會被執行,「死循環」在軟件系統中是須要避免的。
圖 - 11
while語句在實際應用中應用比較普遍,經過以下示例體會while語句的執行邏輯:
int age = 1; while (age<=100) { System.out.println(「立刻有錢」); age++; }
上面的語句執行過程以下,首先聲明整型變量age並賦初始值爲1,然後判斷age是否小於等於100,條件爲真,輸出「立刻有錢」並將age的值增1變爲2,再次判斷條件,此時age爲2,依然小於100,再一次輸出「立刻有錢」並將age的值再增1變爲3,以此類推,直到age等於101時,判斷條件爲false,循環結束。
break用在循環體中用於退出循環結構。看以下示例代碼:
int x = 0; while ( x < 10 ) { if ( 5 == x ) { break; } System.out.println(x); x + + ; }
分析上面的代碼得出結論,輸出結果爲0 1 2 3 4,由於當x等於5時執行break語句直接退出循環結構了,即if語句塊後面的輸出x的值以及x++再也不被執行。
do-while語句也是循環的一種常見語法結構,語法以下:
do { 語句塊 } while( boolean表達式 ) ;
do-while語句的執行過程爲,先執行語句塊,再判斷boolean表達式,若是爲true則再次執行語句塊,如此循環往復,直到boolean表達式的值爲false時止。也就是說,do-while語句,不管boolean表達式是否爲true,都先執行一次語句塊。
do-while語句的流程圖如圖 - 12所示,與while語句同樣,do-while語句也要避免「死循環」的發生。
圖- 12
do-while語句在實際應用中應用比較普遍, 經過以下示例體會do-while語句的執行邏輯:
int pwd ; do{ System.out.print(「請輸入密碼」); pwd = scanner.nextInt(); } while ( 123 != pwd) ;
上面的語句執行過程以下,首先聲明整型變量pwd,在do語句中提示「請輸入密碼」,接收用戶輸入的數據賦給pwd, 然後判斷123是否不等於pwd,若爲true則執行do語句塊,以此類推,直到123等於pwd時,循環結束。
while與do-while都是用於執行循環結構的語句,區別在於,while循環先判斷再執行,而do-while循環先執行一次,再判斷。那麼,當初始狀況不知足循環條件時,while循環就一次都不會執行,而do-while循環無論任何狀況都至少會執行一次。
注意:while和do-while語句的不一樣僅僅體如今第一次就不知足條件的循環中;若是不是這樣的狀況,while與do-while能夠互換。請看以下兩段示例程序:
//示例1:while循環方式 int pwd = 0; while ( 123 != pwd){ System.out.print(「密碼:」); pwd = scanner.nextInt(); } //示例2: do-while循環方式 int pwd ; do{ System.out.print(「密碼」); pwd = scanner.nextInt(); } while ( 123 != pwd) ;
分析示例1與示例2得出結論,運行結果徹底同樣。這是由於兩段代碼第一次的while條件都知足,此時while與do-whlie能夠互換,因此結果徹底同樣。
請考慮以下三個題目的類似之處:
經過上面的問題能夠看出,如上三個題目都是在有規律的重複執行某個操做,在程序中
考慮使用循環結構來解決。首先須要先找到前面介紹的循環變量,此循環變量在每一次的循環中有規律的發生變化,而且經常做爲判斷是否繼續循環的條件。
首先,看第1個題目,設計循環變量i ,i的值爲1,2,…,100,即:從1開始,每次增1。第二個題目,設計循環變量i , i的值爲1,3,5,…,999,即:從1開始,每次增2。第三個題目,設計循環變量i , i的值爲1,2,…,500,即:從1開始,每次增1。
經過上面的分析,能夠看出,如上的循環都是固定次數的循環,這種狀況,優先考慮使用for語句來實現。
for語句是循環中最最經常使用的一種方式。for循環用於將某個語句或語句塊重複執行預約次數的情形。語法以下:
能夠看出,for循環的三個表達式之間經過分號;進行分隔,其執行邏輯以下所示:
for語句流程圖如圖-1所示:
圖- 1
簡單示例以下:
for ( int i = 1 ; i <= 10 ; i + + ) { System.out.println( i ); }
如上程序的輸出結果爲:1 2 3 4 5 6 7 8 9 10
分析如上程序的執行過程:首先,初始化i的值爲1,判斷i是否小於等於10,結果爲true,其次,輸出i的值1,而後,執行i的自增1,再判斷i是否小於等於10,結果爲true,執行輸出i的值2,以此類推……輸出i的值10後,執行i的自增1,此爲i爲11,判斷結果爲false,程序終止。
for語句經常用於解決固定次數循環的處理,好比說累加和,想求1+2+3+…+100的結果,次數固定執行100次,能夠考慮使用for循環處理,參見以下代碼:
int sum = 0 ; for ( int i = 1 ; i <= 100 ; i + + ) { sum += i ; } System.out.println(「1到100的和爲:」 + sum ) ;
分析上面代碼的執行過程,首先,聲明一個變量用於保存累加和,此變量命名爲sum,賦初始值爲0,然後,for循環從1開始,每次增1,執行100次,循環體中將i的值累加到sum變量中。注意:每次都是在sum的基礎之上加上i,因此使用了sum += i。循環結束後,輸出結果「1到100的和爲:5050「。
瞭解瞭如上題目以後,問:想求10的階乘,即1*2*3*…*10,可不可使用for循環來解決,若是能夠的話要如何解決呢?固然能夠,try!!!
首先回顧for語句的語法:
for ( 表達式1;表達式2;表達式3 ) { 語句塊 }
經過上面的代碼能夠看出,for語句實現循環時須要3個表達式而且使用分號;分隔,
在實際使用時,for語句能夠有幾種特殊的使用方法:
特殊方式1:表達式1位置內容爲空,看以下代碼:
int sum = 0 ; int i = 1; for ( ; i <= 10 ; i + + ) { sum += i ; } System.out.println(「1到10的和爲:」 + sum ) ;
經過上面的代碼能夠看出,雖然省略了表達式1,但只是將它放在了for循環的外面進行聲明,只是位置不一樣而已。在此須要注意一點,即便for語句中不寫表達式1了,表達式2前面的分號;也不能省略。
特殊方式2:表達式3位置內容爲空時,看以下代碼:
int sum = 0 ; for ( int i = 1 ; i <= 10 ; ) { sum += i ; i + + ; } System.out.println(「1到10的和爲:」 + sum ) ;
經過上面的代碼能夠看出,雖然省略了表達式3,但也只是將它放在了for循環體之中,只是位置不一樣而已。在此須要注意一點,即便for語句中不寫表達式3了,表達式2後面的分號;也不能省略。
特殊方式3:表達式1,2,3位置內容均爲空時,看以下代碼:
for ( ; ; ) { System.out.println(「我要學習……」); }
經過上面的代碼能夠看出,如上代碼沒有循環變量、沒有條件控制,所以會形成死循環,而死循環在編寫程序過程當中是必需要避免的,能夠在循環體中添加break跳出循環。
特殊方式4:表達式 1 和 3 位置內容的多樣化
for語句中的三個表達式中表達式1和表達式3可使用逗號表達式,逗號表達式就是經過」,」運算符隔開的多個表達式組成的表達式,從左向右進行計算。看以下示例:
for ( int i =1 , j = 6 ; i <= 6 ; i +=2 , j -=2 ) { System.out.println(「 i , j = 「 + i + 「,」 + j ); }
上面的代碼的執行邏輯以下:初始設置i爲1,j爲6,判斷i是否小於等於6,爲真執行循環體,然後執行i+=2,j-=2,即:i增2,j減2。再判斷i是否小於等於6,爲真繼續執行循環體,以此類推,直到條件爲false。本程序的輸出結果爲:
i , j = 1 , 6 i , j = 3 , 4 i , j = 5 , 2
循環中的break語句應用率很廣,break可用於循環語句或switch語句中,其用於循環時,可以使程序終止循環而執行循環後面的語句,經常與條件語句一塊兒使用,看以下代碼:
int sum = 0; for(int i=1; i<=100; i++){ if(sum>=4000){ break; } sum += i; } System.out.println(sum);
上面的程序須要統計1到100的累加和,條件是當和大於等於4000時則終止計算,此案例經過在if語句中使用break實現了for語句的退出,本程序最終sum的值爲:4005。
continue語句只能用於循環中,它的做用爲跳過循環體中剩餘語句而執行下一次循環,看以下代碼:
int sum = 0; for(int i=1; i<=100; i++){ if( i % 10 == 3 ){ continue; } sum += i; } System.out.println(sum);
上面的程序須要統計1到100的累加和,條件是跳過全部個位爲3的,此案例經過在if語句中使用continue實現了跳過for語句中剩餘的循環體語句,本程序最終sum的值爲: 4570。