Java 程式設計()  第三章 二維陣列      下一頁

 

第三章  二維陣列

3-1 二維陣列

內容:

  • 3-1-1 二維陣列結構

  • 3-1-2 二維陣列宣告

  • 3-1-3 範例研討:印出二維陣列內容

  • 3-1-4 範例研討:將二維陣列內容加倍

  • 3-1-5 自我挑戰:印出最高與最低成績者

  • 3-1-6 自我挑戰:成績查詢系統

3-1-1 二維陣列結構

既然陣列是由若干個相同資料型態的變數整合而成,變數的排列格式也延伸了不同的陣列格式。如果所有變數排列成一行或一列,則稱之為『一維陣列』(如 array[]);如果排列成平面形狀,則稱為『二維陣列』(如 array[][];如果是立體形狀,則為『三維陣列』(如 array[][][]);如是四度空間型態,則是『四維陣列』(如 array[][][][]),其中每一維都需要一個變數作為指標,索引其相對位置。各種陣列型態都有其運用範圍,如沒有特殊情況的話,還是一維與二維陣列的應用最普遍,本書僅介紹到二維陣列,更多維數陣列的處理方式,也大致相同的。

將變數排列成『縱橫』的平面形狀,則稱之為『二維陣列』。二維陣列需要兩個位置指標,如 score[x][y] 變數,前面指標(如 x)是標示第幾行數(由 0 開始); 第二個指標(如 y),則標示第幾列數;如是 4 * 3 陣列共計有 12 個相同型態(int)變數的元素。另外,陣列被宣告完成之後(如 int score[][] = { ..})。以 score[][] 陣列為例,java 利用 score.length 變數來表該陣列的行數。又 Java 允許陣列中各行的列數目不一定要相同,以 score[x].length 表示該行(x)元素的數目(即是列數目)。陣列內各元素與行列變數的表示方法,如圖 3-1 所示。

  3-1 二維陣列的結構

3-1-2 二維陣列宣告

陣列的宣告方法有兩種,一者先宣告陣列變數名稱與結構,當需要使用時再指定所需空間,其稱之為動態宣告。另一者是宣告時就限定空間並給予出直,稱之為靜態宣告。語法分別如下:

 

二維陣列宣告語法

       

動態宣告

Data_type Array_name[][];

Array_name = new Data_type[num1][num2];

Data_type[][] name = new Data_type[num1][num2];

int score[];

score = new int[20][10];

int[][] score = new int [20][10];

靜態宣告

Data_type Array_name[] []= { …};

int score[][] = {{1, 2, 3},

{4, 5, 6},

{7, 8, 9},

{10, 11, 12}};

第一行語法是宣告產生二維陣列,第二行則再給予初值。如敘述句如:int [] [] score = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};則產生各個元素與變數內容如下:

score[0][0] = 1, score[0][1]=2, score[0][2]=3  =>score[0].length=3

score[1][0] = 4, score[1][1]=5, score[1][2]=6, score[1][3]=7  =>score[1].length=4

score[2][0] = 8, score[2][1]=9                 =>score[2].length=2

score[3][0] = 10, score[3][1]=11, score[3][2]=12  =>score[3].length=3

score.length = 4

3-1-3 範例研討:印出二維陣列內容

A)程式功能:Ex3_1.java

請編寫一程式,印出陣列 score [][] = {{1, 2, 3}, {4, 5, 6},{7, 8, 9}, {10, 11, 12}} 內容並依照相對位置排列(平面形狀)。 期望操作介面如下:

D:\Java2_book\chap3>javac Ex3_1.java

D:\Java2_book\chap3>java Ex3_1

         1       2       3

         4       5       6

         7       8       8

        10      11      12

B)製作技巧研討:

吾人利用 x y 變數作為陣列位置索引,x 是行數指標,y 為列數指標,則任何一元素可由 score[x][y] 表示。如欲平面型態印出陣列內容,則需要二重迴圈敘述,外迴圈標示共計列印幾行(x = 0, 1, …, score.length);內迴圈索引每行的列數(y = 0, 1, 2, …, score[x].length)。

C)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

//Ex3_1.java

 

public class Ex3_1 {

    public static void main(String args[]) {

        int score[][]={{1, 2, 3},

                   {4, 5, 6},

                   {7, 8, 8},

                   {10, 11, 12}};

        int x;                    // 行指標 (外迴圈)

        int y;                    // 列指標 (內迴圈)

        for(x=0; x<score.length; x++) {

             for(y=0; y<score[x].length; y++)

                 System.out.printf("\t%2d", score[x][y]);

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

        }

    }

}

(D) 程式重點說明:

  • (1) 5~8 int score[][] = { …};。宣告二維陣列並給予初值。

  • (2) 11~15 for(x=0; x<score.length; x++) {…}。外迴圈指定列印行數,其中 score.length 表示該陣列的行數。

  • (3) 12~13 for(y=0; y<score[x].length; y++){…}。內迴圈指定每行的列的數目,其中 score[x].length 表示該行(x)列的數目。

  • (4) 13 System.out.printf("\t%2d", score[x][y]);。列印 score[x][y] 元素的內容,列印格式是開始先跳一個『Tab』(\t)定格,再以兩個位置的格式列印整數(%2d)。

  • (5) 14 System.out.printf(“\n”);。每行列印完成之後,跳至下一行。

