Skip to content

觀念題

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