Download presentation
Presentation is loading. Please wait.
1
第 03 章 流程控制 3.1 流程控制的運算式 3.2 選擇結構 3.3 迴圈結構 3.4 實例
2
任何一種程式語言,最基本的流程控制都是由循序結構、選擇結構和迴圈結構三者組合而成的程式碼。循序結構的特性是從頭到尾、自上而下,一個敘述接著一個敘述逐行執行。選擇結構是當程式執行遇到分歧時,流程要往哪個敘述區段(statements)走,就要視當時資料所符合的條件來決定。迴圈結構是程式中有某個敘述區段需要被重複執行時使用,能否被重複執行也是根據當時資料所符合的條件來決定。 因此擁有清楚的邏輯分析能力,配合以上三種結構,方能寫出一個良好結構化的程式出來。前面的章節介紹資料型別時所使用的程式敘述,皆屬循序結構。本章針對選擇結構及迴圈結構的流程控制敘述做完整的介紹。
3
3.1 流程控制的運算式 「關係運算式」和「邏輯運算式」兩者都是在程式設計時,用來表示一個狀態或條件成立與否。這兩種運算式(或稱「條件式」)經過運算後會產生布林值,當條件成立時,其布林值為true(真);條件不成立時,則布林值為false(假)。當程式中遇到選擇結構或重複結構時,就必須使用此種條件式來比對當時的資料,供我們決定程式執行流程之參考。
4
關係運算子 一般而言,關係運算子會被用來比對條件是否符合的資料,以數值、字元為主。
5
字元是以Unicode碼來比較大小,a的Unicode碼為97,比b的Unicode碼98小,所以b比a大。若字串的第一個字元的Unicode碼相同,比第二字元Unicode碼的大小,以此類推。(有關字串比較,請參閱第4.7節) 此處的關係運算子不能全部套用到字串資料型別,因在Java中,字串是由String類別中建立出來的物件,詳情請參考第4章。
6
邏輯運算子 「邏輯運算式」是用來測試較複雜的條件,邏輯運算式的結果可以為true(真)或false(假)。當一個運算式中有兩個以上的關係運算子就必須透過邏輯運算子來連接,Java所提供邏輯運算子的種類以及邏輯運算式的用法如下表:
7
各種邏輯運算式經過運算後,所有可能的結果如下表:
8
布林資料型別 布林值只有兩個,一個為「true」、另一個為「false」。可分別用來表示「真」和「假」、「Yes」和「No」、「男」和「女」、「On」和「Off」…兩種狀態。布林(boolean)型別資料常被使用在選擇結構與重複結構的關係運算式或邏輯運算式中,用來比較或判斷當時的資料是否符合運算式的結果(條件)。 關係運算式或邏輯運算式的運算結果(boolean型別資料)也可存入boolean型別的變數中,但該變數使用前要先宣告,宣告格式如下:
10
3.2 選擇結構 選擇結構就是用程式來設計條件的分歧,當條件式與資料比對後,「成立」或「不成立」的結果是執行不同的程式流程。選擇結構一般可分為單向選擇、雙向選擇、多重選擇、巢狀選擇…等。
11
單向選擇 if 單向選擇是當判斷條件成立時,才會去執行指定的敘述或敘述區段;若條件不成立,該指定的敘述或敘述區段就不會被執行。反之亦是如此。
13
雙向選擇 if … else 雙向選擇是當判斷條件成立時,程式的流程會去執行指定的敘述或敘述區段;若條件不成立,則程式的流程會去執行另一個指定的敘述或敘述區段。
16
1. 行04:用boolean 宣告is_man變數,並指定初值『false』。true:代表先生、 false:代表小姐。
17
條件運算子 簡單的雙向選擇可由條件運算子「?:」來取代。條件運算子會根據條件式的布林值,從指定的兩個資料之中傳回其中的一個,而待選的資料可以是任何型別的資料、變數或運算式。
20
巢狀選擇 語法:if (主條件) { if (次條件1) { 敘述區段A; } else { 敘述區段B; } } else { if (次條件2) { 敘述區段C; } else { 敘述區段D; } } 如果在選擇結構中又有其它的選擇結構,就形成了巢狀選擇結構。當條件式中有超過三個選擇項時,可以使用巢狀選擇結構。
21
說明: 當(主條件)成立時,則判斷(次條件1),(次條件1)成立時執行「敘述 區段A」;不成立則執行「敘述區段B」。
若(主條件)不成立,則判斷(次條件2),(次條件2)成立時會執行「敘 述區段C」,不成立則執行「敘述區段D」。 流程圖:(巢狀選擇結構尚有其它流程架構,下圖只是其中一種架 構。)
22
計算各科成績,平均及格就錄取,不及格則不錄取。及格且電腦成績大於90分,則保送資訊系。
23
1. 行03:分別宣告兩學科存放成績的變數,並皆指定初值。
2. 行04:宣告double型別變數avg,來存放計算後的平均成績。 3. 行05:(eng + computer)的運算結果171為整數,先強制轉換成double型別(即為171.0),再除以2,其傳給變數avg的結果才能為浮點數85.5。若沒有先轉換成double型別就直接除以2,這時不論有無轉換double型別,其傳給變數avg的結果都不會是有小數的部份(即為85.0)。 4. 行08:若avg >= 60,則執行第09~13行敘述。 5. 行10:若avg >= 60且computer >= 90,則顯示『恭喜…資訊…』文字。 6. 行12:若avg >= 60但computer < 90,則顯示『恭喜!你已達…』文字。 7. 行15:若avg < 60,則顯示『抱歉,你未達錄取標準!』文字。
24
多重選擇 if … else if … else 當選擇的項目超過兩個時,除了可以用巢狀選擇結構來解決外,在特殊情況下,可簡化使用else if多重選擇結構來處理。 語法:if (條件1) { 敘述區段1; } else if (條件2) { 敘述區段2; : } else if (條件n) { 敘述區段n; } else { 敘述區段else; }
25
從許多不同的狀況下,找出符合條件的敘述區段執行。
說明: 從許多不同的狀況下,找出符合條件的敘述區段執行。 若(條件1)成立,則執行敘述區段1;若(條件2)成立,則執行敘述區段2,以此類推,其餘的情況,執行敘述區段else。 流程圖:
26
依據用鍵盤所輸入的分數,給予相對應的評語: 分數 80,顯示"成績很好,請繼續保持
依據用鍵盤所輸入的分數,給予相對應的評語: 分數 80,顯示"成績很好,請繼續保持!" 60 分數 < 80,顯示"成績普通,要多多加油!" 分數 < 60,顯示"成績不行,應反省振作!"
28
1. 行04:定義BufferedReader類別物件keyin。好像是兩行敘述其實是一行敘述,因敘述太長而分割成兩行。本敘述是配置物件keyin的記憶體。
2. 行06:讀取輸入資料並存入int資料型別的變數score中。 3. 行07~13:依據score變數值顯示相應的回饋文字。
29
多重選擇 switch 語法:switch (運算式或變數) { case結果1: 敘述區段1; break; case結果2: 敘述區段2; break; : case結果n: 敘述區段n; break; default: 敘述區段default; } 當選擇的項目超過兩個以上時,除了使用else if多重選擇結構外,還可以考慮使用switch選擇結構。若能使用switch選擇結構,則程式敘述比較簡潔易讀。
30
說明: 依據不同的運算式結果或變數值,執行對應case內的敘述區段。如:符合結果1,則執行敘述區段1;符合結果2,則執行敘述區段2 …以此類推。若沒有一個case結果符合,就執行敘述區段default。 每一個case的敘述區段後面,加上跳離指令break,才可離開switch選擇結構。否則在執行了符合的case敘述區段之後,會接著執行下一個case敘述區段。
31
由鍵盤輸入a、b其中一個字母,電腦立即對應顯示以該字母為首的英文單字apple、book。
33
1. 行04:宣告ch為char資料型別的變數。 2. 行06:將鍵盤輸入字元指定給ch變數。 3. 行07:switch指令比對存放在ch變數內的字元資料。 4. 行08~11:case 'A' 敘述區段中沒有break指令,則會去執行下一個 case 'a' 的敘述區段。鍵盤輸入字元不論大寫A或小寫a,都會顯示apple單字。 5. 行16:若比對ch變數值沒有符合的資料,執行default敘述區段。
34
3.3 迴圈結構 當程式中有某項功能需要被重複執行時,我們就將這項功能組成一個敘述區段,再將這敘述區段置入一個迴圈結構內。Java提供的迴圈有for迴圈、while迴圈、do…while迴圈。
35
3.3.1 for迴圈 語法:for (初值; 條件式; 增值運算式) { 敘述區段; }
36
說明: for迴圈的計數值有「初值」、「條件式」和「增值運算式」三個引 數,引數之間以「;」隔開。
需求,若符合則繼續執行迴圈,不符合則離開迴圈。 增值運算式:每執行一次for迴圈內的敘述,就會執行增值運算式。可 以有二個以上,但必須以逗點「,」隔開。 當初值符合條件式測試,就會執行迴圈內的敘述區段一次;接著再執行 增值運算,若運算後的增值仍符合條件式,則再執行迴圈內的敘述區段 一次;直到條件式測試不符合,才離開迴圈。 敘述區段若只有一行敘述,則for迴圈可簡化如下: for (初值; 條件式; 增值運算式) 敘述;
38
1. 圈被進入執行了10次,在整個過程中,變數n與sum的值變換情形如下:
40
while迴圈與do … while迴圈 當迴圈內的敘述區段被重複執行的次數不可預測時,甚至有些迴圈在某些情狀是不用被執行的。這時,可以使用條件迴圈。條件迴圈又分為前測試while迴圈與後測試do…while迴圈,兩個的語法分別如下: 語法: < 前測試迴圈 > while (條件式) { 敘述區段; } < 後測試迴圈 > do { 敘述區段; } while (條件式);
41
2. 不論是前測試迴圈或後測試迴圈,皆須條件式為『true』時,才能進入或繼續執行迴圈;當條件式為『false』時,就無法進入迴圈。
42
3. 以上範例for迴圈的內容為例,轉換成兩條件迴圈的程式碼 分別如下:
4. 前測試迴圈有可能一次也沒進入迴圈。但後測試迴圈至少要進入一次,而且要注意的是,後測試迴圈的最後要加分號「;」。
43
5. 後測試迴圈的do…while (條件式);,其條件式中所用到的變數,一定要使用在進入迴圈之前宣告的變數,不可以使用在迴圈內宣告的變數。否則系統編譯時,會顯示錯誤。如下所示:
說明: 條件式 (num1 > num2) 中的num2,不是在進入迴圈之前宣告,而是在迴圈內宣告,故系統編譯時會顯示錯誤。
45
1. 行07、08:為上車後前1.5公里的起程計費。 2. 行09~12:為前測試迴圈,執行每行駛0.3公里,使車資累加5元。 3. 當輸入的行駛公里數不超過1.5公里時,經第08行運算後,會不符合第09行的條件式 (km > 0),此種情形造成程式的流程沒有進入迴圈。
46
巢狀迴圈 當迴圈結構中含有另一個迴圈時,就稱為巢狀迴圈。其內層迴圈與外層迴圈皆可以使用for迴圈、while迴圈及do…while迴圈。 利用兩層迴圈,設計出特殊排列的數字圖案(參考程式執行結果)。
48
1. 行03~08:為外層迴圈,行04~06為內層迴圈,兩者皆為for迴圈。
2. 行07:游標移到下一行顯示資料。
50
1. 行03~11:由for迴圈組成的外層迴圈。 2. 行05~09:由while迴圈組成的內層迴圈。
3. 行07:\t 為跳格字元,即下次會顯示在下一個定位點,定位點相隔8格字元。
51
3.3.4 中斷迴圈 在迴圈的使用途中若要中斷迴圈的執行,可使用break和continue敘述。
中斷迴圈 在迴圈的使用途中若要中斷迴圈的執行,可使用break和continue敘述。 break敘述會中斷並跳離迴圈內的程式流程,跳至迴圈的後面續繼執行下一個敘述。continue敘述會中斷該次的迴圈內程式流程,但跳至迴圈的頂端,若仍符合條件式,則再從迴圈的起點進入迴圈執行。break和continue敘述在for迴圈、while迴圈及do…while迴圈的流程分別如下:
56
1. 行05~07:count記錄輸入的次數,pw為密碼設定值,is_pass記錄輸入是否正確。
2. 行08~19:為後測試迴圈,至少被執行一次。第19行敘述後面要加「;」。 3. 行11:pw_keyin接受由鍵盤輸入的字串。 4. 行12:比較輸入字串pw_keyin值是否等於(equals)密碼設定值pw。比較結果若符合,則執行第13~15行敘述;若不符合,則執行第17行敘述。不可以使用if (pw_kyin == pw),否則就算密碼正確,也是傳回false。 5. 行15:break是跳離迴圈的敘述,使本程式跳至第20行繼續執行。 6. 行20:當三次密碼皆輸入錯誤時,一直使is_pass值為false,所以 (!is_pass) 的結果會是true,才會顯示『三次密碼輸入錯誤,拒絕使用!』。
58
1. 行04、05:當n變數值被2或被3整除時,便會跳至第3行迴圈的頂端,但此時的n變數值已增值,如果符合條件式,則可再進入迴圈。
59
指定標籤跳離 break和continue敘述除了可從目前迴圈跳離外,還可以跳離指定標籤用{ }所圍起來的區塊,這區塊必須是一個迴圈結構或選擇結構。 在標籤用{ }所圍起來的區塊中,若遇到「break 標籤;」敘述,則會跳離區塊到區塊最後面的敘述續繼執行;若遇到「continue 標籤;」敘述,則會跳到區塊的頂端,再執行標籤用大括弧 { } 所圍起來的區塊。
61
1. 行09:當n變數值大於8時,程式流程會跳至第13行後面,即從第14行繼續執行。此時用break是跳離兩層迴圈組成的區塊。
62
3.4 實例
64
1. 行05:在此設定一個讓使用者猜的數宇。 2. 行10:輸入所猜的數字。 3. 行11:判斷猜對與否,若猜對則執行第12~13行;若猜錯則 執行第15~19行。
68
1. 行06~32:為無窮迴圈,直到直接按 鍵執行第09行,才離開迴圈。
2. 行12:" 5 == 3 結果為 " 為字串資料,(5 == 3) 為關係運算式,其結果為「false」,"\n" 為游標跳到下一行。
Similar presentations