ch4 條件與迴圈控制

4-1 條件控制

Java 條件控制語法分為下列幾類

4-1-1 if-else 架構

參考 p.4-2 範例程式 IfElse.java

import java.util.Scanner;

public class E01_IfElse {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("請輸入成績:");
		
		int score = sc.nextInt(); // 平均成績

		if (score >= 85) { // if區塊內程式碼只有一行,可以省略大括號
			System.out.println("獲得獎學金10000元!");
		} else { // else區塊內程式碼只有一行,也可省略大括號
			System.out.println("還要再努力!");
		}
	}
}

參考 p.4-3 範例程式 IfElsePlus.java

import java.util.Scanner;
public class E02_IfElsePlus {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("請輸入成績:");

		int score = sc.nextInt(); // 平均成績

		if (score >= 85) // if區塊內程式碼只有一行,省略大括號,但是不建議
			System.out.println("獲得獎學金10000元!");
		else if (score >= 75) // else區塊內程式碼只有一行,省略大括號,但是不建議
			System.out.println("獲得獎學金5000元!");
		else
			// else區塊內程式碼只有一行,省略大括號,但是不建議
			System.out.println("還要再努力!");
	}
}

參考 p.4-4 程式 IfElseNested.java

public class E03_IfElseNested {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("請輸入成績:");
		int score = sc.nextInt();

		if (score >= 75) {
			if (score >= 85) {
				System.out.println("獲得獎學金10000元!");
			} else {
				System.out.println("獲得獎學金5000元!");
			}
		} else {
			System.out.println("還要再努力!");
		}
	}
}

參考 p.4-5 範例程式 If.java

public class E04_If {
	public static void main(String[] args) {
		boolean isDizzy = true; // 是否頭暈
		boolean isVomit = true; // 是否嘔吐
		// 兩者的發生與否,為獨立事件,需要使用2個IF來判斷
		if (isDizzy)
			System.out.println("服用緩和頭暈藥");

		if (isVomit)
			System.out.println("服用緩和嘔吐藥");
	}
}

4-1-2 條件運算符號 ?:

條件運算符號(?:)與if-else類似,參考下列範例

參考 p.4-5 程式 ConditionOP.java

public class E05_ConditionOP {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("請輸入成績:");
		int score = sc.nextInt(); // 平均成績

		String s1 = "獲得獎學金10000元!";
		String s2 = "還要再努力!";
		String r = score >= 85 ? s1 : s2;
		System.out.println(r);
	}
}

4-1-3 switch-case 架構

參考 p.4-7 範例程式 SwitchCase.java

import java.util.Scanner;

public class E06_SwitchCase {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("請輸入名次:");

		int rank = sc.nextInt();
		switch (rank) {
		case 1:
			System.out.println("第1名,獎學金10000元!");
			break;
		case 2:
			System.out.println("第2名,獎學金5000元!");
			break;
		case 3:
			System.out.println("第3名,獎學金2000元!");
			break;
		default:
			System.out.println("還要再努力!");
			break;
		}
	}
}

參考 p.4-8 範例程式 SwitchCaseBreak.java

import java.util.Scanner;

public class E07_SwitchCaseBreak {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("請輸入名次:");

		int rank = sc.nextInt();
		switch (rank) {
		case 1:
			System.out.println("第1名,獎學金10000元!");
		case 2:
			System.out.println("第2名,獎學金5000元!");
		case 3:
			System.out.println("第3名,獎學金2000元!");
			break;
		default:
			System.out.println("還要再努力!");
			break;
		}
	}
}

4-2 迴圈控制

迴圈(loop):在達到某個目的前,不斷、重複地做同樣的是,直到達成這個目的為止

Java 主要有3種迴圈控制

4-2-1 while 迴圈

while(條件式) { // 當條件式為true時,執行迴圈內程式
	// 迴圈內程式
}

參考 p.4-10 範例程式 While.java

public class E08_While {
	public static void main(String[] args) {
		int count = 1;
		while (count <= 10) {
			System.out.print(count + " ");
			count++; // 移除此行會陷入無限迴圈
		}
		System.out.println("列印完畢");
	}
}

4-2-2 do-while 迴圈

do { // 先執行迴圈內程式,然後再判斷條件式 
	// 迴圈內程式 (至少被執行1次)
} while(條件式) // 當條件式為true時,繼續執行迴圈內程式

參考 p.4-11 範例程式 DoWhile.java

public class E09_DoWhile {
	public static void main(String[] args) {
		int count = 11;
		do {
			System.out.printf("count=%d\n", count);
			count++; // 移除此行會陷入無限迴圈
		} while (count <= 10);
		System.out.println("列印完畢");
	}
}

4-2-3 for 迴圈

for(int count=1; count<=10; count++){
	// 迴圈內程式
}

