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)

原文地址:https://www.cnblogs.com/SongHai/p/14011425.html