2.3. 循环语句

2.3.1. while循环语句

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

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

while循环语句的执行示例:

package Number;

public class GetSum {

    public static void main(String[] args) {
        int x=1;
        int sum=0;
        while (x<=10) {
            sum = sum + x;      //while循环语句,当变量满足条件表达式时执行循环体语句
            x++;
        }
        System.out.println("sum = " + sum);

    }

}

// 输出结果:
sum = 55

初学者经常犯的一个错误就是在while表达式的括号后加“;”。如
while (x==5);
System.out.println("x的值为5")
这时程序会任务要执行一条空语句,而进入无限循环,Java编译器又不会报错,这可能会浪费很多时间去调试,
需要注意这个问题。

2.3.2. do..while循环语句

  • do..while循环语句与while循环语句类似,它们之间的区别是while语句为先判断条件是否成立再执行循环体 而do…while循环语句则先执行一次循环之后,再判断条件是否成立。

也就是说,do…while循环语句中“{}”中的程序至少要被执行一次。 语法如下:

do {
执行语句
}
while(条件表达式);


注意:
do...while语句与while语句有一个明显的区别,do...while.语句在结尾处多了一个分号(;)。

eg:

package com.company;

public class Main {

    public static void main(String[] args) {
        // write your code here

        int a = 100;
        while (a == 60) {
            System.out.println("ok1 ");
            a--;
        }
        int b = 100;

//      do..while语句循环体
        do {
            System.out.println("ok2 ");         //ok2
            b--;
        } while (b == 60);            //指定循环结束条件
    }

}

2.3.3. for循环语句

  • for循环是Java程序设计中最有用的循环语句之一。一个for循环可以用来重复执行某条语句,直到某个 条件得到满足。java 5 之后 新增了foreach语法。

for语句

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

* 表达式1,:初始化表达式,负责完成变量的初始化。
* 表达式2:循环条件表达式,值为boolean型的表达式,指定循环条件。
* 表达式3:循环后操作表达式,负责修整变量,改变循环条件。
package Number;

public class for_Test {

    public static void main(String[] args) {
        int sum=0;          //声明变量,用于保存各数相加后的结果
        for (int i=2; i<=100; i+=2) {
            sum = sum + i;  //指定循环条件及循环体
        }

//      将相加后的结果输出
        System.out.println("2到100之间的所有偶数之和为:" + sum);

    }

}

//输出结果
2到100之间的所有偶数之和为:2550
  • 技巧:

  • while实现无限循环

    public class ch6_8 {
        public static void main(String[] args)  {
    //        while (true){
    //            System.out.println("这里是一个死循环......\n");
    //        }
            for (;;){
                System.out.println("这是一个无限死循环....");
            }
        }
    }
    
  • for循环实现无限循环。语法格式如下:

        for (;;) {
            System.out.println("loop.......");
        }

// 无限循环可以通过break进行跳出

        for (;;) {

//          System.out.println("loop.......");
            if(x<20)
            break;
            x++;

}

eg

打印99乘法表

package for_yuju;

public class continue_001 {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(i + "*" + j + "=" + (i + j) + "\t");
            }
            System.out.println();

        }

    }

}

/**
 *
1*1=2
2*1=3   2*2=4
3*1=4   3*2=5   3*3=6
4*1=5   4*2=6   4*3=7   4*4=8
5*1=6   5*2=7   5*3=8   5*4=9   5*5=10
6*1=7   6*2=8   6*3=9   6*4=10  6*5=11  6*6=12
7*1=8   7*2=9   7*3=10  7*4=11  7*5=12  7*6=13  7*7=14
8*1=9   8*2=10  8*3=11  8*4=12  8*5=13  8*6=14  8*7=15  8*8=16
9*1=10  9*2=11  9*3=12  9*4=13  9*5=14  9*6=15  9*7=16  9*8=17  9*9=18
 */

2.3.4. foreach语句

foreach 语句是for语句的特殊简化版本,不能完全取代for语句,但任何foreach语句都可以改写为for语句版本。

foreach并不是一个关键字,习惯上将这种特殊的for语句格式称为foreach语句。

foreach语句在遍历数组等方面为程序员提供了很大的方便

语法如下:

for (元素遍历x:遍历对象obj){
    引用了x的java语句;
}

eg:

package Number;

public class Repetition {

    public static void main(String[] args) {
        int arr[] = {7,10,1};       //声明一维数组
        System.out.println("一维数组中的元素分别为: ");
        for(int x:arr) {
//          foreach语句,int x 引用的变量,arr指定要循环变量的数组,将x输出
            System.out.println(x);

        }
    }

}

2.3.5. 循环控制

循环控制包含两方面的内容:
一方面是控制循环变量的变化方式
另一方面是控制循环的跳转
主要涉及到两个关键字:
break和continue

break是中断循环
continue是执行下一次循环

break语句

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

在循环体中使用break语句有两种方式:带有标签和不带标签。语法格式如下:

break; //不带标签
break label; //带标签,label是标签名

不带标签的break语句使程序跳出所在层的循环体,而带标签的break语句使程序跳出标签指示的循环 体。

eg:

package Number;

public class BreakTest {

    public static void main(String[] args) {
        for (int i=0;i<=100;i++) {
            System.out.println(i);
//          如果i等于6就跳出循环
            if (i==6) {
                break;
            }

        }
        System.out.println("===========end===========");

    }

}

//输出结果
0
1
2
3
4
5
6
===========end===========

**注意: 如果遇到循环嵌套的情况,break语句将只会使程序流程跳出包含它的最内层的循环结构, 只跳出一层循环。 eg:

public class BreakinsideNested {

