Day 4 : 循環結構(while、do…while、for)

1. 循環結構(while、do…while、for)

1.1. 什麼是循環結構

在平常生活中,會有不少須要反覆執行的事情,好比:每年的4個季節,每一週的7天,每日的3餐,打印機每份文檔打印50份,一圈跑道400米跑3圈,都是在反覆執行的。學習

再看軟件系統中的需求:spa

問題1:輸出100行語句,每行語句都同樣,即:設計

  • 行動是成功的階梯,行動越多,登得越高!
  • 行動是成功的階梯,行動越多,登得越高!
  • 行動是成功的階梯,行動越多,登得越高!

code

問題2:輸出100行語句,每行語句都相似,即:blog

  • 第1,行動是成功的階梯,行動越多,登得越高!
  • 第2,行動是成功的階梯,行動越多,登得越高!
  • 第3,行動是成功的階梯,行動越多,登得越高!
  • 第100,行動是成功的階梯,行動越多,登得越高!

問題3:計算1到50乘以8.88的結果ip

  • 1× 8.88 =8.88
  • 2 × 8.88 =17.76
  • 3 × 8.88 =26.64
  • 4 × 8.88 =35.52
  • 50 × 8.88 =444

諸如此類問題都是在反覆執行的,在軟件系統中能夠經過循環這種語法結構來解決。循環是程序設計語言中反覆執行某些代碼的一種計算機處理過程, 是一組相同或類似語句被有規律的重複性執行。ci

對於循環來講,須要考慮兩個要素,其一要素爲循環體, 也就是被反覆執行的相同或類似的語句,其二要素爲循環的條件,也就是循環得以繼續執行下去的條件,經常以循環次數的方式體現。文檔

經常使用的循環結構有:while、do-while、for。it

1.2. while語句

1.2.1. while語句的執行邏輯

while語句是循環的一種常見語法結構,語法以下:for循環

 
while( boolean表達式 ) {        語句塊;
}

 

while語句的執行過程爲,首先計算boolean表達式的值,然後進行判斷,若值爲true則執行語句塊,語句塊執行完後再次判斷boolean表達式的值,若是爲true則繼續執行語句塊,如此循環往復,直到boolean表達式的值爲false時退出while循環而執行while以後的語句。

1.2.2. while語句的流程圖

while語句的流程圖如圖 - 11所示,須要注意的是,通常狀況下,循環操做中會存在使得循環條件不知足的可能性,不然該循環將成爲「死循環」。「死循環」意味着會一直執行循環體操做,循環後面的語句永遠不會被執行,「死循環」在軟件系統中是須要避免的。


圖 - 11

1.2.3. while語句用於處理循環邏輯

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,循環結束。

1.2.4. 使用break語句跳出循環

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++再也不被執行。

1.3. do-while語句

1.3.1. do-while語句的執行邏輯

do-while語句也是循環的一種常見語法結構,語法以下:

do {
        語句塊
} while( boolean表達式 ) ;

 

do-while語句的執行過程爲,先執行語句塊,再判斷boolean表達式,若是爲true則再次執行語句塊,如此循環往復,直到boolean表達式的值爲false時止。也就是說,do-while語句,不管boolean表達式是否爲true,都先執行一次語句塊。

1.3.2. do-while語句的流程圖

do-while語句的流程圖如圖 - 12所示,與while語句同樣,do-while語句也要避免「死循環」的發生。


圖- 12

1.3.3. do-while語句用於處理循環邏輯

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時,循環結束。

1.3.4. while和do-while語句的區別

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.4. for語句

1.4.1. 考慮以下循環問題的相同之處

請考慮以下三個題目的類似之處:

  1. 計算從1加到100的值;
  2. 計算1+1/3+1/5+…+1/999;
  3. 找出從第1號學員到第500號學員中成績大於90的學員。

經過上面的問題能夠看出,如上三個題目都是在有規律的重複執行某個操做,在程序中

考慮使用循環結構來解決。首先須要先找到前面介紹的循環變量,此循環變量在每一次的循環中有規律的發生變化,而且經常做爲判斷是否繼續循環的條件。

首先,看第1個題目,設計循環變量i ,i的值爲1,2,…,100,即:從1開始,每次增1。第二個題目,設計循環變量i , i的值爲1,3,5,…,999,即:從1開始,每次增2。第三個題目,設計循環變量i , i的值爲1,2,…,500,即:從1開始,每次增1。

經過上面的分析,能夠看出,如上的循環都是固定次數的循環,這種狀況,優先考慮使用for語句來實現。

1.4.2. for語句的執行邏輯

for語句是循環中最最經常使用的一種方式。for循環用於將某個語句或語句塊重複執行預約次數的情形。語法以下:

  1. for ( 表達式1;表達式2;表達式3 ) {
  2. 語句塊(循環體)
  3. }

能夠看出,for循環的三個表達式之間經過分號;進行分隔,其執行邏輯以下所示:

  1. 計算表達式1的值,一般爲循環變量賦初值;
  2. 計算表達式2(表達式2爲邏輯表達式)的值,即判斷循環條件是否爲真,若值爲真則執行循環體一次(語句塊),不然跳出循環;
  3. 執行循環體;
  4. 計算表達式3的值,此處一般寫更新循環變量的賦值表達式;
  5. 計算表達式2的值,若值爲true則執行循環體,不然跳出循環;
  6. 如此循環往復,直到表達式2的值爲false。

1.4.3. 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,程序終止。

1.4.4. for語句用於實現固定次數循環

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!!!

1.4.5. for語句三個表達式特殊用法

首先回顧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

 

1.4.6. 循環中使用break語句

循環中的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。

1.4.7. 循環中使用continue語句

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。

相關文章
相關標籤/搜索