觀念題
APCS C 程式識讀 125 題
PDF:https://drive.google.com/file/d/1VXEr7909VMTzNNOJS0XS1kVRkTxfe9zs/view
線上練習:https://a1u.qzz.io/apcs_read_system/?fbclid=IwY2xjawO_DkpleHRuA2FlbQIxMQBzcnRjBmFwcF9pZAwzNTA2ODU1MzE3MjgAAR5cQmyMJcOYDRnG8JQmmPJp2rweccIvEH5n8JdRCbysYvl_Cle53br_toLOYA_aem_ql14ADmabu6JulJQchlF-w
題目整理(MkDocs 可用 Markdown)
1. 遞迴函式輸出
選項
- A. 229 8
- B. 230 7
- C. 230 8
- D. 228 7
題目:請問以下程式碼輸出為何
#include <bits/stdc++.h>
using namespace std;
int g(int x,int y);
int f(int x,int y);
int t;
int g(int x,int y){
if(x==0 && y==1)t++;
if(x<=0 || y<=0)return 3;
return 5+f(x,y-1);
}
int f(int x,int y){
if(x<=0 || y<=0)return 2;
return g(x-1,y)+2*g(x-2,y-1);
}
int main(){
printf("%d",f(5,5));
printf("\n");
printf("%d",t);
return 0;
}
答案:A
2. 變數作用域與傳值
選項
- A. 10 20 25 50 30 40
- B. 10 20 30 50 30 40
- C. 20 20 25 50 30 40
- D. 10 20 25 40 30 40
題目:請問以下程式碼輸出為何
#include<bits/stdc++.h>
using namespace std;
int a=10,b=20;
void f(int a,int b){
a+=5;
b*=2;
printf("%d %d\n",a,b);
return;
}
int main(){
printf("%d %d\n",a,b);
a+=10;
b+=5;
f(a,b);
if(a==25){
int a=0,b=100;
a+=10;
b/=2;
printf("%d %d\n",a,b);
}
else{
a=30,b=40;
}
printf("%d %d\n",a,b);
return 0;
}
答案:A
3. 多層迴圈累加
選項
- A. 55
- B. 56
- C. 57
- D. 58
題目:請問以下程式碼輸出為何
#include <bits/stdc++.h>
using namespace std;
int main(){
int sum=0;
for(int i=1;i<=3;i++){
for(int j=i;j<8;j+=2){
for(int k=j/2;k<5;k++){
if(k%j==0){
sum+=k;
}
sum++;
}
}
}
printf("%d",sum);
return 0;
}
答案:D
4. 作用域與條件分支(空白分隔輸出)
選項
- A. 10 20 25 50 50 50 50 100
- B. 10 20 25 50 10 50 30 50
- C. 10 20 25 50 10 50 20 50
- D. 10 20 25 50 40 25 40 50
題目:請問以下程式碼輸出為何
#include<bits/stdc++.h>
using namespace std;
int a=10,b=20;
void f(int a,int b){
a+=5;
b*=2;
printf("%d %d ",a,b);
return;
}
int main(){
printf("%d %d ",a,b);
a+=10;
b+=5;
f(a,b);
if(a!=25){
int a=0,b=100;
a+=10;
b/=2;
printf("%d %d ",a,b);
}
else{
a*=2;
printf("%d %d ",a,b);
}
if(a==10){
a+=20;
printf("%d %d ",a,b);
}
else{
b*=2;
printf("%d %d ",a,b);
}
return 0;
}
答案:C
5. Bubble Sort 交換次數
選項
- A. 14
- B. 15
- C. 16
- D. 17
題目:請問以下程式碼輸出為何
#include <stdio.h>
int t=0;
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < n - i - 1; ++j) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
t++;
}
}
}
}
int main() {
int arr[]={10,3,2,1,4,6,5,9,7,8}, n=10;
bubbleSort(arr, n);
printf("%d",t);
return 0;
}
答案:B
6. switch / case 貫穿(fall-through)
選項
- A. DDDABCBCBCC
- B. ABCABCACAD
- C. BBCDDC
- D. BBDC
題目:請問以下程式碼輸出為何
#include <bits/stdc++.h>
using namespace std;
int main(){
for(int i=0;i<7;i++){
switch(i) {
case 3:
printf("A");
case 5:
case 4:
printf("B");
case 6:
printf("C");
break;
default:
printf("D");
break;
}
}
return 0;
}
答案:A
7. 二分搜尋填空(輸出 5 -1)
選項
- A. A:<,B:m+1,C:m-1
- B. A:<=,B:m+1,C:m-1
- C. A:<,B:m-1,C:m+1
- D. A:<=,B:m-1,C:m+1
題目:A、B、C 分別要填入啥,才能正確執行二分搜尋,並輸出 5 -1
#include <iostream>
using namespace std;
int bi(int v[8], int l, int r, int x) {
while(l ___A___ r) {
int m = (l + r) / 2;
if(v[m] == x) {
return m;
} else if(v[m] < x) {
l = ___B___ ;
} else {
r = ___C___ ;
}
}
return -1;
}
int main() {
int v[] = {1, 3, 4, 7, 8, 10, 12, 15};
printf("%d %d", bi(v, 0, 8, 10), bi(v, 0, 8, 9)); //會輸出 5 -1
return 0;
}
答案:B
8. 哪個數列會讓二分搜尋回傳位置出錯
選項
- A. 1 2 3 4 5
- B. 5 4 3 2 1
- C. 2 2 3 4 4
- D. 2 2 2 2 3
題目:執行下面程式碼之後,當使用二分搜尋演算法尋找哪一個數列中的 3 時,回傳的位置會出錯
#include <iostream>
using namespace std;
int bi(int v[8], int l, int r, int x) {
while(l ___?___ r) {
int m = (l + r) / 2;
if(v[m] == x) {
return m;
} else if(v[m] < x) {
l = ___?___ ;
} else {
r = ___?___ ;
}
}
return -1;
}
int main() {
int a[] = {1, 2, 3, 4, 5};
int b[] = {5, 4, 3, 2, 1};
int c[] = {2, 2, 3, 4, 4};
int d[] = {2, 2, 2, 2, 3};
printf("%d\n", bi(a, 0, 8, 3));
printf("%d\n", bi(b, 0, 8, 3));
printf("%d\n", bi(c, 0, 8, 3));
printf("%d\n", bi(d, 0, 8, 3));
return 0;
}
答案:B
9. if / else 配對(dangling else)
選項
- A. 20 30
- B. 20
- C. 30
- D. 無任何輸出
題目:請問以下程式碼輸出為何
#include <stdio.h>
int main(){
int a=0,b=10,c=20;
if(a==0)
if(b==20)
printf("20");
else
printf("30");
return 0;
}
答案:C
10. 交換 a、b 使輸出 20 10
選項
- A. A:a=b; B:temp=a; C:b=temp;
- B. A:temp=a; B:a=b; C:b=temp;
- C. A:a=b; B:b=temp; C:temp=a;
- D. A:temp=a; B:b=temp; C:a=b;
題目:A、B、C 應該填入何者,能夠讓程式輸出 20 10
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=10,b=20;
int temp;
__A__
__B__
__C__
cout<<a<<" "<<b;
return 0;
}
答案:B
11. deque 的特性
選項
- A. deque 只能從尾端高效率插入/刪除,從頭端通常是 O(n)
- B. deque 只能從頭端高效率插入/刪除,從尾端通常是 O(n)
- C. deque 兩端(頭、尾)都能高效率插入/刪除
- D. deque 頭尾插入/刪除都很慢,通常都需要整段元素搬移(O(n))
題目:deque 的特性是啥
答案:C
12. queue 的特性
選項
- A. queue 只能從尾端插入、從頭端刪除
- B. queue 只能從頭端插入、從尾端刪除
- C. queue 可以從頭尾兩端都插入/刪除
- D. queue 插入與刪除都只能在中間進行,頭尾不允許操作
題目:queue 的特性是啥
答案:A
13. stack 的特性
選項
- A. stack 只能從頂端(top)插入、也只能從頂端(top)刪除
- B. stack 只能從底端(bottom)插入、也只能從底端(bottom)刪除
- C. stack 可以從頂端插入、從底端刪除
- D. stack 可以從底端插入、從頂端刪除
題目:stack 的特性是啥
答案:A
14. \t 是什麼
選項
- A. '\t' 是字串結尾符號,用來標記 C-style 字串結束
- B. '\t' 是換行控制字元,用於換行與行首對齊
- C. '\t' 是水平跳格(tab)字元,通常用來移動到下一個欄位對齊位置
- D. '\t' 會在輸出時自動補上 '\0' 以終止字串,並視情況插入 '\n' 以刷新緩衝區
題目:\t 是啥
答案:C
15. 想不到做法時怎麼做
選項
- A. 用頭撞桌子
- B. 放棄,提早交卷
- C. 試著畫圖畫出流程、列舉所有條件
- D. 亂猜亂試,試圖矇對程式碼,不做任何推理
題目:請問看到題目想不到做法時可以怎麼做
答案:C
16. 找不到 bug 時怎麼辦
選項
- A. 嘗試刪除網站 Cookie 讓 bug 餓死
- B. 亂猜亂試,試圖矇對程式碼,不做任何推理
- C. 把過程全部 cout 出來找錯誤
- D. 在程式開頭加入 // no bugs allowed 註解
題目:找不到 bug 時怎麼辦
答案:C
17. 正確的寫程式習慣
選項
- A. 只求速度,不管排版
- B. 題目範圍 n 最大值給 100,陣列設為 int v[101]={}
- C. 像蓋房子一樣,寫一段程式碼就檢查一次有沒有 bug
- D. 全部一次寫完程式碼,最後一起找 bug
題目:哪一個是正確的寫程式習慣
答案:C