---
# System prepended metadata

title: APCS 觀念題 - 函式與變數作用域
tags: [APCS]

---

# APCS 觀念題 - 函式與變數作用域

###### tags: `APCS`

## 第 1 題

給定下方程式，當程式執行完後，輸出結果為何？

```c
void f(int x, int y)
{
    int tem = x;
    x = y;
    y = tem;
}

int main()
{
    int x = 2, y = 3;
    f(x, y);
    printf("%d", (x - y) * (x + y) / 2);
    return 0;
}
```

(A) 2
(B) 3
\(C\) -2
(D) -3

<!-- C -->

## 第 2 題

給定一陣列 `a[10] = { 1, 3, 9, 2, 5, 8, 4, 9, 6, 7 }`，i.e., `a[0] = 1`, `a[1] = 3`, ..., `a[8] = 6`, `a[9] = 7`，以 `f(a, 10)` 呼叫執行下方函式後，回傳值為何？

```c
int f(int a[], int n)
{
    int index = 0;

    for (int i = 1; i <= n - 1; i = i + 1)
    {
        if (a[i] >= a[index])
        {
            index = i;
        }
    }

    return index;
}
```

(A) 1
(B) 2
\(C\) 7
(D) 9

<!-- C -->

## 第 3 題

下方 `f()` 函式執行後所回傳的值為何？

```c
int f()
{
    int p = 2;
    while (p < 2000)
    {
        p = 2 * p;
    }
    return p;
}
```

(A) 1023
(B) 1024
\(C\) 2047
(D) 2048

<!-- D -->

## 第 4 題

下方 `f()` 函式 `(a)`, `(b)`, `(c)` 處需分別填入哪些數字，方能使得 `f(4)` 輸出 `2468` 的結果？

```c
int f(int n)
{
    int p = 0;
    int i = n;
    while (i >= ___(a)___)
    {
        p = 10 - ___(b)___ * i;
        printf("%d", p);
        i = i - ___(c)___;
    }
}
```

(A) 1, 2, 1
(B) 0, 1, 2
\(C\) 0, 2, 1
(D) 1, 1, 1

<!-- A -->

## 第 5 題

下方 `F()` 函式執行後，輸出為何？

```c
void F()
{
    char t, item[] = {'2', '8', '3', '1', '9'};
    int a, b, c, count = 5;
    for (a = 0; a < count - 1; a = a + 1)
    {
        c = a;
        t = item[a];
        for (b = a + 1; b < count; b = b + 1)
        {
            if (item[b] < t)
            {
                c = b;
                t = item[b];
            }
            if ((a == 2) && (b == 3))
            {
                printf("%c %d\n", t, c);
            }
        }
    }
}
```

(A) 1 2
(B) 1 3
\(C\) 3 2
(D) 3 3

<!-- B -->

## 第 6 題

給定下方程式，其中 `s` 有被宣告為全域變數，請問程式執行後輸出為何？

```c=
int s = 1; // 全域變數

void add(int a)
{
    int s = 6;
    for (; a >= 0; a = a - 1)
    {
        printf("%d,", s);
        s++;
        printf("%d,", s);
    }
}

int main()
{
    printf("%d,", s);
    add(s);
    printf("%d,", s);
    s = 9;
    printf("%d", s);

    return 0;
}
```

(A) 1,6,7,7,8,8,9
(B) 1,6,7,7,8,1,9
\(C\) 1,6,7,8,9,9,9
(D) 1,6,7,7,8,9,9

<!-- B -->

## 第 7 題

給定下方函式 `F()`，已知 `F(7)` 回傳值為 17，且 `F(8)` 回傳值為 25，請問 `if` 的條件判斷式應為何？

```c
int F(int a)
{
   if (___(?)___)
       return a * 2 + 3;
   else
       return a * 3 + 1;
}
```

(A) `a % 2 != 1`
(B) `a * 2 > 16`
\(C\) `a + 3 < 12`
(D) `a * a < 50`

<!-- D -->

## 第 8 題

小藍寫了一段複雜的程式碼想考考你是否了解函式的執行流程。請回答程式最後輸出的數值為何？

```c
int g1 = 30, g2 = 20;

int f1(int v)
{
    int g1 = 10;
    return g1 + v;
}

int f2(int v)
{
    int c = g2;
    v = v + c + g1;
    g1 = 10;
    c = 40;
    return v;
}

int main()
{
    g2 = 0;
    g2 = f1(g2);
    printf("%d", f2(f2(g2)));
    return 0;
}
```

(A) 70
(B) 80
\(C\) 100
(D) 190

<!-- A -->

## 第 9 題

給定下方函式 `F()`，執行 `F()` 時哪一行程式碼可能永遠不會被執行到？

```c
void F(int a)
{
    while (a < 10)
        a = a + 5;
    if (a < 12)
        a = a + 2;
    if (a <= 11)
        a = 5;
}
```

(A) `a = a + 5;`
(B) `a = a + 2;`
\(C\) `a = 5;`
(D) 每一行都執行得到

<!-- C -->

## 第 10 題

給定下方函式 `F()`，`F()` 執行完所回傳的 `x` 值為何？

```c
int F(int n)
{
    int x = 0;
    for (int i = 1; i <= n; i = i + 1)
        for (int j = i; j <= n; j = j + 1)
            for (int k = 1; k <= n; k = k * 2)
                x = x + 1;

    return x;
}
```

(A) $n(n + 1)\sqrt(\lfloor log_2 n \rfloor)$
(B) $n^2(n + 1)/2$
\(C\) $n(n + 1) \lfloor log_2 n + 1 \rfloor / 2$
(D) $n(n + 1) / 2$

<!-- C -->

## 第 11 題

下方 `F()` 函式執行時，若輸入依序為整數 0, 1, 2, 3, 4, 5, 6, 7, 8, 9，請問 `X[]` 陣列的元素值依順序為何？

```c
void F()
{
    int X[10] = {0};
    for (int i = 0; i < 10; i = i + 1)
    {
        scanf("%d", &X[(i + 2) % 10]);
    }
}
```

(A) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
(B) 2, 0, 2, 0, 2, 0, 2, 0, 2, 0
\(C\) 9, 0, 1, 2, 3, 4, 5, 6, 7, 8
(D) 8, 9, 0, 1, 2, 3, 4, 5, 6, 7

<!-- D -->

## 第 12 題

若以 `f(22)` 呼叫下方 `f() `函式，總共會印出多少數字？

```c
void f(int n)
{
    printf("%d\n", n);
    while (n != 1)
    {
        if ((n % 2) == 1)
        {
            n = 3 * n + 1;
        }
        else
        {
            n = n / 2;
        }
        printf("%d\n", n);
    }
}
```

(A) 16
(B) 22
\(C\) 11
(D) 15

<!-- A -->

----

## 解答

|1|2|3|4|5|
|-|-|-|-|-|
|C|C|D|A|B|

|6|7|8|9|10|
|-|-|-|-|-|
|B|D|A|C|C|

|11|12|13|14|15|
|-|-|-|-|-|
|D|A|-|-|-|

[<< APCS 觀念題 - 陣列](https://hackmd.io/@kaeteyaruyo/APCS-concept-array) | [目錄](https://hackmd.io/@kaeteyaruyo/APCS-concept-index) | [APCS 觀念題 - 遞迴 >>](https://hackmd.io/@kaeteyaruyo/APCS-concept-recursion)