#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....)
沒有留言:
張貼留言