Java基础(3)循环嵌套及break、continue

今日大纲

  • 掌握循环跳转语句break和continue的用法
  • 掌握循环嵌套相关案例
  • 掌握Random类的用法
  • 掌握猜数字案例

1. 循环跳转

1.1 概述

有些时候, 我们想提前终止循环的执行, 或者跳过循环的某一次执行, 例如: 打印1~10之间, 所有不是3倍数的数字, 或者采用死循环让用户不断的录入他/她的账号和密码, 直到用户录入正确, 再终止循环. 这些都要用到循环控制跳转知识点.

1.2 分类

  • break: 是用来终止循环的, 循环不再继续执行.
  • continue: 用来结束本次循环, 进行下一次循环的, 循环还会继续执行.

1.3 案例一: break入门

需求
打印10次HelloWorld, 当打印第五次的时候, 结束循环.

参考代码

//案例: 打印10次`HelloWorld`,  当打印第五次的时候, 结束循环.
public class BreakDemo01 {
    public static void main(String[] args) {
        System.out.println("start");
        //1. 定义for循环, 打印10次HelloWorld
        for (int i = 1; i <= 10 ; i++) {
            //2.当i等于5的时候, 结束循环
            if (i == 5)
                break;
            System.out.println("Hello World! " + i);
        }
        System.out.println("end");
    }
}

图解

1.4 案例二: continue入门

需求

打印1~10之间, 所有不是3倍数的整数.

参考代码

//案例; 打印1~10之间, 所有不是3倍数的整数.
public class ContinueDemo02 {
    public static void main(String[] args) {
        System.out.println("start");
        //1. 通过for循环, 获取1 - 10之间所有的整数
        for (int i = 1; i <= 10; i++) {
            //2. 判断该数字是否是3的倍数.
            if (i % 3 == 0)
                //3. 如果是, 就结束本次循环
                continue;
            //4. 如果不是, 就打印该数字的值.
            System.out.println(i);
        }
        System.out.println("end");
    }
}

图解

2. 循环嵌套

所谓的循环嵌套指的是循环结构中还包裹着循环结构, 外边的循环结构叫外循环, 里边的循环结构叫内循环.

2.1 格式

循环嵌套用的最多的就是for循环的嵌套, 具体格式如下:

for(初始化条件; 判断条件; 控制条件) {        //外循环, 例如: 5   1      2
   for(初始化条件; 判断条件; 控制条件) {     //内循环, 例如: 3   1,2,3  1,2,3
      //循环体;
   }
}

2.2 执行流程

  1. 外循环执行一次, 内循环执行一圈.
  2. 循环嵌套的总执行次数 = 外循环的次数 * 内循环的次数.

例如:

  1. 现实世界中的年月关系, 即: 1年 = 12个月
  2. 现实世界中的时分, 分秒关系, 即: 1小时 = 60分钟, 1分钟=60秒.

2.3 案例一: 打印年月

需求

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

参考代码

  • 复杂写法

    //案例: 打印年月
    public class ForForDemo04 {
        public static void main(String[] args) {
            //1. 定义循环, 打印2021年所有的月份
            for (int j = 1; j <= 12 ; j++) {
                System.out.print("2021年" + j + "月\t");
            }
            System.out.println();   //记得加换行
    
            //2. 定义循环, 打印2022年所有的月份
            for (int j = 1; j <= 12 ; j++) {
                System.out.print("2022年" + j + "月\t");
            }
            System.out.println();   //记得加换行
    
            //3. 定义循环, 打印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. 定义外循环, 控制年份的变化.
            for (int i = 2020; i <= 2023 ; i++) {       //外循环执行一次, 内循环执行一圈.
                System.out.println("start");
                //变量i的取值: 2021, 2022, 2023
                //2. 定义内循环, 控制月份的变化.
                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天内的所有时间, 格式: 13时14分.

参考代码

public class ForForDemo05 {
    public static void main(String[] args) {
        //1. 定义外循环, 控制小时的变化.
        for (int hour = 0; hour <= 23 ; hour++) {
            //2. 定义内循环, 控制分钟的变换.
            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++) {       //外循环控制行
            for (int j = 0; j < 5; j++) {   //内循环控制列
                System.out.print("*");      //每次打印一个"*"
            }
            System.out.println();           //内循环执行结束, 意味着一行打印完毕, 记得要换行.
        }
    }
}

2.6 案例四: 打印正三角形

需求

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

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

参考代码

public class ForForDemo07 {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {       //外循环控制行
            for (int j = 1; j <= i; j++) {   //内循环控制列
                System.out.print("*");      //每次打印一个"*"
            }
            System.out.println();           //内循环执行结束, 意味着一行打印完毕, 记得要换行.
        }
    }
}

小技巧: 打印正三角形和打印矩形相比: 判断条件发生变化.

2.7 案例五: 打印倒三角形

需求

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

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

参考代码

public class ForForDemo08 {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {       //外循环控制行
            for (int j = i; j <= 5; j++) {   //内循环控制列
                System.out.print("*");      //每次打印一个"*"
            }
            System.out.println();           //内循环执行结束, 意味着一行打印完毕, 记得要换行.
        }
    }
}

小技巧: 打印倒三角形和打印矩形相比: 初始化条件发生变化.

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++) {       //外循环控制行
            for (int j = 1; j <= i; j++) {   //内循环控制列
                //1 * 3 = 3   2 * 3 = 6  3 * 3 = 9
                System.out.print(j + " * " + i + " = " + i * j + "\t");     
            }
            System.out.println();           //内循环执行结束, 意味着一行打印完毕, 记得要换行.
        }
    }
}

