Java流程控制:让程序学会“做决策”和“重复做事”

40 阅读7分钟

这些生活中的"如果...就..."、"重复直到..."的逻辑,在Java中就是流程控制语句。它们让程序不再只是简单执行,而是能根据情况做出决策和重复工作

流程控制

流程控制就是控制代码执行顺序的语句,它让程序能够:

  1. 选择性执行:根据不同条件执行不同的代码
  2. 重复执行:让代码块重复执行多次
  3. 跳转执行:改变代码的正常执行顺序

三大流程控制结构及代码示例

1. 条件语句:让程序学会"做选择"

if-else 语句

public class IfElseDemo {
    public static void main(String[] args) {
        System.out.println("=== if-else 条件语句示例 ===");
        
        // 示例1:简单的if语句
        int score = 85;
        System.out.println("学生成绩: " + score + "分");
        
        if (score >= 60) {
            System.out.println("恭喜!成绩及格了!");
        }
        
        // 示例2:if-else语句
        int temperature = 28;
        System.out.println("\n当前温度: " + temperature + "°C");
        
        if (temperature > 30) {
            System.out.println("天气炎热,建议穿短袖");
        } else {
            System.out.println("天气适中,可以穿长袖");
        }
        
        // 示例3:多重if-else if-else语句
        int hour = 14; // 24小时制
        System.out.println("\n当前时间: " + hour + "点");
        
        if (hour >= 6 && hour < 12) {
            System.out.println("现在是上午");
        } else if (hour >= 12 && hour < 18) {
            System.out.println("现在是下午");
        } else if (hour >= 18 && hour < 22) {
            System.out.println("现在是晚上");
        } else {
            System.out.println("现在是深夜");
        }
        
        // 示例4:嵌套if语句
        boolean isWeekend = false;
        boolean isSunny = true;
        System.out.println("\n今天是周末吗? " + isWeekend);
        System.out.println("天气晴朗吗? " + isSunny);
        
        if (isWeekend) {
            if (isSunny) {
                System.out.println("去公园野餐!");
            } else {
                System.out.println("在家看电影!");
            }
        } else {
            System.out.println("去上班/上学");
        }
    }
}

switch 语句

public class SwitchDemo {
    public static void main(String[] args) {
        System.out.println("=== switch 语句示例 ===");
        
        // 示例1:根据星期几输出不同的活动
        int dayOfWeek = 3; // 1=周一, 2=周二, ..., 7=周日
        
        switch (dayOfWeek) {
            case 1:
                System.out.println("星期一:开始新的一周!");
                break;
            case 2:
                System.out.println("星期二:继续努力!");
                break;
            case 3:
                System.out.println("星期三:一周过半!");
                break;
            case 4:
                System.out.println("星期四:周末即将来临!");
                break;
            case 5:
                System.out.println("星期五:终于到周五了!");
                break;
            case 6:
            case 7:
                System.out.println("周末:好好休息!");
                break;
            default:
                System.out.println("无效的星期数");
                break;
        }
        
        // 示例2:根据成绩等级给出评语
        char grade = 'B';
        System.out.println("\n学生等级: " + grade);
        
        switch (grade) {
            case 'A':
                System.out.println("优秀!继续保持!");
                break;
            case 'B':
                System.out.println("良好!还有进步空间!");
                break;
            case 'C':
                System.out.println("中等!需要更努力!");
                break;
            case 'D':
                System.out.println("及格!要加油了!");
                break;
            case 'F':
                System.out.println("不及格!需要补考!");
                break;
            default:
                System.out.println("无效的等级");
        }
        
        // 示例3:Java 12+ 新的switch表达式
        System.out.println("\n=== Java 12+ switch表达式 ===");
        String season = "春天";
        
        String activity = switch (season) {
            case "春天" -> "去郊游赏花";
            case "夏天" -> "去海边游泳";
            case "秋天" -> "去登山赏叶";
            case "冬天" -> "在家吃火锅";
            default -> "正常上班上学";
        };
        
        System.out.println(season + "的活动建议: " + activity);
    }
}

2. 循环语句:让程序学会"重复做事"

for 循环

public class ForLoopDemo {
    public static void main(String[] args) {
        System.out.println("=== for 循环示例 ===");
        
        // 示例1:基础for循环
        System.out.println("1. 打印1到5:");
        for (int i = 1; i <= 5; i++) {
            System.out.println("数字: " + i);
        }
        
        // 示例2:计算1到100的和
        System.out.println("\n2. 计算1到100的和:");
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        System.out.println("1到100的和是: " + sum);
        
        // 示例3:打印乘法表
        System.out.println("\n3. 9×9乘法表:");
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "×" + i + "=" + (i * j) + "\t");
            }
            System.out.println();
        }
        
        // 示例4:遍历数组
        System.out.println("\n4. 遍历数组:");
        int[] scores = {85, 92, 78, 90, 88};
        System.out.println("学生成绩列表:");
        for (int i = 0; i < scores.length; i++) {
            System.out.println("第" + (i + 1) + "个学生成绩: " + scores[i] + "分");
        }
        
        // 示例5:增强for循环(for-each)
        System.out.println("\n5. 使用for-each遍历数组:");
        String[] fruits = {"苹果", "香蕉", "橙子", "葡萄"};
        System.out.println("水果列表:");
        for (String fruit : fruits) {
            System.out.println("水果: " + fruit);
        }
    }
}

