在流程控制語句(條件語句和迴圈語句)中,對我造成最多困擾和模糊的就是for迴圈的多層巢狀,本篇文章通過例項分析巢狀式for迴圈。增強自己對for迴圈的理解。
一,for語句概述
for語句的功能是為了重複執行某些語句,直到某個條件得到滿足。
for語句格式如下:
for(表示式1;表示式2;表示式3)
迴圈體語句塊……
表示式1:初始化表示式,一般用來完成變數的初始化;
表示式2:迴圈條件表示式,結果為boolean型,用於判斷是否要繼續執行語句塊;
表示式3:執行完迴圈語句塊後操作的表示式。
*注意1:以上三個表示式和語句塊都可以為空。由此可得最簡單的for語句:
for(;;){}
該語句是乙個無線迴圈語句。
當表示式2為空時,其值預設為true,表示可以繼續執行迴圈語句。
*注意2:在迴圈體語句塊內建立的變數,作用範圍只在迴圈體內,也不能作用於表示式1、2、3.
例如:
for (;a<10 ;a++ )
是錯誤的,因為在語句塊中建立的變數a無法作用到表示式中。
同時,每次迴圈的時候,a都會被重新建立一次,所以每次迴圈中a不存在互相聯絡;
如:
for (int i=0;i<5 ; i++)
輸出結果為:
000
00
*注意3:表示式1內初始化的變數可以作用於迴圈體語句內,但是不能作用於for語句外。
for語句執行順序:
1)在執行for迴圈時,首先執行表示式1,完成變數初始化;
2)下一步,判斷表示式2的值,若為true,則進入迴圈體,否則跳出迴圈;
3)在執行完迴圈體後,接著執行表示式3,此時一輪迴圈結束;
4)第二輪迴圈從表示式2開始,重複2)3)的過程;
二,for舉例
下面通過例子實現for迴圈的基本應用
2.1需求:按順序列印0-9:
思路:由於需要列印的數是從零開始,所以在表示式1中初始化變數時,可以將變數值i定位0,int i=0;
要列印的最大數為9,所以表示式2的條件語句可以為 i<10,或者i<=9;
因為徐列印數i在遞增,所以表示式3可以寫作i++;
**如下:
for (int i=0;i<10 ; i++)
結果:
012
3456
789
2.2需求:列印100至200之間所有能被11整除的數:
思路:首先由於被迴圈數從100開始,所以表示式1的初始化變數可以定義為int 1=100;
因為迴圈至200結束,所以表示式2可以寫成i<201,或者i<=200;
因為被遍歷數是隨著迴圈次數在遞增,所以很明顯表示式3為i++;
通過以上3個表示式我們可以對100至200的數進行遍歷,在遍歷的同時,根據需求,要對每乙個被遍歷的數進行判斷是否能被11整除,這裡就需要用到if語句了;
下面是**實現:
for (int i=100;i<201 ; i++)
輸出結果:
110
121132
143154
165176
187198
順便說一句,計算機確實可以提高很大的效率,要是手動計算100到200之間能被11整除的數,確實挺複雜的。
2.3需求:求1至100之間所有奇數的和
思路:首先對1至100之間的奇數進行遍歷,這裡可以通過對1-100之間的數進行逐一遍歷的同時進行判斷是否為奇數。也可以同過將初始化變數的值定為1,每次迴圈將變數的值加2,以實現每次被遍歷的數都是奇數。
再遍歷奇數的同時,對獲得的奇數進行累加操作。
**如下:
int num=0;
for (int i=1;i<100 ; i+=2)
system.out.println(num);
結果為:
2500
三,for迴圈巢狀
當迴圈for(表示式1;表示式2;表示式3)
迴圈體語句塊……
中的迴圈體語句塊被執行一次時需要對某些**進行重複執行時,這就涉及到多重迴圈的巢狀。
for迴圈巢狀由於涉及到多層迴圈結構,並且個迴圈結構間經常存在互相影響,所以容易造成邏輯混亂。
正確處理多層for迴圈問題的核心在於分辨每層迴圈的功能和作用範圍,其次是控制每層迴圈的判斷條件。
舉例;3.1需求:用巢狀for迴圈列印
******
******
******
思路:上面的圖形中,涉及到兩個重複的操作,1迴圈:將同一行的內容重複列印多次。2迴圈:在每一行內對*進行重複列印;
所以需要通過兩個for迴圈對他們分別進行迴圈,1迴圈行的整體內容,迴圈的控制條件為行數;
2迴圈每一行內的*,迴圈的控制條件是每一行*的個數,也就是該行的列數。
而且由於1迴圈的行是由2迴圈的*組成的,所以2迴圈的結果是1迴圈的一部分,由此,我們可以確定1迴圈為外迴圈,2迴圈為內迴圈.
下面為**實現:
for(int x=0;x<4;x++)
system.out.println(); //換行
}
3.2需求:列印
*****
****
*****
*
思路:同樣根據3.1我們知道外迴圈控制行數,內迴圈控制列數,
與3.1不同的是:3.1中行數與列數不互相影響,而本題中列數會隨著行數的增加而減少;
這說明控制行數的變數同樣對列數有影響。
下面我們通過**實現;
for(int x=0;x<5;x++)
system.out.println(); //換行
}
3.3需求:列印下圖
*
********
*******
*****
****
思路:與3.2不同的是本題的列數受到多個因素控制,第一:每行的*個數;第二:每行*的初始位置,即每行開頭的空格數量。第三:前面兩個變數都同時收到行數的影響。
根據歸納發現:當行數小於等於4時,隨著行數增加,*個數增加,空格數在減少;
當行數大於4的時候,隨著行數增加,*個數減少,空格數增加。
根據這個規律,可以將內迴圈通過if語句分為兩種情況,並分別進行列數的控制
**實現:
for(int x=0;x<7;x++)
for(int y=0;y<2*x+1;y++)
} else
for(int y=0;y<2*(7-x)-1;y++)
} system.out.println(); //換行
}
四,最後,補充幾個流程控制語句中易犯的問題
1.
if(條件表示式)else if(條件表示式)else if(條件表示式)else
在如上格式的if…else if語句中,該整體表示一句**。程式會從上往下,依次判斷if後的條件表示式是否滿足,如果滿足,則執行該if語句內的**塊,當執行完**塊後,程式會直接跳出該if…else if語句,不會再去判斷後面的條件表示式是否滿足,當所有條件表示式判斷完畢都不滿足條件後,則執行else語句。
2:在流程控制語句中,如果有單獨的break;語句或continue;語句存在,則在該**塊內後面不能有其他語句,因為後面的語句永遠不會被執行到。
如:
for(int i=0;i<10;i++)
迴圈知識總結
迴圈,是比較難的一部分 對於我 主要有以下三種形式 while 迴圈控制表示式 do while 迴圈控制表示式 for 初始化表示式 迴圈控制表示式 增值表示式 對於迴圈次數已知的程式,多採用for語句,未知次數的多用while語句,do while和while極其類似,只是在迴圈之前執行一次程式...
java知識總結
包的訪問控制 子類 同個包內 不同包內 public y y y protect y y n private n n n i o和流 四個抽象類 讀寫位元組 inputstream outputstream 讀寫unicode字元 reader writer iterator arraylist v...
JAVA知識總結
1.格式化數字 double amount 111.0 decimalformat df new decimalformat 0.00 system.out.println df.format amount decimalformat decimal new decimalformat 00 str...