• 十二、流程控制-循环


    ——————————————————————————————————————————————————

    1.while循环语句★

    while语句也称条件判断语句,它的循环方式是利用一个条件来控制是否要继续反复执行这个语句。语法如下:

       while(条件表达式){
               语句序列
        }
    
    • 1
    • 2
    • 3

    当条件表达式的返回值为真时,则执行“{}”中的语句,当执行完“{}”中的语句后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。

    在这里插入图片描述

    例:计算1-1000的相加结果。

    创建GetSum类,在主方法中通过while循环计算1~1000相加的和并输出最终的相加结果。

    在这里插入图片描述

    在这里插入图片描述

    注意:初学者经常犯的错误就是在while表达式括号后加;
    while(x == 5);
    System.out.println(“x的值为5”);

    这时程序会认为要执行一条空语句,而进入无限循环,java编译器又不会报错,这样会浪费很多调试时间。

    ——————————————————————————————————————————————————

    2.do…while语句

    do…while循环语句与while循环语句类似,它们之间的区别是,while语句先判断条件是否成立再执行循环体,而do…while循环语句则先执行一次循环后,再判断条件是否成立。也就是说,do…while循环语句“{}”中的程序段至少要被执行一次。语法如下:

       do {
             语句序列
       }while(条件表达式);
    
    • 1
    • 2
    • 3

    do…while语句与while语句的一个明显区别是,do…while语句在结尾处多了一个分号。

    例:使用do…while语句进行用户登录验证。

    创建LoginService类,首先提示用户输入6位密码,然后使用Scanner扫描器类获取用户输入的密码,最后进入do…while语句中进行循环,以判断用户输入的密码是否正确,如果用户输入的密码不是“931567”,则让用户反复输入,直到输入正确的密码。

    在这里插入图片描述
    首先执行do{}里面的语句,在进行条件判断,成立的话就执行循环。

    在这里插入图片描述

    ——————————————————————————————————————————————————

    3.for循环语句★

    for循环是Java程序设计中最有用的循环语句之一。一个for循环可以用来重复执行某条语句,直到某个条件得到满足。for循环有两种语句,一种是传统的for语句,另一种是foreach语句。

    ——————————————————————————————————————————————————

    3.1.传统for语句

    传统的for语句中有3个表达式,其语法如下:

       for (表达式1;表达式2;表达式3) {
                 语句序列
       }
    
    • 1
    • 2
    • 3

    表达式1:初始化表达式,负责完成变量的初始化。

    表达式2:它是循环条件表达式,该表达式的值为boolean型,该值指定循环条件。等同于while循环里的表达式。

    表达式3:每次循环结束后执行的语句,通常用来改变循环条件。

    在执行for循环时,首先执行表达式1,完成某一变量的初始化工作;下一步判断表达式2的值,若表达式2的值为true,则进入循环体;在执行完循环体后紧接着计算表达式3,这部分通常是增加或减少循环控制变量的一个表达式。这样一轮循环就结束了。第二轮循环从计算表达式2开始,若表达式2返回true,则继续循环,否则跳出整个for语句。

    在这里插入图片描述

    例:使用for循环,计算2~~100的所有偶数之和。

    创建Circulate类,编写程序,使用for循环语句计算2~100的所有偶数的和并输出相加后的结果。

    在这里插入图片描述

    在这里插入图片描述

    ——————————————————————————————————————————————————

    3.2.foreach语句

    oreach语句是for语句的特殊简化版本,不能完全取代for语句,但任何foreach语句都可以被改写为for语句版本。foreach并不是一个关键字,习惯上将这种特殊的for语句格式称为foreach语句。foreach语句在遍历数组等方面为程序员提供了很大的方便。

       for (元素类型 x:遍历对象obj) {
                 引用了x的java语句;
          }
    
    • 1
    • 2
    • 3

    对于foreach语句中的元素变量x,不必对其进行初始化。

    例:使用foreach语句遍历整型数组。

    创建类Repetition,在主方法中定义一维数组,并用foreach语句遍历该数组。

    在这里插入图片描述

    在这里插入图片描述

    ——————————————————————————————————————————————————

    4.循环嵌套★

    循环有3种,即while、do…while和for,这3种循环可以相互嵌套。

    例如,在for循环中套用for循环的代码如下:

       for (....){
                for(...)}
                .....
           }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在while循环中套用while循环的代码如下:

       while (....){
                while(...)}
                .....
           }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在while循环中套用for循环的代码如下:

       while (....){
                for(...)}
                .....
           }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    例:使用嵌套for循环输出乘法口诀表。

    创建Multiplication类,使用嵌套for循环实现在控制台上输出乘法口诀表。

    在这里插入图片描述

    在这里插入图片描述

    这个结果是如何得出来?,最外层的循环负责控制输出的行数,i从1到9。当i=1时,输出第一行,然后进入内层循环,这里的j是循环变量,循环的次数与i的值相同,所以使用"j < i + 1"来控制,内层循环的次数决定本行有几列,所以先输出j的值,然后在输出*号,在输出i的值,最后输出j的结果。内层循环执行完毕,输出换行,开始下一行的循环。

    System.out.print 与 System.out.println 都用来打印内容到控制台。区别:

    System.out.print 打印完不换行。(参数)参数不能为空,必须有。在print(“\n”)可以达到和println一样的效果。
    System.out.println 打印完会多追加一个换行符。(可以不写参数)

    详细过程如下:

    当程序遇到嵌套循环体,如果外层循环的循环条件允许,则开始执行外层循环的循环体,而内层循环将被外层循环体来执行,只是内层循环体需要反复执行自己的循环体。当内层循环体执行结束,则再次计算外层循环体的循环条件,决定是否再次执行外层循环体。

    外层循环体:for (i = 1 ; i < 10; i++)
    初始变量i=1,当i<10的时候执行代码块,执行后i自增。
    内层循环体:for (j = 1; j < i + 1 ; j++)
    初始变量j=1,当j

    1、外层循环体,i=1,1<10,条件成立,执行内层循环,j=1,j

    2、外层循环执行后,i自增,i=2,i<10,条件成立,执行内层循环。J=1,J

    3、外层循环体执行后,i自增,i=3,i<10,条件成立,执行内层循环,j=1,J输出后J自增,J=2,判断J + " * " + i)2×3=6。输出后J自增,J=3,判断j

    依次类推…

    输出格式:
    1 * 1=1 (退回外层循环,回车)
    1 * 2=2 (\t) 2 * 2=4(\t) (退回外层循环,回车)
    1 * 3=3 (\t) 2 * 3=6(\t) 3 * 3=9(\t) (退回外层循环,回车)
    依次类推…

    ——————————————————————————————————————————————————

    训练一:细胞分裂实验

    生物实验室做单细胞细菌繁殖实验,每一代细菌数量都会成倍数增长,一代菌落中只有一个细菌,二代菌落中的细胞经分裂变成两个细菌,三代菌落中的细胞经分裂变成4个细菌,以此类推,请计算第十代菌落中的细菌数量。

    思路:一代~~10代,定义个变量int a = 1,循环条件:a <=10 , 从1代循环到10代。 使用while循环,以一个条件来反复判断。

    在定义b菌落的值 int b = 1,每循环依次菌落就翻倍。

    在这里插入图片描述

    ——————————————————————————————————————————————————

    训练二:斐波那契数列

    1, 1, 2, 3, 5, 8, 13, 21, 34, …是一组典型的斐波那契数列,前两个数相加等于第三个数。那么请问这组数中的第n个数的值是多少?

    先要搞清楚这个斐波那契数列是什么东西?

    斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……其规律很明显,从第3个数开始,每个数都等于它前两个数的和。

    确定了第一个数和第二个数都是1,从第三个数开始循环,进行前两个数相加求和,每次相加之后更新a和b,得出c。

    在这里插入图片描述

    ——————————————————————————————————————————————————

    5.循环控制★

    循环控制包含两方面的内容,一方面是控制循环变量的变化方式,另一方面是控制循环的跳转。

    控制循环的跳转需要使用break和continue两个关键字,这两条跳转语句的跳转效果不同,break语句是中断循环,continue语句是执行下一次循环。

    ——————————————————————————————————————————————————

    5.1.break语句★

    使用break语句可以跳出switch结构。在循环结构中,同样也可用break语句跳出当前循环体,从而中断当前循环。

    例:输出1~20出现的第一个偶数

    创建BreakTest类,循环输出1~20的偶数值,在遇到第一个偶数时,使用break语句结束循环。

    在这里插入图片描述

    在这里插入图片描述

    在循环嵌套情况下,break语句将只会使程序流程跳出包含它的最内层的循环结构,即只跳出一层循环。

    如果想让break跳出外层循环,Java提供了“标签”的功能,语法如下:

       标签名:循环体{
                  break标签名;
       }
    
    • 1
    • 2
    • 3

    标签名:任意标识符。
    循环体:任意循环语句。
    break标签名:break跳出指定的循环体,此循环体的标签名必须与break的标签名一致。

    带有标签的break可以指定跳出的循环,这个循环可以是内层循环,也可以是外层循环。

    例:使用标签让break结束外层循环

    创建BreakInsideNested类,在该类中写两层for循环,第一层for语句循环3次,第二层for语句循环5次。当第二层for语句循环至第4次时,强行用break中断循环。输出程序执行时外层循环和内层循环各循环了多少次。

    在这里插入图片描述

    在这里插入图片描述

    从这个运行结果中可以看到以下内容。

    循环中的if语句判断:当b等于4时,执行break语句,中断了内层的循环,所以输出的b值最大到3为止。

    外层的循环没有受任何影响,输出的i值最大为3,正是for循环设定的最大值。

    ——————————————————————————————————————————————————

    5.2.标签★

    现在修改这段代码,给外层循环添加一个名为Loop的标签,让内层循环结束外层循环,再查看运行结果。

    在这里插入图片描述

    在这里插入图片描述

    从这个结果中可以看出,当b的值等于4时,直接结束外层循环,a的值不再增加。

    ——————————————————————————————————————————————————

    6.continue语句★

    continue语句是针对break语句的补充。continue不是立即跳出循环体,而是跳过本次循环,回到循环的条件测试部分,重新开始执行循环。

    在for循环语句中遇到continue后,首先执行循环的增量部分,然后进行条件测试。在while和do…while循环中,continue语句使控制直接回到条件测试部分。

    例:输出1~20的奇数

    创建ContinueTest类,编写一个for循环从1循环至20,如果当前循环的次数为偶数,则使用continue语句跳过循环。

    在这里插入图片描述

    在这里插入图片描述

    与break语句一样,continue也支持标签功能,语法如下:

       标签名:循环体{
                  continue标签名;
       }
    
    • 1
    • 2
    • 3

    ——————————————————————————————————————————————————

    训练三:蜗牛爬井

    有一口井,深10米,一只蜗牛从井底向井口爬,白天向上爬2米,晚上向下滑1米,问多少天可以爬到井口?

    定义长度变量和天数的变量。

    int a = 0;
    int day = 1;

    循环 while判断,为真
    a = a + 2, 长度加2米(白天)。
    if判断,如果2米大于等于10,a >=10,那么中断。

    a长度减去1,
    日期+1。

    ——————————————————————————————————————————————————

    训练四:剧院售票

    某剧院发售演出门票,演播厅观众席有4行,每行有10个座位。为了不影响观众视角,在发售门票时,屏蔽掉最左一列和最右一列的座位。请编写程序,结合本节知识点模拟整个售票过程。

  • 相关阅读:
    域名解析中的A记录和CNAME什么意思
    Spring Boot日志文件
    Labs‘Codes review(AVR)(2)
    【ARM Coresight 系列文章 21 -- SoC-400 介绍 】
    Redis key分布
    java编程之多线程实战指南(设计模式篇),从基础到避坑
    Java框架 SpringMVC处理ajax请求
    Qt 把.exe打包成安装文件形式
    Prometheus Operator 配置PrometheusRule告警规则
    牛客网刷题记录 || C++入门
  • 原文地址:https://blog.csdn.net/u012451051/article/details/133185096