第 7 章  陣列

一、學習評量

1.(c) 有關陣列的敘述, 下列何者錯誤?

(c)  陣列的元素可以存放不同型別的資料

 

2.(c) 以下程式片段何者有錯?

(c)  int[] i = {10,20,30}

 

3.( b.c ) 以下程式片段何者有錯?

(b)  int[3] a = {1,2,3};

(c)  int[] a = new int[];

 

4.( d ) 以下何者正確?

(d) int[][][] a = new [2][][];

 

5.(b) 請問以下程式執行後, 會顯示何者:

01 public class Ex07_05 {

02   public static void main(String[] argv) {

03     int[] a = {5,6,7,8};

04     int[] b = {1,2,3,4};

05

06     System.out.println(b[(a=b)[2]]);

07   }

08 }

(b) 4

 

6.   請說明以下程式何處錯誤?

(第8行必須使用new運算子)

01  public class Ex07_06 {

02    public static void main(String[] argv) {

03      int[] a = {5,6,7,8};

04

05      for(int i : a)

06        System.out.println(i);

07

08      a = {1,2,3,4};

09

10      for(int i : a)

11        System.out.println(i);

12    }

13  }

 

7.(d) 關於以下程式,何者錯誤?

int[][] a = new int[3][2];

(d) a[3] 所指的陣列擁有 2 個元素

 

8.(a.d ) 以下程式執行後,何者錯誤?

01 public class Ex07_08 {

02   public static void main(String[] argv) {

03     int[] a = {5,6,7,8};

04     int[] b = {1,2,3,4};

05     int[] c;

06

07     c = a;

08     a = b;

09     b = c;

10   }

11 }

(a)    a[3] 為 8

(d)   c[3] 為 4

 

9.   請將以下程式改正:

(將第7行的a[i]改成i)

01 public class Ex07_09 {

02   public static void main(String[] argv) {

03     int[] a = {5,6,7,8};

04

05     int i;

06     for(i : a) {

07       System.out.println(a[i]);

08     }

09   }

10 }

 

10.(  ) 以下何者為真?

(d) 以上皆非

 

二、程式練習

1.請依據表 7-2 的費率, 修改 ParkFeeIf.java 以及 ParkFeeArray.java 程式, 計算修改後的停車費。

public class Pgm0701a {
    public static void main(String[] argv) {
        int hours = 0;
        int fee = 0;

        // 轉換為 int
        hours = java.lang.Integer.parseInt(argv[0]);

        if(hours > 7) { // 先計算超過7小時的部分
            fee += (hours - 7) * 100;
            hours = 7;
        }

        if(hours > 3) { // 計算3~7小時的時段
            fee += (hours - 3) * 60;
            hours = 3;
        }

        if(hours > 0) { // 計算3小時內的時段
            fee += (hours - 0) * 30;
            hours = 0;
        }

        System.out.println("停車時數:" + argv[0] + "小時");
        System.out.println("應繳費用:" + fee + "元整");
    }
}

 

public class Pgm0701b {

    public static void main(String[] argv) {
        int[] hourTable = {0,3,7,}; // 時段
        int[] feeTable = {30,60,100}; // 時段費率
        int hours = 0; //停車時數
        int fee = 0; //停車費用

        // 轉換為 int
        hours = java.lang.Integer.parseInt(argv[0]);

        int i = hourTable.length - 1;
        while(i > 0) {// 先找出最高費率區段
            if(hourTable[i] < hours)
                break;
            i--;
        }

        while(i >= 0) { // 由最高費率區段往下累加
            fee += (hours - hourTable[i]) * feeTable[i];
            hours = hourTable[i];
            i--;
        }

        System.out.println("停車時數:" + argv[0] + "小時");
        System.out.println("應繳費用:" + fee + "元整");
    }
}

 

2. 修改本章 7-6-5 範例 PlayDice.java, 將程式改成計算擲 3 個骰子時, 各種點數出現的機率。

import java.io.*;

public class Pgm0702 {
  public static void main(String[] argv) {
    int[] data = new int[19]; // 儲存擲骰點數出現次數
    int base=0;
    for(int i=1;i<=6;i++)     // 3 個迴圈分別代表 3 個骰子
      for(int j=1;j<=6;j++)   // i+j+k 就是擲出的點數
        for(int k=1;k<=6;k++) {
          data[i+j+k]++;        // 將代表次數的元素加 1
          base++;               // 累加次數
        }

    for(int point=0;point<data.length;point++)
      if(data[point]>0)
        System.out.println("擲出"+ point + "點的機率為" +
                           base+ "分之" + data[point]);
  }  
}

 

3.   請嘗試修改 BubbleSort.java, 將陣列內的資料排成由大到小的順序。

public class Pgm0703 {

    public static void main(String[] argv) {
        int[] data = {23,54,33,5,7,46,99,35}; // 為排序的資料
        int temp; // 用來交換元素的暫存變數

        for(int i = 0;i < data.length - 1;i++) {
            // 共需進行元素個數-1輪
            for(int j = 0;j < data.length - 1 - i;j++ ) {
                // 第i輪比對到倒數第i+1個元素
                if(data[j] < data[j + 1]) {
                    temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                }
            }

            for(int k:data) {
                System.out.print(" " + k);
            }
            System.out.println("");
        }
    }
}

 

4.   請撰寫程式, 將陣列的內容反轉, 舉例來說, 如果陣列的內容如下:

30,20,10,5,34

您的程式必須將陣列內容改為:

34,5,10,20,30

 

