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