1. 右 側 程 式 正 確 的 輸 出 應 該 如 下 : * *** ***** ******* ********* 在 不 修 改 右 側 程 式 之 第 4 行 及 第 7 行 程 式 碼 的 前 提 下, 最 少 需 修 改 幾 行 程 式 碼 以 得 到 正 確 輸 出? (A) 1 (B) 2 (C) 3 (D) 4 1 int k = 4; 2 int m = 1; 3 for (int i=1; i<=5; i=i+1) { 4 for (int j=1; j<=k; j=j+1) { 5 printf (" "); 6 7 for (int j=1; j<=m; j=j+1) { 8 printf ("*"); 9 10 printf ("\n"); 11 k = k 1; 12 m = m + 1; 13 2. 給 定 一 陣 列 a[10]={ 1, 3, 9, 2, 5, 8, 4, 9, 6, 7,i.e., a[0]=1,a[1]=3,, a[8]=6, a[9]=7, 以 f(a, 10) 呼 叫 執 行 右 側 函 式 後, 回 傳 值 為 何? (A) 1 (B) 2 (C) 7 (D) 9 int f (int a[], int n) { int index = 0; for (int i=1; i<=n-1; i=i+1) { if (a[i] >= a[index]) { index = i; return index; 1
3. 給 定 一 整 數 陣 列 a[0] a[1] a[99] 且 a[k]=3k+1, 以 value=100 呼 叫 以 下 兩 函 式, 假 設 函 式 f1 及 f2 之 while 迴 圈 主 體 分 別 執 行 n1 與 n2 次 (i.e, 計 算 if 敘 述 執 行 次 數, 不 包 含 else if 敘 述 ), 請 問 n1 與 n2 之 值 為 何? 註 : (low + high)/2 只 取 整 數 部 分 int f1(int a[], int value) { int r_value = -1; int i = 0; while (i < 100) { if (a[i] == value) { r_value = i; break; i = i + 1; return r_value; int f2(int a[], int value) { int r_value = -1; int low = 0, high = 99; int mid; while (low <= high) { mid = (low + high)/2; if (a[mid] == value) { r_value = mid; break; else if (a[mid] < value) { low = mid + 1; high = mid - 1; return r_value; (A) n1=33, n2=4 (B) n1=33, n2=5 (C) n1=34, n2=4 (D) n1=34, n2=5 4. 經 過 運 算 後, 右 側 程 式 的 輸 出 為 何? (A) 1275 (B) 20 (C) 1000 (D) 810 for (i=1; i<=100; i=i+1) { b[i] = i; a[0] = 0; for (i=1; i<=100; i=i+1) { a[i] = b[i] + a[i-1]; printf ("%d\n", a[50]-a[30]); 2
5. 函 數 f 定 義 如 下, 如 果 呼 叫 f(1000), 指 令 sum=sum+i 被 執 行 的 次 數 最 接 近 下 列 何 者? (A) 1000 (B) 3000 (C) 5000 (D) 10000 int f (int n) { int sum=0; if (n<2) { return 0; for (int i=1; i<=n; i=i+1) { sum = sum + i; sum = sum + f(2*n/3); return sum; 6. List 是 一 個 陣 列, 裡 面 的 元 素 是 element, 它 的 定 義 如 右 List 中 的 每 一 個 element 利 用 next 這 個 整 數 變 數 來 記 錄 下 一 個 element 在 陣 列 中 的 位 置, 如 果 沒 有 下 一 個 element, next 就 會 記 錄 -1 所 有 的 element 串 成 了 一 個 串 列 (linked list) 例 如 在 list 中 有 三 筆 資 料 1 2 3 data = a data = b data = c next = 2 next = -1 next = 1 struct element { char data; int next; void RemoveNextElement (element list[], int current) { if (list[current].next!= -1) { /* 移 除 current 的 下 一 個 element*/ 它 所 代 表 的 串 列 如 下 圖 c a b RemoveNextElement 是 一 個 程 序, 用 來 移 除 串 列 中 current 所 指 向 的 下 一 個 元 素, 但 是 必 須 保 持 原 始 串 列 的 順 序 例 如, 若 current 為 3 ( 對 應 到 list[3]), 呼 叫 完 RemoveNextElement 後, 串 列 應 為 c b 請 問 在 空 格 中 應 該 填 入 的 程 式 碼 為 何? (A) list[current].next = current ; (B) list[current].next = list[list[current].next].next ; (C) current = list[list[current].next].next ; (D) list[list[current].next].next = list[current].next ; 3
7. 請 問 以 a(13,15) 呼 叫 右 側 a() 函 式, 函 式 執 行 完 後 其 回 傳 值 為 何? (A) 90 (B) 103 (C) 93 (D) 60 int a(int n, int m) { if (n < 10) { if (m < 10) { return n + m ; return a(n, m-2) + m ; return a(n-1, m) + n ; 8. 一 個 費 式 數 列 定 義 第 一 個 數 為 0 第 二 個 數 為 1 之 後 的 每 個 數 都 等 於 前 兩 個 數 相 加, 如 下 所 示 : 0 1 1 2 3 5 8 13 21 34 55 89 右 列 的 程 式 用 以 計 算 第 N 個 (N 2) 費 式 數 列 的 數 值, 請 問 (a) 與 (b) 兩 個 空 格 的 敘 述 (statement) 應 該 為 何? (A) (a) f[i]=f[i-1]+f[i-2] (B) (a) a = a + b (C) (a) b = a + b (D) (a) f[i]=f[i-1]+f[i-2] (b) f[n] (b) a (b) b (b) f[i] int a=0; int b=1; int i, temp, N; for (i=2; i<=n; i=i+1) { temp = b; (a) ; a = temp; printf ("%d\n", (b) ); 4
9. 請 問 右 側 程 式 輸 出 為 何? (A) 1 (B) 4 (C) 3 (D) 33 int A[5], B[5], i, c; for (i=1; i<=4; i=i+1) { A[i] = 2 + i*4; B[i] = i*5; c = 0; for (i=1; i<=4; i=i+1) { if (B[i] > A[i]) { c = c + (B[i] % A[i]); c = 1; printf ("%d\n", c); 10. 給 定 右 側 g() 函 式,g(13) 回 傳 值 為 何? (A) 16 (B) 18 (C) 19 (D) 22 int g(int a) { if (a > 1) { return g(a - 2) + 3; return a; 11. 定 義 a[n] 為 一 陣 列 (array), 陣 列 元 素 的 指 標 為 0 至 n-1 若 要 將 陣 列 中 a[0] 的 元 素 移 到 a[n-1], 右 側 程 式 片 段 空 白 處 該 填 入 何 運 算 式? (A) n+1 (B) n (C) n-1 (D) n-2 int i, hold, n; for (i=0; i<= ; i=i+1) { hold = a[i]; a[i] = a[i+1]; a[i+1] = hold; 5
12. 給 定 右 側 函 式 f1() 及 f2() f1(1) 運 算 過 程 中, 以 下 敘 述 何 者 為 錯? (A) 印 出 的 數 字 最 大 的 是 4 (B) f1 一 共 被 呼 叫 二 次 (C) f2 一 共 被 呼 叫 三 次 (D) 數 字 2 被 印 出 兩 次 void f1 (int m) { if (m > 3) { printf ("%d\n", m); return; printf ("%d\n", m); f2(m+2); printf ("%d\n", m); void f2 (int n) { if (n > 3) { printf ("%d\n", n); return; printf ("%d\n", n); f1(n-1); printf ("%d\n", n); 13. 右 側 程 式 片 段 擬 以 輾 轉 除 法 求 i 與 j 的 最 大 公 因 數 請 問 while 迴 圈 內 容 何 者 正 確? (A) k = i % j; i = j; j = k; (B) i = j; j = k; k = i % j; (C) i = j; j = i % k; k = i; (D) k = i; i = j; j = i % k; i = 76; j = 48; while ((i % j)!= 0) { printf ("%d\n", j); 6
14. 右 側 程 式 輸 出 為 何? (A) bar: 6 bar: 1 bar: 8 (B) bar: 6 foo: 1 bar: 3 (C) bar: 1 foo: 1 bar: 8 (D) bar: 6 foo: 1 foo: 3 void foo (int i) { if (i <= 5) { printf ("foo: %d\n", i); bar(i - 10); void bar (int i) { if (i <= 10) { printf ("bar: %d\n", i); foo(i - 5); void main() { foo(15106); bar(3091); foo(6693); 15. 若 以 f(22) 呼 叫 右 側 f() 函 式, 總 共 會 印 出 多 少 數 字? (A) 16 (B) 22 (C) 11 (D) 15 void f(int n) { printf ("%d\n", n); while (n!= 1) { if ((n%2)==1) { n = 3*n + 1; n = n / 2; printf ("%d\n", n); 7
16. 右 側 程 式 執 行 過 後 所 輸 出 數 值 為 何? (A) 11 (B) 13 (C) 15 (D) 16 void main () { int count = 10; if (count > 0) { count = 11; if (count > 10) { count = 12; if (count % 3 == 4) { count = 1; count = 0; else if (count > 11) { count = 13; count = 14; if (count) { count = 15; count = 16; printf ("%d\n", count); 8
17. 右 側 程 式 片 段 主 要 功 能 為 : 輸 入 六 個 整 數, 檢 測 並 印 出 最 後 一 個 數 字 是 否 為 六 個 數 字 中 最 小 的 值 然 而, 這 個 程 式 是 錯 誤 的 請 問 以 下 哪 一 組 測 試 資 料 可 以 測 試 出 程 式 有 誤? (A) 11 12 13 14 15 3 (B) 11 12 13 14 25 20 (C) 23 15 18 20 11 12 (D) 18 17 19 24 15 16 #define TRUE 1 #define FALSE 0 int d[6], val, allbig; for (int i=1; i<=5; i=i+1) { scanf ("%d", &d[i]); scanf ("%d", &val); allbig = TRUE; for (int i=1; i<=5; i=i+1) { if (d[i] > val) { allbig = TRUE; allbig = FALSE; if (allbig == TRUE) { printf ("%d is the smallest.\n", val); printf ("%d is not the smallest.\n", val); 18. 程 式 編 譯 器 可 以 發 現 下 列 哪 種 錯 誤? (A) 語 法 錯 誤 (B) 語 意 錯 誤 (C) 邏 輯 錯 誤 (D) 以 上 皆 是 19. 大 部 分 程 式 語 言 都 是 以 列 為 主 的 方 式 儲 存 陣 列 在 一 個 8x4 的 陣 列 (array) A 裡, 若 每 個 元 素 需 要 兩 單 位 的 記 憶 體 大 小, 且 若 A[0][0] 的 記 憶 體 位 址 為 108 ( 十 進 制 表 示 ), 則 A[1][2] 的 記 憶 體 位 址 為 何? (A) 120 (B) 124 (C) 128 (D) 以 上 皆 非 9
20. 右 側 為 一 個 計 算 n 階 層 的 函 式, 請 問 該 如 何 修 改 才 會 得 到 正 確 的 結 果? 1. int fun (int n) { 2. int fac = 1; 3. if (n >= 0) { 4. fac = n * fun(n - 1); 5. 6. return fac; 7. (A) 第 2 行, 改 為 int fac = n; (B) 第 3 行, 改 為 if (n > 0) { (C) 第 4 行, 改 為 fac = n * fun(n+1); (D) 第 4 行, 改 為 fac = fac * fun(n-1); 21. 右 側 程 式 碼, 執 行 時 的 輸 出 為 何? (A) 0 2 4 6 8 10 (B) 0 1 2 3 4 5 6 7 8 9 10 (C) 0 1 3 5 7 9 (D) 0 1 3 5 7 9 11 void main() { for (int i=0; i<=10; i=i+1) { printf ("%d ", i); i = i + 1; printf ("\n"); 22. 右 側 f() 函 式 執 行 後 所 回 傳 的 值 為 何? (A) 1023 (B) 1024 (C) 2047 (D) 2048 int f() { int p = 2; while (p < 2000) { p = 2 * p; return p; 10
23. 右 側 f() 函 式 (a), (b), (c) 處 需 分 別 填 入 哪 些 數 字, 方 能 使 得 f(4) 輸 出 2468 的 結 果? (A) 1, 2, 1 (B) 0, 1, 2 (C) 0, 2, 1 (D) 1, 1, 1 int f(int n) { int p = 0; int i = n; while (i >= (a) ) { p = 10 (b) * i; printf ("%d", p); i = i - (c) ; 24. 右 側 g(4) 函 式 呼 叫 執 行 後, 回 傳 值 為 何? (A) 6 (B) 11 (C) 13 (D) 14 int f (int n) { if (n > 3) { return 1; else if (n == 2) { return (3 + f(n+1)); return (1 + f(n+1)); int g(int n) { int j = 0; for (int i=1; i<=n-1; i=i+1) { j = j + f(i); return j; 25. 右 側 Mystery() 函 式 else 部 分 運 算 式 應 為 何, 才 能 使 得 Mystery(9) 的 回 傳 值 為 34 (A) x + Mystery(x-1) (B) x * Mystery(x-1) (C) Mystery(x-2) + Mystery(x+2) (D) Mystery(x-2) + Mystery(x-1) int Mystery (int x) { if (x <= 1) { return x; return ; 11