Java基礎(chǔ)(3)循環(huán)嵌套及break澳厢、continue

今日大綱

  • 掌握循環(huán)跳轉(zhuǎn)語句break和continue的用法
  • 掌握循環(huán)嵌套相關(guān)案例
  • 掌握Random類的用法
  • 掌握猜數(shù)字案例

1. 循環(huán)跳轉(zhuǎn)

1.1 概述

有些時候, 我們想提前終止循環(huán)的執(zhí)行, 或者跳過循環(huán)的某一次執(zhí)行, 例如: 打印1~10之間, 所有不是3倍數(shù)的數(shù)字, 或者采用死循環(huán)讓用戶不斷的錄入他/她的賬號和密碼, 直到用戶錄入正確, 再終止循環(huán). 這些都要用到循環(huán)控制跳轉(zhuǎn)知識點.

1.2 分類

  • break: 是用來終止循環(huán)的, 循環(huán)不再繼續(xù)執(zhí)行.
  • continue: 用來結(jié)束本次循環(huán), 進行下一次循環(huán)的, 循環(huán)還會繼續(xù)執(zhí)行.

1.3 案例一: break入門

需求
打印10次HelloWorld, 當(dāng)打印第五次的時候, 結(jié)束循環(huán).

參考代碼

//案例: 打印10次`HelloWorld`,  當(dāng)打印第五次的時候, 結(jié)束循環(huán).
public class BreakDemo01 {
    public static void main(String[] args) {
        System.out.println("start");
        //1. 定義for循環(huán), 打印10次HelloWorld
        for (int i = 1; i <= 10 ; i++) {
            //2.當(dāng)i等于5的時候, 結(jié)束循環(huán)
            if (i == 5)
                break;
            System.out.println("Hello World! " + i);
        }
        System.out.println("end");
    }
}

圖解

1.4 案例二: continue入門

需求

打印1~10之間, 所有不是3倍數(shù)的整數(shù).

參考代碼

//案例; 打印1~10之間, 所有不是3倍數(shù)的整數(shù).
public class ContinueDemo02 {
    public static void main(String[] args) {
        System.out.println("start");
        //1. 通過for循環(huán), 獲取1 - 10之間所有的整數(shù)
        for (int i = 1; i <= 10; i++) {
            //2. 判斷該數(shù)字是否是3的倍數(shù).
            if (i % 3 == 0)
                //3. 如果是, 就結(jié)束本次循環(huán)
                continue;
            //4. 如果不是, 就打印該數(shù)字的值.
            System.out.println(i);
        }
        System.out.println("end");
    }
}

圖解

2. 循環(huán)嵌套

所謂的循環(huán)嵌套指的是循環(huán)結(jié)構(gòu)中還包裹著循環(huán)結(jié)構(gòu), 外邊的循環(huán)結(jié)構(gòu)叫外循環(huán), 里邊的循環(huán)結(jié)構(gòu)叫內(nèi)循環(huán).

2.1 格式

循環(huán)嵌套用的最多的就是for循環(huán)的嵌套, 具體格式如下:

for(初始化條件; 判斷條件; 控制條件) {        //外循環(huán), 例如: 5   1      2
   for(初始化條件; 判斷條件; 控制條件) {     //內(nèi)循環(huán), 例如: 3   1,2,3  1,2,3
      //循環(huán)體;
   }
}

2.2 執(zhí)行流程

  1. 外循環(huán)執(zhí)行一次, 內(nèi)循環(huán)執(zhí)行一圈.
  2. 循環(huán)嵌套的總執(zhí)行次數(shù) = 外循環(huán)的次數(shù) * 內(nèi)循環(huán)的次數(shù).

例如:

  1. 現(xiàn)實世界中的年月關(guān)系, 即: 1年 = 12個月
  2. 現(xiàn)實世界中的時分, 分秒關(guān)系, 即: 1小時 = 60分鐘, 1分鐘=60秒.

2.3 案例一: 打印年月

需求

打印2020年1月至2023年12月之間所有的月份, 格式為: XXXX年XX月

