第 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]);
        }
    }
}

查看原文 >>
相关文章