以分號將for迴圈分成3部分

  1. 第1部分:開始執行for迴圈之前,先執行1次
  2. 第2部分:條件式,迴圈內程式執行完畢之後,根據此條件式判斷,若為false,則停止for迴圈
  3. 第3部分:若第2部分條件式為true時,執行第3部分的statement,再重新執行 for 迴圈內程式

參考 p.4-12 範例程式 For.java

public class E10_For {
	public static void main(String[] args) {
		for (int count = 1; count <= 10; count++) {
			System.out.print(count + " ");
		}
		System.out.println("列印完畢");
	}
}

For 多個控制變數

for (int cnt1 = 0, cnt2 = 0; cnt1 + cnt2 <= 150; cnt1 += 20, cnt2 += 30) {
	// 迴圈內程式
}

參考 p.4-13 範例程式 ForFactors.java

public class E11_ForFactors {
	public static void main(String[] args) {
		int day = 0; // 天數
		// tangerine代表橘子數量,orange代表柳丁數量
		for (int tangerine = 0, orange = 0; tangerine + orange <= 150; tangerine += 20, orange += 30) {
			System.out.print("第" + day + "天\t");
			System.out.print("橘子數量:" + tangerine + "\t");
			System.out.print("柳丁數量:" + orange + "\t");
			System.out.println("總數量:" + (tangerine + orange));
			// 或將上面4個print,合併為下列printf
			System.out.printf("第%d天\t橘子數量:%d\t柳丁數量:%d\t總數量:%d\n", day,
					tangerine, orange, tangerine + orange);
			day++;
		}
		System.out.println("裝滿一箱水果!");
	}
}

4-2-4 巢狀式迴圈

參考 p.4-13 範例程式 ForNested.java

public class E12_ForNested {
	public static void main(String[] args) {
		for (int m = 1; m <= 5; m++) {
			System.out.printf("%2d: ", m);
			for (int n = 1; n <= 10; n++)
				System.out.printf("%4d ", m + n);
			System.out.println();
		}
	}
}

9x9乘法表 練習

 1:    1    2    3    4    5    6    7    8    9 
 2:    2    4    6    8   10   12   14   16   18 
 3:    3    6    9   12   15   18   21   24   27 
 4:    4    8   12   16   20   24   28   32   36 
 5:    5   10   15   20   25   30   35   40   45 
 6:    6   12   18   24   30   36   42   48   54 
 7:    7   14   21   28   35   42   49   56   63 
 8:    8   16   24   32   40   48   56   64   72 
 9:    9   18   27   36   45   54   63   72   81 
1x1= 1 1x2= 2 1x3= 3 1x4= 4 1x5= 5 1x6= 6 1x7= 7 1x8= 8 1x9= 9 
2x1= 2 2x2= 4 2x3= 6 2x4= 8 2x5=10 2x6=12 2x7=14 2x8=16 2x9=18 
3x1= 3 3x2= 6 3x3= 9 3x4=12 3x5=15 3x6=18 3x7=21 3x8=24 3x9=27 
4x1= 4 4x2= 8 4x3=12 4x4=16 4x5=20 4x6=24 4x7=28 4x8=32 4x9=36 
5x1= 5 5x2=10 5x3=15 5x4=20 5x5=25 5x6=30 5x7=35 5x8=40 5x9=45 
6x1= 6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 6x7=42 6x8=48 6x9=54 
7x1= 7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 7x8=56 7x9=63 
8x1= 8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 8x9=72 
9x1= 9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81 

4-3 特殊流程的處理

4-3-1 break的使用

參考 p.4-16 範例程式 LoopBreak.java

public class E13_LoopBreak {
	public static void main(String[] args) {
		int sick = 5; // 第5堂課請假
		for (int num = 1; num <= 8; num++) {
			if (num == sick) {
				System.out.println("身體不適,回家休息!");
				break;
			}
			System.out.println("上完第" + num + "堂課");
		}
	}
}

4-3-2 continue的使用

參考 p.4-17 範例程式 LoopContinue.java

public class E14_LoopContinue {
	public static void main(String[] args) {
		int absent = 5; // 第5堂課翹課
		for (int num = 1; num <= 8; num++) {
			if (num == absent) {
				System.out.println("蹺課出去玩!");
				continue;
			}
			System.out.println("上完第" + num + "堂課");
		}
	}
}

4-3-3 標籤(Label)的使用

參考 p.4-18 範例程式 LoopLabel.java

public class E15_LoopLabel {
	public static void main(String[] args) {
		int faint = 3; // 跑第3圈昏倒了
		labA: // 標籤與迴圈之間不可以插入其他程式碼
		for (int cls = 1; cls <= 8; cls++) {
			if (cls == 6) {
				for (int run = 0; run <= 5; run++) {
					if (run == faint) {
						System.out.println("<<昏倒了,送急診>>");
						break labA;
					}
					System.out.print("跑完" + run + "圈 ");
				}
			}
			System.out.println("上完第" + cls + "堂課");
		}
	}
}