• 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)

  • 相关阅读:
    [GDKOI2010] 圈地计划(网络流)
    jzoj3454 表白(love)解题报告(01分数规划+DP)
    数论之卢卡斯定理
    POJ1180 Batch Scheduling 解题报告(斜率优化)
    BZOJ 球形空间产生器 解题报告(高斯消元)
    你是怎么封装一个view的
    沙盒目录结构是怎样的?各自用于那些场景?
    这个写法会出什么问题: @property (copy) NSMutableArray *array;
    怎么用 copy 关键字?
    @property后面可以有哪些修饰符?
  • 原文地址:https://www.cnblogs.com/SongHai/p/14011425.html
Copyright © 2020-2023  润新知