Logo

郎哥编程

while循环结构

2021-06-01 21

学习目标:掌握while循环结构的使用方法。

1、循环结构

前面讨论了编程中进行判断的各种方法,然而有些问题仅仅通过判断还不能解决。某些情况中,为解决一个问题常常需要重复执行一个或多个操作。例如,要求输出从1—5分别乘以10所得的乘法表,用以前学过的知识编制的程序如案例1所示:

案例6:输出从1—5分别乘以10所得的乘法表。

在Punit3项目unit包下创建Case6类。代码如下:

package com.unit;
 
/**
 * @date: 2021
 * @author:xinch
 */
 
public class Case6 {
    public static void main(String[] args) {
        int result1, result2, result3, result4, result5;
        result1 = 1 * 10;
        System.out.printf("1 * 10 = %d\n", result1);
        result2 = 2 * 10;
        System.out.printf("2 * 10 = %d\n", result2);
        result3 = 3 * 10;
        System.out.printf("3 * 10 = %d\n", result3);
        result4 = 4 * 10;
        System.out.printf("4 * 10 = %d\n", result4);
        result5 = 5 * 10;
        System.out.printf("5 * 10 = %d\n", result5);
 
    }
}

程序结构分析

程序编写五条语句计算乘积,再编写另外五条语句显示这些乘积。如果要求输出1—100的数与10相乘的乘法表呢?就需要重复编写100次这样的语句。这样既费时又费力。我们需要一种方法可以快速有效地执行重复性操作。在Java语言中,可以通过循环结构来解决这类问题。

循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,重复执行某程序段,直到条件不成立为止。给定的条件成为循环条件,反复执行的程序段称为循环体。Java语言提供了三种不同形式的循环结构。

(1)while循环结构

用于在特定条件为真的情况下重复执行某些操作,在执行循环体之前先检查条件,一旦条件为假,循环就停止。

(2)do—while循环结构

同样用于在特定条件为真的情况下重复执行某些任务。但是在do—while循环中,是在执行循环语句之后再检查条件。因此,在循环结束前,循环体内的语句至少会被执行一次。

(3)for循环结构

fou循环与while循环在功能上类似,只要条件为真,就会执行循环体中的语句。同样,也是在执行循环语句之前先检查条件,但是,其语法规则与while循环有所不同。

2、while循环结构

while循环结构的一般语法是:

while( 条件判断表达式 )

        语句;

其中,表达式是循环条件,语句为循环体。while语句的语义是:计算条件判断表达式的值,当值为真(非0)时,执行循环体语句,一旦条件为假,就停止执行循环体。如果条件在开始时就为假,则不执行循环体语句直接退出循环。

循环体语句可以是空语句(空语句就是没有执行任何操作的语句,空语句单独占一行,语句内容只有“;”符号)、单条语句或多条语句。如果是多条语句,则要用“{”和“}”把它们括起来。条件可以是任何表达式。

案例7:实现输出从1—10分别乘以10所得的乘法表。

在Punit3项目unit包下创建Case7类。代码如下:

package com.unit;
 
/**
 * @date: 2021
 * @author:xinch
 */
public class Case7 {
    public static void main(String[] args) {
        // num初始化为1
        int num = 1;
        int result;
        while (num <= 10) {
            result = num * 10;
            System.out.printf(" %d * 10 = %d \n", num, result);
            // 使用自增运算符,修改循环变量
            num++;
        }
    }
}

程序结构分析

程序声明了两个int类型的变量num和result,分别用来存储数字和乘积。然后,将num初始化为1,因为打算在while循环中从1开始执行乘法运算,求出1—10的数字与10的乘积,因此将while循环的条件编写为num<=10。这样确保了只要num小于等于10,就执行while循环;而当此条件变为假时,即num的值达到11时,就结束循环。循环体中的第一个语句用num乘以10,将计算结果保存在变量result中。第二个语句输出乘法表,循环体中的最后一个语句将num的值递增1,来修改num的值。此处使用了单目自增运算符++,也可以编写为num=num+1,来替代num++。

程序中的num++非常重要,这条语句通过修改num的值来修改循环条件,直到num的值等于11,循环条件为假时退出循环。也就是说,循环条件中的变量,需要在循环中重新赋值,以逐渐改变循环条件的值,直到循环条件为假;否则循环将永远不会停止,这种循环称为“死循环”或者“无限循环”。

案例8:无限循环。

在Punit3项目unit包下创建Case8类。代码如下:

package com.unit;
/**
 * @date: 2021
 * @author:xinch
 */
public class Case8 {
    public static void main(String[] args) {
        int count = 0;
        while (count < 100) {
            System.out.println("这将没完没了,帮帮我吧!!!");
            System.out.printf("试试Ctrl+F2吧");
        }
 
    }
}

程序结构分析

程序功能主要是演示在while循环语句中,由于缺乏改变条件的语句而导致出现无限循环的问题。

程序中while循环体内没有修改循环变量count的值,导致循环条件一直为真,造成了无限循环。

另外,假如编写了以下while循环语句:

while( 1 )

其中,条件仅仅是一个数值常量1,由于在Java语言中,规定所有的非0值都表示真。因此,它实际上相当于while(true),而且这个循环条件没有办法在循环体内修改,这样会导致无限循环。可以使用break语句强行跳出循环,这个语句将在后面介绍。

