---
# System prepended metadata

title: APCS 觀念題 - 陣列
tags: [APCS]

---

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