Java 程式設計()  第八章 方法與方法庫產生  上一頁    下一頁

 

8-2 專題研討:物件方法

內容:

  • 8-2-1 範例研討:製作時間運算工具

  • 8-2-2 自我挑戰:遊樂場計費工具

8-2-1 範例研討:製作時間運算工具

A)程式功能:Ex8_1.java

許多應用系統需要相關時間計算工具,譬如:兩個時間點之間相差多久(timeInterval())、一個時間點再過後某些時間之後是何時(timeAfter())、以及一個時間點之前的某些時間數,又應該是何時(timeBefore())。時間運算是屬於 60 進位方式,不同於一般 10 進位計算。請製作上述 3 種時間工具,並測試其運算結果,期望操作介面如下:

G:\Examples\chap11\Ex8_1>java Ex8_1

設定目前時間(//) =>9/20/30

 

目前是 9 20 30

請輸入之前時間距離 (//) =>2/30/50

之前是 6 49 40

 

目前是 9 20 30

請輸入之後時間距離 (//) =>1/40/20

之後是 11 0 50

 

目前是 9 20 30

請輸入第二點時間 (//) =>11/40/20

兩點時間相差 2 19 50

B 製作技巧研討:

製作此系統可區分為下列 3 個主題:

(1) 時間物件格式(Time.class):需製作一個時間類別,規劃時間物件的規格;利用此類別所產生的物件變數之間,才可以做運算處理(於 timeTool.java)。

(2) 時間運算工具類別(timeTool.class):此類別內包含所需的時間計算器(或稱方法),再利用它產生(new)物件方法,就可以做運算處理事項。本範例包含下列四個工具(於 timeTool.java):

(a) getTime()輸入時間字串(時//秒),轉換成時間物件格式(時、分、秒)並回傳。

(b) timeAfter()輸入現在時間點與之前時間量,回傳之前的相當時間點(時、分、秒)。

(c) timeBefore()輸入現在時間點與之後時間量,回傳之後的相當時間(時、分、秒)。

(d) timeInterval():輸入兩個時間點(時、分、秒),回傳之間的距離時間量。

(3) 編譯主程式(Ex8_1.class):測試所製作的工具是否可用。

C)程式範例:timeTool.java

吾人利用 timeTool.java 檔案製作 Time timeTool 兩只類別;兩類別的功能如圖 8-2 所示。

8-2 Time timeTool 類別的功能

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

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

//timeTool.java

 

import java.util.*;

 

/* 時間類別, 描述時間物件的規格 */

class Time {            

     int hour;

     int minute;

     int second;

}

 

/* 時間工具類別, 包含 4 個方法 (計算器) */

class timeTool {    

 

    /* 轉換字串成為時間物件格式 */

    Time getTime(String time_S){

        Time time = new Time();

        Scanner s = new Scanner(time_S).useDelimiter("/");

        time.hour = s.nextInt();

        time.minute = s.nextInt();

        time.second = s.nextInt();

        return time;

    }

 

    /* 之前時間計算器 */

    Time timeBefore(Time now, Time value) {

        Time time = new Time();

        time.hour=0; time.minute=0; time.second=0;

        time.second = now.second - value.second;

        if (time.second < 0) {

            time.second = time.second + 60;

            time.minute = 1;

        }

        time.minute = now.minute - value.minute - time.minute;

        if (time.minute < 0) {

            time.minute = time.minute + 60;

            time.hour = 1;

        }

        time.hour = now.hour - value.hour - time.hour;

        if(time.hour < 0)

            time.hour = time.hour + 24;

        return time;

    }

 

    /* 之後時間計算器 */

    Time timeAfter(Time now, Time value) {

        Time time = new Time();

        time.hour=0; time.minute=0; time.second=0;

        time.second = now.second + value.second;

        if (time.second > 60) {

           time.second = 60 - time.second;

           time.minute = 1;

        }

        time.minute = time.minute + now.minute + value.minute;

        if (time.minute > 60) {

           time.minute = 60 - time.minute;

           time.hour = 1;

        }

        time.hour = time.hour + now.hour + value.hour;

        if (time.hour > 24)

           time.hour = time.hour - 24;

        return time;

    }

 

    /* 兩點時間之間距離計算器 */

    Time timeInterval(Time start, Time end) {

        Time time = new Time();

        time.hour=0; time.minute=0; time.second=0;

        time.second = end.second - start.second;

        if (time.second < 0) {

            time.second = time.second + 60;

            time.minute = 1;

        }

        time.minute = end.minute - start.minute - time.minute;

        if (time.minute < 0) {

            time.minute = time.minute + 60;

            time.hour = 1;

        }

        time.hour = end.hour - start.hour - time.hour;

        if(time.hour < 0)

            time.hour = time.hour + 24;

        return time;

    }

}

D)程式範例:Ex8_1.java

完成 Time timeTool 兩類別之後,吾人利用 Ex8_1 範例驗證這兩類別所產生的物件,觀察其功能是否滿足所需。圖 8-3 為兩類別產生物件的情況,利用 Time 類別產生了 now 物件,該物件內具有 now.hournow.minute now.second 3 個變數成員,則利用這些成員記錄時間的時、分與秒。同樣的,timeTool 類別產生 tool 物件後,該物件具有 tool.getTime()... 4 個方法成員,也利用這 4 個方法庫計算時間長短。

8- 3 Time timeTool 類別產生物件

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

//Ex8_1.java

 

/* timeTool.class, Time.class 需儲存於相同目錄下 */

import java.io.*;

import java.util.*;

public class Ex8_1 {

    public static void main(String args[]) throws IOException {

         BufferedReader keyin = new BufferedReader(new

                              InputStreamReader(System.in));

 

         timeTool tool = new timeTool();   // 產生工具, 包含4種方法

         Time now = new Time();         // 儲存目前時間

         Time time_T = new Time();       // 時間暫存變數

         Time time_B = new Time();       // 時間暫存變數

         String time_S;                 // 讀入時間字串

 

         /* 設定目前時間 */

         System.out.printf("設定目前時間(//) =>");

         time_S = keyin.readLine();

         now = tool.getTime(time_S);

 

         /* 測試計算之前時間 */

         System.out.printf("\n目前是 %d %d %d \n",

                                  now.hour, now.minute, now.second);

         System.out.printf("請輸入之前時間距離 (//) =>");

         time_S = keyin.readLine();

         time_T = tool.getTime(time_S);

         time_B = tool.timeBefore(now, time_T);

         System.out.printf("之前是 %d %d %d \n",

                      time_B.hour, time_B.minute, time_B.second);

 

         /* 測試計算之後時間 */

         System.out.printf("\n目前是 %d %d %d \n",

                          now.hour, now.minute, now.second);

         System.out.printf("請輸入之後時間距離 (//) =>");

         time_S = keyin.readLine();

         time_T = tool.getTime(time_S);

         time_B = tool.timeAfter(now, time_T);

         System.out.printf("之後是 %d %d %d \n",

                     time_B.hour, time_B.minute, time_B.second);

 

         /* 測試計算兩時間之間 距離 */

         System.out.printf("\n目前是 %d %d %d \n",

                            now.hour, now.minute, now.second);

         System.out.printf("請輸入第二點時間 (//) =>");

         time_S = keyin.readLine();

         time_T = tool.getTime(time_S);

         time_B = tool.timeInterval(now, time_T);

         System.out.printf("兩點時間相差 %d %d %d \n",

                      time_B.hour, time_B.minute, time_B.second);

     }

}

程式重點說明:

(1) 11 :『timeTool tool = new timeTool();』。利用 timeTool 類別產生物件工具 tool(包含 4 種方法),但 timeTool.class 必須存在於同一目錄下。

(2) 12 :『Time now = new Time();』。利用 Time 類別產生物件變數 now(包含 3 個變數成員),但 Time.class 必須儲存同一目錄下。

(3) 21 :『now = tool.getTime(time_S);』。呼叫 tool 物件下的 getTime() 物件方法,傳回 Time 格式的物件。

(4) 29 :『time_B = tool.timeBefore(now, time_T);』。呼叫 tool 物件下的 timeBefore() 方法。

(5) 40 :『time_B = tool.timeAfter(now, time_T);』。呼叫 tool 物件下的 timeAfter() 方法。

(6) 51 :『time_B = tool.timeInterval(now, time_T);』。呼叫 tool 物件下的 timeInterval() 方法。

如果依照上述技巧製作本系統,編譯後應該具有下列檔案:

G:\Examples\chap11\Ex8_1>dir/b

Time.class

timeTool.java

timeTool.class

Ex8_1.java

Ex8_1.class

8-2-2 自我挑戰:遊樂場計費系統

A)程式功能:PM8_1.java

Karoror 線上遊戲』係採用按上線時間收費方法,遊戲者上線後開始計時,下線後在計算上線時間多寡計費,以每 30 1 元計算。該公司需要一套收費資訊系統,因此在網路公開招標,期望參與投標者需製作一套雛型管理系統,應具有:設定目前時間、顯示上線遊戲者、開始遊戲、結束遊戲等功能;期望操作介面如下:

G:\Examples\chap11\PM8_1>java PM8_1

 

** Keroro 線上遊戲系統  0 0 0 **

(1) 設定目前時間         (2) 顯示上線遊戲者

(3) 開始遊戲, 計費開始   (4) 結束遊戲, 繳費出場

(5) 離開系統

目前線上 0 請輸入工作選項 =>1

請輸入目前時刻(//) =>9/12/30

 

** Keroro 線上遊戲系統  9 12 30 **

(1) 設定目前時間         (2) 顯示上線遊戲者

(3) 開始遊戲, 計費開始   (4) 結束遊戲, 繳費出場

(5) 離開系統

目前線上 0 請輸入工作選項 =>3

參與玩家暱名 (英文) =>tsnien

 

** Keroro 線上遊戲系統  9 12 30 **

(1) 設定目前時間         (2) 顯示上線遊戲者

(3) 開始遊戲, 計費開始   (4) 結束遊戲, 繳費出場

(5) 離開系統

目前線上 1 請輸入工作選項 =>2

姓名            開始時間

tsnien          9 12 30

 

** Keroro 線上遊戲系統  9 12 30 **

(1) 設定目前時間         (2) 顯示上線遊戲者

(3) 開始遊戲, 計費開始   (4) 結束遊戲, 繳費出場

(5) 離開系統

目前線上 1 請輸入工作選項 =>1

請輸入目前時刻(//) =>10/23/30

 

** Keroro 線上遊戲系統  10 23 30 **

(1) 設定目前時間         (2) 顯示上線遊戲者

(3) 開始遊戲, 計費開始   (4) 結束遊戲, 繳費出場

(5) 離開系統

目前線上 1 請輸入工作選項 =>3

…..

B)製作技巧提示:

系統必須提供登錄每位遊戲者上線的起始時間。當某位遊戲者下線時,計算當時時間與他的起始之間的相差值,得到他上線的時間,依此計算出上線費用。吾人可利用 Ex8_1 範例所建立的 timeTooltimeInterval() 方法)物件來計算兩點差距的差距。另外,主程式虛擬碼提示如下:(Time.class timeTool.class 需與主程式存在於相同目錄下)

導入相關套件;

宣告遊戲者類別 class Games{

    String name;                 // 遊戲者匿名

    Time start = new Time();     // 遊戲者上線時間

}

宣告主類別 public class PM8_1 {

    static Time clock;             // 靜態時鐘物件

    static BufferedReader keyin;   // 靜態鍵盤輸入物件

    static timeTool tool;          // 靜態時間工具物件

    static int number;             // 參與遊戲人數

    static Games[] games;          // 紀錄遊戲者資料(嫟名, 入場時間)

宣告主方法 main {

         keyin = new BufferedReader(new InputStreamReader(System.in));

         tool = new timeTool();

         clock = new Time();

         number = 0;               // 紀錄目前上線者 0

         games = new Games[20];    // 儲存遊戲者陣列

 顯示主功能表(get_menu(), select

         while (select != 5) {

             switch(select) {

                  case 1: setClock();        // 設定目前時間

                  case 2: dispGame();       // 顯示目前參與遊戲者

                  case 3: startGame();        // 開始遊戲

                  case 4: stopGame();        // 停止遊戲

        }

         }

    }//主方法結束

    主功能表選單(get_menu());

    設定目前時間(setClock());

    顯示目前參與遊戲者(dispGame());

參與遊戲, 開始計時(startGame());

結束遊戲, 繳費出場(stopGame());

} // 主類別結束

 

翻轉工作室:粘添壽

 

Java 程式設計(二) 含物件導向

 

 

翻轉電子書系列: