第一部分:本周知识总览
本周我们系统学习了Java程序控制流程的四大核心结构
条件判断
- if-else基础结构
- 多重if-else链
- 嵌套if结构
- 三元运算符
选择结构
- switch-case语法
- break关键字
- default分支
- 字符串switch
循环结构
- for循环
- while循环
- do-while循环
- foreach循环
流程控制
- break语句
- continue语句
- 标签(label)使用
- 嵌套循环控制
第二部分:条件判断详解
从基础if到三元运算符的完整语法体系
学习目标
掌握所有条件判断语法,能编写复杂的逻辑判断程序
1
if-else基础语法
if (条件表达式) {
// 条件为true时执行
} else {
// 条件为false时执行
}
// 条件为true时执行
} else {
// 条件为false时执行
}
条件判断
→
true分支
↘
false分支
2
多重if-else链
int score = 85;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
3
三元运算符
// 基本语法:条件 ? 值1 : 值2
int a = 10, b = 20;
int max = (a > b) ? a : b;
System.out.println("最大值是:" + max); // 输出:20
// 嵌套三元运算符
String result = (score >= 60) ?
((score >= 90) ? "优秀" : "及格") :
"不及格";
int a = 10, b = 20;
int max = (a > b) ? a : b;
System.out.println("最大值是:" + max); // 输出:20
// 嵌套三元运算符
String result = (score >= 60) ?
((score >= 90) ? "优秀" : "及格") :
"不及格";
常见错误警示
- 忘记花括号: 当if语句只有一行代码时,容易忘记花括号导致逻辑错误
- 比较运算符错误: 将==写成=,导致赋值而非比较
- 三元运算符过度嵌套: 超过2层嵌套会降低代码可读性
第三部分:switch-case选择结构
多分支选择的优雅解决方案
1
基础语法结构
switch (表达式) {
case 值1:
// 执行语句
break;
case 值2:
// 执行语句
break;
default:
// 默认执行语句
}
case 值1:
// 执行语句
break;
case 值2:
// 执行语句
break;
default:
// 默认执行语句
}
2
实际应用案例
import java.util.Scanner;
public class GradeCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入成绩等级(A-F):");
String grade = scanner.next().toUpperCase();
switch (grade) {
case "A":
System.out.println("优秀!90-100分");
break;
case "B":
System.out.println("良好!80-89分");
break;
case "C":
case "D":
System.out.println("及格!60-79分");
break;
default:
System.out.println("不及格!需要补考");
}
scanner.close();
}
}
public class GradeCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入成绩等级(A-F):");
String grade = scanner.next().toUpperCase();
switch (grade) {
case "A":
System.out.println("优秀!90-100分");
break;
case "B":
System.out.println("良好!80-89分");
break;
case "C":
case "D":
System.out.println("及格!60-79分");
break;
default:
System.out.println("不及格!需要补考");
}
scanner.close();
}
}
switch-case使用技巧
- 从Java 7开始支持字符串switch
- 多个case可以共享执行代码块
- 不要忘记break,否则会出现"case穿透"
- default分支可以放在任意位置,但通常放最后
第四部分:循环结构完全指南
for、while、do-while三种循环的深入解析
1
for循环基础
// 基本语法:for(初始化; 条件判断; 迭代更新)
for (int i = 0; i < 5; i++) {
System.out.println("第" + (i+1) + "次循环");
}
// 输出1-100的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("1-100的和:" + sum); // 5050
for (int i = 0; i < 5; i++) {
System.out.println("第" + (i+1) + "次循环");
}
// 输出1-100的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("1-100的和:" + sum); // 5050
2
增强for循环
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println("当前数字:" + num);
}
for (int num : numbers) {
System.out.println("当前数字:" + num);
}
3
while循环
// 猜数字游戏
import java.util.Scanner;
import java.util.Random;
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int target = random.nextInt(100) + 1;
int guess = 0;
int attempts = 0;
while (guess != target) {
System.out.print("猜一个1-100的数字:");
guess = scanner.nextInt();
attempts++;
if (guess > target) {
System.out.println("太大了!");
} else if (guess < target) {
System.out.println("太小了!");
} else {
System.out.println("恭喜!用了" + attempts + "次猜中");
}
}
import java.util.Scanner;
import java.util.Random;
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int target = random.nextInt(100) + 1;
int guess = 0;
int attempts = 0;
while (guess != target) {
System.out.print("猜一个1-100的数字:");
guess = scanner.nextInt();
attempts++;
if (guess > target) {
System.out.println("太大了!");
} else if (guess < target) {
System.out.println("太小了!");
} else {
System.out.println("恭喜!用了" + attempts + "次猜中");
}
}
4
do-while循环
// 至少执行一次的循环
int password;
do {
System.out.print("请输入密码(1234):");
password = scanner.nextInt();
if (password != 1234) {
System.out.println("密码错误,请重试!");
}
} while (password != 1234);
System.out.println("登录成功!");
int password;
do {
System.out.print("请输入密码(1234):");
password = scanner.nextInt();
if (password != 1234) {
System.out.println("密码错误,请重试!");
}
} while (password != 1234);
System.out.println("登录成功!");
for循环适用场景
- 已知循环次数
- 需要计数器变量
- 遍历数组/集合
while循环适用场景
- 未知循环次数
- 基于条件判断
- 读取文件/网络数据
do-while循环适用场景
- 至少执行一次
- 菜单选择
- 输入验证
第五部分:break/continue/label控制
掌握循环控制的高级技巧
1
break语句
// 找出1-100的第一个能被17整除的数
for (int i = 1; i <= 100; i++) {
if (i % 17 == 0) {
System.out.println("第一个能被17整除的数是:" + i);
break; // 找到后立即退出循环
}
}
for (int i = 1; i <= 100; i++) {
if (i % 17 == 0) {
System.out.println("第一个能被17整除的数是:" + i);
break; // 找到后立即退出循环
}
}
2
continue语句
// 打印1-20的奇数,跳过偶数
for (int i = 1; i <= 20; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
System.out.print(i + " ");
}
// 输出:1 3 5 7 9 11 13 15 17 19
for (int i = 1; i <= 20; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
System.out.print(i + " ");
}
// 输出:1 3 5 7 9 11 13 15 17 19
3
标签(label)控制
// 使用标签控制嵌套循环
outerLoop: for (int i = 1; i <= 3; i++) {
System.out.println("外层循环:" + i);
for (int j = 1; j <= 3; j++) {
if (j == 2 && i == 2) {
break outerLoop; // 跳出外层循环
}
System.out.println(" 内层循环:" + j);
}
}
outerLoop: for (int i = 1; i <= 3; i++) {
System.out.println("外层循环:" + i);
for (int j = 1; j <= 3; j++) {
if (j == 2 && i == 2) {
break outerLoop; // 跳出外层循环
}
System.out.println(" 内层循环:" + j);
}
}
流程控制使用警告
- 过度使用break: 会使程序流程难以理解,考虑优化循环条件
- 标签滥用: 标签会降低代码可读性,仅在嵌套循环必须使用
- continue替代if: 有时直接用if判断更清晰
第六部分:综合实战演练
综合运用本周所学知识完成实际项目
1
项目需求
开发一个简单的学生成绩管理系统,包含以下功能:
- 录入5个学生的成绩
- 计算平均分
- 统计各等级人数
- 查找最高分学生
2
完整实现代码
import java.util.Scanner;
public class StudentGradeSystem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
final int STUDENT_COUNT = 5;
String[] names = new String[STUDENT_COUNT];
int[] scores = new int[STUDENT_COUNT];
// 1. 录入学生信息
for (int i = 0; i < STUDENT_COUNT; i++) {
System.out.print("请输入第" + (i+1) + "个学生姓名:");
names[i] = scanner.next();
do {
System.out.print("请输入" + names[i] + "的成绩(0-100):");
scores[i] = scanner.nextInt();
} while (scores[i] < 0 || scores[i] > 100);
}
// 2. 计算统计信息
int sum = 0;
int excellent = 0, good = 0, pass = 0, fail = 0;
int maxIndex = 0;
for (int i = 0; i < STUDENT_COUNT; i++) {
sum += scores[i];
if (scores[i] > scores[maxIndex]) {
maxIndex = i;
}
switch (scores[i] / 10) {
case 10:
case 9: excellent++; break;
case 8:
case 7: good++; break;
case 6: pass++; break;
default: fail++;
}
}
// 3. 输出结果
System.out.println("\n=== 成绩统计结果 ===");
System.out.println("平均分:" + (sum / (double)STUDENT_COUNT));
System.out.println("最高分:" + names[maxIndex] + " - " + scores[maxIndex] + "分");
System.out.println("优秀:" + excellent + "人");
System.out.println("良好:" + good + "人");
System.out.println("及格:" + pass + "人");
System.out.println("不及格:" + fail + "人");
scanner.close();
}
}
public class StudentGradeSystem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
final int STUDENT_COUNT = 5;
String[] names = new String[STUDENT_COUNT];
int[] scores = new int[STUDENT_COUNT];
// 1. 录入学生信息
for (int i = 0; i < STUDENT_COUNT; i++) {
System.out.print("请输入第" + (i+1) + "个学生姓名:");
names[i] = scanner.next();
do {
System.out.print("请输入" + names[i] + "的成绩(0-100):");
scores[i] = scanner.nextInt();
} while (scores[i] < 0 || scores[i] > 100);
}
// 2. 计算统计信息
int sum = 0;
int excellent = 0, good = 0, pass = 0, fail = 0;
int maxIndex = 0;
for (int i = 0; i < STUDENT_COUNT; i++) {
sum += scores[i];
if (scores[i] > scores[maxIndex]) {
maxIndex = i;
}
switch (scores[i] / 10) {
case 10:
case 9: excellent++; break;
case 8:
case 7: good++; break;
case 6: pass++; break;
default: fail++;
}
}
// 3. 输出结果
System.out.println("\n=== 成绩统计结果 ===");
System.out.println("平均分:" + (sum / (double)STUDENT_COUNT));
System.out.println("最高分:" + names[maxIndex] + " - " + scores[maxIndex] + "分");
System.out.println("优秀:" + excellent + "人");
System.out.println("良好:" + good + "人");
System.out.println("及格:" + pass + "人");
System.out.println("不及格:" + fail + "人");
scanner.close();
}
}
动手练习任务
- 修改程序支持动态学生数量
- 添加成绩排序功能
- 实现按姓名搜索学生成绩
- 添加异常处理(输入非数字时)
第七部分:常见错误与调试技巧
汇总新手最容易犯的错误及解决方案
语法错误
- for循环缺少分号
- switch语句缺少break
- while条件后多写分号
// 错误示例
for (int i=0 i<10 i++) {} // 缺少分号
while (i < 10); {} // 分号导致空循环
for (int i=0 i<10 i++) {} // 缺少分号
while (i < 10); {} // 分号导致空循环
逻辑错误
- 循环条件设置错误
- 边界值处理不当
- 变量作用域问题
// 错误示例
for (int i=1; i<=10; i++) {
int sum = 0; // 变量在循环内重置
sum += i; // 结果始终为i
}
for (int i=1; i<=10; i++) {
int sum = 0; // 变量在循环内重置
sum += i; // 结果始终为i
}
调试技巧
- 使用System.out.println()输出变量值
- IDEA断点调试
- 逐步执行观察变量变化
// 调试技巧
for (int i=0; i<10; i++) {
System.out.println("i=" + i + ", sum=" + sum);
// 设置断点观察
}
for (int i=0; i<10; i++) {
System.out.println("i=" + i + ", sum=" + sum);
// 设置断点观察
}
调试建议
遇到循环问题时,建议:1) 先画流程图理清思路 2) 从简单案例开始测试 3) 逐步添加复杂度 4) 使用调试工具单步执行 5) 打印关键变量值
第八部分:第二周学习检查清单
确认本周所有知识点已掌握
条件判断 ✓
- □ 能编写if-else链处理多分支
- □ 理解三元运算符的用法
- □ 掌握switch-case语法
- □ 能处理字符串switch
循环结构 ✓
- □ 能正确使用for循环
- □ 理解while和do-while区别
- □ 掌握增强for循环
- □ 能处理嵌套循环
流程控制 ✓
- □ 正确使用break退出循环
- □ 理解continue的用法
- □ 掌握标签控制
- □ 能调试循环程序
本周成就
恭喜完成第一阶段第二周学习!您现在能够:
- ✅ 编写复杂的条件判断程序
- ✅ 熟练使用各种循环结构
- ✅ 解决实际编程问题
- ✅ 调试和修复常见错误
下周预告: 将学习数组、方法和面向对象基础