ch4 Loops

4-1 Introduction

4-2 The while Loop

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

p.141 Figure 4.1 counter-controlled loop

int sum = 0, count = 1;
while (count < 10) {
	sum = sum + count;
	System.out.printf("count=%d, sum=%d\n", count, sum);
	count++; // 移除此行時,會發生何種狀況?
}
System.out.printf("sum=%d\n", sum);

p.141 Caution

  1. infinite loop 無窮迴圈
  2. off-by-one error 少數了一個

4-2-1 Problem: Guessing Numbers

參考 p.142 程式 Listing 4.1 GuessNumberOneTime.java

參考 p.143 程式 Listing 4.2 GuessNumber.java

4-2-2 Loop Design Strategies

  1. 找出需要重複的敘述
  2. 將這些敘述包含在while迴圈內
  3. while(true) { 
    	Statements;
    }
    
  4. 設定終止條件與迴圈內更改條件變數的內容

4-2-3 Problem: An Advanced Math Learning Tool

參考 p.145 程式 Listing 4.3 SubtractionQuizLoop.java

4-2-4 Controlling a Loop with a Sentinel Value

參考 p.147 程式 Listing 4.4 SentinelValue.java

4-2-5 Input and Output Redirections 輸入/輸出 重新導向

  1. < 輸入
  2. > 輸出

4-3 The do-while Loop

do { // 先執行迴圈內程式,然後再判斷條件式 
	// 迴圈內程式 (至少被執行1次)
} while(條件式) // 當條件式為true時,繼續執行迴圈內程式
public class EX04A_While {
	public static void main(String[] args) {
		int count = 1;
		while (count <= 10) {
			System.out.print(count + " ");
			count++; // 移除此行會陷入無限迴圈
		}
		System.out.println("列印完畢");
	}
}
public class EX05A_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("列印完畢");
	}
}

參考 p.149 程式 Listing 4.5 TestDoWhile.java

4-4 The for Loop

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

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

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

p.150 Figure 4.3 for loop

public class EX06A_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 < 10; cnt1 ++, cnt2 ++) {
	// 迴圈內程式
}

無窮迴圈

使用 if, break等方式來停止迴圈

p.152 Note

for (;;) {
	// do something
}
for (; true;) {
	// do something
}
while (true) {
	// do something
}

4-5 Which Loop to Use?

for (initial-action; loop-continuation-condition; action-after-each-iteration) {
	// loop body
}
initial-action;
while (loop-continuation-condition;) {
	// loop body
	action-after-each-iteration;
}

p.152 Caution 注意分號 ;

4-6 Nested Loops

參考 p.153 程式 Listing 4.6 MultiplicationTable.java

4-7 Minimizing Numberic Errors

參考 p.154 程式 Listing 4.7 TestSum.java

public class EX07_TestSum {
	public static void main(String[] args) {
		// Initialize sum
		float sum = 0;
		float i;

		// Add 0.01, 0.02, ..., 0.99, 1 to sum
		for (i = 0.01f; i <= 1.0f; i = i + 0.01f) {
			sum += i;
			System.out.println("I=" + i + " sum=" + sum);
		}

		// Display result
		System.out.println("I=" + i + " The sum is " + sum);
	}
}

4-8 Case Study

4-8-1 Problem: Finding the Greatest Common Divisor

參考 p.156 程式 Listing 4.8 GreatestCommonDivisor.java

4-8-2 Problem: Predicating the Future Tuition

參考 p.157 程式 Listing 4.9 FutureTuition.java

4-8-3 Problem: Monte Carlo Simulation

參考 p.158 程式 Listing 4.10 MonteCarloSimulation.java

4-9 Keywords break and continue

參考 p.159 程式 Listing 4.11 TestBreak.java

參考 p.160 程式 Listing 4.12 TestContinue.java

參考 p.161 程式 Listing 4.13 GuessNumberUsingBreak.java

4-9-1 Problem: Displaying Prime Numbers

參考 p.162 程式 Listing 4.14 PrimeNumber.java

4-10 (GUI) Controlling a Loop with a Confirmation Dialog

參考 p.164 程式 Listing 4.15 SentinelValueUsingConfirmationDialog.java