參考代碼

  • 復(fù)雜寫法

    //案例: 打印年月
    public class ForForDemo04 {
        public static void main(String[] args) {
            //1. 定義循環(huán), 打印2021年所有的月份
            for (int j = 1; j <= 12 ; j++) {
                System.out.print("2021年" + j + "月\t");
            }
            System.out.println();   //記得加換行
    
            //2. 定義循環(huán), 打印2022年所有的月份
            for (int j = 1; j <= 12 ; j++) {
                System.out.print("2022年" + j + "月\t");
            }
            System.out.println();   //記得加換行
    
            //3. 定義循環(huán), 打印2023年所有的月份
            for (int j = 1; j <= 12 ; j++) {
                System.out.print("2023年" + j + "月\t");
            }
            System.out.println();   //記得加換行
        }
    }
    
  • 簡單寫法

    //案例: 打印年月
    public class ForForDemo04 {
        public static void main(String[] args) {
            //1. 定義外循環(huán), 控制年份的變化.
            for (int i = 2020; i <= 2023 ; i++) {       //外循環(huán)執(zhí)行一次, 內(nèi)循環(huán)執(zhí)行一圈.
                System.out.println("start");
                //變量i的取值: 2021, 2022, 2023
                //2. 定義內(nèi)循環(huán), 控制月份的變化.
                for (int j = 1; j <= 12 ; j++) {
                    System.out.print(i + "年" + j + "月\t");
                }
                System.out.println();   //記得加換行
                System.out.println("end\r\n");
            }
        }
    }
    

2.4 案例二: 打印時分

需求

打印1天內(nèi)的所有時間, 格式: 13時14分.

參考代碼

public class ForForDemo05 {
    public static void main(String[] args) {
        //1. 定義外循環(huán), 控制小時的變化.
        for (int hour = 0; hour <= 23 ; hour++) {
            //2. 定義內(nèi)循環(huán), 控制分鐘的變換.
            for (int minute = 0; minute <= 59; minute++) {
                System.out.println(hour + "時" + minute + "分");
            }
        }
    }
}

2.5 案例三: 打印矩形

需求

  1. 在控制臺打印一個3行5列的矩形星星序列, 具體格式如下:

    *****
    *****
    *****
    
  2. 要求: 一次只能打印一個"*"

參考代碼

public class ForForDemo06 {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {       //外循環(huán)控制行
            for (int j = 0; j < 5; j++) {   //內(nèi)循環(huán)控制列
                System.out.print("*");      //每次打印一個"*"
            }
            System.out.println();           //內(nèi)循環(huán)執(zhí)行結(jié)束, 意味著一行打印完畢, 記得要換行.
        }
    }
}

2.6 案例四: 打印正三角形

需求

  1. 在控制臺打印一個5行5列的正三角形星星序列, 具體格式如下:

    *
    **
    ***
    ****
    *****
    
  2. 要求: 一次只能打印一個"*"

參考代碼

public class ForForDemo07 {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {       //外循環(huán)控制行
            for (int j = 1; j <= i; j++) {   //內(nèi)循環(huán)控制列
                System.out.print("*");      //每次打印一個"*"
            }
            System.out.println();           //內(nèi)循環(huán)執(zhí)行結(jié)束, 意味著一行打印完畢, 記得要換行.
        }
    }
}

小技巧: 打印正三角形和打印矩形相比: 判斷條件發(fā)生變化.

2.7 案例五: 打印倒三角形

需求

  1. 在控制臺打印一個5行5列的正三角形星星序列, 具體格式如下:

    *****
    ****
    ***
    **
    *
    
  2. 要求: 一次只能打印一個"*"

參考代碼

public class ForForDemo08 {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {       //外循環(huán)控制行
            for (int j = i; j <= 5; j++) {   //內(nèi)循環(huán)控制列
                System.out.print("*");      //每次打印一個"*"
            }
            System.out.println();           //內(nèi)循環(huán)執(zhí)行結(jié)束, 意味著一行打印完畢, 記得要換行.
        }
    }
}

小技巧: 打印倒三角形和打印矩形相比: 初始化條件發(fā)生變化.

2.8 案例六: 打印99乘法表

需求

打印99乘法表, 格式如下:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

參考代碼

public class ForForDemo09 {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {       //外循環(huán)控制行
            for (int j = 1; j <= i; j++) {   //內(nèi)循環(huán)控制列
                //1 * 3 = 3   2 * 3 = 6  3 * 3 = 9
                System.out.print(j + " * " + i + " = " + i * j + "\t");     
            }
            System.out.println();           //內(nèi)循環(huán)執(zhí)行結(jié)束, 意味著一行打印完畢, 記得要換行.
        }
    }
}

3. 帶標(biāo)號的循環(huán)操作

來看一下下面的代碼, 打印結(jié)果是什么呢?

