流程控制結構 4-1 流程控制與UML活動圖 4-2 程式區塊與主控台基本輸入 4-3 條件控制敘述 4-4 迴圈控制敘述 4-5 巢狀迴圈
4-1 流程控制與UML活動圖 4-1-1 UML活動圖 4-1-2 流程控制的種類
4-1-1 UML活動圖-說明 「UML」(Unified Modelling Language)是一種符號語言,用來描述「物件導向分析」(OOA)和「物件導向設計」(OOD)的分析結果,如同工程式師閱讀藍圖就可以蓋房子,程式設計師看到UML繪出的模型圖,就可以寫出所需的程式碼。 「活動圖」(Activity Diagram)是UML眾多符號圖形之一,主要是用來描述使用案例(Use Case)的事件流程和物件操作,即工作流程和所需的作業和活動。
4-1-1 UML活動圖-符號圖形
4-1-2 流程控制的種類-說明 流程控制依據程式碼執行的順序可以分為三種: 循序結構(Sequential) 選擇結構(Selection) 重複結構(Iteration)
4-1-2 流程控制的種類-循序結構 循序結構是程式預設的執行方式,也就是一個程式敘述接著一個敘述依序的執行,如右圖所示:
4-1-2 流程控制的種類-選擇結構 選擇結構是一種條件控制敘述的選擇題,可以分為單一選擇、二選一或多選一三種。 程式執行順序是依照關係運算式的條件來決定執行哪一個程式區塊的程式碼,如右圖所示:
4-1-2 流程控制的種類-重複結構說明 重複結構就是迴圈控制,可以重複執行一個程式區塊的程式碼,提供一個結束條件結束迴圈的執行,依據結束條件測試的位置不同分為兩種,如下所示: 前測式重複結構 後測式重複結構
4-1-2 流程控制的種類-前測式重複結構 測試迴圈結束條件在程式區塊的開頭,需要符合條件,才能執行迴圈中程式區塊的程式碼,如右圖所示:
4-1-2 流程控制的種類-後測式重複結構 測試迴圈結束條件在程式區塊的結尾,所以迴圈的程式區塊至少會執行一次,如右圖所示:
4-2 程式區塊與主控台基本輸入 4-2-1 程式區塊 4-2-2 主控台的基本輸入
4-2-1 程式區塊-說明 程式區塊(Blocks)的目的是將零到多列的程式敘述組合成一個群組,以便將整個程式區塊視為一列程式敘述,如下所示: { 程式敘述; ………… } 程式區塊是使用「{」和「}」大括號包圍的一至多個程式敘述,事實上,在大括號內也可以不含任何程式敘述,稱為「空程式區塊」(Empty Block)。
4-2-1 程式區塊-範例 程式區塊可以群組化程式編排,因為Java語言並沒有限制宣告變數的位置,所以程式區塊還可以用來隱藏變數的宣告,如下所示: { int temp; temp = a; a = b; b = temp; } 程式區塊宣告整數變數temp,變數temp只能在程式區塊內使用,一旦離開程式區塊,就無法存取變數temp,變數temp稱為程式區塊的區域變數(Local to the Block)。
4-2-2 主控台的基本輸入- java.util.Scanner類別 Java主控台基本輸入是從System.in物件讀取資料,為了方便說明,筆者使用java.util.Scanner類別(此為類別全名,如此就不需匯入套件)的Scanner物件來取得輸入資料,如下所示: java.util.Scanner sc = new java.util.Scanner(System.in); 程式碼使用new運算子建立Scanner物件,其建構子參數是基本輸入的System.in物件。
4-2-2 主控台的基本輸入-相關方法 在建立Scanner物件後,就可以使用相關方法來取得使用者輸入的資料,如下所示: String name = sc.nextLine(); int score = sc.nextInt(); double height = sc.nextDouble(); 上述程式碼的nextLine()方法可以取得使用者輸入字串的String物件(可以包含空白字元);nextInt()方法取得輸入的整數;nextDouble()方法取得浮點數。
4-3 條件控制敘述 4-3-1 if是否選條件敘述 4-3-2 if/else二選一條件敘述 4-3-3 switch多選一條件敘述 4-3-4 ?:條件敘述運算子
4-3 條件控制敘述-說明 Java的條件控制敘述是使用第3章的關係和條件運算式,配合程式區塊建立的決策敘述,可以分為: 選擇(if) 二選一(if/else) 多選一(switch) 條件敘述運算子(?:)
4-3-1 if是否選條件敘述-說明 Java語言的if條件敘述是一種是否執行的單選題,可以決定是否執行程式區塊的程式碼。如果關係/條件運算結果為true,就執行括號之間的程式區塊。例如:以身高判斷是否需要購買全票的條件敘述,如下所示: if ( height >= 150 ) { System.out.print("身高: " + height); System.out.println("購買全票!"); }
4-3-1 if是否選條件敘述-UML活動圖 活動圖菱形分歧的連接上有防衛條件,如果height < 150就結束;height >= 150才執行之後的程式區塊,如右圖所示:
4-3-2 if/else二選一條件敘述-說明 如果條件是排它情況的2個執行區塊,只能二選一,我們可以加上else指令。例如:成績是否及格是二選一的情況,我們可以依據成績值判斷學生的成績是及格或不及格,如下所示: if ( grade >= 60 ) { System.out.println("成績及格: " + grade); } else { System.out.println("成績不及格: " + grade);
4-3-2 if/else二選一條件敘述- UML活動圖
4-3-3 switch多選一條件敘述-說明 Java程式如果需要多選一的條件敘述,也就是依照一個條件判斷來執行多個區塊之一的程式碼,一共有兩種方法可以達成相同的目的,如下所示: 第一種方法:if/else/if 第二種方法:switch
4-3-3 switch多選一條件敘述- if/else/if(說明) 在Java程式只需重複使用if/else條件,就可以建立多選一條件敘述。例如:判斷多種成績範圍的學生GPA成績,如下所示: if ( grade >= 80 ) System.out.println("學生成績:A"); else if ( grade >= 70 ) System.out.println("學生成績:B"); System.out.println("學生成績:C");
4-3-3 switch多選一條件敘述-if/else/if(UML活動圖)
4-3-3 switch多選一條件敘述- switch(說明) Java的switch多條件敘述比較簡潔,可以依照符合條件來執行不同程式區塊的程式碼 ,如下所示: switch ( gpa ) { case 'A': System.out.println("學生成績超過:80"); break; case 'B': System.out.println("學生成績:70~79"); case 'C': System.out.println("學生成績:60~69"); default: System.out.println("學生成績不及格!"); }
4-3-3 switch多選一條件敘述- switch(UML活動圖)
4-3-3 switch多選一條件敘述-Java SE 7版支援switch條件為字串 switch ( gpa ) { case "GPA: A": System.out.println("學生成績超過:80"); break; case "GPA: B": System.out.println("學生成績:70~79"); case "GPA: C": System.out.println("學生成績:60~69"); default: System.out.println("學生成績不及格!"); }
4-3-4 ?:條件敘述運算子-說明 Java語言的條件敘述運算子?:可以使用在指定敘述以條件指定變數值,其語法格式如下所示: 變數 = (關係/條件運算式) ? 變數值1 : 變數值2; 指定敘述的「=」號右邊是條件敘述運算子,如同一個if/else條件,使用「?」符號代替if,「:」符號代替else,如果條件成立,就將變數指定成變數值1,否則就是變數值2。
4-3-4 ?:條件敘述運算子-範例 條件敘述運算子的範例,如下所示: hour = (hour >= 12) ? hour-12 : hour; 程式碼使用條件敘述運算子指定變數hour的值,如果條件為true,hour變數值為hour-12,false就是hour,其流程圖與if/else相似。
4-4 迴圈控制敘述 4-4-1 for迴圈敘述 4-4-2 前測式的while迴圈敘述 4-4-3 後測式的do/while迴圈敘述 4-4-4 break和continue指令敘述
4-4-1 for迴圈敘述-說明 Java的for迴圈是一種簡化的while迴圈,可以執行固定次數的程式區塊,迴圈會自行處理計數器,讓計數器每一次增加或減少一個固定值,直到迴圈的結束條件成立為止。
4-4-1 for迴圈敘述-遞增的for迴圈 for迴圈也稱為「計數迴圈」(Counting Loop),迴圈是使用變數來控制迴圈的執行,從一個最小值執行到最大值。 例如:計算1加到15的總和,每次增加1,如下所示: for ( i = 1; i <= 15; i++ ) { System.out.print("|" + i); total += i; }
4-4-1 for迴圈敘述-UML活動圖
4-4-1 for迴圈敘述-括號說明 for迴圈括號中三部分運算式的詳細說明,如下: i = 1:迴圈初始值,變數i是計數器變數,如下所示: for ( int i = 1; i <= 15; i++ ) { } for ( total = 0, i = 15; i >= 1; i-- ) { } i <= 15:迴圈的結束條件,當i > 15時結束for迴圈的執行。 i++:更改計數器的值,i++是遞增1,變數i的值依序為1、2、3、4…和15,總共執行15次迴圈。
4-4-1 for迴圈敘述-遞減的for迴圈 相反的情況,如果是從15到1,for迴圈的計數器就是使用i--,表示每次遞減1,如下所示: for ( total = 0, i = 15; i >= 1; i-- ) { }
4-4-1 for迴圈敘述-無窮的for迴圈 如果for迴圈是空的for( ; ; ),即沒有指定結束條件,其預設是true。換句話說,for迴圈是一個無窮迴圈,永遠不會結束迴圈執行。
4-4-2 前測式的while迴圈敘述-說明 while迴圈敘述不同於for迴圈,我們需要在程式區塊自己處理計數器的增減。while迴圈是在程式區塊的開頭檢查結束條件,條件為true才允許進入迴圈執行。例如:使用while迴圈計算階層5!的值,如下所示: while ( level <= 5 ) { n *= level; System.out.println(level + "!=" + n); level++; }
4-4-2 前測式的while迴圈敘述-UML活動圖
4-4-3 後測式的do/while迴圈敘述-說明 do/while和while迴圈敘述的差異是在迴圈結尾檢查結束條件,因此,do/while迴圈的程式區塊至少會執行一次。例如:使用do/while迴圈顯示攝氏轉華氏的溫度轉換表,如下所示: do { f = (9.0 * c) / 5.0 + 32.0; System.out.println(c + "\t" + f); c += step; } while ( c <= upper );
4-4-3 後測式的do/while迴圈敘述-UML活動圖
4-4-4 break和continue指令敘述-break指令中斷迴圈 Java的break指令可以強迫終止迴圈執行,如同switch條件敘述使用break指令敘述跳出程式區塊一般,如下所示: do { System.out.print("|" + i); total += i; i++; if ( i > 15 ) break; } while ( true );
4-4-4 break和continue指令敘述- continue指令繼續迴圈 Java的continue指令是對應break指令,可以馬上繼續下一次迴圈的執行。不過,它並不會執行程式區塊位在continue指令敘述後的程式碼,如果使用在for迴圈,一樣更新計數器變數,如下所示: for ( total = 0, i = 1; i <= 10; i++ ) { if ( (i % 2) == 1 ) continue; System.out.print("|" + i); total += i; }
4-5 巢狀迴圈-說明 巢狀迴圈是在迴圈內擁有其他迴圈。例如:在for迴圈擁有for、while和do/while迴圈;或在while迴圈內擁有for、while和do/while迴圈。
4-5 巢狀迴圈-範例 Java語言的巢狀迴圈可以有很多層,二、三、四層都可以,例如:二層的巢狀迴圈,如下所示: for ( i = 1; i <= 9; i++ ) { …… j = 1; while ( j <= 9 ) { ….. j++; }
4-5 巢狀迴圈-執行過程1 迴圈一共有兩層,第一層的for迴圈執行9次,第二層的while迴圈也是執行9次,兩層迴圈總共執行81次,如下表所示:
4-5 巢狀迴圈-執行過程2 程式範例第一層迴圈的計數器變數i值為1時,第二層迴圈的變數j為1到9,可以顯示下列的執行結果,如下所示: 1*1=1 1*2=2 …. 1*9=9 當第一層迴圈執行第二次時,i值為2,第二層迴圈仍然為1到9,此時的執行結果,如下所示: 2*1=2 2*2=4 2*9=18 繼續第一層迴圈,i值依序為3到9,所以可以建立完整的九九乘法表。