1. 程式人生 > 實用技巧 >Java基礎之:迴圈

Java基礎之:迴圈

Java基礎之:迴圈

首先Java中的迴圈結構包括:for , while ,do...while

但不管是哪一種迴圈結構一定包含以下迴圈四要素:

  1. 迴圈變數初始化

  2. 迴圈執行條件判斷

  3. 迴圈體

  4. 迴圈變數迭代

for迴圈體

迴圈流程圖:

基本語法:

for([迴圈變數初始化];迴圈執行條件判斷;[迴圈變數迭代]){
    迴圈體;
}
//迴圈變數初始化和迴圈變數迭代可以不寫在()內,但兩個";"不可以省略。
//具體結構如下:
迴圈變數初始化;
for(;迴圈執行條件判斷;){
    迴圈體;
    迴圈變數迭代;
}

  

說明:

  1. 當迴圈體只有一條語句時,可以省略{},但並不建議這樣寫程式碼。

  2. 迴圈執行條件判斷語句的返回值一定是一個boolean值。(往往在寫for迴圈時,這一部分是最難的)

  3. 迴圈變數初始化和迴圈變數迭代都可以是多條,中間用逗號分隔。

簡單案例:

//列印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迴圈體同樣包含了迴圈四要素,其實所有的迴圈體在底層都是同樣的結構,但為什麼要分幾種迴圈體呢?這就好比有人習慣用叉子,有人習慣用筷子一樣。

說明:

  1. while迴圈是先判斷條件是否滿足再進行迴圈,這點兒與do...whlie不同。

  2. 在寫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(迴圈條件判斷);

  

說明:

  1. 從do...while迴圈的流程圖我們就可以看出,do...while迴圈是先執行一次迴圈體,再進行迴圈條件判斷。也就是說do...while迴圈不管如何一定會執行一次,適合用於選單的列印。

  2. 要注意在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

注意:標籤的名字並不是固定的,所以可以使用lable也可以使用abc,也可以是任意的合法字元。

注:本文所有流程圖轉載自:尚矽谷-韓順平B站視訊地址(https://www.bilibili.com/video/BV15C4y1b76A?p=1)