day07_Java中的流程控制(循环结构丶break丶continue)

循环概述

循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。

循环组成

  • 初始化表达式:用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
  • 循环条件:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
  • 循环体:用于表示循环反复执行的内容,简单说就是循环反复执行的事情
  • 步进表达式:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去

for循环

格式

执行流程

  • 第一步:执行初始化语句①,完成循环变量的初始化;

  • 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;

    • 如果是true,执行第三步;

    • 如果是false,循环语句中止,循环不再执行。

  • 第三步:执行循环体语句③

  • 第四步:执行迭代语句④,针对循环变量重新赋值

  • 第五步:根据循环变量的新值,重新从第二步开始再执行一遍

图解分析:

注意事项:

  • for(;;)中的两个;是不能多也不能少
  • 循环条件必须是boolean类型
  • 如果循环条件语句②省略的话,就默认为循环条件成立

代码示例

/*
需求:
    在控制台输出所有的“水仙花数”及总个数

解释:什么是水仙花数?
    水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数
    例如 153 3*3*3 + 5*5*5 + 1*1*1 = 27 + 125 + 1 = 153
 */
public class Demo03For {
    public static void main(String[] args) {
        //1.定义int变量count,初始值0,作用是统计水仙花数字的个数
        int count = 0;

        //2.使用for循环遍历获取所有的三位数字,每个数字保存到int变量num中
        for (int num = 100; num <= 999; num++) {
            //2.1计算num中数字的个位,十位,百位 分别保存到3个int变量ge(个位),shi(十位),bai(百位)中
            int ge = num % 10;//个位
            int shi = num / 10 % 10;//十位
            int bai = num / 100 % 10;//百位
            //2.2计算个位,十位,百位数字的立方和,保存到int变量sum中
            //2.3判断如果三位数字num 等于 每位数字的立方和sum
            if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == num) {
                //输出该数字num
                System.out.println(num);
                //同时计数器count的值增加1
                count++;
            }
        }
        //3.for循环结束后,打印count的值
        System.out.println("水仙花数字总共有: " + count + " 个");
    }
}

while循环

格式:

执行流程:

  • 第一步:执行初始化语句①,完成循环变量的初始化;

  • 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;

    • 如果是true,执行第三步;

    • 如果是false,循环语句中止,循环不再执行。

  • 第三步:执行循环体语句③

  • 第四步:执行迭代语句④,针对循环变量重新赋值

  • 第五步:根据循环变量的新值,重新从第二步开始再执行一遍

图解分析

 

 

注意事项:

  • while(循环条件)中循环条件必须是boolean类型

代码示例

package demo04;

/*
需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度
是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
 */
public class Demo05While {
    public static void main(String[] args) {
        //定义一个计数器,初始值为0
        int count = 0;
        //定义纸张厚度
        double paper = 0.1;
        //定义珠穆朗玛峰的高度
        int zf = 8844430;
        //因为要反复折叠,所以要使用循环,但是不知道折叠多少次,这种情况下更适合使用while循环
        // 折叠的过程中当纸张厚度大于珠峰就停止了,因此继续执行的要求是纸张厚度小于珠峰高度
        while (paper <= zf) {
            //循环的执行过程中每次纸张折叠,纸张的厚度要加倍
            paper *= 2;
            //在循环中执行累加,对应折叠了多少次
            count++;
        }
        //打印计数器的值
        System.out.println("需要折叠:" + count + "次");//需要折叠:27次
    }
}

do...while循环

格式:

注意事项:

  • while(循环条件)中循环条件必须是boolean类型
  • do{}while();最后有一个分号
  • do...while结构的循环体语句是至少会执行一次,这个和for和while是不一样的

执行流程:

  • 第一步:执行初始化语句①,完成循环变量的初始化;

  • 第二步:执行循环体语句②;

  • 第三步:执行迭代语句③,针对循环变量重新赋值;

  • 第四步:执行循环条件语句④,看循环条件语句的值是true,还是false;

    • 如果是true,根据循环变量的新值,重新从第二步开始再执行一遍;

    • 如果是false,循环语句中止,循环不再执行。

