2.18.2012

C語言測驗 (2)

4. 寫出主程式的輸出為何??
#include <stdio.h>

void f1(int *, int);
void (*p[2])(int *, int);

int main(void)
{
    int a = 0, b = 0;

    p[0] = f1;
    p[1] = f1;
    a = 5;
    b = 10;
    p[0](&a, b);
    printf("%d\t %d\t", a, b);
    p[1](&a, b);
    printf("%d\t %d\t", a, b);

    return 0;
}

void f1(int *p, int q) {

    int tmp = 0;
    tmp = *p;
    *p = q;
    q = tmp;

    return;
}
Answer: 這一題是在測驗C語言中,Call by Value和Call by Reference的觀念;在這一道題目中要注意到:b傳進去的"值"是5,但儲存'b'此一變數的記憶體位址裡的"值"並未被改變,所以b的值永遠不會被改變。結果為:
10        10        10        10        

5. 寫出主程式的輸出為何??
#include <stdio.h>

void foo(int);

int main(void)
{
    int a = 3;
    foo(a);

    return 0;
}

void foo(int n) {

    if (n > 0) {
        foo(--n);
        printf("%d \n", n);
        foo(n--);
    }
    printf("\n");

    return;
}
Answer: 說真的,個人覺得這一題很無聊,居然在測驗遞迴 (Recursive)?? 記得以前學生時代,老師有教過寫程式時,盡量少用遞迴和goto (goto就是會在程式中跳來跳去),因為會增加debug的困難‧遞迴只應天上有,人間應當用迴圈....@@

6. 寫出主程式的輸出為何??
#include <stdio.h>

void foo(int *, int, int);

int main(void)
{
    int i = 0, j = 0, n = 10, b[10] = {4, 7, 1, 5, 15, 12, 9, 6, 3, 8};

    n--;
    for (i = (n - 1) / 2; i >= 0; i--)
        foo(b, i, n);

    for (j = 0; j < 10; j++)
        printf("%d\t", b[j]);

    printf("\n");

    return 0;
}

void foo(int *a, int r, int n) {

    int k = a[r], j = 0;

    for (j = 2 * r + 1; j <= n; j = j * 2 + 1) {
        if ( j < n ) {
            if ( a[j + 1] > a[j] )
                j++;
        }
        if ( k >= a[j] )
            break;
        a[(j - 1) / 2] = a[j];
    }
    a[(j - 1) / 2] = k;

    return;
}
Answer: 這一題更無聊!! 在測驗你的數學邏輯觀念!! 直接把源代碼Copy-Paste到開發環境上執行一次不就可以知道答案了??

相關文章:C語言測驗 (1)

(To be continue....)

沒有留言:

張貼留言