    public static void main(String[] args) {
        for (int i=0;i<3;i++) {
            for (int j=0;j<6;j++) {
//              如果j等于4就结束内部循环
                if (j==4) {
                    break;
                }
                System.out.println("i=" + i + " j="+ j);
            }

        }

    }

}
// 输出结果
i=0 j=0
i=0 j=1
i=0 j=2
i=0 j=3
i=1 j=0
i=1 j=1
i=1 j=2
i=1 j=3
i=2 j=0
i=2 j=1
i=2 j=2
i=2 j=3

从这个运行结果我们可以看出: (1)循环中的if语句判断:如果j等于4时,执行break语句,则中断了内层的循环,输出的j值最大到3为止 (2)外层的循环没有受任何影响,输出的i值最大为2,正是for循环设定的最大值。

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

标签名:循环体{
    break 标签名;
}
  • 标签名:任意标识符
  • 循环体:任意循环语句
  • break 标签名:break跳出指定的循环体,此循环体的标签名必须与break的标签名一致 带有标签的break可以制定跳出的循环,这个循环可以是内层循环,也可以是外层循环

eg:带有标签的break跳出外层循环

public class BreakOutsideNested {

    public static void main(String[] args) {
//      在for循环前用标签标记
        Loop:for(int i=0; i<3; i++) {
            for (int j=0; j<6; j++) {
                if(j==4) {
//                  如果j等于4就结束外层循环,跳出Loop标签标记的循环体
                    break Loop;
                }
                System.out.println("i=" +i + " j=" + j);
            }
        }

    }

}

//输出结果
i=0 j=0
i=0 j=1
i=0 j=2
i=0 j=3

continue语句

continue语句是针对break语句的补充,contunye不是立即跳出循环体,而是跳过本次循环结束前的语句, 回到循环的条件测试部分,重新开始执行循环,在for循环语句中遇到continue后,首先执行 循环的增量部分,然后进行条件测试。在while和do…while循环中,continue语句使控制直接回到条件 测试部分。

在循环体中使用continue语句有两种方式可以带有标签,也可以不带标签。语法格式如下:

continue //不带标签
continue label //带标签,label是标签名

eg:输出1~20之间的奇数

public class continue1 {
    public static void main(String[] args) {
        for (int i=0;i<20;i++) {
//          如果i是偶数
            if (i%2 == 0) {
                continue;   //跳到下一循环
            }
            System.out.println(i);      //输出i的值
        }

    }

}

// 输出信息
1
3
5
7
9
11
13
15
17
19

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

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

2.3.6. 总结

使用复合语句可以为变量定义一个有效区域。 使用if与switch语句,可以基于布尔类型的测试,将一个程序分成不同的部分

使用while、do…while循环语句和for循环语句,可以让程序的一部分重复执行,直到满足 某个终止循环的条件。

2.3.7. 课后练习

  • 编写java程序,判断变量x是奇数还是偶数
public class checktest {
    public static void main(String[] args) {
        int x=49;   //定义变量x的值为49
//      进行if判断奇数偶数
        if(x%2==0) {
            System.out.println("x 是一个偶数...");
        }
        else {
            System.out.println("x 是一个奇数...");
        }
    }

}
  • 编写java程序,应用for循环打印菱形
public class Test_for {
    public static void main(String args[]) {
        int lineCount = 17;// 输出的菱形有多少行,请赋值成奇数

        int maxLineNum = (lineCount + 1) / 2;// 菱形最多一行
        for (int i = 1; i <= maxLineNum; i++) {// 循环菱形数量越来越多的几行
            for (int space = 1; space <= maxLineNum - i; space++) {// 输出空格,数量=最后一行-当前行数
                System.out.print("  ");
            }
            for (int star = 1; star <= (i * 2) - 1; star++) {// 输出星号,数量=行数*2-1
                System.out.print("* ");
            }
            System.out.println();// 换行
        }

        int declineCount = lineCount - maxLineNum;// 计算剩下的几行,这几行星号的数量是递减的
        for (int i = 1; i <= declineCount; i++) {// 循环菱形数量越来越少的行数
            for (int space = 1; space <= i; space++) {// 输出空格,数量等于当前的行数
                System.out.print("  ");
            }
            for (int star = 1; star <= (declineCount - i + 1) * 2 - 1; star++) {// 输出星号,数量等于(总数-当前行数)*2-1
                System.out.print("* ");
            }
            System.out.println();
        }

    }
}
  • 编写java程序,使用while循环语句计算1+1/2!+1/3!….1/20!之和
public class Example_02 {
  public static void main(String args[])
    {
      double sum = 0,a = 1;
      int i = 1;
      while(i <= 20)
      {
          sum = sum+a;
          i = i+1;
          a = a*(1.0/i);
      }
      System.out.println(sum);
    }
}

2.3.8. 将循环应用于Scanner类的输入检查

import java.util.Scanner;

public class CH6_13_1 {
    public static void main(String[] args) {
        int x1, x2;
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入2个整数,使用空格隔开");
        while (!scanner.hasNextInt()) {
            System.out.println("输入的第一个数据类型错误,请输入整数");
            scanner.next();      // 用字符串方式读取1
        }
        x1 = scanner.nextInt();

        while (!scanner.hasNextInt()) {
            System.out.println("输入的第二个数据类型错误,请输入整数");
            scanner.next();      // 用字符串方式读取1
        }
        x2 = scanner.nextInt();

        System.out.printf("输入的第一个数是:%d\n", x1);
        System.out.printf("输入的第二个数是:%d\n", x2);
        System.out.printf("输入的数的总和是:%d\n", (x1 + x2));
    }
}