代码示例

   /*
    输入密码和确认密码,如果两次密码一致则显示注册成功,两次密码不一致则提示重新输入
    */
    Scanner input = new Scanner(System.in);
    String pwdOne = "";
    String pwdTwo = "";
    do{
        System.out.println("请输入密码");
        pwdOne = input.next();
        System.out.println("请输入确认密码");
        pwdTwo = input.next();
        if(!pwdOne.equals(pwdTwo)){
            System.out.println("两次密码不一致,请重新输入");
        }
    }while(!pwdOne.equals(pwdTwo));


    System.out.println("注册成功");

循环语句的区别

从循环次数角度分析

  • do...while循环至少执行一次循环体语句
  • for和while循环先循环条件语句是否成立,然后决定是否执行循环体,至少执行零次循环体语句

从循环变量的生命周期角度分析

  • for循环的循环变量在for()中声明的,在循环语句结束后,不可以被访问;
  • while和do...while循环的循环变量因为在外面声明的,所以while和do...while结束后可以被继续使用的;

如何选择

  • 遍历有明显的循环次数(范围)的需求,选择for循环
  • 遍历没有明显的循环次数(范围)的需求,循环while循环
  • 如果循环体语句块至少执行一次,可以考虑使用do...while循环

本质上:三种循环之间是可以互相转换的,都能实现循环的功能

三种循环结构都具有四要素:

  • 循环变量的初始化表达式
  • 循环条件
  • 循环变量的修改的迭代表达式
  • 循环体语句块

死循环

也就是循环中的条件永远为true,死循环的是永不结束的循环。例如:while(true){}。 在后期的开发中,会出现使用死循环的场景,例如:我们需要读取用户输入的输入,但是用户输入多少数据我们 并不清楚,也只能使用死循环,当用户不想输入数据了,就可以结束循环了,如何去结束一个死循环呢,就需要使用到跳出语句了

死循环格式:

/*
            (1)for循环的死循环格式      
                for(;;){循环体}

            (2)while循环的死循环格式        
                while(true){循环体}

            (3)do-while循环的死循环格式
                do{
                   循环体
                }while(true);
 */

break控制语句

使用场景

  • 使用在switch语句中,用来结束switch语句,执行switch语句后面的其它语句
  • 使用在循环中,用来结束循环(1.本次循环的循环体中break后面的代码不再执行 2.剩余次数的循环也不再执行),执行循环后面的其它语句
  • break不能使用在出switch和循环语句以外的其它位置

代码示例

public class Demo01Break {
    public static void main(String[] args) {
        System.out.println("顾客获取到了购买的四个包子..........");
        for (int num = 1; num <= 4; num++) {
            /*
                当num的值为2时,num == 2 --> true,if后面()中是true,执行if后面{}中的内容,
                首先: 执行输出语句
                其次: 执行break,一旦执行break,本次循环的循环体中break后面的代码不再执行,
                剩余次数的循环也不再执行,直接从循环中跳出到循环后面的其它代码继续执行

             */
            if (num == 2) {
                System.out.println("发现2号包子上有个大家伙(小强),2号(及剩余所有)包子不能吃了,找老板投诉");
                break;
            }
            System.out.println("顾客吃第" + num + "个包子......");
        }
        System.out.println("顾客投诉: 这是神马包子,岂有此理.老板: 非常抱歉,赔偿100000元~~~~~");
    }
}

图解分析:

案例:

//从键盘输入不断输入整数,输入0表示结束,统计一共有几个正数、负数。
public class Demo02Break {
    public static void main(String[] args) {
        java.util.Scanner input = new java.util.Scanner(System.in);

        int positive = 0;
        int negative = 0;
        while (true) {
            System.out.print("请输入整数(0)结束:");
            int num = input.nextInt();
            if (num == 0) {
                break;
            } else if (num > 0) {
                positive++;
            } else {
                negative++;
            }
        }
        System.out.println("正数:" + positive + ",负数:" + negative);
    }
}