如果循环条件中包含多个条件表达式的组合,这时需要检查整个条件表达式的值。如果整个条件表达式的值为假,即使其中某个子条件表达式为真,循环也会结束。

案例9:编写一个程序,要求从摄氏度0度到250度,每隔20度为一项,输出一个摄氏温度与华氏温度的对照表,同时要求对照表中的条目不超过10条。

在Punit3项目unit包下创建Case9类。代码如下:

package com.unit;
 
/**
 * @date: 2021
 * @author:xinch
 */
 
public class Case9 {
    public static void main(String[] args) {
        int count = 0;
        int c = 0;
        double f;
        // 输出控制在10条以内
        while (c <= 250 && count < 10) {
            count++;
            System.out.printf("%d:  ", count);
            //计算华氏温度
            f = c * 9 / 5.0 + 32.0;
            System.out.printf("c = %d, F = %7.2f\n", c, f);
            c = c + 20;
        }
 
 
    }
}

程序结构分析

程序中的循环将执行10次,虽然温度只显示到180,但是由于对照表中条目已经满10条,即count<10变为假,从而导致循环结束。

3、do-while循环结构

do-while循环与while循环的不同在于:它先执行循环体中的语句,然后再判断条件是否为真。如果为真则继续循环,如果为假,则终止循环。因此,do-while循环至少要执行一次循环语句。同样当有多条语句参加循环时,要用“{”和“}”把它们括起来。

do-while循环的一般语法是:

do{

   语句;

}while(条件);

注意:在do-while语句的表达式后面必须加分号。

案例10:编写一个猜数游戏,要求猜一个介于1—10之间的数字,根据用户猜测的数与答案进行对比,并给出提示,以便下次猜测能接近标准值,直到猜中为止。

在Punit3项目unit包下创建Case10类。代码如下:

package com.unit;
import java.util.Scanner;
/**
 * @date: 2021
 * @author:xinch
 */
 
public class Case10 {
    public static void main(String[] args) {
        //初始化猜数的标准数值
        int  number = 5;
        int  guess;
        Scanner sc = new Scanner(System.in);
        System.out.println("猜一个介于 1 与 10 之间的数");
        do
        {
            System.out.println("请输入您猜测的数");
            guess = sc.nextInt();
            // 比较guess与number
            if( guess > number )
                System.out.println("太大");
            else if( guess < number )
                System.out.println("太小");
 
        }while( guess != number );
        System.out.printf("您猜中了:答案为 %d\n",number);
 
    }
}

程序结构分析

程序内部设置一个答案存储到变量number中,并声明一个guess变量接收用户猜测的数值。采用do-while结构可以确保用户至少能进行一次猜数操作,在循环体内,提示用户输入要猜的数,用户输入猜测的数值后,利用if-else语句和正确答案进行判断,如果用户猜测的数值大于答案,提示用户数太大;如果用户猜测的数值小于答案,提示用户数太小。while语句后面的表达式( guess != number )用于判断循环条件是否满足,如果用户输入的数值和答案不相等,该表达式返回的结果为真,继续执行循环体,要求用户根据提示继续猜数,否则,表达式返回的结果为假,循环条件不满足,程序不再执行循环体,直接执行循环体后面的语句。

01.png

从上述结果可以看出,输入的数值与答案不相等时,程序给出相应提示,并继续执行循环。当用户输入的数值与答案相等时,程序不再执行循环,并输出猜中的答案。

do-while语句是一种先执行循环体,然后再判断条件的结构,即只有在循环体中的代码执行之后,才会判断循环条件。总的来说,循环结构在开始执行的时候,先执行循环体内的代码,然后通过while里面的条件进行判断,条件成立就继续执行循环,不成立就跳出循环,循环体内代码至少被执行一次。

4、  while嵌套循环结构

就像if语句可以嵌套一样,一个循环也可以嵌套在另一个循环中,一个循环中含有另一个循环就称为嵌套循环。

嵌套循环的工作原理如下:首先外循环的第一轮触发内循环,内循环将一直执行到完成为止,然后,外循环的第二轮再次触发内循环,此过程不断重复直到外循环结束,使用嵌套循环时,只有在内循环完全结束后,外循环才会执行下一趟循环,

一个while循环可以嵌套在另一个while循环中,示例1演示了嵌套while循环的用法。

案例11:用*输出一个直角三角形图案。

在Punit3项目unit包下创建Case11类。代码如下:

package com.unit;
 
/**
 * @date: 2021
 * @author:xinch
 */
 
public class Case11 {
    public static void main(String[] args) {
        int nstars=1,stars;
        //外层循环控制输出*的行数
        while( nstars <= 10 )
        {
            stars = 1;
            //内层循环控制打印星号的数量
            while( stars <= nstars )
            {
                System.out.printf("*");
                stars++;
            }
            System.out.printf("\n");
            nstars++;
        }
 
 
    }
}

程序结构分析:

程序用外层循环控制输出“*”的行数,循环条件为nstars <= 10,nstars初始化为1,该条件允许输出10行“*”;内层循环控制“*”输出的数量,循环条件为stars <= nstars,内层循环开始前,stars都被赋值为1,然后在内层循环体内做自增操作。

程序执行结果如下图所示:

02.png

while循环和do-while循环也可以互相嵌套。例如,可以将示例11的内层while循环修改为do-while循环,或者将外层循环修改为do-while循环。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论