JAVA从零开始05_循环语句

一、循环语句

for循环和while循环在Java中都是用于重复执行一段代码,但它们之间存在一些差异。以下是它们之间的主要区别:

初始化:for循环通常在循环开始时进行初始化,而while循环在循环之外进行初始化。
条件:for循环和while循环都有一个条件,当该条件为真时,循环会继续执行。这两种循环的条件位置不同:for循环将条件放在循环声明中,而while循环将条件放在循环的开头。
更新:for循环的更新语句通常位于循环声明中,而while循环的更新语句在循环体内部。
结构:for循环更加紧凑,因为它在一个语句中包含了初始化、条件和更新,而while循环将这些部分分开。
选择何时使用for循环或while循环取决于特定场景和代码结构。

以下是一些关于何时使用它们的建议

在循环次数已知的情况下,使用for循环。例如,遍历数组或集合中的元素。
在循环次数未知,但需要满足某个条件才能停止循环时,使用while循环。例如,从输入流读取数据,直到没有更多数据为止。


二、while 循环和 do-while

while 循环和 do-while 循环都是 Java 中的循环结构,它们用于重复执行一段代码,直到满足某个条件。尽管它们在功能上相似,但在执行顺序和使用场景上有一些区别。
区别:

while 循环:
在执行循环体之前检查条件。
如果条件为 false,则循环体不会被执行。
语法结构:

while (condition) {
    // 循环体
}

do-while 循环:
在执行循环体后检查条件。
无论条件是否为 true,循环体至少会执行一次
语法结构:

do {
    // 循环体
} while (condition);

使用场景:
while 循环:适用于在执行循环体之前需要检查条件的情况。当你不确定循环体是否需要执行,或者在进入循环之前就需要满足某个条件时,使用 while 循环是合适的。例如,从用户输入中读取数据,直到用户输入一个有效值。

do-while 循环:适用于在执行循环体后检查条件的情况。当你至少需要执行循环体一次,然后再检查条件时,使用 do-while 循环是合适的。例如,在实现菜单驱动程序时,可能需要至少执行一次操作,然后根据用户的输入来决定是否继续操作。

总之,while 循环和 do-while 循环的主要区别在于循环条件的检查时间。根据实际需求和应用场景选择合适的循环结构。


三、无限循环

在Java中,无限循环是指程序在执行过程中会持续运行的循环,除非被外部因素中断或者遇到特定的终止条件。通常,无限循环在编程时要尽量避免,因为它可能导致程序无法正常终止。然而,在某些情况下,无限循环是有意使用的,例如在服务器监听客户端请求或者在某些实时系统中。

下面是几个具有特殊目的的无限循环案例:

  1. 服务器监听客户端请求:
    在服务器应用程序中,无限循环经常被用于监听客户端请求。服务器需要持续运行并接受新的连接和请求。当收到一个请求时,服务器通常会在一个新的线程中处理该请求,以便同时处理多个请求。

ServerSocket serverSocket = new ServerSocket(port);

while (true) {
    Socket clientSocket = serverSocket.accept(); // 等待客户端连接
    // 处理客户端请求(通常在新的线程中进行)
}
  1. 实时系统中的事件处理:
    在实时系统中,如游戏、监控系统等,无限循环可以用于持续检测并处理事件。在这类系统中,程序需要不断地响应用户输入、更新状态、绘制界面等。
while (true) {
    // 检查用户输入
    // 更新系统状态
    // 绘制界面
    // 暂停一段时间(通常会有一个固定的帧率)
}

  1. 生产者-消费者模型:
    在生产者-消费者模型中,无限循环可以用于持续生成和处理数据。生产者负责生成数据,而消费者负责处理这些数据。通常,这两个操作会在不同的线程中进行,并通过一个共享的数据结构(如队列)进行通信。

// 生产者线程
while (true) {
    // 生成数据
    // 将数据放入共享队列
}

// 消费者线程
while (true) {
    // 从共享队列中获取数据
    // 处理数据
}

这些无限循环案例通常会在特定条件下终止循环,例如收到停止信号、达到预设的执行时间等。在使用无限循环时,务必确保提供适当的终止条件和异常处理机制,以避免程序无法正常终止。


四、回文数练习

“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。
设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。

以下是用while循环完成的判断录入数字是否是回文数的代码片段:

import java.util.Scanner;

public class PalindromeNumber {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建 Scanner 对象以接收用户输入
        System.out.print("请输入一个整数: ");
        int num = scanner.nextInt(); // 读取用户输入的整数

        if (isPalindrome(num)) { // 调用 isPalindrome 方法判断输入的数字是否是回文数
            System.out.println(num + " 是回文数");
        } else {
            System.out.println(num + " 不是回文数");
        }
    }

    public static boolean isPalindrome(int num) {
        if (num < 0) { // 负数不是回文数
            return false;
        }

        int reversed = 0; // 用于存储反转后的数字
        int originalNum = num; // 存储原始数字,以便后面进行比较

        // 反转数字
        while (num != 0) {
            int digit = num % 10; // 提取数字的最后一位
            reversed = reversed * 10 + digit; // 将反转数字乘以10并加上新提取的数字,实现数字反转
            num = num / 10; // 去掉已处理的最后一位
        }

        return originalNum == reversed; // 如果原始数字与反转后的数字相等,则为回文数
   }
 }

五、商和余数的练习

给定两个整数,被除数和除数,将两数相除,不能使用乘法、除法和%运算符,得到这两个数的商和余数

以下是用while循环实现的代码片段:

public class DivisionAndRemainder {
    public static void main(String[] args) {
        int dividend = 20;
        int divisor = 3;

        // 计算商和余数
        Result result = divideAndRemainder(dividend, divisor);
        System.out.println("商: " + result.quotient + " 余数: " + result.remainder);
    }

    public static Result divideAndRemainder(int dividend, int divisor) {
        if (divisor == 0) { // 检查除数是否为零,如果为零则抛出异常
            throw new ArithmeticException("除数不能为零");
        }

        int quotient = 0; // 初始化商为0
        int remainder = Math.abs(dividend); // 将被除数转换为绝对值,便于处理负数情况
        int absDivisor = Math.abs(divisor); // 将除数转换为绝对值,便于处理负数情况

        // 使用while循环实现除法操作
        while (remainder >= absDivisor) {
            remainder -= absDivisor; // 从余数中减去除数
            quotient++; // 增加商的值
        }

        // 检查被除数和除数的符号,如果符号不同,则取反商的符号
        if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) {
            quotient = -quotient;
        }

        return new Result(quotient, remainder); // 返回包含商和余数的Result对象
    }

    // 结果类,用于存储商和余数
    static class Result {
        int quotient;
        int remainder;

        Result(int quotient, int remainder) { // 构造方法,用于初始化商和余数
            this.quotient = quotient;
            this.remainder = remainder;
        }
    }
}

程序首先检查除数是否为零,如果为零则抛出异常。然后,我们将被除数和除数转换为绝对值,以便处理负数的情况。我们使用一个while循环来实现除法,每次迭代中我们都将除数从余数中减去,并增加商的值。在计算完商和余数后,我们需要检查被除数和除数的符号,如果它们的符号不同,我们将商的符号取反。最后,我们返回一个包含商和余数的Result对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值