Java 程式設計(一)  第 六章 方法與套件引用  上一頁    下一頁

 

6-2 方法宣告與流程

內容:

  • 6-2-1 方法的宣告

  • 6-2-2 範例研討:加法器函數製作

  • 6-2-3 範例研討:比較大小方法製作

  • 6-2-4 範例研討:麻將選擇出牌順序

  • 6-2-5 自我挑戰:擲骰子博弈遊戲

6-2-1 方法的宣告

      在某一程式內,我們大多會將些特殊功能並會重複使用的程式,編寫成一個方法(或稱為函數),讓它可以被重複呼叫使用。另一方面,為了實現方法特殊功能(如,加法器),它被呼叫時允許呼叫者植入相關『引數』(如,加數與被加數);執行完後,也會回覆執行結果(如,兩數的和)。為了達到上述功能,宣告方法的語法如下:

宣告方法(函數)語法:

   

方法屬性 傳回值型態 方法名稱 (引數_1, 引數_1) {

方法實體

……

return 傳回值;

}

static int ADD (int a, int b) {

int c;

c = a + b;

return c;

}

呼叫方法

    

資料型態 變數名稱=方法名稱(引數, ..);

int sum = ADD(3, 5);

相關參數如下:

(1) 方法屬性:可被引用(呼叫)的屬性,常用有下列組合型態:

     (a) public static允許類別外部呼叫的靜態(或稱類別)方法。

      (b) private static僅允許類別內其他方法呼叫的靜態方法。

      (c) static如同 public static 屬性。

(2) 傳回值型態:宣告執行該方法後,得到結果的資料型態,可宣告為一般資料型態(intfloatchar...等)、或某一物件型態(object),如果不回傳任何值,則宣告為 void(空)。

(3) 方法名稱:指定該方法(或函數)名稱,與一般變數名稱相同。

(4) 引數:呼叫該函數時,可以攜帶的引數,可以是變數、或數值。

(5) { ……}函數的程式主體。

(6) return 變數(或敘述句):執行後將變數(或敘述句)內容回傳,該資料型態必須與『傳回值型態』相同。

譬如,『主方法』(或稱主函數)是不需經由產生物件再執行,而可以直接執行的(static 屬性),並允許外部環境呼叫它(public 屬性),執行後也不會傳回任何資料(void 傳回值型態);因此,宣告主方法的相關參數為 public static void main(..)

宣告方法 (函數) 範例:

public static void main(String args[]){

……

……      // “” (void) 傳回值,不需要 return

}

6-2-2 範例研討:加法器函數製作

A)系統功能:Ex6_1.java

請製作一個兩數相加的加法器函數,於主程式會要求輸入兩個整數,再呼叫加法器球兩整數的和,最後印出兩數相加的結果。期望操作介面如下:

請輸入第一個整數 =>35

請輸入第二個整數 =>48

35 + 48 = 83

B)製作技巧研討:

題目要求製作一個加法器(Add()),並將主程式(main())所輸入的兩個整數相加後,顯示其結果。由此可見,主類別中包含兩個函數(或稱方法,method),如圖 6-3 所示。Main 方法利用 sum = Add(value1, value2) 敘述句呼叫 Add 方法,並且攜帶了兩個引數。依照引數的相對應位置,將 value1 內容填入 a 變數內;也將 value2 內容複製到 b 變數內。Add 函數將執行結果 sum,利用 return 敘述句,傳回給 main 方法,並存入 main 方法內的 sum 變數內。另外,main Add 方法內都有 sum 變數,但兩者皆是獨立不相干的『區域變數』。

1

2

3

4

5

static int ADD (int a, int b) {

int c;

c = a + b;

return c;

}

6-3 呼叫加法器函數的運作情形

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

//Ex6_1.java

 

import java.util.*;

/* Ex6_1 類別開始 */

public class Ex6_1 {

     /* main 方法開始 */

     public static void main(String args[]) {

          Scanner keyin = new Scanner(System.in);

          int sum;                            // 區域變數

          int value1, value2;

          System.out.printf("請輸入第一個整數 =>");

          value1 = keyin.nextInt();

          System.out.printf("請輸入第二個整數 =>");

          value2 = keyin.nextInt();

          /* 呼叫 Add() 函數 */

          sum = Add(value1, value2);

          System.out.printf("%d+%d = %d\n", value1, value2, sum);

     } /* main 方法結束 */

 