循环标号:

如果需要告诉break跳出指定的循环,可以给其起一个标号,例如:

import java.util.Scanner;

public class Test {
      /*        需求:程序运行后,用户可多次查询星期对应的减肥计划,直到输入0,程序结束
             步骤:
                1. 不明确用户操作几次, 使用死循环包裹业务逻辑
                2. 匹配到0的时候,使用break结束循环死循环​
               */
    public static void main(String[] args) {
        lo:
        while (true) {
            System.out.println("请输入您要查看的星期数:");
            System.out.println("(如无需继续查看,请输入0退出程序)");
            // 1. 键盘录入星期数据,使用变量接收
            Scanner sc = new Scanner(System.in);
            int week = sc.nextInt();
            // 2. 多情况判断,采用switch语句实现
            switch (week) {
                // 3. 在不同的case中,输出对应的减肥计划
                case 0:
                    System.out.println("感谢您的使用");
                    break lo;
                case 1:
                    System.out.println("跑步");
                    break;
                case 2:
                    System.out.println("游泳");
                    break;
                case 3:
                    System.out.println("慢走");
                    break;
                case 4:
                    System.out.println("动感单车");
                    break;
                case 5:
                    System.out.println("拳击");
                    break;
                case 6:
                    System.out.println("爬山");
                    break;
                case 7:
                    System.out.println("好好吃一顿");
                    break;
                default:
                    System.out.println("您的输入有误");
                    break;
            }
        }
    }
}

continue控制语句

使用场景:

  • 只能使用在循环中,作用是提前结束本次循环,继续进行下一次循环
  • 不能使用在除循环结构中的其它位置
代码示例
package demo05;

public class Demo03Continue {
    public static void main(String[] args) {
        System.out.println("顾客获取到了购买的四个包子..........");
        for (int num = 1; num <= 4; num++) {
            /*
                当num的值为2时,num == 2 --> true,if后面()中是true,执行if后面{}中的内容,
                首先: 执行输出语句
                其次: 执行continue,一旦执行continue,本次循环的循环体中continue后面的代码不再执行,
                继续执行下一次循环的步进表达式
                总结: continue的作用提前结束本次循环,继续进行下一次循环

             */
            if (num == 2) {
                System.out.println("把第2个包子弄脏了,不能吃第2个包子了,继续吃其它包子...");
                continue;
            }
            System.out.println("顾客吃第" + num + "个包子......");
        }
        System.out.println("找老板结账,交钱400块,老板说: 欢迎下次光临....");
    }
}

图解分析:

案例:

public class Demo04Continue {
    public static void main(String[] args) {
        //打印1-100之间的整数,跳过7的倍数和7结尾的数
        for (int i = 1; i <= 100; i++) {
            if (i % 7 == 0 || i % 10 == 7) {
                continue;
            }
            System.out.println(i);
        }
    }
}

​如果需要告诉continue提前结束指定的循环,继续进行下一次循环,可以给其起一个标号,使用方式和break是一样的。这里代码就不演示了。。

循环嵌套

  • 所谓嵌套循环,是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。总共的循环次数=外循环次数*内循环次数。当然可以是三种循环任意互相嵌套。

for循环相互嵌套格式

编辑

嵌套循环执行流程:

  • 执行顺序:①②③④⑤⑥>④⑤⑥>⑦②③④⑤⑥>④⑤⑥
  • 外层循环执行1次,内层循环执行完整的(从初始化表达式开始)一遍

图解分析:

代码示例

public class Demo05ForFor {
    public static void main(String[] args) {
        //打印2021年至2023年月份
        // 年份是外循环,3年;月份是内循环,12月
        for (int i = 2021; i <= 2023; i++) {
            for (int j = 1; j <= 12; j++) {
                //不换行打印星号
                System.out.print(i + "年" + j + "月 ");
            }
            //内循环打印12个月后,需要一次换行
            System.out.println();
        }
    }
}

 

posted @ 2022-06-26 15:09  我的脚印  阅读(33)  评论(0)    收藏  举报