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