     /* Add 方法開始 */

     static int Add(int a, int b) {

         int sum;                             // 區域變數

         sum = a + b;

         return sum;

     }  /* Add 方法結束 */

}  /* Ex6_1 類別結束 */

(D) 程式重點說明:

(1) 5~29 public class Ex6_1 { … }。宣告主類別的範圍。

(2) 7~18 public static void main(…) {….}。宣告 main 方法的範圍。

(3) 23~27 static int Add(int a, int b) { …}。宣告 Add 方法的範圍。

(4) 9 int sum;。宣告 main 方法的區域變數 sum

(5)   23 int  sum;。宣告 Add 方法的區域變數 sum

6-2-3 範例研討:比較大小方法製作

(A) 程式功能

請製作一套系統,它允許連續輸入五個數字,再輸出其中最大值與最小值的數值。系統功能如下:(請參考 Ex3_5 範例)

請輸入第 1 整數 =>34

請輸入第 2 整數 =>56

請輸入第 3 整數 =>12

請輸入第 4 整數 =>98

請輸入第 5 整數 =>67

最大數值是 98

最小數值是 12

(B) 製作技巧

吾人嘗試製作兩個比較大小方法,一者 max(a, b) 則傳會兩數較大者,另一者 min(a, b) 則傳回兩數中較小則,程式架構如下:

6-4 Ex6_2 程式架構

(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

//Ex6_2.java

import java.util.*;

public class Ex6_2 {  // Ex6_2 類別開始

     public static void main(String args[]) {

          Scanner keyin = new Scanner(System.in);

          int max=0, min=999;

          int value;

          for(int i=0; i<5; i++){

            System.out.printf("請輸入第 %d 整數 =>", i+1);

            value = keyin.nextInt();

            max = Max(max, value);

           min = Min(min, value);

          }

          System.out.printf("最大數值是 %d\n", max);

          System.out.printf("最小數值是 %d\n", min);  

     } /* main 方法結束 */

 

     static int Max(int a, int b) {  //Max 方法開始

         if (a > b)

         return a;

         else

         return b;

     }  //Max 方法結束

 

     static int Min(int a, int b){  //Min 方法開始

     if(a <b)

              return a;

     else

              return b;

     }//Min 方法結束

} /* Ex6_2 類別結束 */

6-2-4 範例研討:麻將選擇出牌次序

A)程式功能:Ex6_2.java

        麻將桌上常出現需要客戶擲骰子來決定應先順序,每次是擲三個骰子(1 ~ 6),由它們的和計算大小。請製作一個程式,假設有四位牌友(東、西、南、北),分別擲三個骰子,並能選出最大數值。期望操作介面如下:

期望操作介面如下:

D:\Java1_book\chap6>java Ex6_2

東方 擲骰子 ( Enter ) =>

        擲出 => 6   5   2

東方擲的是: 13

南方 擲骰子 ( Enter ) =>

        擲出 => 1   1   5

南方擲的是: 7

西方 擲骰子 ( Enter ) =>

        擲出 => 1   3   4

西方擲的是: 8

北方 擲骰子 ( Enter ) =>

        擲出 => 1   1   1

北方擲的是: 3

擲出最大的是 = 13

B)製作技巧研討:

每位牌友都需要擲 3 個骰子,我們可以將擲骰子動作製作成函數(game());另外,也需製作一只比較大小的函數(max()),如圖 6-3 所示。主程式 main 呼叫 game () 函數時,不需攜帶任何引數,但執行完畢後,會傳回 3 個骰子的總和;呼叫 max() 函數時,需攜帶兩個函數,但會傳回其中較大者。

6-5 Ex6_2 程式架構

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

//Ex6_2.java

 

import java.util.*;

public class Ex6_2 {

