觀念題

以 C 語言命題

出題方式:

程式運行追蹤
for (int i = 0; i < 16; i++)
    i = i * 2

i = i * 2 執行幾次 ?

  1. 2

  2. 3

  3. 5

  4. 6

程式填空
int a, b;
int p[] = ____;
a = b = p[0]; 
for (int i = 0; i < 10; i++) {
    if (p[i] > a) {
        b = a;
        a = p[i];
    } else if (p[i] > b) {
        b = p[i];
    }
}
printf("%d\n", b);

_ _ _ _ 填入哪個輸入會錯 ?

  1. {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}

  2. {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

  3. {5, 4, 7, 6, 1, 3, 2, 9, 0, 8}

  4. {0, 8, 7, 6, 5, 4, 3, 2, 1, 9}

程式除錯
int sum(int n) {
    if (n == 1)
        return 1;
    return n * (n - 1) + sum(n - 1);
}

int main() {
    sum(10);
}

想要計算 1 * 2 + 2 * 3 + 3 * 4 + … + 9 * 10 如何除錯?

  1. 第 2 行要改成 return 0

  2. 第 3 行要改成 return (n - 1) * n + sum(n - 1);

  3. 第 1 行要改成 if (n == 2)

出題內容:

資料型態
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

w, x, y, z 哪個不同?

  1. w

  2. x

  3. y

  4. z

視域
int a = 30;
void b() {
    int a = 20;
}
int main() {
    int a = 10;
    b();
    printf ("%d ", a);
}

printf ("%d", a) 輸出什麼?

  1. 30

  2. 10

  3. 20

if-else
int f(char s[], int n) {
    char t[1000];
    int j = 0;
    for (int i = 0; i < n; i++, j += 2) {
        if (s[i] == '0') {
            t[j] = 'w';
            t[j + 1] = 'a';
        } else if ( __A__ || __B__ ){
            t[j] = 't';
            t[j + 1] = 'e';
        } else if (s[i] == '3' || s[i] == '5') {
            t[j] = 'd';
            t[j + 1] = 'o';
        } else if (s[i] == '4' || s[i] == '6') {
            t[j] = 'p';
            t[j + 1] = 'u';
        } else {
            t[j] = ' ';
            j = j - 1;
        }
    }
    t[j] = '\0';
    printf("%s ", t);
}
int main() {
    char s[] = "0328675";
    f(s, 8);
}

輸出結果為 "wadote putedo __A__ __B__ 分別是什麼?

  1. 0 7

  2. 2 7

  3. 3 6

  4. 8 5

switch
int main(){
    char c = 'a';
    switch(c){
        case 'a':
            printf("a");
        case 'b':
            printf("b");
        case 'c':
            printf("c");
        default:
            printf("d");
    }
}

輸出什麼?

  1. a

  2. d

  3. abc

  4. abcd

for
for (int i = 0; i < 8; i++) {
  for (int j = 0; ____; j++)
      printf("%d ", (i + j) % 2);
  printf("\n");
}

結果:

1
0 1
1 0 1
0 1 0 1
1 0 1 0 1
0 1 0 1 0 1
1 0 1 0 1 0 1

____ 應該要填入 ?

  1. j <= i

  2. j < i

  3. j >= i

  4. j > i

while
int f(int n) {
    if (n > 10)
        n = n + 5;
    while (n < 12)
        n = n + 1;
    if (n == 14)
        n = 5;
    return n;
}

詢問 f(n) 不可能會回傳什麼數值

  1. 15

  2. 16

  3. 17

  4. 18

陣列
int a[3][3] = {};
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i == j)
            a[i][j] = i + j;
        else
            a[i][j] = 0;
    }
}
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++)
        printf("%d ", a[j][i]);
    printf("\n");
}

輸出結果 ?

  1. 0 0 0 0 2 0 0 0 4

  2. 0 1 2 3 0 0 0 0 4

  3. 1 0 0 0 2 0 0 0 4

ASCII
void f(char *s) {
    char mp[] = "IEFGHDJKLMNOPCRSTUVWXYZABQ";

    int len = strlen(s);
    for (int i = 0; i < len; i++) {
        int c = s[i] - 'A';
        printf("%c", mp[c]);
    }
}

輸出結果為 FIHVIU ,請問 s 應該是什麼?

  1. CAERAQ

  2. AEIURQ

  3. FHIJRA

  4. BCAQAD

指標
int f(int *a, int *b);
int g(int *a, int *b);

int main(){
    int a = 2, b = 5;
    int x = f(&a, &b);
    printf("%d %d %d", x, a, b);
}
int f(int *a, int *b){
    int c = 10;
    *a = *a + *b / 5; 
    int p = g(b, a) % 2;
    if (p % 2 == 0){
        return *b - p;
    } else {
        return *b + p;
    }
}
int g(int *a, int *b){
    return (*a - *b) * 5 + 2;
}

輸出 ?

  1. 5 3 5

  2. 10 2 5

  3. 3 5 5

巨集
#define add(a, b) a + b

int main() {
    printf("%d\n", add(3, 5) * add(3, 5));
}

輸出結果 ?

  1. 8

  2. 64

  3. 23

  4. 0

遞迴
int p(int n, int k) {
    if (k == 0)
        return 1;
    else if (k == 1)
        return n;
    else
        return n * p(n - 1, k - 1);
}

p(5,4) = ?

  1. 50

  2. 18

  3. 20

  4. 120

數學
int x = 0;
for (int i = 1; i <= 8; i++)
    for (int j = 1; j <= i; j++)
        for (int k = 1; k <= j; k++)
            x += 1;
printf("%d", x)

輸出 ?

  1. 88

  2. 60

  3. 120

  4. 240

資料結構
int level = 1;
for (int i=0; i<6; i++){
    if (empty()){
        push(level);
        level = level + 1;
    } else if (rand() % 2 == 0){ 
        printf("%d ", top());
        pop();
        level = level - 1;
    } else {
        push(level);
        level = level + 1;
    }
}
while (!empty()){
    printf("%d ", top());
    pop();
}

找出不可能的輸出結果

  1. 1 2 3 4 5 6

  2. 1 2 3

  3. 1 2 5

  4. 2 3 4

演算法
void f(int x) {
    int a[] = {0, 2, 15, 20, 25, 30}, i = 0, j = 6;
    do {
        int m = (i + j) / 2;
        if (a[m] == x)
            break;
        if (a[m] < x)
            i = m;
        else
            j = m;
    } while (i + 1 < j);
}

問 func(3), func(15), func(4) int m = (i + j) / 2 執行了幾次 ?

  1. 7

  2. 9

  3. 10

  4. 12

複雜度
// 程式1
double f(int n) {  // O(n)
    double acc = 1, ret = 0;
    for (int i = 1; i <= n; i++) {
        acc = acc * i;
        ret += 1 / acc;
    }
    return ret;
}
// 程式2
double q(int n) { // O(n)
    double ret = 1;
    for (int i = 1; i <= n; i++)
        ret = ret * i;
    return ret;
}
double g(int n) { // O(n2)
    double ret = 0;;
    for (int i = 1; i <= n; i++) {
        ret += q(i); // O(n)
    }
    return ret;
}

哪個跑得快

  1. f()

  2. g()

其他

"3*5/6+2-1",它的後序運算式 ?

Last updated

Was this helpful?