Java 程式設計(一)  第 五章 重複性流程      下一頁

 

第五章 重複性流程

5-1 重複性流程簡介

內容:

  • 5-1 重複性流程簡介

  • 5-2 for 迴圈控制

    • 5-2-1 for 迴圈敘述

    • 5-2-2 範例研討:連續累加程式

    • 5-2-3 自我挑戰:累加程式變化

    • 5-2-4 範例研討:連續累乘程式

    • 5-2-5 自我挑戰:九九乘法評分系統

重複性流程表是在符合某一條件下,重複的執行特定『敘述區塊』(Body,又稱之為『迴圈』。執行方法是,首先判斷條件是否成立,如成立則執行迴圈一次;否則跳過迴圈而不執行。迴圈與選擇敘述之間最大不同是,條件成立的話,選擇敘述僅執行一次;迴圈敘述則不然,執行『敘述區塊』之後,會再回來測試條件是否再成立,如成立則再執行迴圈一次,如此重複執行迴圈,一直到條件不成立才結束。如果條件一直都成立的話,則程式可能永遠無法離開迴圈敘述,一般程式語言都有下列三種迴圈:

(1)  for 迴圈(for loop

(2) while 迴圈(while loop

(3) do/while 迴圈(do/while loop

雖然以上三種迴圈都可以達到一般重複敘述的功能,但之間還是有稍微不同的地方,並沒有孰好孰壞的問題,完全看程式設計師自己喜好決定。

5-2 for 迴圈控制

5-2-1 for 迴圈敘述

最典型的迴圈功能莫過於 for 迴圈(for loop)了,它明確表示迴圈可能出現的狀況。圖 5-1 for 迴圈的流程圖,首先設定初始條件,接著再測試條件是否成立,條件不成立(no)則立即結束該敘述;成立(yes)的話,則執行 for 敘述區塊。執行完畢後,則計算條件參數的『增減量』,接著再次測試條件是否成立(yes/no);如此重複執行 for 敘述區塊,一直到條件不成立(no)才結束該 for 敘述。

5-1 for 敘述的流程圖

為了達成條件敘述的演算功能,在 for 敘述內必須指定一個或一個以上的條件變數,並初始設定條件變數內容、測試內容是否滿足條件、以及增減變數內容的數值。For 敘述句的語法與範例如下:

語法:

範例:由 1 累加到 10

for (條件初始; 條件判斷; 增減量 ) {

Statement 1;

Statement 2,

…..

}

int sum = 0;

for (k=1; k <= 10; k = k +1) {

sum = sum + k;   //for body

}

System.out.println("Sum = " + sum);

For 敘述的小括號內包含 3 個敘述句,之間以『分號』(;)分隔。第一個敘述句為條件變數的初值設定(如 k = 1);第二個為測試變數內容是否滿足條件(如 k < =10);第三個敘述句為執行 for 區塊敘述(如 sum = sum + k)後,再針對條件變數做增量或減量的變動(如 k = k +1)。另一重點,如果區塊敘述超過一行的話,則必須利用左右大掛號包起來({ ….})。

在上述範例中,變數 k 作為 for 迴圈的計數基數,此變數有僅運用於 for 迴圈內,完成迴圈敘述後,該變數即失效了。許多情況下,為了減少變數宣告數量,期望宣告判斷變數僅存活於迴圈內就好,離開迴圈該變數自動消失,而將計數(或判斷)變數宣告成迴圈區域變數(本書第 6-3 節介紹)。宣告方法是在 for 迴圈控制敘述的小掛號內指定,如 for(int k=0; k<=10; k++) { …}

5-2-2 範例研討:連續累加程式

A)程式功能:

請製作一只由 1 累加到 10sum = 1 + 2 +3 + … + 10)的程式,並輸出其運算結果;期望操作介面如下:

1 + 2 + .. + 10 = 55

B)製作技巧研討:

計算大串無聊複雜的數字,是『計算機』(Computer最主要的能耐,由 1 加到 10100100010000...等,對自然人來說有差別,對程式設計師來講卻都是一樣的,只要下對指令,電腦會不厭其煩地默默工作,絕不偷懶。累加程式需準備一個稱之為『累積器』(Accumulator,如 sum)的箱子,將連續數字累積加進去(sum = sum + count,如圖 5-2 所示。

5-2 累積器功能

吾人可利用 for 敘述句來製作連續由 1 10 重複運作,宣告產生一個整數變數 sum 作為累加器,並設定初始值為 0sum = 0)。再利用 count 變數作為計數指標(count = 1, 2, …, 10),也作為條件判斷數值。首先將指標設定初始值 1count = 1)、運作到 10 為止,表示滿足 count <= 10 條件,需重複執行迴圈,指標每次增值 1count = count + 1);條件成立則執行『敘述區塊』,其內容為 sum = sum + count。將上述技巧套入 for 敘述句內,如圖 5-3 所示。

