# APCS 觀念題 - 陣列 ###### tags: `APCS` ## 第 1 題 給定下方程式片段,哪個 `n` 值不會造成超過陣列 `A` 的存取範圍? ```c int i, n, A[100]; scanf("%d", &n); for (i = 0; i != n; i = i + 1) { A[i] = i; i = i + 1; } ``` (A) 69 (B) 89 \(C\) 98 (D) 202 <!-- C --> ## 第 2 題 給定下方程式,當程式執行完後,輸出結果為何? ```c int A[8] = {8, 7, 6, 5, 4, 3, 2, 1}; int main() { int i, j; for (i = 0; i < 8; i = i + 1) { for (j = i; j < 7; j = j + 1) { if (A[j] > A[j + 1]) { A[j] = A[j] + A[j + 1]; A[j + 1] = A[j] - A[j + 1]; A[j] = A[j] - A[j + 1]; } } } for (i = 0; i < 8; i = i + 1) { printf("%d ", A[i]); } } ``` (A) 1 2 3 4 5 6 7 8 (B) 7 5 3 1 2 4 6 8 \(C\) 7 5 3 2 1 4 8 6 (D) 8 7 6 5 4 3 2 1 <!-- A --> ## 第 3 題 給定下方程式,當程式執行完後,輸出結果為何? ```c int main() { int a[5] = {9, 4, 3, 5, 3}; int b[10] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; int c = 0; for (int i = 0; i < 5; i = i + 1) c = c + b[a[i]]; printf("%d", c); return 0; } ``` (A) 1 (B) 2 \(C\) 3 (D) 4 <!-- D --> ## 第 4 題 給定下方程式片段,當程式執行完後,輸出結果為何? ```c int Q[200]; int i, val = 0; int count = 0; int head = 0, tail = 0; for (i = 1; i <= 30; i = i + 1) { Q[tail] = i; tail = tail + 1; } while (tail > head + 1) { val = Q[head]; head = head + 1; count = count + 1; if (count == 3) { count = 0; Q[tail] = val; tail = tail + 1; } } printf("%d", Q[head]); ``` (A) 9 (B) 18 \(C\) 27 (D) 30 <!-- A --> ## 第 5 題 經過運算後,下方程式的輸出為何? ```c for (i = 1; i <= 100; i = i + 1) { b[i] = i; } a[0] = 0; for (i = 1; i <= 100; i = i + 1) { a[i] = b[i] + a[i - 1]; } printf("%d\n", a[50] - a[30]); ``` (A) 1275 (B) 20 \(C\) 1000 (D) 810 <!-- D --> ## 第 6 題 請問下方程式輸出為何? ```c int A[5], B[5], i, c; // ... for (i = 1; i <= 4; i = i + 1) { A[i] = 2 + i * 4; B[i] = i * 5; } c = 0; for (i = 1; i <= 4; i = i + 1) { if (B[i] > A[i]) { c = c + (B[i] % A[i]); } else { c = 1; } } printf("%d\n", c); ``` (A) 1 (B) 4 \(C\) 3 (D) 33 <!-- B --> ## 第 7 題 定義 `a[n]` 為一陣列 (array),陣列元素的索引值為 0 至 n - 1。若要將陣列中 `a[0]` 的元素移到 `a[n - 1]`,下方程式片段空白處該填入何運算式? ```c int i, hold, n; // ... for (i = 0; i <= ; i = i + 1) { hold = a[i]; a[i] = a[i + 1]; a[i + 1] = hold; } ``` (A) `n + 1` (B) `n` \(C\) `n - 1` (D) `n - 2` <!-- D --> ## 第 8 題 右側程式碼執行後輸出結果為何? ```c int a[9] = {1, 3, 5, 7, 9, 8, 6, 4, 2}; int n = 9, tmp; for (int i = 0; i < n; i = i + 1) { tmp = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = tmp; } for (int i = 0; i <= n / 2; i = i + 1) printf("%d %d ", a[i], a[n - i - 1]); ``` (A) 2 4 6 8 9 7 5 3 1 9 (B) 1 3 5 7 9 2 4 6 8 9 \(C\) 1 2 3 4 5 6 7 8 9 9 (D) 2 4 6 8 5 1 3 7 9 9 <!-- C --> ## 第 9 題 右側程式片段執行後, `count` 的值為何? ```c int maze[5][5] = { {1, 1, 1, 1, 1}, {1, 0, 1, 0, 1}, {1, 1, 0, 0, 1}, {1, 0, 0, 1, 1}, {1, 1, 1, 1, 1} }; int count = 0; for (int i = 1; i <= 3; i = i + 1){ for (int j = 1; j <= 3; j = j + 1) { int dir[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} }; for (int d = 0; d < 4; d = d + 1) { if (maze[i + dir[d][0]][j + dir[d][1]] == 1) { count = count + 1; } } } } ``` (A) 36 (B) 20 \(C\) 12 (D) 3 <!-- B --> ## 第 10 題 若 `A` 是一個可儲存 `n` 筆整數的陣列,且資料儲存於 `A[0]` ~ `A[n - 1]`。經過下方程式碼運算後,以下何者敘述不一定正確? ```c int A[n] = { ... }; int p = q = A[0]; for (int i = 1; i < n; i = i + 1) { if (A[i] > p) p = A[i]; if (A[i] < q) q = A[i]; } ``` (A) `p` 是 `A` 陣列資料中的最大值 (B) `q` 是 `A` 陣列資料中的最小值 \(C\) `q < p` (D) `A[0] <= p` <!-- C --> ## 第 11 題 若 `A[][]` 是一個 M x N 的整數陣列,下方程式片段用以計算 `A` 陣列每一列的總和,以下敘述何者正確? ```c void main() { int rowsum = 0; for (int i = 0; i < M; i = i + 1) { for (int j = 0; j < N; j = j + 1) { rowsum = rowsum + A[i][j]; } printf("The sum of row %d is %d.\n", i, rowsum); } } ``` (A) 第一列總和是正確,但其他列總和不一定正確 (B) 程式片段在執行時會產生錯誤 (run-time error) \(C\) 程式片段中有語法上的錯誤 (D) 程式片段會完成執行並正確印出每一列的總和 <!-- A --> ## 第 12 題 下方程式擬找出陣列 `A[]` 中的最大值和最小值。不過,這段程式碼有誤,請問 `A[]` 初始值如何設定就可以測出程式有誤? ```c int main() { int M = -1, N = 101, s = 3; int A[] = ___(?)___; for (int i = 0; i < s; i = i + 1) { if (A[i] > M) { M = A[i]; } else if (A[i] < N) { N = A[i]; } } printf("M = %d, N = %d\n", M, N); return 0; } ``` (A) `{90, 80, 100}` (B) `{80, 90, 100}` \(C\) `{100, 90, 80}` (D) `{90, 100, 80}` <!-- B --> ## 第 13 題 下方程式片段執行過程的輸出為何? ```c int i, sum, arr[10]; for (int i = 0; i < 10; i = i + 1) arr[i] = i; sum = 0; for (int i = 1; i < 9; i = i + 1) sum = sum - arr[i - 1] + arr[i] + arr[i + 1]; printf("%d", sum); ``` (A) 44 (B) 52 \(C\) 54 (D) 63 <!-- B --> ---- ## 解答 |1|2|3|4|5| |-|-|-|-|-| |C|A|D|A|D| |6|7|8|9|10| |-|-|-|-|-| |B|D|C|B|C| |11|12|13|14|15| |-|-|-|-|-| |A|B|B|-|-| [<< APCS 觀念題 - 迴圈](https://hackmd.io/@kaeteyaruyo/APCS-concept-loop) | [目錄](https://hackmd.io/@kaeteyaruyo/APCS-concept-index) | [APCS 觀念題 - 函式與變數作用域 >>](https://hackmd.io/@kaeteyaruyo/APCS-concept-function)