APCS 2021/01/09 - B卷
===
###### tags: `2021 觀念題` `筆試題目`
```c=
void swap( int a, int b ) {
printf("%d, %d", a, b) ;
__________
b = a - b ;
a = a - b ;
printf("%d, %d", a, b) ;
}
```
01. 以上程式碼如何達成交換2個變數的功能?
+ [A] a = a - b
+ [B] a = a + b
+ [C] b = a - b
+ [D] b = a + b
---
```c=
int f(int n){
if (n > 17 )
n += 5 ;
while ( n >= 23 )
n -= 6 ;
if (n > 17 )
n += 2 ;
return n;
}
```
02. 執行以上程式碼,不可能回傳哪個值?
+ [A] 23
+ [B] 21
+ [C] 19
+ [D] 17
---
```c=
int a = 0 ;
for ( int i = 1 ; i <= n ; i = i + 1 )
for ( int j = 1 ; j <= n ; j = 2 * j )
for ( int k = i ; k <= n ; k = k + 1 )
a += 1 ;
```
03. 執行以上程式碼後的 a 的值是多少?
+ [A] $\frac{n(n+1)(n+2)}{3}$
+ [B] $\frac{n(n+1)(2n+1)}{6}$
+ [C] $\frac{n\lfloor \log_2{n} \rfloor(n+1)}{2}$
+ [D] $\frac{n(\lfloor \log_2{n} \rfloor+1 )(n+1)}{2}$
---
```c=
int num[ 10 ] ;
for( int i = 0 ; i < 10 ; i = i + 1 )
scanf( “%d”, &num[ ( i + 6 ) % 10 ] ) ;
```
04. 執行上述程式碼時依序輸入 10, 9, 8, ..., 1 ,請問陣列內的數字為何?
+ [A] { 6, 5, 4, 3, 2, 1, 10, 9, 8, 7 }
+ [B] { 5, 6, 7, 8, 9, 10, 1, 2, 3, 4 }
+ [C] { 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 }
+ [D] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 10 }
---
```c=
int a = 7, b = 3 ;
float w = a / 2 / b * 1.0 ;
float x = a / b / 2.0 ;
float y = a / 2 / b ;
float z = 1.0 * a / 2 / b ;
```
05. 以下選項敘述何者正確?
+ [A] $\lvert w-x \rvert > 0.5$
+ [B] $\lvert x-z \rvert \leq 0.0$
+ [C] $\lvert y-z \rvert \leq 0.5$
+ [D] $\lvert x+y \rvert \leq 0.5$
---
```c=
int Q[30] ;
int count = 0 ;
int front = 0 ;
int back = 0 ;
for ( int i = 1; i <= 15; i = i + 1 )
{
Q[ back ] = i ;
back = back + 1 ;
}
while ( front < back-1 )
{
int v = Q[ front ] ;
front = front + 1 ;
count = count + 1 ;
if ( count == 3 )
{
count = 0 ;
Q[ back ] = v ;
back = back + 1 ;
}
}
printf("%d", Q[front] ) ;
```
06. 以下選項敘述何者正確?
+ [A] 6
+ [B] 9
+ [C] 12
+ [D] 15
---
```c=
int a[10] = { 10, 9, 7, 2, 3, 4, 5, 6, 1, 8 } ;
int b[10] = { 2, 1, 3, 4, 5, 6, 7, 2, 4, 5 } ;
for (int i = 0 ; i < 10 ; i = i + 1 ) {
a[ b[i] - 1 ] = b[ a[i] ] + 1 ;
}
printf("%d", a[7]);
```
07. 以下選項敘述何者正確?
+ [A] 輸出 2
+ [B] 輸出 6
+ [C] a[ ] 的索引值錯誤
+ [D] b[ ] 的索引值錯誤
---
```c=
int f(int n){
int A[1000] = { } ;
for ( int i = 1 ; i != n ; i = i + 2 ) {
A[i] = 1;
}
}
```
08. 當 n 設定為多少時迴圈才能停下來?
+ [A] 1000
+ [B] 999
+ [C] 0
+ [D] -1
---
```c=
int sum( int n ) {
if (__________) {
return __________ ;
}
return n + sum( n - 1 ) ;
}
```
09. 停止條件應該如何設定才能計算出 1 + 2 + 3 + ... + n ?
+ [A] $n\leq 1 , n$
+ [B] $n\leq 0 , n$
+ [C] $n\leq-1 , n+1$
+ [D] 以上條件都可以
---
```c=
int a[21] = { } ;
for ( int i = 3 ; i <= 20 ; i = i + 1 )
{
for ( int j = i * i ; j <= 20 ; j = j + i )
{
a[ j ] = 1 ;
}
}
int k = 0 ;
for ( int i = 0 ; i <= 20 ; i = i + 1 )
{
k = k + a[ i ] ;
}
```
10. 執行完上述程式碼後,k的值應該符合下列哪個選項
+ [A] $1 \leq k \leq 5$
+ [B] $6 \leq k \leq 10$
+ [C] $11 \leq k \leq 15$
+ [D] $16 \leq k \leq 20$
---
```c=
typedef struct student_info
{
int math, chinese, english ;
} std[20] ;
int main ()
{
int n = 20 ;
int best_ID = 0 ;
int best_sum = std[0].math + std[0].chinese + std[0].english ;
for ( int i = 1 ; i < n ; i = i + 1 )
{
int sum = std[i].math + std[i].chinese + std[i].english ;
if ( sum > best_sum )
{
best_ID = i ;
best_sum = sum ;
}
else if ( ___________ )
{
best_ID = i ;
}
}
}
```
11. 為了找到 n 位學生的成績當中成績最好的,先比總分高的,若總分相同時則比照數學成績,數學成績相同時則依照學號較小的為主,下列的判斷式應該如何選擇才能保證達成條件?
+ [A] sum >= best_sum && std[ i ].math >= std[ best_ID ].math
+ [B] sum >= best_sum && std[ i ].math > std[ best_ID ].math
+ [C] sum > best_sum && std[ i ].math > std[ best_ID ].math
+ [D] sum > best_sum && std[ i ].math >= std[ best_ID ].math
---
```c=
int f()
{
int a[8] = { 8, 7, 6, 5, 1, 2, 3, 4 } ;
for (int i = 7 ; 0 < i ; i = i - 1 )
{
for (int j = 0 ; j < i ; j = j + 1)
{
if ( a[j+1] >= a[j] )
{
int temp = a[j+1] ;
a[j+1] = a[j] ;
a[j] = temp ;
}
}
}
}
```
12. 輸出 a[ ] 執行完後的數字?
+ [A] = { 8, 7, 6, 5, 1, 2, 3, 4 }
+ [B] = { 8, 7, 6, 5, 4, 3, 2, 1 }
+ [C] = { 1, 2, 3, 4, 5, 6, 7, 8 }
+ [D] = { 5, 6, 7, 8, 1, 2, 3, 4 }
---
```c=
int f ( int n )
{
if ( n >= 101 )
{
return n - 10 ;
}
return f( f( n + 11 ) ) ;
}
```
13. 上述程式碼執行 f(5) 和 f(99) 之後的值各是多少?
+ [A] f(5) = 91, f(99) = 91
+ [B] f(5) = 94, f(99) = 91
+ [C] f(5) = 91, f(99) = 99
+ [D] f(5) = 94, f(99) = 99
---
```c=
int i = 5 ;
int main()
{
while ( i )
{
i = i - 1 ;
main() ;
printf( "%d ", i ) ;
}
return 0 ;
}
```
14. 上述程式碼執行後會輸出的結果?
+ [A] 0 0 0 0 0
+ [B] 1 2 3 4 5
+ [C] 5 4 3 2 1
+ [D] 4 3 2 1 0