3. 带标号的循环操作

来看一下下面的代码, 打印结果是什么呢?

public class ForForDemo10 {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {      //外循环, 控制行.    i的值: 1,   
            for (int j = 1; j <= 5 ; j++) { //内循环, 控制列.    j的值: 1,2,3(整个循环结束)
                if (j == 3) {
                    break;   //这个break, 是用来结束哪个循环呢? 
                }
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

上述的代码, 打印结果是一个5行2列的矩形星星图案, 而我的需求是获取一个1行2列的星星图案, 这就意味着, 上述代码中的break, 只要能直接结束外循环即可.

实际开发中, 为了方便我们操作循环嵌套中的指定循环, 就需要用到带标号的循环操作了.

格式

A: for(初始化条件; 判断条件; 控制条件) {     //外循环
    B: for(初始化条件; 判断条件; 控制条件) { //内循环
        循环体;
    }
}

2.1 案例一: break用法

优化上述的代码, 改为打印一个1行2列的星星图案.

参考代码

public class ForForDemo10 {
    public static void main(String[] args) {
        A: for (int i = 1; i <= 5; i++) {      //外循环, 控制行.
            B: for (int j = 1; j <= 5 ; j++) { //内循环, 控制列.
                if (j == 3) {
                    break A;   //这个break, 是用来结束哪个循环呢?
                }
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

2.9 案例二: continue用法

需求

打印1~100之间所有的质数, 并按照3个一行的形式进行输出.

解释:

  1. 质数指的是只能被1及它自身整除的数字. 例如: 2, 3, 5, 7, 11, 13
  2. 最小的质数是2
  3. 该题的目的是演示: 带标号的循环的continue操作.

参考代码

public class ForForDemo10 {
    public static void main(String[] args) {
        //打印1~100之间所有的质数, 并按照3个一行的形式进行输出.
        //定义变量, 用来记录1-100之间的 质数个数.
        int count = 0;
        //定义变量, 用来记录一行打印几个数.
        int flag = 3;
        a: for (int i = 2; i < 100; i++) {
            for (int j = 2; j < i ; j++) {
                if (i % j == 0) {
                    //走到这里, 说明i不是质数.
                    continue a;
                }
            }
            System.out.print(i + (++count % flag == 0 ? "\r\n" : "\t"));
        }
    }
}

4. 生成随机数

4.1 概述

Random类似Scanner,也是Java提供好的API(Application Programming Interface),内部提供了产生随机数的功能. API后续课程详细讲解,现在可以简单理解为Java已经写好的代码, 我们可以直接拿来用.

4.2 使用步骤

  1. 导入包

    import java.util.Random;
    
  2. 创建随机数Random对象.

    Random r = new Random();
    
  3. 调用方法, 产生随机数

    int num = r.nextInt(10); //小括号中可以传入任意的正整数
    double num = r.nexDouble();  // [0, 1.0)之间的任意小数
    boolean num = r.nextBoolean(10); // 生成均等的布尔值
    
    
r.setSeed()
public void setSeed(long seed)

该方法的作用是重新设置Random对象中的种子数。
设置完种子数以后的Random对象和相同种子数使用
new关键字创建出的Random对象相同。

解释:

  1. 小括号中写的整数是生成的随机数的上限.
  2. 例如: 小括号中写10 , 说明生成0~10之间的随机数, 包含0, 但是不包含10, 即: 包左不包右.
  3. 小括号中必须传入正整数, 否则会报IllegalArgumentException(非法参数异常).

4.3 案例一: Random入门

需求

使用Random类,生成5个10以内的随机整数, 并将结果打印到控制台.

参考代码

import java.util.Random;

public class RandomDemo01 {
    public static void main(String[] args) {
        //1. 创建Random对象.
        Random r = new Random();
        //2. 定义for循环, 用来获取3个随机数.
        int num;
        for (int i = 1; i <= 3; i++) {
            //3. 调用r.nextInt(数字)方法, 获取具体的随机数.
            num = r.nextInt(10);
            System.out.println(num);
        }
    }
}

4.4 案例二: 随机职业

需求

  1. 提示用户录入他/她的名字并接收.
  2. 通过随机数, 来打印用户上辈子的职业.
  3. 0: 宰相, 1: 一品带刀侍卫, 2:皇帝, 3: 大内总管, 4: 店小二, 5: 江湖郎中

参考代码

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

public class RandomDemo03 {
    public static void main(String[] args) {
        /*
            1. 提示用户录入他/她的名字并接收.
            2. 通过随机数, 来打印用户上辈子的职业.
            3. 0: 宰相, 1: 一品带刀侍卫, 2:皇帝, 3: 大内总管, 4: 店小二, 5: 江湖郎中
         */
        //1. 创建Random类的对象.
        Random r = new Random();
        //2. 提示用户录入他/她的名字并接收.
        Scanner sc = new Scanner(System.in);
        System.out.println("请录入您的姓名, 我来算一下您上辈子的职业: ");
        String name = sc.nextLine();

        //3. 生成一个0-5之间的随机数.
        int num = r.nextInt(6);
        String occupation = "";
        switch (num) {
            case 0:
                occupation = "宰相";
                break;
            case 1:
                occupation = "一品带刀侍卫";
                break;
            case 2:
                occupation = "皇帝";
                break;
            case 3:
                occupation = "大内总管";
                break;
            case 4:
                occupation = "店小二";
                break;
            case 5:
                occupation = "宰相";
                break;
            default:
                System.out.println("江湖郎中");
                break;
        }
        //4. 根据生成的随机数, 打印用户上辈子的职业.
        System.out.println("您好, " + name + ", 经过大数据分析, 您上辈子的职业是: " + occupation);
    }
}

4.5 案例三: 猜数字

需求

  1. 生成一个1-100之间的随机数, 让用户来猜.
  2. 如果猜的数字比生成的随机数大,提示你猜的数据大了
  3. 如果猜的数字比生成的随机数小,提示你猜的数据小了
  4. 如果猜的数字与生成的随机数相等,提示恭喜你猜中了

参考代码

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

public class RandomDemo02 {
    public static void main(String[] args) {
        //1. 创建Random类的对象.
        Random r = new Random();
        //2. 生成一个随机数让用户来猜.
        int guessNum = r.nextInt(100) + 1;
        //3. 因为不知道用户多少次能猜对, 所以用while(true)死循环.
        int inputNum = 0;
        while (true) {
            //4. 提示用户录入猜的数据, 并接收.
            System.out.println("请录入您猜的数据(1-100): ");
            inputNum = new Scanner(System.in).nextInt();
            //5. 比较用户录入的数据 和 生成的随机数是否一致, 并提示.
            if (inputNum > guessNum)
                System.out.println("您猜的数字大了!");
            else if (inputNum < guessNum)
                System.out.println("您猜的数字小了");
            else {
                System.out.println("恭喜您, 猜对了, 请找班任领取奖品... 就业班晋级卡");
                break;
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,273评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,349评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,709评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,520评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,515评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,158评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,755评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,660评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,203评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,287评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,427评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,122评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,801评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,272评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,393评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,808评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,440评论 2 359

推荐阅读更多精彩内容