假设有一家蛋糕店,每天要生产50个蛋糕。每个蛋糕的制作都需要:
- 准备模具(初始化)
- 检查是否还需要生产(条件判断)
- 倒入面糊(循环体执行)
- 记录已生产数量(迭代)
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
代码解析
- 先询读取班级人数,确定循环次数。
- 初始化计数器
i=1
,这是"学生人数的计数器"。 - 每次循环读取一个学生成绩并累加到总成绩totalScore。
- 计数器i自动增加,直到超过学生人数时结束循环。
- 最后计算并输出平均分,并格式化输出。
这个例子展示了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;
}
综合练习题
理论题
-
下面代码输出什么?为什么?
for(int i=0; i<5; i=i+2) { System.out.print(i + " "); }
答案:输出"0 2 4 ",因为循环变量每次增加2
-
如何用for循环实现从100倒数到1? 答案:for(int i=100; i>=1; i--) {}
-
比较for循环和while循环各适合什么场景? 答案:for适合已知循环次数的情况,while适合条件复杂或次数不确定的情况。
-
下面这段代码会输出什么?
for(int i=10; i>0; i-=3) { System.out.print(i + " "); }
答案:输出"10 7 4 1 ",因为每次循环i减少3。
-
如果要遍历字符串中的每个字符,应该怎么写循环? 示例
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到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
- 改进成绩统计程序,增加最高分和最低分统计功能
# 源文件保存为“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