|
4-6 多重 if/else 選擇分歧
內容:
4-6-1 多重 if/else 敘述流程
圖 4-4 為多重 if/else 選擇敘述的流程圖,主要功能是能連續測試多種條件是否成立。程式進入多重 if/else 敘述之後,首先判斷第一個條件是否成立,如果成立的話,則執行『yes 區塊』內敘述,之後也離開該敘述句;否則再測試第二個條件(else if),成立的話,則執行『敘述區塊』,之後也離開該敘述句;否則再測試第三個條件(else if)。依此類推,一直到所有條件測試完畢。
圖 4-4 多重 if/else 敘述的流程圖
多重 if/else 敘述句的語法與範例如下:
語法: |
範例: |
if(條件運算式
1)
{
條件一成立的敘述區塊
…..
}
else if(條件運算式
2)
{
條件二成立的敘述區塊
….
}
else if
(條件運算式
3)
{
條件三成立的敘述區塊
…..
}
else {
條件全不符合的敘述區塊
…..
} |
if (bmi <=
base) { //條件一
….
System.out.printf("您身材太瘦了\n");
….
}
else if (bmi
>= height) { //條件二
System.out.printf("您身材太胖了\n");
…..
}
else
{ //上述條件都不成立
System.out.printf("您是健美體材\n");
…..
} |
4-6-2 範例研討:測量身材 BMI 系統
(A)程式功能:Ex4_4.java
美體中心小姐需時常幫客人計算 BMI 值(體重(kg)/身高2(m)),正常值為 18 ~ 24;低於 18 則太瘦,高於 24 則太胖。系統會要求輸入客人體重與身高,則輸出印出該它的 BMI 值,並告知太胖、太瘦或標準體材。期望系統操作介面如下:
太胖的結果如下:
==
歡迎使用 BMI
評估系統(18 ~ 24) ==
請輸入客戶身高(公分) =>170
請輸入客戶體重(公斤) =>80
客戶 BMI
值 = 27.6817
您身材太胖了,
需要減重
==
系統結束,
歡迎再次光臨 ==
太瘦的結果如下:
==
歡迎使用 BMI
評估系統(18 ~ 24) ==
請輸入客戶身高(公分) =>170
請輸入客戶體重(公斤) =>45
客戶 BMI
值 = 15.5709
您身材太瘦了,
需要增胖
==
系統結束,
歡迎再次光臨 ==
標準身材的結果如下:
==
歡迎使用 BMI
評估系統(18 ~ 24) ==
請輸入客戶身高(公分) =>170
請輸入客戶體重(公斤) =>60
客戶 BMI
值 = 20.7612
恭喜您有一個健美體材
==
系統結束,
歡迎再次光臨 ==
|
(B)製作技巧研討:
我們利用虛擬碼來設計該程式的製作技巧,如下:
宣告輸入物件;
宣告相關變數;
讀入客戶身高與體重(toll、weight);
計算客戶 bmi = weight / (toll * toll);
輸出顯示客戶 BMI 值;
if (bmi < 18.0)
輸出告知客戶身材太瘦;
else if (bmi > 24.0)
輸出告知客戶身材太胖;
else
輸出告知客戶身材健美;
輸出顯示歡迎再度光臨; |
(C)程式範例:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
// Ex4_4.java
import
java.util.*;
public
class
Ex4_4 {
public
static
void
main(String
args[]){
Scanner
keyin
=
new
Scanner(System.in);
final
double
base=18.0,
height=24.0;
double
toll,
weight,
bmi;
System.out.printf("==
歡迎使用
BMI
評估系統(18
~ 24) ==\n");
System.out.printf("請輸入客戶身高(公分)
=>");
toll
=
keyin.nextDouble()
/ 100;
System.out.printf("請輸入客戶體重(公斤)
=>");
weight
=
keyin.nextDouble();
bmi
=
weight
/ (toll
*
toll);
System.out.printf("\n客戶
BMI
值
= %.4f\n",
bmi);
if
(bmi
<=
base)
System.out.printf("您身材太瘦了,
需要增胖\n");
else
if
(bmi
>=
height)
System.out.printf("您身材太胖了,
需要減重\n");
else
System.out.printf("恭喜您有一個健美體材\n");
System.out.printf("==
系統結束,
歡迎再次光臨
==\n");
}
} |
(D)程式重點分析:
-
第 8
行:『final double base=18.0, height=24.0;』。一般程式設計師大多會將特定數值宣告成『固定變數』(final),當環境變遷需要修改數值內容時,僅變更固定變數,其他程式內容就不需要優改。;本敘述句宣告產生 base 與 height 兩固定變數(double 型態),並分別填入 18.0 與 24.0,並限制不可再變更其內容。
-
第 19~25
行:『if .. else if …』。多重 if/else 敘述句。
4-6-3
自我挑戰:計算雕塑身材質量
(A)程式功能:PM4_5.java
美體中心僅利用
BMI(=(體重(kg)/身高2(m))告知客戶是否太瘦或太胖,並不能滿足公司的要求(公司目的要客戶購買塑身課程)。請您修改 Ex4-4.java 系統,使其能告知客戶太胖時,應該減重多少公斤;或太瘦時應該增胖多少公斤,才合乎健康美麗的身材(客戶身高大多無法改變)。期望操作介面如下:
太胖的結果如下:
==
歡迎使用
BMI
評估系統(18
~ 24) ==
請輸入客戶身高(公分)
=>170
請輸入客戶體重(公斤)
=>80
客戶
BMI
值
= 27.6817
您身材太胖了,
需要減重
10.64
公斤
==
系統結束,
歡迎再次光臨
==
太瘦的結果如下:
==
歡迎使用
BMI
評估系統(18
~ 24) ==
請輸入客戶身高(公分)
=>170
請輸入客戶體重(公斤)
=>50
客戶
BMI
值
= 17.3010
您身材太瘦了,
需要增胖
2.02
公斤
==
系統結束,
歡迎再次光臨
==
標準身材的結果如下:
==
歡迎使用
BMI
評估系統(18
~ 24) ==
請輸入客戶身高(公尺)
=>170
請輸入客戶體重(公斤)
=>60
客戶
BMI
值
= 20.7612
恭喜您有一個健美體材
==
系統結束,
歡迎再次光臨
== |
(B)製作技巧提示:
客戶太胖或太瘦應該增重或減重的計算公式如下:
(1) 太胖(BMI > 24):減重量 = 原體重 – 24*身高*身高;
(2) 太瘦(BMI < 18):增重量= 18*身高*身高 – 原體重;
程式重點提示如下:(虛擬碼)
if (BMI < 18){
增重量 = 18*身高*身高 – 原體重;
輸出告知客戶身材太瘦,應增加 %增重量 公斤;
}
else if (BMI > 24) {
減重量 = 原體重 – 24*身高*身高;
輸出告知客戶身材太胖,應減少 %減重量 公斤;
}
else
輸出告知客戶身材健美; |
4-6-4 範例研討:醫療診斷推論系統
(A)系統功能:Ex4_5.java
市面上出現許多醫療診斷系統,使用者輸入身體狀況可大略告知可能邏患哪種疾病。我們建立一個雛型診斷系統,功能如下:
簡單說明一下,如果發燒又咳嗽,又感覺疲倦,則應該是『感冒』症狀。另一條敘述推論是有發燒、沒有咳嗽但有高血壓,而且會感覺口乾,則可能是得『肝病』;其他推論敘述也大多如此。期望操作介面如下:
期望操作介面如下:
狀況一,結果如下:
歡迎使用醫療診斷系統,
請依序回答問題
=====================================
請問您最近是否發燒
(y/n) =>y
請問您最近是否咳嗽
(y/n) =>y
請問您最近是否感覺疲倦
(y/n) =>n
請問您是否血壓升高
(y/n) =>y
請問您最近是否口乾
(y/n) =>y
先生/小姐您可能得肝病
!!!
狀況二,結果如下:
歡迎使用醫療診斷系統,
請依序回答問題
=====================================
請問您最近是否發燒
(y/n) =>y
請問您最近是否咳嗽
(y/n) =>y
請問您最近是否感覺疲倦
(y/n) =>n
請問您是否血壓升高
(y/n) =>n
請問您最近是否盜汗
(y/n) =>y
先生/小姐您可能得肺病
!!! |
(B)製作技巧研討:
一般推論系統裡大多包含了許多規則(Rule),每條規則皆是利用 if/else 敘述句來描述。市面上銷售的推論系統大多允許使用者利用選單方式來填寫規則,再由系統自動產生 if/else 敘述句,並將所有規則整合成一套系統。基本上,推論系統無所謂準確度如何,完全依賴管理者給它的規則來推論,如果規則設定得越完備,則系統推論結果越細膩;否則它的知識有限,就無法做出正確的判斷。本範例僅以簡單的知識來推論,無關正確與否。
(C)程式範例:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 |
// Ex4_5.java
import
java.util.*;
public
class
Ex4_5 {
public
static
void
main(String
args[]){
Scanner
keyin
=
new
Scanner(System.in);
String
key;
System.out.printf("歡迎使用醫療診斷系統,
請依序回答問題
\n");
System.out.printf("=====================================
\n");
System.out.printf("請問您最近是否發燒
(y/n) =>");
key
=
keyin.nextLine();
if
(key.equals("y"))
{
System.out.printf("請問您最近是否咳嗽
(y/n) =>");
key
=
keyin.nextLine();
if
(key.equals("y"))
{
System.out.printf("請問您最近是否感覺疲倦
(y/n) =>");
key
=
keyin.nextLine();
if
(key.equals("y"))
{
System.out.printf("先生/小姐您已經感冒了
!!! \n");
}
else
{
System.out.printf("請問您是否血壓升高
(y/n) =>");
key
=
keyin.nextLine();
if
(key.equals("y"))
{
System.out.printf("請問您最近是否口乾
(y/n) =>");
key
=
keyin.nextLine();
if
(key.equals("y"))
System.out.printf("先生/小姐您可能得肝病
!!! \n");
else
System.out.printf("有可能僅有感冒而已
??? \n");
}
else
{
System.out.printf("請問您最近是否盜汗
(y/n) =>");
key
=
keyin.nextLine();
if
(key.equals("y"))
System.out.printf("先生/小姐您可能得肺病
!!! \n");
else
System.out.printf("需要由其他系統進一步檢查
!!! \n");
}
}
}
else
System.out.printf("有發燒無咳嗽,
請到別科門診
!!!\n");
}
else
System.out.printf("應該是健康身體
\n");
}
} |
(D)程式重點分析:
-
第 8
行:『String key;』。宣告所欲讀入選擇 y 或 n 存放的變數(key)為字串型態。
-
第 12
行:『key = keyin.readLine();』。讀入鍵盤輸入字元,並存入 key 變數內。
-
第 13
行:『if (key.equals("y"))』。判斷 key 變數內容是否與字串『y』相同(equals(“y”))。
4-6-5 自我挑戰:肺結核自我診斷系統
(A)程式功能:PM4_6.java
結核病是受『結核菌感染』而引起,是一種慢性傳染病,不會遺傳;可分為『肺結核』與『肺外結核』兩種。政府除了宣導民眾預防結核病傳染之外,並希望製作一套自我檢查是否感染網站,讓不幸感染民眾能提早治療,自我診斷項目如下:
結核菌感染階段 |
病情現象 |
狀況處理 |
感染期 |
咳嗽現象:積分
1 |
< 3
未受感染
離開系統 |
>= 3
進入感染期
繼續詢問 |
咳痰現象:積分
1 |
疲倦現象:積分
1 |
體重減輕:積分
1 |
發作期 |
胸悶現象:積分
1 |
< 2
僅受感染
盡快就醫 |
>= 2
進入發病期
繼續詢問 |
胸痛現象:積分1 |
呼吸困難現象:積分
1 |
危險期 |
午後發燒現象:積分
1 |
< 2
已發病
儘快就醫 |
>= 2
進入危險期
需隔離就醫 |
夜間盜汗現象:積分
1 |
咳血現象:積分
1 |
如上表所示,民眾進入系統時,依照『結核病感染期』的病情現象(計 4 條),詢問是否有滿足現象,如果超過 3 項,表示已進入『感染期』,則緊接著『發作期』現象詢問;否則告知民眾沒有感染。『發作期』有 3 個詢問項目,如果低於 2 項,則告知儘快就醫;否則(高於 2 項),請民眾繼續進入『危險期』詢問。『危險期』有 3 個選項,超過兩個現象,則須隔離並儘速就醫。期望操作介面如下:
狀況(一),未受感染的結果如下:
歡迎使用肺結核自我診斷系統,
請回答下列問題
=====================================
===
感染期現象詢問
==
您最近是否咳嗽現象
(y/n) =>n
您最近是否咳痰現象
(y/n) =>n
您最近是否疲倦現象
(y/n) =>y
您最近是否體重減輕
(y/n) =>y
恭喜您,
未受感染
狀況(二),感染未發病的結果如下:
歡迎使用肺結核自我診斷系統,
請回答下列問題
=====================================
===
感染期現象詢問
==
您最近是否咳嗽現象
(y/n) =>y
您最近是否咳痰現象
(y/n) =>y
您最近是否疲倦現象
(y/n) =>y
您最近是否體重減輕
(y/n) =>y
===
發病期現象詢問
==
您最近是否胸悶現象
(y/n) =>y
您最近是否胸痛現象
(y/n) =>n
您最近是否呼吸困難現象
(y/n) =>n
您僅受感染未發病,
儘快就醫
狀況(三),已進入危險期的結果如下:
歡迎使用肺結核自我診斷系統,
請回答下列問題
=====================================
===
感染期現象詢問
==
您最近是否咳嗽現象
(y/n) =>y
您最近是否咳痰現象
(y/n) =>y
您最近是否疲倦現象
(y/n) =>y
您最近是否體重減輕
(y/n) =>n
===
發病期現象詢問
==
您最近是否胸悶現象
(y/n) =>y
您最近是否胸痛現象
(y/n) =>y
您最近是否呼吸困難現象
(y/n) =>y
===
危險期現象詢問
==
您最近是否午後發燒現象
(y/n) =>y
您最近是否夜間盜汗現象
(y/n) =>y
您最近是否呼吸咳血現象
(y/n) =>n
您已進入危險期,
必須隔離並儘快就醫 |
(B)製作技巧提示:
利用虛擬碼提示如下:
清除現象累積選擇項目(status
= 0);
詢問及累積計算感染期現象(status
= status +1);
if (status < 3) {
輸出顯示
"恭喜您,
未受感染";
}
else {
清除現象累積選擇項目(status
= 0);
詢問及累積計算發病期現象(status
= status +1);
if(status <2) {
輸出顯示
“您僅受感染未發病,
儘快就醫”;
}
else {
清除現象累積選擇項目(status
= 0);
詢問及累積計算危險期現象(status
= status +1);
if(status <2) {
輸出顯示
“您已進入發作期,
儘快就醫”;
else {
輸出顯示
"您已進入危險期,
必須隔離並儘快就醫";
}
}
} |
狀態現象詢問程式片段提示如下:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22 |
……
/*
危險期現象詢問
*/
System.out.printf("\n===
危險期現象詢問
==\n");
status = 0;
System.out.printf("您最近是否午後發燒現象
(y/n) =>");
key =
keyin.nextLine();
if (key.equals("y"))
status =
status + 1;
System.out.printf("您最近是否夜間盜汗現象
(y/n) =>");
key =
keyin.nextLine();
if (key.equals("y"))
status
= status + 1;
System.out.printf("您最近是否呼吸咳血現象
(y/n) =>");
key =
keyin.nextLine();
if (key.equals("y"))
status
= status + 1;
if (status <
2)
System.out.printf("您已進入發作期,
儘快就醫\n");
else
System.out.printf("您已進入危險期,
必須隔離並儘快就醫\n");
…… |
|
翻轉工作室:粘添壽
Java 程式設計(一) 含程式邏輯
翻轉電子書系列:
|