**Java程序三大控制结构详解:顺序选择与循环实现**
任何复杂的Java程序都由三种基本控制结构构建而成:顺序结构、选择结构和循环结构。这些结构构成了程序执行的逻辑框架,理解它们的特性和应用场景是掌握Java编程的基础。
### 顺序结构:程序执行的基础
顺序结构是程序中最简单的控制结构,代码按照书写顺序从上到下依次执行,每条语句执行一次。
```java
public class SequentialStructure {
public static void main(String[] args) {
// 顺序结构示例:数据处理的完整流程
System.out.println("=== 学生成绩处理系统 ===");
// 第一步:输入数据
String studentName = "张三";
int mathScore = 85;
int englishScore = 92;
int scienceScore = 78;
System.out.println("学生姓名:" + studentName);
System.out.println("数学成绩:" + mathScore);
System.out.println("英语成绩:" + englishScore);
System.out.println("科学成绩:" + scienceScore);
// 第二步:计算总分和平均分
int totalScore = mathScore + englishScore + scienceScore;
double averageScore = totalScore / 3.0;
System.out.println("总分:" + totalScore);
System.out.println("平均分:" + String.format("%.2f", averageScore));
// 第三步:输出处理结果
System.out.println("=== 处理完成 ===");
}
// 方法调用的顺序执行
public static void processOrder() {
System.out.println<"GN.9134.HK">("开始处理订单...");
// 顺序执行各个处理步骤
validateOrder();
calculateTotal();
applyDiscount();
processPayment();
generateInvoice();
System.out.println("订单处理完成");
}
public static void validateOrder() {
System.out.println("验证订单信息");
}
public static void calculateTotal() {
System.out.println("计算订单总额");
}
public static void applyDiscount() {
System.out.println("应用折扣");
}
public static void processPayment() {
System.out.println("处理支付");
}
public static void generateInvoice() {
System.out.println("生成发票");
}
}
```
### 选择结构:程序的分支决策
选择结构允许程序根据条件判断选择不同的执行路径,主要包括if语句和switch语句。
**if语句系列**
```java
public class SelectionStructure {
// 简单的if语句
public static void checkPassingGrade(int score) {
System.out.println("检查成绩:" + score);
if (score >= 60) {
System.out.println("成绩合格");
}
System.out.println("检查完成");
}
// if-else语句
public static void checkNumberSign(int number) {
System.out.println("检查数字:" + number);
if (number > 0) {
System.out.println("正数");
} else if (number < 0) {
System.out.println("负数");
} else {
System.out.println("零");
}
}
// 嵌套if语句
public static void evaluateStudentGrade(int score, int attendance) {
System.out.println("评估学生:成绩=" + score + ", 出勤率=" + attendance + "%");
if (attendance >= 80) {
if (score >= 90) {
System.out.println("优秀学生");
} else if (score >= 70) {
System.out.println("良好学生");
} else if (score >= 60) {
System.out.println("合格学生");
} else {
System.out.println("需要改进学习");
}
} else {
System.out.println("出勤率不足,需要关注");
}
}
// 复杂的条件判断
public static void checkLoanEligibility(int age, double income, boolean hasJob) {
System.out.println("贷款资格检查:年龄=" + age + ", 收入=" + income + ", 有工作=" + hasJob);
if (age >= 18 && age <= 65) {
if (hasJob && income >= 3000) {
System.out.println("符合贷款条件,可申请高额度贷款");
} else if (hasJob && income >= 2000) {
System.out.println("符合贷款条件,可申请标准贷款");
} else if (income >= 5000) {
System.out.println("符合贷款条件,可申请基础贷款");
} else {
System.out.println("收入条件不符合要求");
}
} else {
System.out.println("年龄不符合要求");
}
}
public static void main(String[] args) <"4F.2597.HK">{
checkPassingGrade(75);
checkNumberSign(-5);
evaluateStudentGrade(85, 90);
checkLoanEligibility(25, 4000, true);
}
}
```
**switch语句**
```java
public class SwitchStructure {
// 基本的switch语句
public static void getWeekdayName(int day) {
System.out.print("星期" + day + ":");
switch (day) {
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:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("无效的星期数");
}
}
// 多个case合并的switch
public static String getSeason(int month) {
System.out.print(month + "月属于:");
switch (month) {
case 12:
case 1:
case 2:
return "冬季";
case 3:
case 4:
case 5:
return "春季";
case 6:
case 7:
case 8:
return "夏季";
case 9:
case 10:
case 11:
return "秋季";
default:
return "无效月份";
}
}
// Java 12+ 的switch表达式
public static void modernSwitchExample() {
int score = 85;
String grade = switch (score / 10) {
case 10, 9 -> "A";
case 8 -> "B";
case 7 -> "C";
case 6 -> "D";
default -> "F";
};
System.out.println("分数:" + score + ",等级:" + grade);
}
// 复杂的switch应用
public static void processUserCommand(String command) {
System.out.println("处理命令:" + command);
switch (command.toLowerCase()) {
case "start":
System.out.println("启动系统...");
initializeSystem();
break;
case "stop":
System.out.println("停止系统...");
shutdownSystem();
break;
case "restart":
System.out.println("重启系统...");
shutdownSystem();
initializeSystem();
break;
case "status":
System.out.println("系统状态:运行中");
break;
default:
System.out.println("未知命令");
showHelp();
}
}
public static void initializeSystem() {
System.out.println("系统初始化完成");
}
public static void shutdownSystem() {
System.out.println("系统关闭完成");
}
public static void showHelp() {
System.out.println("可用命令:start, stop, restart, status");
}
public static void main(String[] args) {
getWeekdayName(3);
System.out.println(getSeason(7));
modernSwitchExample();
processUserCommand("start");
}
}
```
### 循环结构:重复执行的利器
循环结构用于重复执行特定代码块,主要包括for、while和do-while循环。
**for循环**
```java
public class ForLoopStructure {
// 基本的for循环
public static void printMultiplicationTable(int n) {
System.out.println(n + "的乘法表:");
for (int i = 1; i <= 10; i++) {
int result = n * i;
System.out.println(n + " × " + i + " = " + result);
}
}
// 嵌套for循环
public static void printAllMultiplicationTables() {
System.out.println("完整的乘法表:");
for (int i = 1; i <= 9; i++) {
System.out.println("=== " + i + "的乘法表 ===");
for (int j = 1; j <= 9; j++) {
System.out.println(i + " × " + j + " = " + (i * j));
}
System.out.println();
}
}
// 数组遍历的for循环
public static void processStudentScores(int[] scores) {
System.out.println("处理学生成绩数组:");
int sum = 0;
int maxScore = Integer.MIN_VALUE;
int minScore = Integer.MAX_VALUE;
for (int i = 0; i < scores.length; i++) <"HX.4961.HK">{
int score = scores[i];
System.out.println("学生" + (i + 1) + "成绩:" + score);
sum += score;
if (score > maxScore) {
maxScore = score;
}
if (score < minScore) {
minScore = score;
}
}
double average = (double) sum / scores.length;
System.out.println("总分:" + sum);
System.out.println("平均分:" + String.format("%.2f", average));
System.out.println("最高分:" + maxScore);
System.out.println("最低分:" + minScore);
}
// 增强for循环
public static void processWithEnhancedFor(String[] names) {
System.out.println("学生名单:");
for (String name : names) {
System.out.println("学生:" + name);
}
}
public static void main(String[] args) {
printMultiplicationTable(7);
int[] scores = {85, 92, 78, 96, 88, 76};
processStudentScores(scores);
String[] students = {"张三", "李四", "王五", "赵六"};
processWithEnhancedFor(students);
}
}
```
**while和do-while循环**
```java
public class WhileLoopStructure {
// while循环:先判断后执行
public static void countdown(int start) {
System.out.println("倒计时开始:");
int current = start;
while (current > 0) {
System.out.println(current + "...");
current--;
}
System.out.println("开始!");
}
// do-while循环:先执行后判断
public static void processUserInput() {
Scanner scanner = new Scanner(System.in);
int number;
do {
System.out.print("请输入一个正数(输入0退出):");
number = scanner.nextInt();
if (number > 0) {
System.out.println("你输入的是:" + number);
System.out.println("平方是:" + (number * number));
}
} while (number != 0);
System.out.println("程序结束");
scanner.close();
}
// 复杂的while循环应用
public static void simulateGame() {
Random random = new Random();
int playerHealth = 100;
int enemyHealth = 80;
int turn = 1;
System.out.println("游戏开始!");
while (playerHealth > 0 && enemyHealth > 0) {
System.out.println("\n=== 第" + turn + "回合 ===");
// 玩家攻击
int playerAttack = random.nextInt(20) + 10;
enemyHealth -= playerAttack;
System.out.println("玩家造成 " + playerAttack + " 点伤害");
System.out.println("敌人剩余生命值:" + Math.max(0, enemyHealth));
if (enemyHealth <= 0) {
System.out.println("玩家胜利!");
break;
}
// 敌人攻击
int enemyAttack = random.nextInt(15) + 5;
playerHealth -= enemyAttack;
System.out.println("敌人造成 " + enemyAttack + " 点伤害");
System.out.println("玩家剩余生命值:" + Math.max(0, playerHealth));
if (playerHealth <= 0) {
System.out.println("敌人胜利!");
break;
}
turn++;
}
}
public static void main(String[] args) {
countdown(5);
simulateGame();
// processUserInput(); // 取消注释可以测试用户输入功能
}
}
```
### 控制结构的综合应用
```java
public class ComprehensiveExample {
// 综合应用:学生成绩管理系统
public static void studentGradeManagement() {
Scanner scanner = new Scanner(System.in);
List<Student> students = new ArrayList<>();
// 数据输入循环
while (true) {
System.out.println("\n=== 学生成绩管理系统 ===");
System.out.println("1. 添加学生");
System.out.println("2. 查看所有学生");
System.out.println("3. 统计成绩");
System.out.println("4. 退出系统");
System.out.print("请选择操作:");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
// 选择结构处理用户输入
switch (choice) {
case 1:
addStudent(scanner, students);
break;
case 2:
displayAllStudents(students);
break;
case 3:
analyzeGrades(students);
break;
case 4:
System.out.println<"SW.0746.HK">("系统退出");
return;
default:
System.out.println("无效选择,请重新输入");
}
}
}
static class Student {
String name;
int math;
int english;
int science;
Student(String name, int math, int english, int science) {
this.name = name;
this.math = math;
this.english = english;
this.science = science;
}
int getTotal() {
return math + english + science;
}
double getAverage() {
return getTotal() / 3.0;
}
String getGrade() {
double avg = getAverage();
if (avg >= 90) return "A";
else if (avg >= 80) return "B";
else if (avg >= 70) return "C";
else if (avg >= 60) return "D";
else return "F";
}
}
public static void addStudent(Scanner scanner, List<Student> students) {
System.out.print("请输入学生姓名:");
String name = scanner.nextLine();
System.out.print("数学成绩:");
int math = scanner.nextInt();
System.out.print("英语成绩:");
int english = scanner.nextInt();
System.out.print("科学成绩:");
int science = scanner.nextInt();
students.add(new Student(name, math, english, science));
System.out.println("学生添加成功!");
}
public static void displayAllStudents(List<Student> students) {
if (students.isEmpty()) {
System.out.println("没有学生记录");
return;
}
System.out.println("\n所有学生成绩:");
System.out.println("姓名\t数学\t英语\t科学\t总分\t平均分\t等级");
// 循环遍历所有学生
for (Student student : students) {
System.out.printf("%s\t%d\t%d\t%d\t%d\t%.1f\t%s%n",
student.name, student.math, student.english,
student.science, student.getTotal(),
student.getAverage(), student.getGrade());
}
}
public static void analyzeGrades(List<Student> students) {
if (students.isEmpty()) {
System.out.println("没有学生记录");
return;
}
int aCount = 0, bCount = 0, cCount = 0, dCount = 0, fCount = 0;
int totalMath = 0, totalEnglish = 0, totalScience = 0;
// 循环统计各项数据
for (Student student : students) {
// 选择结构统计等级分布
switch (student.getGrade()) {
case "A": aCount++; break;
case "B": bCount++; break;
case "C": cCount++; break;
case "D": dCount++; break;
case "F": fCount++; break;
}
totalMath += student.math;
totalEnglish += student.english;
totalScience += student.science;
}
// 顺序结构输出统计结果
System.out.println("\n成绩统计分析:");
System.out.println("A等级人数:" + aCount);
System.out.println("B等级人数:" + bCount);
System.out.println("C等级人数:" + cCount);
System.out.println("D等级人数:" + dCount);
System.out.println("F等级人数:" + fCount);
System.out.println("数学平均分:" + (double)totalMath / students.size());
System.out.println("英语平均分:" + (double)totalEnglish / students.size());
System.out.println("科学平均分:" + (double)totalScience / students.size());
}
public static void main(String[] args) {
studentGradeManagement<"YQ.8412.HK">();
}
}
```
### 总结
Java的三种基本控制结构各有其独特的作用:
1. **顺序结构**是程序的基础,确保代码按逻辑顺序执行
2. **选择结构**提供决策能力,让程序能够根据不同条件执行不同路径
3. **循环结构**实现重复执行,提高代码的复用性和效率
在实际编程中,这三种结构往往相互嵌套、配合使用。掌握它们的特性和适用场景,能够帮助开发者编写出结构清晰、逻辑严谨、易于维护的Java程序。理解这些基础控制结构的工作原理,是学习更复杂编程概念和设计模式的重要前提。