「Java流程控制」do……while循环结构

0 阅读4分钟

想象一下在健身房锻炼的场景。利用do……while循环表示:

  1. 先做一次训练(循环体执行)
  2. 然后看看效果(条件判断)
  3. 决定是否继续(是否进入下一次循环)

这和while循环不同,while循环是先在门口看看人多人少才决定进不进去。而do...while是二话不说先练起来再说!

do……while语法结构

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

do……while结构保证了循环体至少执行一次,然后根据条件决定是否继续;就像至少会尝试一次健身,然后根据感受决定要不要继续。

案例解析

用户密码验证

编写一个程序看,模拟用户登录时的密码验证。

# 源文件保存为“PasswordValidation.java”。
import java.util.Scanner;

public class PasswordValidation {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String correctPassword = "java123";
        String userInput;
        int attempts = 0;
        
        do {
            System.out.print("请输入密码:");
            userInput = scanner.nextLine();
            attempts++;
            
            if(!userInput.equals(correctPassword)) {
                System.out.println("密码错误!您已尝试" + attempts + "次");
            }
        } while (!userInput.equals(correctPassword) && attempts < 3);
        
        if(userInput.equals(correctPassword)) {
            System.out.println("登录成功!");
        } else {
            System.out.println("尝试次数过多,账户已锁定");
        }
        
        scanner.close();
    }
}

运行结果 输入3次错误的密码

请输入密码:123456 密码错误!您已尝试1次 请输入密码:456123 密码错误!您已尝试2次 请输入密码:789456 密码错误!您已尝试3次 尝试次数过多,账户已锁定

输入正确密码

请输入密码:java123 登录成功!

代码解析:

  • 程序首先会要求用户输入密码(至少执行一次)
  • 检查密码是否正确,并记录尝试次数
  • 当密码错误且尝试次数小于3次时,继续循环
  • 退出循环后根据情况输出相应提示

这个例子很好地展示了do...while的特点:至少要给用户一次输入机会。

购物车结算系统

编写一个程序,模拟电商网站购物车结算系统。

# 源文件保存为“ShoppingCartCheckout.java”。
import java.util.Scanner;

public class ShoppingCartCheckout {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double total = 0.0;
        String itemName;
        double itemPrice;
        char continueShopping;

        System.out.println("=== 欢迎来到Java超市结算系统 ===");

        do {
            System.out.print("请输入商品名称:");
            itemName = scanner.next();

            System.out.print("请输入商品价格:");
            itemPrice = scanner.nextDouble();

            total += itemPrice;
            System.out.printf("已添加 %s 到购物车,当前总计:%.2f元\n", itemName, total);

            System.out.print("是否继续购物?(y/n):");
            continueShopping = scanner.next().charAt(0);

        } while (continueShopping == 'y' || continueShopping == 'Y');

        System.out.printf("\n购物结算完成,总金额:%.2f元\n", total);
        System.out.println("感谢您的光临!");
        scanner.close();
    }
}

代码运行效果: 依次输入产品和价格。

=== 欢迎来到Java超市结算系统 === 请输入商品名称:牛奶 请输入商品价格:12.5 已添加 牛奶 到购物车,当前总计:12.50元 是否继续购物?(y/n):y 请输入商品名称:面包 请输入商品价格:8.8 已添加 面包 到购物车,当前总计:21.30元 是否继续购物?(y/n):n

购物结算完成,总金额:21.30元 感谢您的光临!

常见错误及解决方法

忘记分号

do {
    //...
} while(条件)  // 这里缺少分号

解决方法:记住while后面的小括号外必须加分号。

条件永远为真导致无限循环

int i = 0;
do {
    System.out.println(i);
    // 忘记写i++导致i永远不增加
} while (i < 10);

解决方法:确保循环条件最终会变为false。

错误的条件判断

int i = 10;
do {
    System.out.println(i);
    i++;
} while (i < 5);  // 初始就不满足但仍会执行一次

解决方法:理解do...while至少执行一次的特性,确保逻辑正确

练习题

理论练习题

  1. do...while循环和while循环最主要的区别是什么? 答案:do...while循环至少执行一次循环体,而while循环可能一次都不执行。

  2. 下列代码会输出什么?

    int x = 5;
    do {
        System.out.print(x + " ");
        x--;
    } while (x > 0);
    

    答案:输出"5 4 3 2 1 ",因为从5递减到1,当x=0时退出循环。

  3. 什么情况下应该优先选择do...while而不是while循环? 答案:当需要至少执行一次循环体时,比如菜单显示、用户输入验证等场景。

  4. 如果超市结算系统改用while循环实现,会有什么潜在问题? 答案:使用while循环时,如果用户一开始就选择不购物,程序会变得很奇怪。而do...while确保至少执行一次结算流程,更符合实际场景

  5. 下面这段代码有什么问题?

    int count = 5;
    do {
        System.out.println(count);
        count++;
    } while (count < 5);
    

    答案:虽然循环条件初始就不满足,但do...while仍会执行一次,输出5。这可能不是程序员的本意,需要注意这种特性。

  6. 为什么购物车案例中使用charAt(0)来获取用户输入? 答案:Scanner的next()方法返回字符串,而我们需要单个字符做判断。charAt(0)取字符串第一个字符,既简化输入又避免字符串比较的开销。

实操练习题

编写一个程序,使用do...while循环计算1到100的偶数和

# 源文件保存为“EvenNumbers.java”。
public class EvenNumbers {
    public static void main(String[] args) {
        int sum = 0;
        int num = 1;
        do {
            if(num % 2 == 0) {
                sum += num;
            }
            num++;
        } while (num <= 100);
        System.out.println("1到100的偶数和为:" + sum);
    }
}

运行结果

1到100的偶数和为:2550