5-3 連續累加流程圖

吾人將圖 5-3 運作流程,製表如下所示:

吾人將圖 5-3 運作流程,製表如下所示:

次數

count

count <=10 ?

sum = sum +count

count = count + 1

1

1

yes

sum = 0 +1 =1

count = 1+1=2

2

2

yes

sum = 1 +2 =3

count = 2+1=3

3

3

yes

sum = 3 +3 =6

count = 3+1=4

4

4

yes

sum = 6 +4 =10

count = 4+1=5

5

5

yes

sum = 10 +5 =15

count = 5+1=6

6

6

yes

sum = 15 +6 =21

count = 6+1=7

7

7

yes

sum = 21 +7 =28

count = 7+1=8

8

8

yes

sum = 28 +8 =36

count = 8+1=9

9

9

yes

sum = 36 +9 =45

count = 9+1=10

10

10

yes

sum = 45 +10 =55

count = 10+1=11

11

11

no

 

 

C)程式範例:Ex5_1.java

01

02

03

04

05

06

07

08

09

10

11

12

// Ex5_1.java

 

public class Ex5_1 {

     public static void main(String args[]) {

          int count, sum;

          sum = 0;

          for (count = 1;count <= 10; count = count +1) {

                sum = sum + count;

          }

          System.out.printf("1 + 2 + .. + 10 = %d\n", sum);

     }

}

D)程式重點分析:

  • 6 sum = 0;。累加器初值設定為 0

  • 7~9 for (….) { …..}For 敘述句,其中 count = count + 1 可改為 count++;又敘述區塊僅有一條敘述句,則左右大括號({ … })可以省略。

  • 8 sum = sum + count;。累加計算功能,將原來 sum 變數的內取出與 k 相加後,再存入 sum 變數內。

5-2-3 自我挑戰:累加程式變化

累加程式最能表現出程式設計的特性。在現實環境中,資料越多或數值越大的情況下,處理事物起來就會越困難;但利用電腦處理則不然,無論處理資料多寡,都是一樣的,只不過時間較長一點而已(如電腦速度過快,也不會有很大的感覺)。以銀行查詢哪些客戶存款不足為範例,如利用人工查詢,當然客戶越多則越困難;但如利用電腦查詢,無論客戶有 1001000、或 10000 筆,對程式設計師而言都沒什麼分別。我們利用 Ex5_1 範例,增加一點變化,吾人就可以瞭解其中奧妙。

(A)程式變化()PM5_1_1.java

功能:修改 Ex5_1.java 程式中一個地方,使其功能為 sum = 1 + 2, …, 1000,執行結果如下:

1  + 2 + .. + 1000 = 500500

(B)程式變化()PM5_1_2.java

功能:修改 Ex5_1.java,使其功能為 sum = 100 + 99 …, + 1,執行結果如下:

sum = 100 + 99 …, + 1,執行結果如下:

100  + 99 + .. + 1 = 5050

(C)程式變化()PM5_1_3.java

功能:修改 Ex5_1.java,使其功能為 sum = 0 + 2 + 4+ ,…, 1000,其結果如下:

其結果如下:

0   + 2 + .. + 1000 = 250500

(D)程式變化()PM5_1_4.java

功能:修改 Ex5_1.java,使其功能為 sum = 1 + 3 + 5 +,…, 999,執行結果如下:

