# 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)