條件語句:程序的邏輯分支
程序之所以能解決複雜問題,核心在於它能根據不同條件執行不同代碼。就像生活中"如果下雨就帶傘,否則帶墨鏡"的決策過程,Java通過條件語句實現這種邏輯判斷。
if-else基礎結構
最常用的條件判斷結構是if-else語句,它由一個布爾條件和兩個代碼塊組成。當條件為true時執行if代碼塊,為false時執行else代碼塊。
基礎語法示例:
int score = 75;
if (score >= 60) {
System.out.println("成績合格"); // 條件成立時執行
} else {
System.out.println("成績不合格"); // 條件不成立時執行
}
這段代碼會輸出"成績合格",因為75大於60。注意條件表達式必須返回布爾值,不能直接使用數字(這是Java與C語言的重要區別)。
if-else if-else多條件判斷
當需要判斷多個條件時,可以使用if-else 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("不及格");
}
常見錯誤:條件順序錯誤。如果把score >= 60放在最前面,那麼85分會錯誤地被判斷為"及格"。條件應該從嚴格到寬鬆排列。
switch-case分支結構
當判斷條件是固定值匹配時,switch-case結構比if-else更簡潔。Java 7及以上版本支持字符串作為switch的判斷條件。
星期判斷示例:
int weekday = 3;
switch (weekday) {
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("無效日期");
}
注意事項:
- case後必須是常量表達式,不能是變量
- 每個case分支需要用break結束,否則會發生"穿透"現象
- default分支處理所有未匹配的情況,位置可以靈活放置但通常放在最後
常見錯誤示例:缺少break導致的穿透
int num = 2;
switch (num) {
case 1:
System.out.println("一");
case 2:
System.out.println("二"); // 輸出"二"
case 3:
System.out.println("三"); // 繼續輸出"三",因為缺少break
default:
System.out.println("其他"); // 繼續輸出"其他"
}
循環語句:重複執行的藝術
循環結構允許程序重複執行某段代碼,直到滿足特定條件。Java提供了三種循環語句:for、while和do-while,適用於不同場景。
for循環:計數循環的首選
for循環最適合已知循環次數的場景,它將初始化、條件判斷和迭代操作整合在一個簡潔的語法結構中。
基本語法:
for (初始化表達式; 條件表達式; 迭代表達式) {
// 循環體
}
打印1-10示例:
for (int i = 1; i <= 10; i++) {
System.out.print(i + " "); // 輸出:1 2 3 4 5 6 7 8 9 10
}
增強for循環(foreach):遍歷數組和集合的簡化寫法
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.print(num + " "); // 輸出:1 2 3 4 5
}
while循環:條件滿足就執行
while循環先判斷條件,只有條件為true時才執行循環體,適合循環次數不確定的場景。
基本語法:
while (條件表達式) {
// 循環體
}
累加1-100示例:
int sum = 0;
int i = 1;
while (i <= 100) {
sum += i; // 等價於 sum = sum + i
i++;
}
System.out.println("1到100的和是:" + sum); // 輸出:5050
do-while循環:至少執行一次
do-while循環與while循環的區別是它先執行一次循環體,再判斷條件,確保循環體至少執行一次。
基本語法:
do {
// 循環體
} while (條件表達式);
用户輸入驗證示例:
Scanner scanner = new Scanner(System.in);
int password;
do {
System.out.print("請輸入6位數字密碼:");
password = scanner.nextInt();
} while (password < 100000 || password > 999999); // 確保是6位數
System.out.println("密碼設置成功!");
循環嵌套:複雜邏輯的構建
循環嵌套是指在一個循環內部再包含另一個循環,這是處理多維數據或複雜圖案的強大工具。想象一下日曆的佈局——年包含月,月包含日,這就是典型的嵌套結構。
嵌套循環基礎結構
最常見的嵌套是for-for嵌套,外層循環控制行數,內層循環控制每行的列數。
打印5x5矩陣示例:
for (int i = 1; i <= 5; i++) { // 外層循環控制行
for (int j = 1; j <= 5; j++) { // 內層循環控制列
System.out.print(i + "," + j + " ");
}
System.out.println(); // 換行
}
輸出結果:
1,1 1,2 1,3 1,4 1,5
2,1 2,2 2,3 2,4 2,5
3,1 3,2 3,3 3,4 3,5
4,1 4,2 4,3 4,4 4,5
5,1 5,2 5,3 5,4 5,5
嵌套循環的實際應用:打印圖形
利用嵌套循環可以打印各種規則圖形,這是理解循環控制的經典練習。
打印直角三角形:
int rows = 5;
for (int i = 1; i <= rows; i++) { // 控制行數
for (int j = 1; j <= i; j++) { // 控制每行的*數量
System.out.print("* ");
}
System.out.println(); // 換行
}
輸出結果:
*
* *
* * *
* * * *
* * * * *
打印九九乘法表:
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();
}
控制跳轉語句:循環中的轉向操作
在複雜循環中,我們經常需要提前結束循環或跳過某次迭代。Java提供了break、continue和return三種跳轉語句來實現這些控制。
break:終止循環
break語句用於立即終止當前循環,跳出循環體執行後續代碼。
查找數字示例:找到第一個能被7整除的數就停止
int[] numbers = {12, 23, 35, 49, 51, 63};
for (int num : numbers) {
if (num % 7 == 0) {
System.out.println("找到能被7整除的數:" + num); // 輸出:49
break; // 找到後立即退出循環
}
}
帶標籤的break:跳出多層循環
outerLoop: // 外層循環標籤
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
if (i * j > 10) {
System.out.println("i=" + i + ", j=" + j); // 輸出:i=3, j=4
break outerLoop; // 跳出外層循環
}
}
}
continue:跳過本次迭代
continue語句用於跳過當前循環中的剩餘語句,直接進入下一次迭代。
打印奇數示例:跳過偶數只打印奇數
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 如果是偶數就跳過
}
System.out.print(i + " "); // 輸出:1 3 5 7 9
}
return:結束方法
return語句用於結束當前方法的執行,自然也會終止方法中的循環。
查找元素示例:找到元素後返回索引
public static int findIndex(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i; // 找到目標,返回索引並結束方法
}
}
return -1; // 未找到目標
}
// 調用示例
int[] array = {10, 20, 30, 40};
System.out.println(findIndex(array, 30)); // 輸出:2
常見邏輯錯誤分析與規避
流程控制中容易出現各種邏輯錯誤,這些錯誤往往不報錯但會導致程序運行結果不符合預期,需要特別注意。
死循環:停不下來的循環
死循環是指條件永遠為true的循環,會導致程序卡死或崩潰。
典型死循環示例:
// 錯誤示例:條件永遠為true
while (true) {
System.out.println("這會一直打印");
// 缺少終止條件
}
// 錯誤示例:迭代錯誤
int i = 0;
while (i < 10) {
System.out.println(i);
// i++; // 忘記遞增i,i永遠是0,條件永遠成立
}
如何避免:
- 確保循環條件最終會變為false
- 複雜循環中添加安全機制(如最大迭代次數限制)
int i = 0;
int maxIterations = 1000; // 最大迭代次數限制
while (condition && i < maxIterations) {
// 循環操作
i++;
}
條件判斷失誤
條件表達式邏輯錯誤是另一個常見問題,尤其在複雜條件判斷中。
常見錯誤示例:
int score = 85;
// 錯誤:邏輯運算符使用錯誤,應該用&&而不是&
if (score > 80 & score < 90) {
System.out.println("良好");
}
// 錯誤:條件順序錯誤,永遠不會執行第二個條件
if (score > 90) {
System.out.println("優秀");
} else if (score > 80) {
System.out.println("良好");
} else if (score > 95) { // 這個條件永遠不會被判斷
System.out.println("卓越");
}
如何避免:
- 複雜條件拆分,使用中間變量提高可讀性
- 注意條件判斷順序,從嚴格到寬鬆
- 使用括號明確運算優先級
循環邊界問題
循環起始或結束條件設置不當會導致"差一錯誤"(Off-by-one Error)。
錯誤示例:
int[] numbers = {1, 2, 3, 4, 5};
// 錯誤:數組索引從0開始,numbers[5]會越界
for (int i = 1; i <= numbers.length; i++) {
System.out.println(numbers[i]);
}
正確做法:
// 數組遍歷推薦寫法
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
// 或者使用增強for循環避免索引問題
for (int num : numbers) {
System.out.println(num);
}
交互式案例實戰
理論學習後,通過實際案例鞏固知識是最有效的方式。下面我們將開發兩個交互式程序,綜合運用今天學習的所有流程控制知識。
案例一:簡易計算器
功能需求:實現兩個數的加減乘除運算,支持用户重複輸入,直到選擇退出。
實現思路:
- 使用循環實現重複計算
- 使用switch-case處理不同運算符
- 使用條件判斷處理特殊情況(如除數為0)
代碼實現:
import java.util.Scanner;
public class SimpleCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean continueFlag = true;
System.out.println("=== 簡易計算器 ===");
while (continueFlag) {
// 輸入操作數和運算符
System.out.print("請輸入第一個數字:");
double num1 = scanner.nextDouble();
System.out.print("請輸入運算符(+、-、*、/):");
char operator = scanner.next().charAt(0);
System.out.print("請輸入第二個數字:");
double num2 = scanner.nextDouble();
// 計算並輸出結果
double result = 0;
boolean valid = true;
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if (num2 == 0) {
System.out.println("錯誤:除數不能為0!");
valid = false;
} else {
result = num1 / num2;
}
break;
default:
System.out.println("錯誤:不支持的運算符!");
valid = false;
}
if (valid) {
System.out.println("計算結果:" + num1 + " " + operator + " " + num2 + " = " + result);
}
// 判斷是否繼續
System.out.print("是否繼續計算?(y/n):");
String choice = scanner.next();
if (!choice.equalsIgnoreCase("y")) {
continueFlag = false;
System.out.println("謝謝使用,再見!");
}
System.out.println("---------------------");
}
scanner.close();
}
}
案例二:猜數字遊戲
功能需求:程序隨機生成1-100之間的整數,玩家最多猜5次,每次猜測後給出"太大"或"太小"的提示,猜對則獲勝。
實現思路:
- 使用Random類生成隨機數
- 使用循環控制猜測次數
- 使用條件判斷比較猜測值和目標值
- 使用break提前結束遊戲
代碼實現:
import java.util.Random;
import java.util.Scanner;
public class GuessNumberGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
// 生成1-100之間的隨機數
int targetNumber = random.nextInt(100) + 1;
int maxTries = 5; // 最大猜測次數
boolean won = false;
System.out.println("=== 猜數字遊戲 ===");
System.out.println("我已經想好了一個1-100之間的數字");
System.out.println("你有" + maxTries + "次機會猜出它");
for (int tryCount = 1; tryCount <= maxTries; tryCount++) {
System.out.print("第" + tryCount + "次猜測:請輸入數字:");
int guess = scanner.nextInt();
if (guess < targetNumber) {
System.out.println("太小了!再試試");
} else if (guess > targetNumber) {
System.out.println("太大了!再試試");
} else {
System.out.println("恭喜你猜對了!");
won = true;
break; // 猜對了,跳出循環
}
// 顯示剩餘次數
int remainingTries = maxTries - tryCount;
if (remainingTries > 0) {
System.out.println("還剩" + remainingTries + "次機會");
}
}
// 遊戲結束
if (!won) {
System.out.println("很遺憾,你已經用完了所有機會");
System.out.println("正確答案是:" + targetNumber);
}
System.out.println("遊戲結束,謝謝參與!");
scanner.close();
}
}
總結與實踐
第三天我們學習了Java流程控制的核心內容,包括條件判斷、循環結構和跳轉語句。這些工具讓程序從簡單的順序執行升級為能夠處理複雜邏輯的智能系統。
重點回顧:
- 條件語句(if-else、switch-case)實現邏輯分支
- 循環結構(for、while、do-while)處理重複任務
- 跳轉語句(break、continue、return)控制流程走向
- 嵌套結構構建複雜邏輯,解決多維問題
- 識別並規避常見邏輯錯誤(死循環、條件判斷失誤等)
課後練習:
- 編寫程序打印100以內所有素數(質數)
- 實現一個簡單的學生成績管理系統,支持錄入、查詢和統計功能
- 改進猜數字遊戲,增加難度級別(如簡單1-50/5次機會,困難1-200/7次機會)
- 編寫程序打印斐波那契數列的前20項(1, 1, 2, 3, 5, 8...)
流程控制是編程的基礎,也是解決實際問題的關鍵。只有通過大量練習,才能熟練掌握這些工具並靈活運用於複雜場景。明天我們將學習數組和字符串,進一步擴展程序處理數據的能力。