while 循环

public class WhileLoopDemo {
    public static void main(String[] args) {
        System.out.println("=== while 循环示例 ===");
        
        // 示例1:基础while循环
        System.out.println("1. 倒计时:");
        int countdown = 5;
        while (countdown > 0) {
            System.out.println("倒计时: " + countdown);
            countdown--; // 不要忘记改变条件,否则会无限循环!
        }
        System.out.println("发射!");
        
        // 示例2:用户输入验证
        System.out.println("\n2. 密码验证模拟:");
        String correctPassword = "123456";
        String enteredPassword = "";
        int attempts = 0;
        int maxAttempts = 3;
        
        // 模拟用户尝试输入密码
        java.util.Scanner scanner = new java.util.Scanner(System.in);
        
        while (!enteredPassword.equals(correctPassword) && attempts < maxAttempts) {
            attempts++;
            System.out.print("请输入密码(尝试" + attempts + "/" + maxAttempts + "): ");
            enteredPassword = scanner.nextLine();
            
            if (!enteredPassword.equals(correctPassword)) {
                System.out.println("密码错误!");
            }
        }
        
        if (enteredPassword.equals(correctPassword)) {
            System.out.println("登录成功!");
        } else {
            System.out.println("尝试次数过多,账户已锁定!");
        }
        
        // 示例3:计算阶乘
        System.out.println("\n3. 计算5的阶乘:");
        int number = 5;
        long factorial = 1;
        int i = 1;
        
        while (i <= number) {
            factorial *= i;
            i++;
        }
        System.out.println(number + "! = " + factorial);
    }
}

do-while 循环

public class DoWhileDemo {
    public static void main(String[] args) {
        System.out.println("=== do-while 循环示例 ===");
        
        // 示例1:至少执行一次
        System.out.println("1. 菜单选择:");
        java.util.Scanner scanner = new java.util.Scanner(System.in);
        int choice;
        
        do {
            System.out.println("\n===== 主菜单 =====");
            System.out.println("1. 查看信息");
            System.out.println("2. 修改信息");
            System.out.println("3. 退出系统");
            System.out.print("请选择(1-3): ");
            
            choice = scanner.nextInt();
            
            switch (choice) {
                case 1:
                    System.out.println("正在查看信息...");
                    break;
                case 2:
                    System.out.println("正在修改信息...");
                    break;
                case 3:
                    System.out.println("正在退出系统...");
                    break;
                default:
                    System.out.println("无效选择,请重新输入!");
            }
        } while (choice != 3);
        
        System.out.println("系统已退出!");
        
        // 示例2:猜数字游戏
        System.out.println("\n2. 猜数字游戏:");
        int secretNumber = 42;
        int guess;
        int attempts = 0;
        
        do {
            attempts++;
            System.out.print("猜一个1-100之间的数字: ");
            guess = scanner.nextInt();
            
            if (guess < secretNumber) {
                System.out.println("猜小了!");
            } else if (guess > secretNumber) {
                System.out.println("猜大了!");
            }
        } while (guess != secretNumber);
        
        System.out.println("恭喜!猜对了!");
        System.out.println("你猜了" + attempts + "次");
    }
}

3. 跳转语句:改变程序执行流程

public class JumpStatements {
    public static void main(String[] args) {
        System.out.println("=== 跳转语句示例 ===");
        
        // break示例:提前结束循环
        System.out.println("1. break语句:查找第一个大于50的数");
        int[] numbers = {23, 45, 67, 12, 89, 34};
        
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] > 50) {
                System.out.println("找到第一个大于50的数: " + numbers[i]);
                System.out.println("它在数组中的位置: 第" + (i + 1) + "个");
                break; // 找到后立即退出循环
            }
        }
        
        // continue示例:跳过当前迭代
        System.out.println("\n2. continue语句:打印1-10之间的奇数");
        for (int i = 1; i <= 10; i++) {
            if (i % 2 == 0) { // 如果是偶数
                continue; // 跳过本次循环的剩余部分
            }
            System.out.print(i + " ");
        }
        
        // 带标签的break和continue
        System.out.println("\n\n3. 带标签的break:");
        outerLoop: // 标签
        for (int i = 1; i <= 3; i++) {
            System.out.println("外层循环第" + i + "次");
            
            for (int j = 1; j <= 3; j++) {
                System.out.println("  内层循环第" + j + "次");
                
                if (i == 2 && j == 2) {
                    System.out.println("  跳出外层循环!");
                    break outerLoop; // 跳出外层循环
                }
            }
        }
        
        // return示例
        System.out.println("\n4. return语句:");
        System.out.println("调用方法前");
        printMessage();
        System.out.println("调用方法后");
    }
    
    public static void printMessage() {
        System.out.println("  方法开始执行");
        
        for (int i = 1; i <= 5; i++) {
            if (i == 3) {
                System.out.println("  遇到3,提前返回");
                return; // 结束方法执行,返回调用处
            }
            System.out.println("  当前数字: " + i);
        }
        
        System.out.println("  方法正常结束"); // 这行不会执行
    }
}