1 + 3 + .. + 999 = 250000

5-2-4 範例研討:連續累乘程式

A)程式功能:Ex5_2.java

請編寫一個 total = 1 * 2 * 3 * … *1010!)程式,並顯示每次累乘的計算結果。期望操作介面模式如下:

total * 1 = 1

total * 2 = 2

total * 3 = 6

total * 4 = 24

total * 5 = 120

total * 6 = 720

total * 7 = 5040

total * 8 = 40320

total * 9 = 362880

total * 10 = 3628800

B)製作技巧研討:

其實,連續累乘程式與累加程式非常相同,都是利用一個累積器,連續累積或累乘進入;兩者之間最大不同是,累加程式的累積器初始值必須設定為 0sum = 0);累乘程式的累積器必須設定為 1total = 1),否則任何數與 0 相乘結果都是 0。另外,累乘計算的敘述句為 total = total * count。吾人利用虛擬碼規劃程式設計概要,如下:

宣告計數器(count1, 2, …, 10);

宣告累積器並設定初值為 1total = 1);

for (count = 1; count <= 10; count++) {

total = total * count;

列印 total, count;

}

C)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

// Ex5_2.java

 

public class Ex5_2 {

   public static void main(String args[]) {

       int count, total;

       total= 1;

       for (count = 1;count <= 10; count++) {

            total = total * count;

            System.out.printf("total * %d = %d\n", count, total);

       }

   }

}

D)程式重點分析:

  • 7~10 for(count = 1; count<=10; count++) { ..}For 敘述句,條件初始值設定為 1,當它小於或等於 10 則執行 for 程式區塊,執行完後再執行 count++(增量 1),再回去測試條件是否成立;如條件不成立,則離開 for 迴圈敘述。

  • 8 total = total * count;。累乘程式功能,首先將 total 內容取出,與 count 相乘後結果,再存回 total 變數內。

5-2-5 自我挑戰:九九乘法評分系統

A)程式功能:PM5_2.java

請幫國民小學老師製作一套九九乘法的測試系統,系統會連續出現 10 題兩個 1 ~ 9 之間亂數,學生輸入自己計算相乘的結果,最後評定學生得分多寡(每題 10 分)。期望操作介面如下:

== 歡迎進入九九乘法評分系統 ==

請輸入 9 * 7 = 63

請輸入 3 * 7 = 21

請輸入 3 * 3 = 9

請輸入 8 * 3 = 24

請輸入 6 * 3 = 15

錯了!! 答案是 18

請輸入 5 * 9 = 45

請輸入 3 * 2 = 7

錯了!! 答案是 6

請輸入 8 * 6 = 48

請輸入 3 * 7 = 21

請輸入 1 * 5 = 5

您得到 80

B)製作技巧提示:

系統要求連續出現 10 次九九乘法練習題,這方面可利用 for 迴圈達成,其中,計數器(count)由 1 10,每次增量 1count++,或 count = count + 1)。迴圈內必須產生兩個 1 ~ 9 的亂數,如此需要導入 java.util.Random 套件;另外,也需要導入鍵盤輸入套件,吾人可選用 java.util.Scanner 套件。兩套件都是屬於 java.util 套件底下,因此只要導入該套件即可,即是『import java.util.*;』。系統虛擬碼如下:(參考 Ex4_3.java)

導入相關套件(import java.util.*;;

宣告與產生亂數物件(Random random

宣告與產生輸入物件(Scanner keyin;

宣告相關變數;

for (count = 1; count <= 10; count++) {

產生第一個 1 ~ 9 亂數(ran1 = 1 + random.nextInt(9);

產生第二個亂數(ran2;

計算正確答案(value = ran1 * value2

顯示兩亂數並要求輸入答案(ran1, ran2;

讀入學生答案(answer = keyin.nextInt();

if (answer == value)

累加學生答對題數(correct = correct + 1;

else

顯示學生答錯了, 並給予正確答案;

}

列印學分得到分數(correct * 10;

翻轉工作室:粘添壽

 

Java 程式設計(一) 含程式邏輯

 

 

翻轉電子書系列: