107年身心障礙人員四等程式設計概要
二、如果 A, B 都是大小為 M×N 的二維陣列,其元素資料型態均為 double,且假設陣列 A 已經有完整的資料。今欲依據 A 求得 B,使得 B[i][j] 成為在陣列 A 中以 A [i][j] 為中心的3×3個數的平均值 (當 B[i][j] 位於邊界時,仍是以 A[i][j] 為中心的3×3個數的平均值,惟超出陣列的部分皆以0取代,即 B[0][0], B[0][N-1], B[M-1][0], B[M-1][N-1] 是2×2個數的平均值;B[0][j], B[M-1][j] 是2×3個數的平均值, 0 < j < N-1;B[i][0], B[i][N-1] 是3×2個數的平均值, 0 < i < M-1)。無論採用 C/C++ 或 Java 撰寫程式,都可以用下列程式片段達成任務。請為每一空白處填入一運算式 (Expression) 完成該程式片段。作答時須完整寫出此程式片段,並於填空處加底線標示,且不能更改此程式片段。(25分) B[0][0] = _____________________________; B[0][N-1] = _____________________________ ; B[M-1][0] = _____________________________; B[M-1][N-1] = _____________________________; for (int j = 1; ___________; j++) { B[0][j] = _____________________________; B[M - 1][j] = _____________________________; } for (int i = 1; ___________ ; i++) { B[i][0] = _____________________________; B[i][N-1] = _____________________________; } for (int i = 1; ___________; i++) for (int j = 1; ___________; j++) B[i][j] = _____________________________; |
答:
#include <iostream> #include <vector> using namespace std; int main( ) { const int M = 3; const int N = 4; double A[M][N] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }; double B[M][N] = {0}; B[0][0] = (A[0][0] + A[0][1] + A[1][0] + A[1][1]) / 4; B[0][N - 1] = (A[0][N - 2] + A[0][N - 1] + A[1][N - 2] + A[1][N - 1]) / 4; B[M - 1][0] = (A[M - 2][0] + A[M - 2][1] + A[M - 1][0] + A[M - 1][1]) / 4; B[M - 1][N - 1] = (A[M - 2][N - 2] + A[M - 2][N - 1] + A[M - 1][N - 2] + A[M - 1][N - 1]) / 4; for (int j = 1; j < N - 1; j++) { B[0][j] = (A[0][j - 1] + A[0][j] + A[0][j + 1] + A[1][j - 1] + A[1][j] + A[1][j + 1]) / 6; B[M - 1][j] = (A[M - 2][j - 1] + A[M - 2][j] + A[M - 2][j + 1] + A[M - 1][j - 1] + A[M - 1][j] + A[M - 1][j + 1]) / 6; } for (int i = 1; i < M - 1; i++) { B[i][0] = (A[i - 1][0] + A[i][0] + A[i + 1][0] + A[i - 1][1] + A[i][1] + A[i + 1][1]) / 6; B[i][N - 1] = (A[i - 1][N - 2] + A[i][N - 2] + A[i + 1][N - 2] + A[i - 1][N - 1] + A[i][N - 1] + A[i + 1][N - 1]) / 6; } for (int i = 1; i < M - 1; i++) { for (int j = 1; j < N - 1; j++) { B[i][j] = (A[i - 1][j - 1] + A[i - 1][j] + A[i - 1][j + 1] + A[i][j - 1] + A[i][j] + A[i][j + 1] + A[i + 1][j - 1] + A[i + 1][j] + A[i + 1][j + 1]) / 9; } } cout << "二維陣列 B:" << endl; for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) cout << B[i][j] << " "; cout << endl; } return 0; } |
執行結果:
二維陣列 B:
3.5 4 5 5.5
5.5 6 7 7.5
7.5 8 9 9.5
說明:
陣列A:
|
0 |
1 |
2 (N-2) |
3 (N-1) |
0 |
1 |
2 |
3 |
4 |
1 (M-2) |
5 |
6 |
7 |
8 |
2 (M-1) |
9 |
10 |
11 |
12 |
1.主要目的是對一個給定的二維陣列 (稱為 A) 進行操作,以生成另一個新的二維陣列 (稱為 B)。新陣列 B 中的每個元素都是根據原陣列 A 中的相應元素計算出來的。
2.計算過程:
(1)對於陣列 A 中的每個元素都會找到包含這個元素和其周圍的元素的一個3×3子陣列。然後,將這個子陣列中所有的元素加起來,再除以這個子陣列中的元素個數,得到一個平均值。將這個平均值儲存在陣列 B 中相對應的位置。
(2)但是,對於陣列 A 中靠近邊緣的元素,不能得到一個完整的3×3子陣列,因為一部分會超出陣列的範圍。在這種情況下,將超出範圍的元素視為0。
(3)最後,會得到一個新的陣列 B,其中每個元素都是原陣列 A 中相應位置的子陣列的平均值。
3.範例:
B[0][0] = (1+2+5+6) / 4 = 14/4 = 3.5。
B[0][1] = (1+2+3+5+6+7) / 6 = 24/6 = 4。
B[0][2] = (2+3+4+6+7+8) / 6 = 30 / 6 = 5。
B[0][3] = (3+4+7+8) / 4 = 22 / 4 = 5.5。
...
B[1][1] = (1+2+3+5+6+7+9+10+11) / 9 = 54/9 = 6。
...