综合示例:学生成绩管理系统

import java.util.Scanner;

public class StudentGradeManagement {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("=== 学生成绩管理系统 ===");
        
        // 输入学生数量
        System.out.print("请输入学生数量: ");
        int studentCount = scanner.nextInt();
        
        // 创建数组存储成绩
        String[] studentNames = new String[studentCount];
        double[] studentGrades = new double[studentCount];
        
        // 输入学生信息和成绩
        for (int i = 0; i < studentCount; i++) {
            System.out.println("\n--- 第" + (i + 1) + "个学生 ---");
            
            System.out.print("请输入学生姓名: ");
            studentNames[i] = scanner.next();
            
            boolean validGrade = false;
            while (!validGrade) {
                System.out.print("请输入学生成绩(0-100): ");
                double grade = scanner.nextDouble();
                
                if (grade >= 0 && grade <= 100) {
                    studentGrades[i] = grade;
                    validGrade = true;
                } else {
                    System.out.println("成绩无效!请输入0-100之间的数字。");
                }
            }
        }
        
        // 统计和分析
        System.out.println("\n=== 成绩统计结果 ===");
        
        double total = 0;
        double highest = studentGrades[0];
        double lowest = studentGrades[0];
        String highestStudent = studentNames[0];
        String lowestStudent = studentNames[0];
        
        for (int i = 0; i < studentCount; i++) {
            // 累加总分
            total += studentGrades[i];
            
            // 查找最高分
            if (studentGrades[i] > highest) {
                highest = studentGrades[i];
                highestStudent = studentNames[i];
            }
            
            // 查找最低分
            if (studentGrades[i] < lowest) {
                lowest = studentGrades[i];
                lowestStudent = studentNames[i];
            }
        }
        
        // 计算平均分
        double average = total / studentCount;
        System.out.println("班级平均分: " + String.format("%.2f", average));
        System.out.println("最高分: " + highest + " (" + highestStudent + ")");
        System.out.println("最低分: " + lowest + " (" + lowestStudent + ")");
        
        // 统计各分数段人数
        int excellent = 0, good = 0, medium = 0, pass = 0, fail = 0;
        
        for (int i = 0; i < studentCount; i++) {
            if (studentGrades[i] >= 90) {
                excellent++;
            } else if (studentGrades[i] >= 80) {
                good++;
            } else if (studentGrades[i] >= 70) {
                medium++;
            } else if (studentGrades[i] >= 60) {
                pass++;
            } else {
                fail++;
            }
        }
        
        System.out.println("\n=== 分数段统计 ===");
        System.out.println("优秀(90-100): " + excellent + "人");
        System.out.println("良好(80-89): " + good + "人");
        System.out.println("中等(70-79): " + medium + "人");
        System.out.println("及格(60-69): " + pass + "人");
        System.out.println("不及格(0-59): " + fail + "人");
        
        // 查找特定学生
        System.out.print("\n请输入要查找的学生姓名: ");
        String searchName = scanner.next();
        boolean found = false;
        
        for (int i = 0; i < studentCount; i++) {
            if (studentNames[i].equalsIgnoreCase(searchName)) {
                System.out.println("找到学生: " + studentNames[i]);
                System.out.println("成绩: " + studentGrades[i]);
                
                // 判断等级
                if (studentGrades[i] >= 90) {
                    System.out.println("等级: 优秀");
                } else if (studentGrades[i] >= 80) {
                    System.out.println("等级: 良好");
                } else if (studentGrades[i] >= 70) {
                    System.out.println("等级: 中等");
                } else if (studentGrades[i] >= 60) {
                    System.out.println("等级: 及格");
                } else {
                    System.out.println("等级: 不及格");
                }
                
                found = true;
                break;
            }
        }
        
        if (!found) {
            System.out.println("未找到学生: " + searchName);
        }
        
        scanner.close();
        System.out.println("\n=== 程序结束 ===");
    }
}

注意事项

  1. if语句条件:条件必须是布尔表达式,不能用数字代替
  2. switch的break:忘记写break会导致"穿透"现象,会继续执行后面的case
  3. 循环控制变量:确保循环有结束条件,避免无限循环
  4. 循环性能:嵌套循环的时间复杂度是O(n²),数据量大时性能差
  5. break和continue:谨慎使用,过多使用会影响代码可读性
  6. 浮点数比较:不要用==比较浮点数,应该判断差值是否在允许范围内