Java基礎之:迴圈
首先Java中的迴圈結構包括:for , while ,do...while
但不管是哪一種迴圈結構一定包含以下迴圈四要素:
-
迴圈變數初始化
-
迴圈執行條件判斷
-
迴圈體
-
迴圈變數迭代
for迴圈體
迴圈流程圖:
for([迴圈變數初始化];迴圈執行條件判斷;[迴圈變數迭代]){ 迴圈體; } //迴圈變數初始化和迴圈變數迭代可以不寫在()內,但兩個";"不可以省略。 //具體結構如下: 迴圈變數初始化; for(;迴圈執行條件判斷;){ 迴圈體; 迴圈變數迭代; }
說明:
-
當迴圈體只有一條語句時,可以省略{},但並不建議這樣寫程式碼。
-
迴圈執行條件判斷語句的返回值一定是一個boolean值。(往往在寫for迴圈時,這一部分是最難的)
-
迴圈變數初始化和迴圈變數迭代都可以是多條,中間用逗號分隔。
簡單案例:
//列印100以內所有7的倍數的整數,通過化繁為簡的思想 //首先我們先思考如何列印1-100,然後再思考通過判斷誰是7的倍數 for(int i = 1 ; i <= 100 ; i++){ //System.out.println(i); // 1-100 if(i % 7 == 0){ System.out.println(i); } }
while迴圈體
迴圈流程圖:
基本語法:
迴圈變數初始化 while(迴圈條件判斷){ 迴圈體: 迴圈變數迭代: }
可以看到while迴圈體同樣包含了迴圈四要素,其實所有的迴圈體在底層都是同樣的結構,但為什麼要分幾種迴圈體呢?這就好比有人習慣用叉子,有人習慣用筷子一樣。
說明:
-
while迴圈是先判斷條件是否滿足再進行迴圈,這點兒與do...whlie不同。
-
在寫while迴圈時一定不要忘記了退出迴圈的條件,例如迴圈變數的迭代。
簡單案例:
//不斷輸入內容,直到輸入內容為exit,則退出迴圈 import java.util.Scanner; public class While { public static void main(String[] args){ Scanner input = new Scanner(System.in); String name = ""; //String物件宣告時,要習慣對它進行初始化 while(!"exit".equals(name)){ //使用常量"exit"呼叫equals()方法,防止出現空指標異常 name = input.next(); } System.out.println("程式結束!"); } }
通過這個案例我們看到,while迴圈並不一定要使用變數值的迭代來進行判斷是否退出迴圈。
我們甚至可以這樣使用while迴圈:
boolean flag = true; while(flag){ 迴圈體; if(條件判斷){ flag = false; } }
當然使用for迴圈也可以實現這樣的功能,只是使用while迴圈能讓我們更清晰的看出,可以通過boolean值的改變來控制何時退出迴圈。
do...while迴圈體
迴圈流程圖:
基本語法:
迴圈變數初始化 do{ 迴圈體; 迴圈變數迭代; }while(迴圈條件判斷);
說明:
-
從do...while迴圈的流程圖我們就可以看出,do...while迴圈是先執行一次迴圈體,再進行迴圈條件判斷。也就是說do...while迴圈不管如何一定會執行一次,適合用於選單的列印。
-
要注意在while()之後有一個";",這一點與for迴圈體和while迴圈體不同。因Java將do...while迴圈體看作是一條語句。
簡單案例:
//統計1——200之間能被5整除但不能被3整除的個數 import java.util.Scanner; public class While { public static void main(String[] args){ int a = 1; int count = 0; do{ if(a % 5 == 0 && a % 3 != 0){ count += 1; //計數 } a += 1; }while(a <= 200); System.out.println("1——200之間能被5整除但不能被3整除的數有" + count + "個" ); } }
多重迴圈(重難點)
多重迴圈即迴圈的巢狀,就如同之前的if條件判斷時的巢狀格式一樣。
多重迴圈實際上就是將內層迴圈當作外層迴圈的迴圈體,所以只有當內層迴圈退出時(即內層迴圈的迴圈條件判斷結果為false時)才會執行外層迴圈的下一次迴圈。
例如:
for(int i = 1;i <= 10;i++){ //只有當j>10時,才會執行下一次的i迴圈。 for(int j = 1;j <= 10;j++){ System.out.println("奮鬥的小范同學!"); //一共將列印100次。 i * j } }
簡單案例1:
//統計3個班成績情況,每個班有3名同學,求出各個班的平均分和所有班級的平均分[學生的成績從鍵盤輸入]。 //並統計3個班的總及格人數。 import java.util.Scanner; public class DoubleFor { public static void main(String[] args){ Scanner input = new Scanner(System.in); double classAvg = 0.0; double allClassAvg = 0.0; int count = 0; //及格人數 for(int i = 0; i<3;i++){ //三個班 double classSum = 0.0;//計算每個班的成績總和 System.out.println("班級"+(i+1)); System.out.println("輸入班級人數:"); //每個班3個學生 int classNum = input.nextInt(); //通過控制檯輸入每個班學生人數 for(int j = 0;j< classNum ;j++){ double temp = 0.0; //用於接收控制檯輸入的成績 System.out.println("輸入成績:"); temp = input.nextDouble(); classSum += temp; if(temp >= 60){ //統計及格人數 count += 1; } } classAvg = classSum / classNum; System.out.println("班級"+(i+1)+"的平均成績為:" + classAvg); allClassAvg += classAvg; } System.out.println("所有班平均成績為:"+(allClassAvg/3)); System.out.println("所有班及格人數為:"+count); } }
執行結果:
簡單案例2:
//列印空心等腰三角形 化繁為簡的思想!! // * 1.首先嚐試列印一半的實心金字塔 // * * 2.再嘗試列印整個的實心金字塔 // * * 3.最後思考如何列印空心金字塔 // * * // * * //*********** import java.util.Scanner; public class DayHomeWork { public static void main(String[] args){ Scanner input = new Scanner(System.in); System.out.println("請輸入等腰三角形層數:"); int num = input.nextInt(); for(int i = 0 ; i <= num;i++){ //外層迴圈控制層數 for(int j = 0;j<num-i;j++){ //內層迴圈控制 每行列印的空格數 System.out.printf(" "); } for(int k = 0;k < (2*i-1);k++){ //內層迴圈控制 每行列印的*數 if(i == 0 || i == num){ //第一行和最後一行正常輸出 System.out.printf("*"); }else{//空心列印 if(k == 0 || k == (2*i-1)-1){ //第一個和最後一個"*"列印 System.out.printf("*"); }else{ //其他時候列印空格 System.out.printf(" "); } } } System.out.println(); } } }
跳轉控制語句
作用於迴圈體內的跳轉控制語句有:break,continue ,return
break
流程示意圖(while迴圈體為例):
之前我們在switch中也用到了break關鍵字,其作用是退出switch語句。在三大迴圈體中,它的作用同樣如此。
break關鍵字使用場景通常時我們不知道迴圈次數時,用break來退出迴圈。
簡單案例:
public class Ninety { public static void main(String[] args){ int count = 0; for(int i = 0 ; i < 100 ; i++){ count += 1; if(((int)(Math.random()*100)) == 90 ){ break; } } System.out.println("一共用了:"+count+"次!"); } }
continue
流程示意圖(以while迴圈體為例):
continue關鍵字作用:退出此次迴圈,直接進入下一次迴圈。
簡單案例:
public class ContinueTest { public static void main(String[] args) { int i = 1; while( i <= 4) { i++; if( i == 2) { continue; //跳過2,不進行列印直接進入下次迴圈 } System.out.println("i=" + i); } } } //列印結果為: 1 3 4 5 // 1 3 4 5 // 1 3 4 5
return
return使用在方法,表示跳出所在的方法。這裡只做簡單瞭解,有個概念就行。
標籤
break 與 continue 出現在多重巢狀的語句塊中時,可以通過標籤指定 具體要跳轉到哪一層語句塊。
若不適用標籤,即預設跳出最近的一層語句塊,就如同上面的案例。
簡單案例(這裡以continue為例):
lable1: for(int i = 1 ; i < 3;i++){ lable2: for(int j = 1 ; j < 4;j++){ if(j == 2){ continue lable2; // continue lable1; } System.out.println(j); } }
如果使用 continue lable2將列印輸出:1 3 ; 1 3
如果使用 continue lable1將列印輸出:1 ; 1
注:本文所有流程圖轉載自:尚矽谷-韓順平B站視訊地址(https://www.bilibili.com/video/BV15C4y1b76A?p=1)