public class ForForDemo10 {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {      //外循環(huán), 控制行.    i的值: 1,   
            for (int j = 1; j <= 5 ; j++) { //內(nèi)循環(huán), 控制列.    j的值: 1,2,3(整個循環(huán)結(jié)束)
                if (j == 3) {
                    break;   //這個break, 是用來結(jié)束哪個循環(huán)呢? 
                }
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

上述的代碼, 打印結(jié)果是一個5行2列的矩形星星圖案, 而我的需求是獲取一個1行2列的星星圖案, 這就意味著, 上述代碼中的break, 只要能直接結(jié)束外循環(huán)即可.

實際開發(fā)中, 為了方便我們操作循環(huán)嵌套中的指定循環(huán), 就需要用到帶標(biāo)號的循環(huán)操作了.

格式

A: for(初始化條件; 判斷條件; 控制條件) {     //外循環(huán)
    B: for(初始化條件; 判斷條件; 控制條件) { //內(nèi)循環(huán)
        循環(huán)體;
    }
}

2.1 案例一: break用法

優(yōu)化上述的代碼, 改為打印一個1行2列的星星圖案.

參考代碼

public class ForForDemo10 {
    public static void main(String[] args) {
        A: for (int i = 1; i <= 5; i++) {      //外循環(huán), 控制行.
            B: for (int j = 1; j <= 5 ; j++) { //內(nèi)循環(huán), 控制列.
                if (j == 3) {
                    break A;   //這個break, 是用來結(jié)束哪個循環(huán)呢?
                }
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

2.9 案例二: continue用法

需求

打印1~100之間所有的質(zhì)數(shù), 并按照3個一行的形式進行輸出.

解釋:

  1. 質(zhì)數(shù)指的是只能被1及它自身整除的數(shù)字. 例如: 2, 3, 5, 7, 11, 13
  2. 最小的質(zhì)數(shù)是2
  3. 該題的目的是演示: 帶標(biāo)號的循環(huán)的continue操作.

參考代碼

public class ForForDemo10 {
    public static void main(String[] args) {
        //打印1~100之間所有的質(zhì)數(shù), 并按照3個一行的形式進行輸出.
        //定義變量, 用來記錄1-100之間的 質(zhì)數(shù)個數(shù).
        int count = 0;
        //定義變量, 用來記錄一行打印幾個數(shù).
        int flag = 3;
        a: for (int i = 2; i < 100; i++) {
            for (int j = 2; j < i ; j++) {
                if (i % j == 0) {
                    //走到這里, 說明i不是質(zhì)數(shù).
                    continue a;
                }
            }
            System.out.print(i + (++count % flag == 0 ? "\r\n" : "\t"));
        }
    }
}

4. 生成隨機數(shù)

4.1 概述

Random類似Scanner橄镜,也是Java提供好的API(Application Programming Interface)臭埋,內(nèi)部提供了產(chǎn)生隨機數(shù)的功能. API后續(xù)課程詳細(xì)講解蛇捌,現(xiàn)在可以簡單理解為Java已經(jīng)寫好的代碼, 我們可以直接拿來用.

4.2 使用步驟

  1. 導(dǎo)入包

    import java.util.Random;
    
  2. 創(chuàng)建隨機數(shù)Random對象.

    Random r = new Random();
    
  3. 調(diào)用方法, 產(chǎn)生隨機數(shù)

    int num = r.nextInt(10); //小括號中可以傳入任意的正整數(shù)
    double num = r.nexDouble();  // [0, 1.0)之間的任意小數(shù)
    boolean num = r.nextBoolean(10); // 生成均等的布爾值
    
    
r.setSeed()
public void setSeed(long seed)

該方法的作用是重新設(shè)置Random對象中的種子數(shù)毕贼。
設(shè)置完種子數(shù)以后的Random對象和相同種子數(shù)使用
new關(guān)鍵字創(chuàng)建出的Random對象相同务漩。

解釋:

  1. 小括號中寫的整數(shù)是生成的隨機數(shù)的上限.
  2. 例如: 小括號中寫10 , 說明生成0~10之間的隨機數(shù), 包含0, 但是不包含10, 即: 包左不包右.
  3. 小括號中必須傳入正整數(shù), 否則會報IllegalArgumentException(非法參數(shù)異常).

4.3 案例一: Random入門

需求

使用Random類拄衰,生成5個10以內(nèi)的隨機整數(shù), 并將結(jié)果打印到控制臺.

參考代碼

import java.util.Random;

public class RandomDemo01 {
    public static void main(String[] args) {
        //1. 創(chuàng)建Random對象.
        Random r = new Random();
        //2. 定義for循環(huán), 用來獲取3個隨機數(shù).
        int num;
        for (int i = 1; i <= 3; i++) {
            //3. 調(diào)用r.nextInt(數(shù)字)方法, 獲取具體的隨機數(shù).
            num = r.nextInt(10);
            System.out.println(num);
        }
    }
}

4.4 案例二: 隨機職業(yè)

需求

  1. 提示用戶錄入他/她的名字并接收.
  2. 通過隨機數(shù), 來打印用戶上輩子的職業(yè).
  3. 0: 宰相, 1: 一品帶刀侍衛(wèi), 2:皇帝, 3: 大內(nèi)總管, 4: 店小二, 5: 江湖郎中

參考代碼

import java.util.Random;
import java.util.Scanner;

public class RandomDemo03 {
    public static void main(String[] args) {
        /*
            1. 提示用戶錄入他/她的名字并接收.
            2. 通過隨機數(shù), 來打印用戶上輩子的職業(yè).
            3. 0: 宰相, 1: 一品帶刀侍衛(wèi), 2:皇帝, 3: 大內(nèi)總管, 4: 店小二, 5: 江湖郎中
         */
        //1. 創(chuàng)建Random類的對象.
        Random r = new Random();
        //2. 提示用戶錄入他/她的名字并接收.
        Scanner sc = new Scanner(System.in);
        System.out.println("請錄入您的姓名, 我來算一下您上輩子的職業(yè): ");
        String name = sc.nextLine();

        //3. 生成一個0-5之間的隨機數(shù).
        int num = r.nextInt(6);
        String occupation = "";
        switch (num) {
            case 0:
                occupation = "宰相";
                break;
            case 1:
                occupation = "一品帶刀侍衛(wèi)";
                break;
            case 2:
                occupation = "皇帝";
                break;
            case 3:
                occupation = "大內(nèi)總管";
                break;
            case 4:
                occupation = "店小二";
                break;
            case 5:
                occupation = "宰相";
                break;
            default:
                System.out.println("江湖郎中");
                break;
        }
        //4. 根據(jù)生成的隨機數(shù), 打印用戶上輩子的職業(yè).
        System.out.println("您好, " + name + ", 經(jīng)過大數(shù)據(jù)分析, 您上輩子的職業(yè)是: " + occupation);
    }
}

4.5 案例三: 猜數(shù)字

需求

  1. 生成一個1-100之間的隨機數(shù), 讓用戶來猜.
  2. 如果猜的數(shù)字比生成的隨機數(shù)大,提示你猜的數(shù)據(jù)大了
  3. 如果猜的數(shù)字比生成的隨機數(shù)小饵骨,提示你猜的數(shù)據(jù)小了
  4. 如果猜的數(shù)字與生成的隨機數(shù)相等翘悉,提示恭喜你猜中了

參考代碼

import java.util.Random;
import java.util.Scanner;

public class RandomDemo02 {
    public static void main(String[] args) {
        //1. 創(chuàng)建Random類的對象.
        Random r = new Random();
        //2. 生成一個隨機數(shù)讓用戶來猜.
        int guessNum = r.nextInt(100) + 1;
        //3. 因為不知道用戶多少次能猜對, 所以用while(true)死循環(huán).
        int inputNum = 0;
        while (true) {
            //4. 提示用戶錄入猜的數(shù)據(jù), 并接收.
            System.out.println("請錄入您猜的數(shù)據(jù)(1-100): ");
            inputNum = new Scanner(System.in).nextInt();
            //5. 比較用戶錄入的數(shù)據(jù) 和 生成的隨機數(shù)是否一致, 并提示.
            if (inputNum > guessNum)
                System.out.println("您猜的數(shù)字大了!");
            else if (inputNum < guessNum)
                System.out.println("您猜的數(shù)字小了");
            else {
                System.out.println("恭喜您, 猜對了, 請找班任領(lǐng)取獎品... 就業(yè)班晉級卡");
                break;
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市居触,隨后出現(xiàn)的幾起案子妖混,更是在濱河造成了極大的恐慌,老刑警劉巖轮洋,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件制市,死亡現(xiàn)場離奇詭異,居然都是意外死亡弊予,警方通過查閱死者的電腦和手機祥楣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汉柒,“玉大人荣堰,你說我怎么就攤上這事〗叽洌” “怎么了振坚?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斋扰。 經(jīng)常有香客問我渡八,道長啃洋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任屎鳍,我火速辦了婚禮宏娄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逮壁。我一直安慰自己孵坚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布窥淆。 她就那樣靜靜地躺著卖宠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忧饭。 梳的紋絲不亂的頭發(fā)上扛伍,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音词裤,去河邊找鬼刺洒。 笑死,一個胖子當(dāng)著我的面吹牛吼砂,可吹牛的內(nèi)容都是我干的逆航。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼渔肩,長吁一口氣:“原來是場噩夢啊……” “哼纸泡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赖瞒,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤女揭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后栏饮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吧兔,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年袍嬉,在試婚紗的時候發(fā)現(xiàn)自己被綠了境蔼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡伺通,死狀恐怖箍土,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罐监,我是刑警寧澤吴藻,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站弓柱,受9級特大地震影響沟堡,放射性物質(zhì)發(fā)生泄漏侧但。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一航罗、第九天 我趴在偏房一處隱蔽的房頂上張望禀横。 院中可真熱鬧,春花似錦粥血、人聲如沸柏锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趾娃。三九已至,卻和暖如春蜓耻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背械巡。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工刹淌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讥耗。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓有勾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親古程。 傳聞我的和親對象是個殘疾皇子蔼卡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容