3-1-4 範例研討:將二維陣列內容加倍

A)程式功能:Ex3_2.java

請編寫一程式,請修改 Ex3_1 範例,將陣列 score [][] = {{1, 2, 3}, {4, 5, 6},{7, 8, 9}, {10, 11, 12}} 內容加 3 倍,再依照相對位置排列(平面形狀)。 期望操作介面如下:

D:\Java2_book\chap3>java Ex3_2

原陣列內容:

         1       2       3

         4       5       6

         7       8       8

        10      11      12

加倍後陣列內容:

         2       4       6

         8      10      12

        14      16      16

        20      22      24

B)製作技巧提示:

我們建構一個比較容易擴充的程式,將 score[][] 宣告成類別變數,使其允許類別內所有方法使用,又將列印陣列的功能製作成一個獨立的 disp_arr() 方法,程式架構如圖 3-2 所示。

3-2 Ex3-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

//Ex3_2.java

public class Ex3_2 {

  /*宣告類別變數 score[] */

  static int score[][]={{1, 2, 3},

                        {4, 5, 6},

                        {7, 8, 8},

                        {10, 11, 12}};

  /* 主程式 main() */

  public static void main(String args[]) {

      System.out.printf("原陣列內容:\n");                  

      disp_Arr();

      for(int x=0; x<score.length; x++) {         // 行指標 (外迴圈)

           for(int y=0; y<score[x].length; y++)   // 列指標 (內迴圈)

               score[x][y] = score[x][y] * 2;

      }

      System.out.printf("加倍後陣列內容:\n");

      disp_Arr();

  }

 

  /* 列印陣列方法 disp_arr()  */

  static void disp_Arr() {

      for(int x=0; x<score.length; x++) {

           for(int y=0; y<score[x].length; y++)

               System.out.printf("\t%2d", score[x][y]);

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

      }

  }

}

3-1-5 自我挑戰:印出最高與最低成績者

A)程式功能:PM3_1.java

數學老師利用一個二維陣列儲存某一班級學生的成績,score[][] = {{411101, 70}, {411102, 80}, {411103, 75}, {411104, 90}, {411105, 85}, {4111106, 65}, {411107, 83}, {411108, 78}}。請編寫一程式列印出該班成績最高與最低分數與姓名,期望操作介面如下:

D:\Java2_book\chap3>javac PM3_1.java

D:\Java2_book\chap3>java PM3_1

最高者 411104 成績= 90

最低者 411106 成績= 65

B)製作技巧提示:

二維陣列(score[][])的每行(score[i], i =0, 1, 2 .., 7)紀錄一筆學生資料,第 0 列(score[i][0])儲存學號、第 1 列(score[i][1])儲存數學成績。吾人可利用兩只一維陣列(max[] min[])儲存最高成績與最低成績,其中第 0 列(如max[0])儲存學號、第 1 列(如max[1])存放成績。圖 3-# 為搜尋運作程序,起先將最高成績的陣列設定為 0max = {0, 0});最低成績設定成超過成績界線(min = {0, 999}),再依序比較每位學生成績,如果高於 max,則該紀錄複製到 max 陣列內;如果低於 min,則複製到 min 上。如此由第 0 筆到最後一筆搜尋之後,max   min 陣列分別得到最高與最低成績的紀錄。虛擬碼提示如下:

3-3 最高與最低成績搜尋

01

02

03

04

05

06

07

08

09

10

宣告成績儲存陣列並給初值(int score[][]= {{411101, 70}, …});

宣告最高成績陣列(int max[] = {0, 0});

宣告最低成績陣列(int min[] = {0, 9999});

搜尋最高與最低成績者:

        for(int i=0; i<score.length; i++) {

             if(score[i][1] > max[1])

                  max = score[i];

             if(score[i][1] < min[1])

                  min = score[i];

        }

3-1-6 自我挑戰:成績查詢系統

A)程式功能:PM3_2.java

數學老師利用一個二維陣列儲存某一班級學生的成績,score[][] = {{411101, 70}, {411102, 80}, {411103, 75}, {411104, 90}, {411105, 85}, {4111106, 65}, {411107, 83}, {411108, 78}}。請編寫程式可允許輸入學生學號,並輸出該學生的數學成績,期望操作介面如下:

D:\Java2_book\chap3>java PM3_2

== 成績查詢系統 ==

請輸入學生學號 =>4111120

沒有學號 = 4111120 的資料

D:\Java2_book\chap3>java PM3_2

== 成績查詢系統 ==

請輸入學生學號 =>411103

學號 = 411103, 成績= 75

B)製作技巧提示:

利用輸入學號作為查詢關鍵,由陣列的起頭到結尾依序比較第 0 個欄位(score[i][0], i=0, 1, 2, …, score.length-1),如果相同則印出第 1 個欄位的內容(score[i][1],成績欄位);虛擬碼提示如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

宣告輸入物件(Scanner);

宣告成績儲存陣列並給初值(int score[][]= {{411101, 70}, …});

宣告旗號並給予初值(int flag=0);

讀入查詢學號(num);

搜尋查詢成績:

        for(int i=0; i<score.length; i++) {

             if(score[i][0] == num){

                輸出顯示學號與成績;

                flag = 1;

             }

         }

         if(flag ==0)

            輸出顯示沒有資料;

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: