AI悦创

V1

2022/12/17阅读:17主题:凝夜紫

16-程序循环之 while 语句

你好,我是悦创。

原文首发:https://bornforthis.cn

0. 目录

  • 用 while 语句增强找整除数的程序
  • do-while 语句——至少执行一次
  • 死循环(endless loop)
  • 一个看似死循环却不是死循环的例子
  • 使用 break 语句结束循环

1. 用 while 语句增强找整除数的程序

1.1 增强点:找出 n 个可以被整除的数

while 语句的语法

  • 条件表达式的结果是一个 boolean 值,如果为 true,则执行循环体,如果为 false,则循环结束。
  • While 循环体是一个代码块。所以 while 循环也是可以嵌套别的语句的,包括 while 语句,for 语句,if-else 语句等。

while (条件表达式){ while 循环体 }

public class FindNDiv {
    public static void main(String[] args) {
        int n = 10;
        // int n = -1;

        int dividend = 100;  // 被除数
        int divisor = 89;  // 除数

        int found = 0;
        while (found < n) {
            if (dividend % divisor == 0) {
                System.out.println(dividend + "可以整除" + divisor + "。商是" + dividend / divisor);
                found++;
            }
            dividend++;
        }

    }
}

输出:

/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=52087:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/huangjiabao/GitHub/Java_Coder/Coder16/out/production/Coder16 FindNDiv
178可以整除89。商是2
267可以整除89。商是3
356可以整除89。商是4
445可以整除89。商是5
534可以整除89。商是6
623可以整除89。商是7
712可以整除89。商是8
801可以整除89。商是9
890可以整除89。商是10
979可以整除89。商是11

Process finished with exit code 0

2. do-while 语句——至少执行一次

  • do-while 语句语法
  • do-while 语句的循环体至少执行一次

do{ while 循环体 } while (条件表达式);

public class DoWhileExample {
    public static void main(String[] args) {
        do {
            System.out.println("会执行一次");
        } while (false);
    }
}
public class DoWhileExample {
    public static void main(String[] args) {
        // 在条件为假的情况下,for 语句或 while 语句都不会执行
        for (int i = 0; i > 90; i++) {
            System.out.println("一次都不会执行");
        }
    }
}

从本人的编程经验来看, do......while...... 用到的情况比较少。 我们既然说了循环,那我们就离不开一个概念:死循环。

3. 死循环(endless loop)

  • 死循环:无法结束的循环( endless loop / infinite loop)
  • 一个死循环的例子
  • 死循环是因为没有设置好结束条件「下面没有设置 found + 1」,循环的结束条件很重要,要充分考虑各种边界情况。
public class FindNDivEndless {
    public static void main(String[] args) {
        int n = 5;

        int dividend = 100;
        int divisor = 89;

        int found = 0;
        while (found < n) {
            if (dividend % divisor == 0) {
                System.out.println(dividend + "可以整除" + divisor + "。商是" + dividend / divisor);
            }
            dividend++; 
        }

    }
}

4. 一个看似死循环却不是死循环的例子

  • 用 while 找出 5个能被 2,000,000,000 整除的数
  • 程序最终还是结束了,但是结果并不是我们想要的
public class FindNDivNotEndless {
    public static void main(String[] args) {
        int n = 5;

        int dividend = 100;
        int divisor = 2000000000;

        int found = 0;
        while (found < n) {
            if (dividend % divisor == 0) {
                System.out.println(dividend + "可以整除" + divisor + "。商是" + dividend / divisor);
                found++;
            }
            dividend++;
        }

    }
}
2000000000可以整除2000000000。商是1
-2000000000可以整除2000000000。商是-1
0可以整除2000000000。商是0
2000000000可以整除2000000000。商是1
-2000000000可以整除2000000000。商是-1

这其实是整数的加法溢出,我们之前也提过。如果你对一个整数一直加 1 的话,最后就会变成负数。然后再加加就变成正数。它会这样循环,所以说这是个问题。这是计算和数学的区别,数学是没有这种边界问题的。数学中,这个数字可以无限大,那计算就只有这 4 个 byte。超出范围是不可控、不可知的。1 int = 4 byte,1 byte = 8 bit。

5. 使用 break 语句结束循环

  • break 语句可以结束任何循环
  • 不考虑负数的情况,使用 break 改善程序「比如程序 ++ 出现负数,就可以食用 break 跳出循环,避免程序做一些无谓的运算」
  • 理解 String start 的内容,为什么不是“从 -2147483648 开始递增”
public class FindNDivBetter {
    public static void main(String[] args) {
        int n = 5;

        int dividend = 100;
        int divisor = 2000000000;

        String start = "从" + dividend + "开始递增,";

        int found = 0;
        while (found < n) {
            if (dividend < 0) {
                System.out.println("被除数溢出,未找到足够的数。循环结束。");
                break;
            }
            if (dividend % divisor == 0) {
                System.out.println(dividend + "可以整除" + divisor + "。商是" + dividend / divisor);
                found++;
            }
            dividend++;
        }

        System.out.println(start + "共找到" + found + "个可以整除" + divisor + "的数。");

        System.out.println(dividend);
    }
}
2000000000可以整除2000000000。商是1
被除数溢出,未找到足够的数。循环结束。
100开始递增,共找到1个可以整除2000000000的数。
-2147483648

为什么是从100,而不是从-2147483648 开始?举个简单的例子就可以:就像一个印章,你盖完之后。别人把印章再修修改改其实也不会影响到已经盖完的。

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

分类:

后端

标签:

Java

作者介绍

AI悦创
V1

编程一对一教学,微信:Jiabcdefh