public class Pgm0704 {
    public static void main(String[] argv) {
        int[] a = {30,20,10,5,34,44};

        System.out.println("原始陣列內容:");
        for(int i : a)
            System.out.print(i + " ");

        int temp;
        for(int i = 0;i < a.length / 2;i++) {
            temp = a[i];
            a[i] = a[a.length - i - 1];
            a[a.length - i - 1] = temp;
        }
        
        System.out.println("\n反轉之後內容:");
        for(int i : a)
            System.out.print(i + " ");
    }
}

 

5.   請撰寫一個程式, 宣告一個 1 維的整數陣列, 並計算元素中所有元素的立方和。

public class Pgm0705 {
    public static void main(String[] argv) {
        int[] a = {30,20,10,5,34,44};

        System.out.println("原始陣列內容:");
        for(int i : a)
            System.out.print(i + " ");

        int result = 0;
        for(int i : a)
            result += i * i * i;        
        
        System.out.println("\n全部元素立方和:" + result);
    }
}

 

6.   請撰寫一個程式, 宣告 2 個陣列變數 a b, 分別指向擁有同樣個數元素的陣列, 並且將 a 中元素依據 b 中對應位置的元素值調換位置。舉例來說, 如果 a b 的內容如下:

陣列 a 20,30,40,50

陣列 b 1,3,0,2

您的程式必須將陣列 a 的內容更改為:

40,20,50,30

public class Pgm0706 {
    public static void main(String[] argv) {
        int[] a = {20,30,40,50};
        int[] b = {1,3,0,2};
        int[] temp = new int[a.length]; // 暫存資料用的陣列

        System.out.println("原始陣列內容:");
        for(int i : a)
            System.out.print(i + " ");
        System.out.println("\n位置陣列內容:");
        for(int i : b)
            System.out.print(i + " ");
        
        for(int i = 0;i < a.length;i++) // 使用暫存陣列調換資料
            temp[b[i]] = a[i];

        for(int i = 0;i < a.length;i++) // 將資料放回原陣列
            a[i] = temp[i];

        System.out.println("\n處理後陣列內容:");
        for(int i : a)
            System.out.print(i + " ");
    }
}

 

7. 請撰寫程式, 利用篩選法找出 1 ~ 100 之間的質數。所謂的篩選法是這樣的, 如果要找出 1 ~ n 之間的質數, 步驟如下:

(1) 宣告一個有 n + 1 個元素的 Boolean 陣列。

(2) 將每個元素的值都設為 true

(3) 2 的倍數為索引碼, 將索引碼所指的元素設為 false;再以3的倍數為索引碼, 重複同樣的動作, 依此類推, 一直到 n 為止。

(4)  陣列中元素值為 true 的索引碼就是質數。

public class Pgm0707 {
    public static void main(String[] argv) {
        int max = 100; // 找1..max之間的質數
        boolean[] seive = new boolean[max + 1];
        
        for(int i = 1;i < seive.length;i++)
            seive[i] = true;
            
        for(int i = 2;i < max;i++)
            for(int j = 2;i * j <= max;j++)
                seive[i * j] = false;
                
        System.out.println("1.." + max + "之間的質數如下:");
        for(int i = 2;i < seive.length;i++)
            if(seive[i])
                System.out.print(i + " ");
        
    }
}

8.請撰寫一個程式, 透過命令行參數傳入任意個數的數值, 將這些數值排序後顯示出來。

public class Pgm0708 {

    public static void main(String[] argv) {
        int[] data = new int[argv.length]; // 依據命令列參數個數配置
        
        for(int i = 0;i < argv.length;i++)
            data[i] = Integer.parseInt(argv[i]); // 將命令列參數轉換成整數放入陣列
            
        int temp; // 用來交換元素的暫存變數

        for(int i = 0;i < data.length - 1;i++) {
            // 共需進行元素個數-1輪
            for(int j = 0;j < data.length - 1 - i;j++ ) {
                // 第i輪比對到倒數第i+1個元素
                if(data[j] < data[j + 1]) {
                    temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                }
            }

            for(int k:data) {
                System.out.print(" " + k);
            }
            System.out.println("");
        }
    }
}

9.請修改ParkFeeArray.java, 改用一個 2 維陣列來計算停車費。

public class Pgm0709 {

    public static void main(String[] argv) {
        int[][] hourFeeTable = {{0,2,4,6}, // 時段
                                                        {30,50,80,100}}; // 時段費率
        int hours = 0; //停車時數
        int fee = 0; //停車費用

        // 轉換為 int
        hours = java.lang.Integer.parseInt(argv[0]);

        int i = hourFeeTable[0].length - 1;
        while(i > 0) {// 先找出最高費率區段
            if(hourFeeTable[0][i] < hours)
                break;
            i--;
        }

        while(i >= 0) { // 由最高費率區段往下累加
            fee += (hours - hourFeeTable[0][i]) * hourFeeTable[1][i];
            hours = hourFeeTable[0][i];
            i--;
        }

        System.out.println("停車時數:" + argv[0] + "小時");
        System.out.println("應繳費用:" + fee + "元整");
    }
}

10. 請撰寫一個程式, 找出陣列中是否有某個元素的索引碼與元素值相等。

public class Pgm0710 {

    public static void main(String[] argv) {
        int[] data = new int[argv.length]; // 依據命令列參數個數配置
        
        for(int i = 0;i < argv.length;i++)
            data[i] = Integer.parseInt(argv[i]); // 將命令列參數轉換成整數放入陣列
            
        for(int i = 0;i < data.length;i++) {
            if(i == data[i])
                System.out.println("索引碼:" + i + "的元素值為"  + data[i]);
        }
    }
}

arrow
arrow

    Lineage 發表在 痞客邦 留言(0) 人氣()