     public static void main(String args[]) {

          int maxNum, num1, num2, num3, num4;

          Scanner keyin = new Scanner(System.in);

          System.out.printf(" 東方 擲骰子 ( Enter ) =>");

          keyin.nextLine();     //暫停的功能

          num1 = game();

          System.out.printf("東方擲的是: %d\n", num1);

 

          System.out.printf(" 南方 擲骰子 ( Enter ) =>");

          keyin.nextLine();      //暫停的功能

          num2 = game();

          System.out.printf("南方擲的是: %d\n", num2);

 

          System.out.printf(" 西方 擲骰子 ( Enter ) =>");

          keyin.nextLine();      //暫停的功能

          num3 = game();

          System.out.printf("西方擲的是: %d\n", num3);

 

          System.out.printf(" 北方 擲骰子 ( Enter ) =>");

          keyin.nextLine();        //暫停的功能

          num4 = game();

          System.out.printf("北方擲的是: %d\n", num4);

 

          maxNum = max(num1, max(num2, max(num3, num4)));

          System.out.printf("擲出最大的是 = %d\n", maxNum);

     }

     static int game() {

          Random random = new Random();

          int k, sum = 0, ran;

          System.out.printf("\t擲出 => ");

          for (k=1; k<=3; k++) {

               ran= 1 + random.nextInt(6);

               System.out.printf("%d   ", ran);

               sum = sum + ran;

          }

          System.out.printf("\n");

          return sum;

     }

     static int max(int a, int b) {

          if (a > b)

              return a;

          else

             return b;

     }

}

(D) 程式重點說明

(1) 8 System.out.printf(" 東方 擲骰子 ( Enter ) =>")。顯示要求玩家自行啟動亂數產生。

(2) 9 :『keyin.readLine();。系統執行到此命令時,會暫停等待使用者由鍵盤輸入數值,並按下『Enter』鍵,再讀入所輸入資料。但此程式並沒有要求使用者輸入任何資料,讀入資料也沒有存入任何變數,其表示僅等待使用者敲入『Enter』鍵而已。

(3) 4~50 public Ex6_2 { …}。宣告主類別的範圍。

(4)   5~31 public static void main(..) { …}。宣告主方法的範圍。

(5) 32~43 static int game() { …}。宣告 game() 方法的範圍。

(6) 44~49 static int max(int a, int b) { …}。宣告 max() 方法範圍。

6-2-5 自我挑戰:擲骰子搏奕遊戲

A)系統功能:PM6_1.java

以前夜市常出現擲骰子的搏奕遊戲,方法是參與賭博者依序擲出三個骰子到碗公內,總數最大者贏了此局。請編寫一程式來取代賭具(碗公與骰子),並假設只有四個人參與賭博。程式功能是參與者輸入自己名字,系統立即顯示所擲骰子的總數,最後顯示最高者命名與數值。期望操作介面如下:

G:\Examples\chap6>java PM6_1

請玩家輸入姓名並擲骰子 =>丁一

        您擲出 => 3   1   3   合計: 7

請玩家輸入姓名並擲骰子 =>劉二

        您擲出 => 6   6   2   合計: 14

請玩家輸入姓名並擲骰子 =>張三

        您擲出 => 6   2   3   合計: 11

請玩家輸入姓名並擲骰子 =>李四

        您擲出 => 4   6   1   合計: 11

恭喜!! 劉二 先生擲出 14 贏得此局

B)製作技巧提示:

6-6

吾人可規劃兩個方法(main game)於主類別內(PM6_1)。game 方法處理擲出 3 個骰字的動作,包含分別顯示每只骰子的數字,以及計算總和,並傳回給主方法 main。虛擬碼提示如下:

導入相關套件;

主類別宣告範圍 {     // 主類別開始

主方法 main 宣告範圍 {     // main 方法開始

宣告擲出最大數值者姓名並設定初值(String maxName = “”);

宣告擲出最大數值並設定初值(int maxNum = 0);

For (int i=1; i<=4; i++) {

讀入玩家姓名( name);

呼叫擲骰子函數(number = game());

If (number > maxNum) {

maxNum = number;

maxName = name;

}

}

輸出最大者姓名與數字(maxName, maxNum);

}    // main 方法結束

宣告 game 方法範圍 {  // game 方法開始

宣告產生亂數物件;

產生並顯示 3 1~6 之間亂數;

計算總和並回傳;

} // game 方法結束

} // 主類別結束

翻轉工作室:粘添壽

 

Java 程式設計(一) 含程式邏輯

 

 

翻轉電子書系列: