「Java流程控制」for循环结构

0 阅读6分钟

假设有一家蛋糕店,每天要生产50个蛋糕。每个蛋糕的制作都需要:

  1. 准备模具(初始化)
  2. 检查是否还需要生产(条件判断)
  3. 倒入面糊(循环体执行)
  4. 记录已生产数量(迭代)

for循环就像这个标准化的生产过程,把重复性的工作安排得井井有条。

for语法结构

for(初始化; 条件判断; 迭代){
    // 循环体语句
}

for循环结构把循环控制的三个关键要素集中放在一行,比while循环更加紧凑明了。就像流水线的控制面板,所有调节按钮都集中在一个区域,操作起来特别方便。

案例解析

学生成绩统计

编写一个程序,统计一个班级学生的平均分。

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

public class ScoreCalculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入班级人数:");
        int studentCount = scanner.nextInt();
        
        double totalScore = 0;
        
        for(int i = 1; i <= studentCount; i++) {
            System.out.print("请输入第" + i + "个学生的成绩:");
            double score = scanner.nextDouble();
            totalScore += score;
        }
        
        double average = totalScore / studentCount;
        System.out.printf("班级平均分是:%.1f\n", average);
        
        scanner.close();
    }
}

运行结果 依次输入班级人数和学生成绩

请输入班级人数:5 请输入第1个学生的成绩:65 请输入第2个学生的成绩:36 请输入第3个学生的成绩:96 请输入第4个学生的成绩:49 请输入第5个学生的成绩:86 班级平均分是:66.4

代码解析

  1. 先询读取班级人数,确定循环次数。
  2. 初始化计数器i=1,这是"学生人数的计数器"。
  3. 每次循环读取一个学生成绩并累加到总成绩totalScore
  4. 计数器i自动增加,直到超过学生人数时结束循环。
  5. 最后计算并输出平均分,并格式化输出。

这个例子展示了for循环最适合的场景:已知循环次数的重复操作。就像知道要生产多少个蛋糕,按数量一个个制作。

智能温度转换器

编写程序,把最近一周的摄氏温度转换为华氏温度。

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

public class TemperatureConverter {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double[] celsiusTemps = new double[7];

        System.out.println("请输入最近7天的摄氏温度:");

        for (int day = 0; day < 7; day++) {
            System.out.print("第" + (day + 1) + "天温度:");
            celsiusTemps[day] = scanner.nextDouble();
        }

        System.out.println("\n温度转换结果:");
        System.out.println("天数\t摄氏\t华氏");

        for (int day = 0; day < 7; day++) {
            double fahrenheit = celsiusTemps[day] * 9 / 5 + 32;
            System.out.printf("%d\t%.1f\t%.1f\n",
                    day + 1, celsiusTemps[day], fahrenheit);
        }

        scanner.close();
    }
}

运行结果 依次输入一周7天的温度

请输入最近7天的摄氏温度: 第1天温度:28 第2天温度:26 第3天温度:27 第4天温度:28 第5天温度:29 第6天温度:30 第7天温度:26

温度转换结果: 天数 摄氏 华氏 1 28.0 82.4 2 26.0 78.8 3 27.0 80.6 4 28.0 82.4 5 29.0 84.2 6 30.0 86.0 7 26.0 78.8

代码亮点:

  • 第一个for循环收读取户输入的温度数据
  • 第二个for循环进行批量转换计算
  • 使用printf格式化输出,保持表格对齐
  • 数组索引从0开始,但显示给用户时从1开始

这个案例比简单的计数循环更实用,展示了for循环处理数组的天然优势

常见错误及解决方法

死循环陷阱

for(int i=0; i<10; i--) {
    // 不小心把i++写成i--
}

解决方法:检查迭代条件,确保循环变量朝着结束条件方向变化。

作用域问题

for(int i=0; i<5; i++) {
    // 循环体
}
System.out.println(i); // 这里i已经不可见

解决方法:理解循环变量的作用域仅限于循环内部,外部需要使用时要提前声明。

分号位置错误

for(int i=0; i<5; i++); {
    System.out.println("这只会执行一次");
}

错误原因:结果编译报错,怎么回事?问题出在那个多余的分号上,它让for循环变成了空语句。 解决方法:注意for语句后面不要误加分号,这会导致循环体变成空语句。应该改成:

for(int i=0; i<5; i++); {
    System.out.println("这只会执行一次");
}

数组越界

int[] scores = new int[5];
for(int i=1; i<=5; i++) {
    scores[i] = i*10; // 当i=5时会抛出异常
}

错误原因:数组的下标从0开始,int[] scores = new int[5];数组下标从0开始到4结束,当i = 5时,scores[i] = i*10;等价于scores[5] = 5*10;数组越界,出现错误。 解决方法:记住数组索引是从0开始的,应该改成:

for(int i=0; i<5; i++) {
    scores[i] = (i+1)*10;
}

综合练习题

理论题

  1. 下面代码输出什么?为什么?

    for(int i=0; i<5; i=i+2) {
        System.out.print(i + " ");
    }
    

    答案:输出"0 2 4 ",因为循环变量每次增加2

  2. 如何用for循环实现从100倒数到1? 答案:for(int i=100; i>=1; i--) {}

  3. 比较for循环和while循环各适合什么场景? 答案:for适合已知循环次数的情况,while适合条件复杂或次数不确定的情况。

  4. 下面这段代码会输出什么?

    for(int i=10; i>0; i-=3) {
        System.out.print(i + " ");
    }
    

    答案:输出"10 7 4 1 ",因为每次循环i减少3。

  5. 如果要遍历字符串中的每个字符,应该怎么写循环? 示例

    String word = "Hello";
    for(int i=0; i<word.length(); i++) {
        char c = word.charAt(i);
        System.out.println(c);
    }
    

6 为什么下面的循环不会结束?

for(double d = 0.1; d != 1.0; d += 0.1) {
    System.out.println(d);
}

解析:浮点数精度问题导致d永远不会精确等于1.0,应该改为d <= 1.0。

实战编程题

  1. 编写程序计算1到100所有奇数的和
# 源文件保存为“OddNumber.java”。
public class OddNumber {
    public static void main(String[] args) {
        int sum = 0;
        for(int i=1; i<=100; i+=2) {
            sum += i;
        }
        System.out.println("奇数和:" + sum);
    }
}

运行结果

奇数和:2500

  1. 改进成绩统计程序,增加最高分和最低分统计功能
# 源文件保存为“ScoreCalculator.java”。
import java.util.Scanner;

public class ScoreCalculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入班级人数:");
        int studentCount = scanner.nextInt();
        double maxScore = Double.MIN_VALUE;
        double minScore = Double.MAX_VALUE;

        double totalScore = 0;

        for(int i = 1; i <= studentCount; i++) {
            System.out.print("请输入第" + i + "个学生的成绩:");
            double score = scanner.nextDouble();
            totalScore += score;
            if(score > maxScore) maxScore = score;
            if(score < minScore) minScore = score;
        }

        double average = totalScore / studentCount;
        System.out.printf("班级平均分是:%.1f\n", average);
        System.out.printf("最高分:%.1f\n", maxScore);
        System.out.printf("最低分:%.1f\n", minScore);

        scanner.close();
    }
}

运行结果 依次输入班级人数和学生成绩

请输入班级人数:5 请输入第1个学生的成绩:65 请输入第2个学生的成绩:36 请输入第3个学生的成绩:96 请输入第4个学生的成绩:49 请输入第5个学生的成绩:86 班级平均分是:66.4 最高分:96.0 最低分:36.0