Java 程式設計(一)  第 四章 順序與分歧流程  上一頁    下一頁

 

4-6 多重 if/else 選擇分歧

內容:

  • 4-6-1 多重 if/else 敘述流程

  • 4-6-2 範例研討:測量身材 BMI 系統

  • 4-6-3 自我挑戰:計算雕塑身材質量

  • 4-6-4 範例研討:醫療診斷推論系統

  • 4-6-5 自我挑戰:肺結核自我診斷系統

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/身高2m)),正常值為 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)製作技巧研討:

我們利用虛擬碼來設計該程式的製作技巧,如下:

宣告輸入物件;

宣告相關變數;

讀入客戶身高與體重(tollweight);

計算客戶 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/身高2m)告知客戶是否太瘦或太胖,並不能滿足公司的要求(公司目的要客戶購買塑身課程)。請您修改 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 程式設計(一) 含程式邏輯

 

 

翻轉電子書系列: