《流程控制叙述.ppt》由会员分享,可在线阅读,更多相关《流程控制叙述.ppt(43页珍藏版)》请在三一办公上搜索。
1、流程控制敘述,內 容 大 綱,if敘述if-else敘述條件運算子巢狀if-else敘述switch-case敘述break、continue敘述標記控制敘述實例,if敘述(1/2),if敘述的語法為 if(條件式)條件敘述區塊一個if敘述可以根據條件式的成立與否來決定條件敘述區塊中的敘述是否要執行,流程圖我們以下列的敘述為例:if(i%j)=0)/條件式為(i%j)=0 System.out.println(i+是+j+的倍數);/此敘述為條件敘述區塊中唯一的敘述,if敘述(2/2),說明:Example:假設變數i的值為9,變數j的值為3,因為9除以3的餘數為0(9是3的倍數),則上列條件
2、敘述會在命令視窗中輸出:9是3的倍數 反之,若假設變數i的值是8,變數j的值是3,因為8除以3的餘數不為0(8不是3的倍數),所以命令視窗中不會有任何輸出。,if-else敘述(1/2),if-else的敘述與if敘述非常類似,它只是多了於條件式的值為false時必須執行的條件敘述區塊的部份而已,它的用法為:if(條件式)條件敘述區塊1 else 條件敘述區塊2當條件式成立時,條件敘述區塊1中的敘述會被執行,而若條件式不成立時,則條件敘述區塊2中的敘述會被執行,流程圖,if-else敘述(2/2),Example if(i%j)=0)/條件式為(i%j)=0 System.out.printl
3、n(i+是+j+的倍數);/此敘述在條件式成立時會執行 else System.out.println(i+“不是”+j+“的倍數”);/此敘述在條件式不成立時會執行假設變數i的值為9,變數j的值為3,則此敘述會在命令視窗中印出 9是3的倍數若假設變數i的值為8,變數j的值為3,則此敘述會在命令視窗中輸出 8不是3的倍數,條件運算子(1/2),以下我們介紹與if-else敘述有類似功能的條件運算子(?:),條件運算子的用法如下:條件式?值1:值2在條件式成立時,條件運算子會傳回值1,而在條件式不成立時,條件運算子會傳回值2Example:成績=60?“及格”:“不及格”在變數成績大於等於60時
4、,上列由條件運算子所構成的式子傳回的值為及格字串。反之,在變數成績不是大於等於60(即小於60)時,上列由條件運算子所構成的式子傳回的值為不及格字串,條件運算子(2/2),Example:以下的if-else敘述if(成績=60)System.out.println(及格);else System.out.println(“不及格”);可以用條件運算子改寫如下System.out.println(成績=60?及格:不及格);,巢狀if-else敘述(1/4),以下我們介紹巢狀if-else敘述(nesting if-else statement),所謂巢狀if-else敘述指的是if-else
5、敘述區塊中還包含有if-else敘述Example:if(ij)if(ik)System.out.println(i+最大);/表示ij且ik else System.out.println(k+最大);/表示ij且kielse if(jk)System.out.println(j+“最大”);/表示 非(ij)(即ij)且(jk)else System.out.println(k+“最大”);/表示 非(ij)(即ij)且 非(jk)(即jk),巢狀if-else敘述(2/4),說明:巢狀if-else敘述也可以用條件運算子取代之,例如ij?(ik?i:k):(jk?j:k)會傳回i、j、k
6、三個變數中數值最大的值。Example:if(成績=90)System.out.println(優);else if(成績=80)System.out.println(甲);else if(成績=70)System.out.println(乙);else if(成績=60)System.out.println(丙);else System.out.println(不及格);,巢狀if-else敘述(3/4),以上的程式片段,會依變數成績的值而輸出“優”、“甲”、“乙”、“丙”或“不及格”等字串,上述的程式片斷只有else部份的敘述區塊內含巢狀的if-else敘述,是一種比較特別的巢狀結構。碰到
7、這種特別的巢狀if-else敘述,一般我們會取消各行之間的縮排,寫成如下的格式:if(成績=90)System.out.println(優);else if(成績=80)System.out.println(甲);else if(成績=70)System.out.println(乙);else if(成績=60)System.out.println(丙);else System.out.println(不及格);,巢狀if-else敘述(4/4),上述巢狀if-else敘述也可以使巢狀條件運算子來改寫如下:System.out.println(成績=90)?優:(成績=80)?“甲”:(成績=
8、70)?乙:(成績=60)?丙:不及格);,switch-case敘述(1/4),以下我們介紹switch-case敘述,其用法為 switch(算式)case定值1:敘述區塊1 case定值2:敘述區塊2.case定值N:敘述區塊N default:預設敘述區塊上列switch-case敘述的用法中,算式及定值1、定值2、定值N都必須為int型別,或是可轉換為int型別而不會有數值誤差的char型別、byte型別及short型別。,switch-case敘述(2/4),敘述switch-case的流程圖switch-case敘述會先對算式求值,然後再依序於case關鍵字後的定值1、定值2、定
9、值N尋找與算式的值吻合(match)的定值。假若有找到,則程式執行流程就轉到相對的敘述區塊中執行,如果找不到與算式吻合的定值,則程式執行流程會轉到default關鍵字後的預設敘述區塊中執行,而如果沒有與算式吻合的定值,而又沒有default關鍵字,則程式執行流程會跳過整個switch敘述。,switch-case敘述(3/4),請注意,若有吻合的定值要執行相同的敘述區塊,我們可以將數個case 定值 寫在一起,我們只要在其中間以冒號隔開即可:case 定值1:case 定值2:case 定值N:敘述區塊switch-case敘述中的case定值,其用法非常類似我們後面馬上要介紹的標記(labe
10、l)的用法,所謂標記是在程式中替某個敘述加上識別名稱,標記的用法在本章稍後將有詳細介紹。關鍵字case中定值的用法與標記(label)用法的相似性,形成switch-case敘述中的流經(fall through)現象。,switch-case敘述(4/4),可以使用break敘述來打破敘述區塊間的流經現象,其用法為將break敘述列為每個敘述區塊的最後一個敘述,當程式執行流程在碰到break敘述之後不會再進入switch-case敘述中的其他敘述區塊而會直接跳離整個switch-case敘述區塊,即執行流程轉移到整個switch-case敘述之後。Example:switch(成績/10)c
11、ase 10:case 9:System.out.println(優);break;case 8:System.out.println(甲);break;case 7:System.out.println(乙);break;case 6:System.out.println(丙);break;default:System.out.println(不及格);說明:,break、continue敘述與標記的使用(1/3),break敘述可以使程式的執行跳離switch-case敘述區塊,實際上,break敘述也可以用來跳離迴圈敘述區塊(包括for迴圈敘述區塊、while迴圈敘述區塊及do迴圈敘述區
12、塊)。Example:int 陣列=1,2,3,0,4,5,0,6;for(int i=0;i陣列.length;+i)if(陣列i=0)break;else System.out.print(陣列i);上列的程式片斷執行結果為印出123(即陣列0、陣列1、陣列2的值)之後即會停止執行,這是因為當變數i的值為3時,條件式陣列i=0成立,此時會執行break敘述,而此時程式執行流程會跳離整個迴圈敘述區塊。,break、continue敘述與標記的使用(2/3),continue,continue敘述會直接執行迴圈的遞增敘述,並使程式執行流程直接跳回迴圈敘述區塊的開頭。Example:int 陣列
13、=1,2,3,0,4,5,0,6;for(int i=0;i陣列.length;+i)if(陣列i=0)continue;else System.out.print(陣列i);上列程式片斷執行結果印出為印出123456。這是因為變數i的值為3及6之時,條件式陣列i=0成立,此時時會執行continue敘述,而使遞增敘述+i;直接執行後,程式流程即會回到迴圈敘述區塊的開頭,繼續執行迴圈的下一個反覆(iteration)。也就是說,continue敘述會以新的迴圈變數開始下一個新的迴圈敘述區塊的執行。,break、continue敘述與標記的使用(3/3),一般而言,break敘述與continu
14、e敘述都是用於跳開包含break敘述或continue敘述的最內層的敘述區塊。除了上述的一般用法,break敘述與continue敘述也可以配合標記(label)的使用來作較複雜的程式執行流程控制。,。,標記(1/2),標記(label)可以用來替敘述加上識別名稱,其用法為在標記識別名稱之後加上冒號,並將之加於敘述之前=標記識別名稱:敘述;break敘述與continue敘述可以配合標記的使用來作較複雜的程式執行流程控制,其用法為在break關鍵字或continue關鍵字之後加上標記識別名稱=break 標記識別名稱;Example:int 陣列=1,2,3,0,4,5,6,0,7,8,9,0
15、;外迴圈:for(int 列=0;列=3;+列)內迴圈:for(int 欄=0;欄=2;+欄)if(陣列列欄=0)break 外迴圈;else System.out.print(陣列列欄);,標記(2/2),說明:若break或continue敘述不加上標記名稱,則break敘述代表跳離包含此break敘述的最內層迴圈,而continue敘述則代表回到包含此continue敘述的最內層迴圈的開頭。在上列的例子中,break;敘述與break 內迴圈;敘述的意義相同;而continue;敘述與continue 內迴圈;敘述的意義相同。,控制敘述實例(1/4),Example 5-1 1:/檔名:
16、閏年測試.java 2:/說明:此程式可輸入一公元年份並判斷此公元年份是否為閏年 3:import javax.swing.JOptionPane;4:public class 閏年測試 5:public static void main(String 參數)6:int 年份;7:String 輸入字串,顯示字串;8:輸入字串=JOptionPane.showInputDialog(“請輸入一個公 元年份?);9:年份=Integer.parseInt(字串);,控制敘述實例(2/4),10:if(年份%4=0)11:if(年份%100=0)12:if(年份%400=0)顯示字串=公元+年份+
17、是閏年;13:else 顯示字串=公元+年份+非閏年;14:else 顯示字串=公元+年份+是閏年;15:else 顯示字串=“公元”+年份+“非閏年”;16:JOptionPane.showMessageDialog(null,顯示字串);17:System.exit(0);18:/方法:main()定義區塊結束 19./類別:閏年測試 定義區塊結束程式執行結果,控制敘述實例(3/4),Example 5-21:/檔名:閏年排行.java 2:/說明:此程式可由命令列中輸入一個整數“排行”3:/並輸出一個公元年份使得此公元年份是自公元元年後排行為 第“排行”個的閏年。4:public cla
18、ss 閏年排行 5:public static void main(String 參數)6:int 排行=Integer.parseInt(參數0);7:int 目前閏年數=0;8:int 年份=0;9:while(true),控制敘述實例(4/4),10:年份+=4;11:if(年份%4=0 15:/方法:main()定義區塊結束 16:/類別:閏年排行 定義區塊結束程式執行結果,The End,IF流程圖,IF-ELSE流程圖,switch-case流程圖,執行結果,執行結果,執行結果,程式說明,在上列敘述中,條件式為(i%j)=0(此條件式是用以測試變數i除以變數j的餘數是否為0,即測試
19、變數i是否為變數j的倍數)而條件敘述區塊僅包含一個敘述System.out.println(i+“是”+j+“的倍數”);當if敘述中的條件式的值為true時(當變數i除以變數j的餘數為0時),條件敘述區塊中的敘述(即System.out.println(i+是+j+的倍數);敘述)將會執行;反之,當if敘述中的條件式值為false時(當變數i除以變數j的餘數不為0時),則條件敘述區塊中的敘述不會執行。,程式說明,上述程式片段可以印出i、j、k三個變數中最大的那一個變數的值,巢狀的if-else敘述必須注意if及else關鍵字的配對,它的原則與其他配對符號(如大括號、中括號及小括號等)的配對原
20、則相同,這個原則是if關鍵字與程式後面第一個尋找到的else關鍵字配對,但是若在尋找else關鍵字的過程中曾經出現其他的if關鍵字,則需要先略過相同數目的else關鍵字後再與其後出現的第一個else關鍵字配對。例如,上面所列的程式碼中加上底線的if關鍵字與else關鍵字是配對的一組if-else關鍵字。一般而言,我們會使用縮排來突顯if及else關鍵字的配對關係。,程式說明,上述的寫法是不是使用巢式if-else敘述還簡單與明瞭呢?請注意,上列程式片段每一個case關鍵字對應的敘述區塊都是以break敘述作為最後一個敘述,這是switch-case敘述用以去除流經(fall through)現
21、象的的標準用法。若我們將所有的break敘述去除,則成績為90以上者會印出優、甲、乙、丙及不及格,而成績為80以上者會印出甲、乙、丙及不及格,餘類推。位於最後的預設敘述區塊並沒有加上break敘述,這是因為預設敘述區塊之後已經沒有其他敘述區塊了,因此沒有流經的問題,不需要再加上break敘述了。,程式說明,在上列程式片段中,陣列是一個4列3欄的陣列變數,列的編號為由0至3,欄的編號為由0至2,上列程式片段會在命令視窗中印出123,這是因為在 變數列的值為1及變數欄的值為0 時,條件式陣列列欄=0(陣列10=0)成立,程式執行流程會執行敘述 break 外迴圈;而跳離外層識別名稱為外迴圈的迴圈。
22、我們若將上列程式片斷中的break 外迴圈;敘述改為break 內迴圈;敘述,則程式片段會在命令視窗中印出123689,這是因為在變數列的值為1及變數欄的值為0 時,條件式陣列列欄=0(陣列10=0)成立,程式執行流程會執行敘述break 內迴圈;敘述跳離內層命名為內迴圈的迴圈,而接著執行外層迴圈的下一個反覆(在此反覆中,變數列的值為2)。在變數列的值為2及變數欄的值為1 時,條件式陣列列欄=0(陣列21=0)成立,程式執行流程則再度跳離內層迴圈,而接著執行外層迴圈的下一個反覆(在此反覆中,變數列的值為3)。最後,在變數列的值為3及變數欄的值為2 時,條件式陣列列欄=0(陣列32=0)成立,程
23、式執行流程則再度跳離內層迴圈,而預計進行外層迴圈的下一個反覆,而因為變數列的值為4已超過外層迴圈指定的範圍,所以整個程式的執行即停止了。,程式說明,以類似的用法,continue敘述也可以與標記配合使用,例如,若我們將上列程式片斷中的break 外迴圈;敘述改為 continue 外迴圈;敘述,則程式片段會在命令視窗中印出123689,這是因為在變數列的值為1及變數欄的值為0 時,條件式陣列列欄=0(陣列10=0)成立,程式執行流程會執行敘述continue 外迴圈;敘述而回到外層迴圈敘述區塊的開頭,繼續執行外層迴圈的下一個反覆(此反覆中,變數列的值為2)。另外,同樣的情形亦發生在在變數列的值
24、為2及變數欄的值為1 時及變數列的值為3及變數欄的值為2 時。,程式說明,若我們將上列程式片斷中的break 外迴圈;敘述改為continue 內迴圈;敘述,則程式片段會在命令視窗中印出123456789,這是因為在變數列的值為1及變數欄的值為0 時,條件式陣列列欄=0(陣列10=0)成立,程式執行流程會執行敘述continue 內迴圈;敘述而回到內層迴圈敘述區塊的開頭,繼續執行內層迴圈的下一個反覆(此反覆中,變數列的值為1,變數欄的值為1)。另外,同樣的情形亦發生在在變數列的值為2及變數欄的值為1 時及變數列的值為3及變數欄的值為2 時。也就是說所有值為0的元素會被跳過列印,所以印出的結果為
25、123456789。,程式說明,範例程式5-1是一個閏年測試的程式,此程式可以讓使用者輸入一個公元年份,並判斷此公元年份是否為閏年。請注意,公元記年中,每4年有一個閏年,每100年減少一個閏年,而每400年再加回1個閏年。第10-15行,程式說明,此6行合在一起是一個單一的三層巢狀if-else敘述,用以測試變數年份是否代表閏年。若第12行條件式成立則代表變數年份是4的倍數也是100的倍數也是400的倍數,它代表一個閏年公元年份;若程式執行流程進行到第13行代表變數年份是4的倍數也是100的倍數,但不是400的倍數,它代表一個100年應該扣掉一次的非閏年公元年份;若程式執行流程進行到第14行代
26、表變數年份是4的倍數但不是100的倍數,它代表一個每四年一次的一般的閏年公元年份;若程式執行流程進行到第15行代表變數年份不是4的倍數,它代表的公元年份絕對不會是閏年。,程式說明,第5-6行 5:public static void main(String 參數)6:int 排行=Integer.parseInt(參數0);main方法可以自命令列讀入參數並將之存於main方法中宣告的String陣列中,命令列參數輸入的方式為在利用Java解譯器執行類別所對應的位元組碼檔案時一併輸入參數java 類別 參數1 參數2 參數3(若類別以中文識別名稱命名,則必須在java與類別之間加入 Run)第
27、5行於main方法中宣告的String陣列變數為參數,而第1個命令列參數則儲存於參數0中,第2個命令列參數則儲存於參數1中,。另外,參數.length儲存由命令列輸入的參數個數。,程式說明,第6行的參數0儲存代表第1個參數的字串,而方法Integer.parseInt(參數0)則會將參數0轉換為int型別的整數數值。第9行是一個while迴圈敘述的開頭,而第13行是此迴圈敘述區塊的結束。此while迴圈敘述的條件式為true,這表示這個while迴圈敘述將永遠不斷的執行下去。第10行 年份+=4;此敘述會將變數年份之值遞增4。此敘述在while迴圈敘述不斷執行時會衍生出4、8、12、等整數值。第11行 if(年份%4=0 這個敘述會將變數目前閏年數遞增1。,程式說明,第12行 if(目前閏年數=排行)break;此if敘述根據變數目前閏年數之值是否大於等於變數排行之值來判斷是否要執行敘述break;而使while迴圈結束執行。第14行 System.out.println(“排行為第”+排行+“的閏年為公元”+年份+“年”);此敘述為while迴圈敘述定義區塊結束後的第一個敘述,當while迴圈敘述結束後第一個執行的敘述就在這裡,此敘述輸出本程式的輸出結果。,