4-3 條件判斷式
內容:
程式執行當中,期望測試某些現象是否發生,再決定如何處理下一步驟的話,則需仰賴條件判斷式來達成。也就是說,程式當中可加入某些條件判斷式,測試是否發生某種特殊現象。經由判斷式運算處理後,有兩種輸出結果:『真』(True)或『假』(False),前者表示條件成立;後者為條件不成立。
一般程式語言的比較判斷式大致上可區分為:數值比較、字元比對與條件邏輯組合等三類,以下分別介紹之。
4-3-1 數值比較
兩數值之間比較判斷是否大於(>)、小於(<)、大於或等於(>=)...等等等。得到一個『真』(true,1)或『否』(false,0)的邏輯結果,常用的數值比較判斷運算子,如表 4-1 所示。
表 4-1 判斷式(假設 value1 = 10、value2 = 5)
判斷式 |
說
明 |
範
例 |
> |
大於 |
(value1 > value2),則輸出為
true (1) |
< |
小於 |
(value1 < value2),則輸出為
false(0) |
== |
等於 |
(value1 == value2),為輸出為
false (0) |
!= |
不等於 |
(value1 != value2)
為
true (1) |
>= |
大於或等於 |
(value1 >= value2)
為
true (1) |
<= |
小於或等於 |
(value1 <= value2)
為
false (0) |
4-3-2 字元或字串比對
字元或字串比對與數值比較不同,字元比對必須使用 Character 類別方法,字串則須利用 String 方法;假設 key 被宣告成字元或字串物件,則常用的比對方法如表 4-2 所示。
表 4-2 字元比對方法(假設 key = ‘y’)
判斷式 |
說
明 |
範
例 |
equals() |
是否相同 |
key.equals(“n”),則輸出為
false (0)。 |
compareTo() |
字元比較大小 |
key.compareTo(“n”),整數輸出之間差異。 |
length() |
字串長度 |
key.length(),輸出字串內字元長度。 |
isDigit() |
是否數字 |
key.isDigit(),為輸出為
false (0)。 |
isLetter() |
是否文字 |
key.isLetterl(),為
true (1)。 |
isLowerCase() |
是否小寫 |
key.isLowerCase(),為
true (1)。 |
isSpace() |
是否空白格 |
key.isSpace(),為
false (0)。 |
4-3-3 條件邏輯組合
當一個判斷式無法滿足條件時,也許需要多個判斷式組合成為一個決定條件。譬如:天氣下雨又颳風的話,則必須穿雨衣,其表示兩種條件都成立,才處理預先制定的事項。組合條件判斷中,每一個判斷式的計算輸出不是 1(true)則是 0(false),再利用特殊邏輯運算子來組合多個判斷式;但經過邏輯運算處理後,輸出也是 0 或 1。表 4-3 為一般程式語言的邏輯運算子。
表 4-3 邏輯運算子
運算式 |
說
明 |
範
例 |
&& |
AND(且) |
X && Y,X
與
Y 兩條件都成立。 |
|| |
OR(或) |
X || Y,X
與
Y 只要一個條件成立即可。 |
! |
NOT(否) |
! X,X
條件不成立即可。 |
4-4 分歧流程 - if
4-4-1 if 敘述流程
if 選擇性敘述(Selection statement)的功能是,首先判斷某一條件,如果條件成立的話,則執行某一敘述區塊(或某一敘述);不成立的話,則不做任何事或執行另一敘述區塊。
圖 4-2 為 if 敘述(if statement)的流程控制圖(或稱流程圖),其中『圓形』為敘述句的開始(start)與結束(stop);『菱形』內存放條件判斷式,有成立(yes)與不成立(no)兩種可能性輸出;另外,『矩形』內存放敘述區塊(一連串順序性敘述)。
整體上而言,if 敘述句開始時,進入『條件判斷式』測試條件是否成立,成立則執行『yes』 敘述區塊,然後結束 if 敘述;條件不成立的話,則直接離開,而不執行任何敘述。If 選擇敘述的語法如下:
圖4-2 if 敘述的流程圖
if
敘述語法: |
範
例: |
if (條件判斷式)
{
敘述
1;
敘述
2;
…..
} |
if (value > 0) {
float sqrt_value = Math.sqrt(value);
System.out.printf("%.2f
平方根值為
=", value);
System.out.printf("%.2f \n", sqrt_value);
} |
4-4-2 範例研討:簡單計算器製作
(A)程式功能:Ex4_2.java
請製作一個求平方根的計算器,但被計算的原數不可以是負數;使用者輸入某一數值後,系統會先測試該值是否大於 0,如正確輸入則計算並輸出其平方根值。並期望系統操作介面如下:
如果輸入值大於零的結果如下:
請輸入一個浮點數
=>4.5
4.50
的平方根值為
= 2.12
程式最後結束了
如果輸入值小於零的結果如下:
請輸入一個浮點數
=>-3.5
程式最後結束了 |
(B)製作技巧研討:
系統要求使用者輸入一個大於零的浮點數,如果正確輸入的話(if 敘述功能),則執行計算均方根函數(Math.sqrt()),否則不予執行。當 if 敘述句完成之後,再執行列印『程式最後結束了』之敘述句。程式流程圖如下:
圖 4-2-1 計算器製作
(C)程式範例:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15 |
//
Ex4_2.java
import
java.util.*;
public class
Ex4_2 {
public
static void main(String args[]) {
Scanner keyin = new Scanner(System.in);
double
value, squre;
System.out.printf("請輸入一個浮點數
=>");
value
= keyin.nextDouble();
if
(value > 0) {
squre = Math.sqrt(value);
System.out.printf("%.2f
的平方根值為
= %.2f\n", value, squre);
}
System.out.printf("程式最後結束了
\n");
}
} |
(D)程式重點分析:
-
第 9、10
行:顯示要求輸入一個浮點數,讀入後儲存於 value 變數內。
-
第 11 ~ 14
行:『if (value >0 ) { ….. }』。此為 if 敘述句,如果條件成立的話(value > 0),則執行左右大括號內({ ….. })的程式實體(program body);該實體又稱為『if body』。
-
第 15
行:『System.out.printf("程式最後結束了 \n")』。緊接著 if 敘述句後下一個敘述句,無論 if 敘述的條件是否成立,皆會執行到該敘述句。
4-4-3 自我挑戰:薪資計算系統
(A)程式功能:PM4_2.java
請幫春嬌美體公司建立一套薪資管理系統。員工薪資必須符合勞委會規定,底薪不可以低於 16800 元,如低於該值則自動調整到最低薪資;加班時數不得高於 45 小時,高於 45 小時則以 45 小時計算;又加班費為原來時薪再增加 1/3 倍(即是原來時薪的 (1 + 1/3) 倍)。該系統允許輸入員工姓名、底薪、加班時數,計算完成後,分別印出該員工姓名、底薪、加班費與應領薪資多寡。期望操作介面如下:
輸入薪資如符合規定,如下
請輸入員工姓名
=>張大智
請輸入底薪
=>24000
請輸入加班時數
=>30
列印員工薪資如下:
員工姓名
=
張大智
底薪
= 24000
加班費
= 3998
本月薪資
= 27998
輸入薪資如不符合勞委會規定,如下:
請輸入員工姓名
=>劉明傳
請輸入底薪
=>15000
請輸入加班時數
=>50
列印員工薪資如下:
員工姓名
=
劉明傳
底薪
= 16800
加班費
= 4198
本月薪資
= 20998 |
(B)製作技巧提示:
輸入底薪後,立即判斷是否小於 16800 元,如是的話,就將底薪設定為 16800 元;同樣的,判斷加班時數是否大於 45 小時,成立則設定為 45。另一重點是,計算時薪時,必須將其轉換成點浮點數,最後結果再轉換回整數,如此計算員工較不會吃虧。程式提示如下:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18 |
…..
/*
輸入底薪後,判斷是否低於
16800,如是則設定成
16800 */
System.out.printf("請輸入底薪
=>");
base = keyin.nextInt();
if (base < 16800)
base = 16800;
/*
輸入加班時數,再判斷是否高於
45,如是則設定成
45 */
System.out.printf("請輸入加班時數
=>");
extra = keyin.nextInt();
if (extra > 45)
extra = 45;
/*
計算加班費,以及應領薪資多寡*/
extra_pay = (int)(((double)base/(30 * 8))*1.333 *
extra);
pay = base + extra_pay;
….. |
|