Download presentation
Presentation is loading. Please wait.
1
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用
2
目錄 4-1 條件判斷 4-2 迴圈 4-3 跳躍敘述 溫故知新 自我突破習題
3
4-1 條件判斷 4-1.1 if敘述 4-1.2 if…else…敘述 4-1.3 巢狀if敘述
4-1 條件判斷 4-1.1 if敘述 4-1.2 if…else…敘述 4-1.3 巢狀if敘述 4-1.4 逐一過濾條件的if…else if…else敘述 4-1.5 多重條件判斷switch…case
4
前言: 當程式執行到某一種特殊情況,必須執行特定的程式碼時,就可以使用條件流程控制敘述,將程式的執行順序引導到另一個流程,使得程式變得比較有彈性,比較有智慧,而不是只單純的從頭執行到尾,此節將介紹各種條件判斷命令的用法。
5
4-1.1 if敘述 日常常說的「如果……就……」的情況,就可以使用if…來完成,例如:如果成績低於60分,就顯示不及格。
6
if敘述有下面兩種表示方法: 單一敘述 當符合條件時,只需要執行單一敘述的內容,就可以使用單一敘述的語法來撰寫,其語法如下:
上述語法的意思是,當if條件式成立時,才執行後面的敘述;當if條件式不成立時,則直接往下一行程式執行。
7
下面範例是運用if條件式判斷的應用,其程式碼如下:
9
上述運用if條件式判斷的程式碼分析如下:
第10行利用if敘述來做條件式判斷,條件是當x % 2 == 0,使用者輸入的整數除以2,得整數商後的餘數等於0,也就是偶數。當此條件成立時,則執行if條件式後面的敘述,顯示“這個數是偶數!”的訊息。 第11行利用if敘述來做條件式判斷,條件是當x % 2 == 1,使用者輸入的整數除以2,得整數商後的餘數等於1,也就是奇數。當此條件成立時,則執行if條件式後面的敘述,顯示“這個數是奇數!”的訊息。
10
完成後,執行程式的畫面顯示如下:
11
敘述區塊: 如果在符合條件的情況下,要執行的敘述內容很多時,可以將它分成多行敘述來撰寫,並用{}包圍,變成敘述區塊,其語法如下:
12
上述敘述區塊的語法說明如下 上述語法的意思是,當if條件式成立時,執行介於大括弧{}之間的所有敘述;當if條件式不成立時,則直接跳到大括弧{}外面繼續執行。
16
4-1.2 if…else…敘述 在程式執行過程中,如果想要在條件成立時,執行某個敘述,條件不成立時,執行另一個敘述時,也就是日常生活常說的「如果……就……,否則就……」的情況,這時可以使用if…else…來撰寫程式,例如:如果沒有下雨,我就搭公車;否則,我就搭計程車。
17
if…else…的語法如下: 如果敘述很多時,可以將它寫成敘述區塊的方式。 if…else…的另一種語法如下:
18
上述if…else…的語法說明如下: 上述語法的意思是,當if條件式成立時,執行if大括弧{}裡面的敘述(也就是敘述1或敘述區塊1),再執行if…else…條件判斷之後的敘述;當if條件式不成立時,則執行else大括弧{}裡面的敘述(也就是敘述2或敘述區塊2),再執行if…else…條件判斷之後的敘述。
19
下面範例是運用if…else…條件判斷,其程式碼如下:
22
上述運用if…else…條件判斷的程式碼分析如下:
第20行利用if …else…來做條件式判斷,條件是當e >= 60,也就是四科成績的平均大於或等於60分。當此條件成立時,則執行if大括弧{}裡面的敘述,也就是顯示平均分數和及格的訊息;如果此條件不成立,則執行else大括弧{}裡面的敘述,顯示平均分數和不及格的訊息。 此範例採敘述區塊的方式來輸入if …else…的敘述,所以記得要將敘述區塊1與敘述區塊2以大括弧{}括起來。
23
完成後,執行程式的畫面顯示如下:
25
4-1.3 巢狀if敘述 若if敘述內還有if敘述,就稱為巢狀if敘述。
26
巢狀if敘述的語法如下:
27
上述巢狀if敘述的說明如下: 上述語法總共包含兩層if敘述,程式執行時,會先判斷外層的條件(也就是條件1):
條件1成立時,才判斷內層的條件,也就是條件2。 條件1不成立時,則直接執行外層else{}裡面的敘述區塊,接著再執行外層else{}後面的敘述。 若條件1成立,且條件2成立時,則執行條件2之{}裡面的敘述區塊,接著執行內層else{}後面的敘述,再執行外層else{}後面的敘述。 若條件1成立,但條件2不成立時,則執行內層之else{}裡面的敘述區塊,接著執行內層else{}後面的敘述,再執行外層else{}後面的敘述。
28
上述巢狀if程式的流程如下:
29
多層的if敘述: 上述舉例的是兩層的巢狀if敘述,其實,巢狀if敘述可以包含很多層的if敘述,只要注意每一層的if敘述必須完整即可。
而除了上述在外層if{}的裡面加入另一層的if敘述以外,也可以在外層else{}的裡面加入另一層的if敘述。 每增加一層if敘述,就會多一項邏輯判斷,可能出現的情形就倍增,所以必須特別注意每一層條件的邏輯性。因此,在撰寫巢狀if敘述前,可以先做一個表格,比較容易寫判斷式與結果。
30
下面設計一個程式,條件判斷檢核表如下所示:
例如:想要設計一個程式,判斷此人是月收入50000元以上的男生或女生,或者是月收入小於50000元的男生或女生,條件判斷檢核表如下所示:
31
例如下面的程式碼:
33
上述的程式碼分析如下: 第9行宣告sex為整數資料型別,並設定為字串s1轉換的整數值。
第12行宣告salary為整數資料型別,並設定為字串s2轉換的整數值。 此程式使用兩層if…else…來做判斷,第13~24行是外層的if…else…敘述,而第14~17行和第19~22行是內層的if…else…敘述。 外層的if…else…判斷性別是男生或女生,而內層的if…else…則判斷月收入。
34
完成後,執行程式的畫面顯示如下:
36
4-1.4 逐一過濾條件的if…else if…else敘述
在程式執行過程中,如果有很多種狀況,並且會產生不同的結果時,也就是日常生活常說的「如果……就……;否則,如果……就……;否則,如果……就……;」情況,可以使用if…else if…else來逐一過濾條件,例如:輸入身分證的第一個英文字母,如果是A,就顯示“您的出生地是台北市”;如果是B,就顯示“您的出生地是台中市”;如果是C,就顯示“您的出生地是基隆市”;……。
37
逐一過濾條件if…else if…else的語法如下:
38
上述逐一過濾條件if…else if…else的語法說明如下:
上述語法的意思是,當條件式1成立時,才執行敘述區塊1的敘述,然後執行if…else if…else之後的敘述;若當條件式1不成立時,則檢查條件式2是否成立,如果成立,則執行敘述區塊2的敘述,然後執行if…else if…else之後的敘述;若當條件式2不成立時,則檢查條件式3是否成立,如果成立,則執行敘述區塊3的敘述,然後執行if…else if…else之後的敘述;若所有的條件式都不成立時,則執行else{}裡面的敘述,再執行if…else if…else之後的敘述。
39
上述逐一過濾條件if…else if…else程式的流程如下:
40
下面範例是運用if…else if…else條件式判斷的應用,其程式碼如下:
42
上述運用if…else if…else條件式判斷的程式碼分析如下:
第8行宣告W為整數資料型別,並設定為字串s轉換的整數值。 第9~24行利用if…else if…else來逐一判斷所輸入的條件。 第23~24行表示若不是輸入1、2、3、4、5、6、7等數字,會出現“您輸入錯誤!”的訊息。
43
完成後,執行程式的畫面顯示如下:
46
4-1.5 多重條件判斷switch…case 若使用if…else…或if…else if…else來撰寫程式碼,覺得程式碼有多處重複,或造成閱讀不便和維護不易時,可以試試利用多重條件判斷的switch…case來撰寫程式碼。 與if…else if…else功能相似,在程式執行過程中,如果有很多種狀況,並且會產生不同的結果時,也就是日常常說的「如果……就……;如果……就……;……」情況,就可以使用switch…case來做多重判斷。 例如:輸入年齡,如果1~5歲,可以欣賞普通級電影;如果6~11歲,可以欣賞普通級和保護級電影;如果12~17歲,可以欣賞普通級、保護級和輔導級電影;如果18歲以上,可以欣賞普通級、保護級、輔導級和限制級電影。
47
多重條件判斷switch…case的語法如下:
48
上述多重條件判斷switch…case的語法說明如下:
上述語法的意思是,當條件值1成立時,執行敘述區塊1的敘述,執行到break指令時,就會跳出switch程式區塊,而執行後面的敘述;若條件值2成立時,則執行敘述區塊2的敘述,當執行到break指令時,就會跳出switch程式區塊,而執行後面的敘述;若所有的條件式都不成立時,則執行default裡面的敘述,再跳出switch程式區塊。 不過,一定要記得在每個case裡的最後一行都要加上break指令,否則程式執行時,當執行完符合條件的case敘述,仍會繼續執行下一個case敘述,並不會跳離switch程式區塊。
49
上述多重條件判斷switch…case程式的流程如下:
50
下面範例是運用switch…case來做多重判斷的應用,其程式碼如下:
52
上述運用switch…case來做多重判斷的程式碼分析如下:
第8行宣告age為整數資料型別,並設定為字串s轉換的整數值。 第9~21行利用switch…case來逐一判斷所輸入的條件。 case後面的條件值的資料型態必須要和switch()中資料或運算式的資料型態一樣。 第19~20行的程式碼表示若不符合第10、13、16行所指定的數字,也就是年齡大於或等於18者,會出現“您可以欣賞普通級、保護級、輔導級和限制級電影”的訊息。
53
完成後,執行程式的畫面顯示如下: 上述程式碼只是舉例之用,並不是很嚴謹,因當使用者輸入小於或等於0的數值時,顯示的結果不符合邏輯。
56
4-2 迴圈 4-2.1 for迴圈 4-2.2 while迴圈 4-2.3 do…while迴圈 4-2.4 巢狀迴圈
57
前言: 迴圈(Loop)是程式設計蠻常使用的一種結構,它可以重複做一些指定的動作,達到累積運算的結果,本來可能需要重複執行100次的程式,只要利用迴圈觀念,就可以利用一小段程式敘述,讓程式自動執行100次,例如:想要從1加到100,這時候,就可以利用迴圈的結構,讓程式每次累加後,又會再自動累加下一個數字,直到累加到100為止。 善用迴圈功能,一些需重複執行的程式碼就會變得很簡短了。 迴圈分成兩種,一種是計次迴圈,一種是條件迴圈。 計次迴圈是指程式會依指定的次數重複執行指定的程式碼;而條件迴圈是指當符合條件時,就重複執行指定的程式碼,本節將一一介紹各種迴圈的語法結構。
58
4-2.1 for迴圈 如果已經確定想要重複執行的次數,就可以利用for迴圈,讓程式敘述變得簡短一點。
59
for迴圈的語法如下:
60
for迴圈的語法各部分說明如下: 初始運算式:設定計次變數的初始值,只有在進入迴圈時會執行此運算式。
61
間隔值: for迴圈的語法中,間隔值可以是正數,也可以是負數,當間隔值是正數時,條件表示式通常為計次變數的初始值要小於或等於終止值;若間隔值是負數,則條件表示式通常為計次變數的初始值要大於或等於終止值。 當迴圈執行到條件表示式為“假”時,則會直接跳離迴圈,而不執行for迴圈內的敘述區塊。
62
上述for迴圈的流程如下:
63
下面範例是運用for迴圈的技巧,其程式碼如下:
64
上述運用for迴圈技巧的程式碼分析如下-1:
第4行宣告兩個變數,i表示計次變數,而sum表示每次加總後的值,並設定變數sum的初始值為0。 第5~7行利用for迴圈的技巧,讓加法進行100次。
65
上述運用for迴圈技巧的程式碼分析如下-2:
第6行利用sum=sum+i運算式,讓i在條件表示式(i<=100)為真時,能將計次的i加上sum。應用這種迴圈技巧,讓第1次迴圈sum的內容等於1;第2次迴圈sum的內容等於1+2;第3次迴圈sum的內容等於1+2+3;如此到第100次時,就可以計算出1+2+3+……+100的值。請看下表的分析:
66
完成後,執行程式的畫面顯示如下: 前面例子的間隔值為1,間隔值也可以設定為2、 3……或其他數值。
67
下面範例應用for迴圈的技巧,計算出1+3+5+…+101的數值,程式碼如下:
71
4-2.2 while迴圈 當迴圈的次數無法預估,也就是無法判斷需要執行幾次時,可以使用while敘述來達成迴圈的效果。
72
while迴圈的語法如下: 上述while迴圈的敘述是指 只要符合條件式,就反覆 執行迴圈內的敘述;如果 不符合條件式,就跳出迴 圈,執行while迴圈之後的 敘述。
73
下面範例改採while條件迴圈來撰寫程式,其程式碼如下:
在前一小節中曾經利用for迴圈的技巧,計算出 ……+100的數值,本小節將改採while 條件迴圈來撰寫程式,讓讀者比較兩者的差異, 其程式碼如下:
74
上述應用while條件迴圈的程式碼分析如下:
第4行宣告兩個變數,i表示欲加總的加數,其初始值為1,而sum表示每次加總後的值,並設定變數sum的初始值為0。 第5~8行利用while迴圈的技巧,讓加法進行100次。 第6行利用sum=sum +i運算式,讓第一次迴圈時,sum=0+1,i=1+1;第二次迴圈時,sum=0+1+2,i=2+1;第三次迴圈時,sum= ,i=3+1;……直到第100次迴圈時,sum= ……+100,i=100+1,此時i值等於101,當跳回第5行時,不符合while條件式,所以會跳出迴圈,而跳到第9行執行。 第7行設定i=i+1,這樣子變數i才會累加,請千萬不要漏掉了,否則將出現每次i值都將固定等於初始值的狀況,而造成無窮迴圈。
75
完成後,執行程式的畫面顯示如下: 若間隔值不為1,或不為正數時,也可以應用相同的技巧來做迴圈,只要將第7行設定成i=i+間隔值,其中間隔值可以為正數也可以為負數。
80
4-2.3 do…while迴圈 do…while也是一種條件迴圈,和while的作用相同,只是判斷的先後不同。
81
do…while的語法如下: 上述do…while迴圈的敘述是指先執行一次迴圈內的敘述,然後判斷條件式是否成立,若成立,就執行迴圈內的敘述;若不成立,則跳出迴圈。 所以利用此語法撰寫條件迴圈時,不管條件式是否成立,都會先執行一次迴圈內的敘述。
82
do…while迴圈的流程如下:
83
下面範例利用do…while迴圈的技巧,計算1~20整數的平方和,其程式碼如下:
84
上述利用do…while迴圈的技巧程式碼分析如下:
第4行宣告變數i,其初始值為1,表示欲平方的數值,而sum表示每次平方和後的值,並設定變數sum的初始值為0。 第5~8行利用do…while迴圈的技巧,讓平方和進行20次,而第8行則是用來判斷欲平方的數值是否小於或等於20。 第6行利用sum=sum+i*i運算式,讓第一次迴圈時,sum=0+1*1,i=1+1;第二次迴圈時,sum=0+1*1+2*2,i=2+1;第三次迴圈時,sum=0+1*1+2*2+3*3,i=3+1;……直到第20次迴圈時,sum=0+1*1+ 2*2+3*3+……+20*20,i=20+1,此時i值等於21,當執行到第8行時,不符合while條件式,所以會跳出迴圈,而跳到第9行執行。 第7行設定i=i+1,這樣子變數i才會累加。
85
完成後,執行程式的畫面顯示如下:
88
4-2.4 巢狀迴圈 如果迴圈內還有迴圈,就稱為巢狀迴圈。
89
以兩層for迴圈來說,其巢狀迴圈敘述的語法如下:
上述巢狀迴圈的敘述總共包含外和內兩層迴圈敘述,程式執行時,外層迴圈每執行一次,內層迴圈就會執行一個完整的週期,接著才會再執行下一個外層的迴圈。
90
下面範例利用for巢狀迴圈技巧,顯示出九九乘法表的程式碼如下:
92
上述利用for巢狀迴圈技巧的程式碼分析如下:
九九乘法表最主要與被乘數和乘數兩個數有關,所以在第3行宣告兩個計次變數,一個代表被乘數,一個代表乘數。 第4~9行,利用巢狀迴圈來控制程式反覆執行,外層迴圈設定被乘數的計次變數從2到9,而內層迴圈設定乘數的計次變數從1到9。 第6行利用System.out.println函式將乘式組合起來即可。
93
完成後執行程式,就會將九九乘法逐一計算並列出,畫面顯示如下:
94
由上述九九乘法表的例子可以得知,巢狀迴圈執行的流程如下:
97
4-3 跳躍敘述 4-3.1 中斷分支break敘述 4-3.2 迴圈接續continue敘述 4-3.3 中斷程式return敘述
98
前言: 是不是一定要執行完符合次數或條件的迴圈敘述?其實也可以強迫離開迴圈。
只要在迴圈敘述內加入break敘述就可以強制離開迴圈,而continue敘述則會將控制權轉移到迴圈開頭的敘述繼續執行,另外,利用return敘述可以中斷程式或函式的執行。
99
4-3.1 中斷分支break敘述 前面的多重條件判斷switch…case章節裡,曾經介紹到break敘述的使用,除了switch…case以外,在迴圈中也可以使用break敘述來強迫程式跳離迴圈或中斷迴圈的執行。 例如下面的程式碼:
100
上述的程式碼分析如下: 第4~7行的for迴圈從1加到100,第5行的if敘述,使i值在超過5時會做break動作,將程式的控制權轉移至最近迴圈的外面(第8行)。 當i=6時,sum已經從之前的1加到5,故sum=15。因為i在第5行的if敘述符合條件i>5,所以執行break,跳至第8行。
101
完成後,執行程式的畫面顯示如下:
104
4-3.2 迴圈接續continue敘述 另外一個和break敘述相反的是continue敘述,break敘述可以強迫將控制權跳離迴圈;而continue則是將控制權轉移到迴圈開頭的敘述繼續執行。 例如,在for迴圈中,遇到continue敘述會跳至for敘述的條件表示式,再執行計次運算式。
105
下面範例利用continue敘述的程式碼如下:
下面這個範例是計算1~100之間所有是2的倍數或3的倍數,而不是6的倍數的和,其程式碼如下:
107
上述利用continue敘述的程式碼分析如下:
第4~9行for迴圈的目的是將1到100之間2或3的倍數加總,但是在第5行的if敘述,當i為6的倍數時則執行continue敘述,也就是跳至for迴圈的條件表示式i<=100繼續執行,而沒有往下執行到sum+=i。 當迴圈結束時,i值會累加到101,但是sum只有在i為2或3的倍數,且不是6的倍數時才執行,故sum= …… 。 第5~8行也可以改成下列敘述,而不用continue敘述:
108
完成後,執行程式的畫面顯示如下:
111
4-3.3 中斷程式return敘述 利用return敘述可以中斷程式或函式的執行,並返回呼叫的程式,在返回程式時,也可以傳回“運算式”或“值”。
112
例如下面的程式碼: 上述程式碼第9行利用return敘述中斷程式的執行,所以當輸入的字元為“n”時,就不會往下執行第10行的敘述。
113
完成後,執行程式的畫面顯示如下:
114
溫故知新-1:
115
溫故知新-2:
116
溫故知新-3:
117
自我突破習題-選擇題:
118
自我突破習題-選擇題:
119
自我突破習題-實作題:
120
自我突破習題-實作題:
121
自我突破習題-實作題:
122
自我突破習題-實作題:
123
自我突破習題-實作題:
124
自我突破習題-實作題:
125
自我突破習題-實作題:
126
自我突破習題-實作題:
127
自我突破習題-實作題:
Similar presentations