114 年 國立中正大學資訊工程學系碩士班甲組《軟體設計》

📄 試題原卷 免費註冊後即可對照原始考卷 PDF免費註冊

第 1 題5 分

(Select multiple correct answers) Please select all the possible height(s) for an AVL tree of 100 nodes from the following options. Note that the height of a tree with only one node is 1. (Hint: log⁡102≈0.3010\log_{10}2\approx0.3010)

(A) 55
(B) 66
(C) 77
(D) 88
(E) 99
(F) 1010
(G) None of the above.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

AVL 樹中,任一節點的左右子樹高度差至多為 11。題目採用葉節點高度為 11,因此高度為 hh 的 AVL 樹,其最少節點數 N(h)N(h) 滿足:

N(0)=0,N(1)=1N(0)=0,\qquad N(1)=1 N(h)=1+N(h−1)+N(h−2)N(h)=1+N(h-1)+N(h-2)

高度為 hh 的二元樹最多有 2h−12^h-1 個節點。

解題方法

先算出 AVL 樹各高度的最少節點數:

高度 hhN(h)N(h):最少節點數最多節點數 2h−12^h-1
51231
62063
733127
854255
988511
101431023

高度為 55 或 66 的樹最多分別只有 3131、6363 個節點,無法容納 100100 個節點。高度為 1010 的 AVL 樹至少需要 143143 個節點,超過題目給定的 100100 個。

因此只需確認高度 77、88、99 都能容納恰好 100100 個節點。固定高度的 AVL 樹可達成從最少節點數到最多節點數之間的每個整數節點數;以下各高度的子樹配置也能直接構成 100100 個節點:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2 題5 分

(Select multiple correct answers) Please select all the correct statement(s).

(A) A 2-3-4 tree is a B-tree of order 5.
(B) A red-black tree is a binary tree form of a 2-3 tree.
(C) All the external nodes in a B-tree are on the same level.
(D) Any internal node (excluding the root) has at least ⌈m2⌉\lceil\frac{m}{2}\rceil children in a B-tree of order mm.
(E) None of the above.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 2-3-4 樹、紅黑樹與 B-tree 的對應關係,以及 B-tree 的階數與平衡性質。

採用常見定義:階數為 mm 的 B-tree,單一節點最多有 mm 個子節點。因此,除根節點外,每個內部節點至少有 ⌈m/2⌉\lceil m/2\rceil 個子節點;所有外部節點都在同一層。

解題方法

逐項套用定義即可:

  • 先由最大子節點數判斷 2-3-4 樹的階數。
  • 再確認紅黑樹對應的是 2-3 樹還是 2-3-4 樹。
  • 最後檢查 B-tree 的葉節點平衡性與非根內部節點的最小子節點數。

選項分析

(A) 錯誤。
2-3-4 樹的節點最多有 44 個子節點,因此按 B-tree 階數的常見定義,它是階數為 44 的 B-tree,不是階數為 55 的 B-tree。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 3 題5 分

(Choose one best answer) Consider the integer array {52,21,40,33,88,57,46,71}\{52, 21, 40, 33, 88, 57, 46, 71\}. What will the array look like after heapifying it to a Max Heap? Note that we use the bottom-up method that runs in O(n)O(n) time.

(A) {88,71,57,52,21,40,46,33}\{88, 71, 57, 52, 21, 40, 46, 33\}
(B) {88,71,57,52,46,40,33,21}\{88, 71, 57, 52, 46, 40, 33, 21\}
(C) {21,33,40,46,52,57,71,88}\{21, 33, 40, 46, 52, 57, 71, 88\}
(D) {88,71,57,52,33,40,46,21}\{88, 71, 57, 52, 33, 40, 46, 21\}
(E) None of the above.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

Max Heap(最大堆積)是一種完全二元樹,且每個父節點的值都大於或等於其子節點。陣列以層序儲存時,若採 1 起始索引,索引 ii 的左右子節點分別是 2i2i、2i+12i+1。

題目指定使用自底向上的建堆法:從最後一個非葉節點 ⌊n/2⌋\lfloor n/2 \rfloor 開始,依序對每個節點執行向下調整(sift-down),直到根節點。此方法的時間複雜度為 O(n)O(n)。

解題方法

原陣列共有 88 個元素,最後一個非葉節點的索引為 ⌊8/2⌋=4\lfloor 8/2 \rfloor=4。依序調整索引 44 到 11:

  1. 調整索引 44:值為 3333,子節點索引 88 的值為 7171。交換後,陣列為 {52,21,40,71,88,57,46,33}\{52,21,40,71,88,57,46,33\}。
  2. 調整索引 33:值為 4040,子節點為 5757、4646。與較大的子節點 5757 交換,陣列為 {52,21,57,71,88,40,46,33}\{52,21,57,71,88,40,46,33\}。
  3. 調整索引 22:值為 2121,子節點為 7171、8888。與較大的子節點 8888 交換,陣列為 {52,88,57,71,21,40,46,33}\{52,88,57,71,21,40,46,33\}。
  4. 調整索引 11:值為 5252,子節點為 8888、5757。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 4 題5 分

(Choose one best answer) Consider the red-black tree resulting from sequentially inserting the following numbers into an empty red-black tree: 40,60,55,15,20,5,25,3040, 60, 55, 15, 20, 5, 25, 30. What is the sum of the numbers in the red nodes in the red-black tree?

(A) 145145
(B) 125125
(C) 110110
(D) 9090
(E) None of the above.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

紅黑樹插入(CLRS 版本):新節點一律塗紅色;若父節點也是紅色就要修正:

  • 叔叔為紅:父、叔改黑,祖父改紅,再以祖父繼續往上檢查。
  • 叔叔為黑:以旋轉修正。新節點與父節點「同側」做一次旋轉;「異側」先旋轉父節點變成同側,再旋轉祖父;最後新的子樹根塗黑、兩個子節點塗紅。

解題方法(R=紅,B=黑)

  1. 40:根,塗黑。
  2. 60:40 的右子,紅;父為黑,不需修正。
  3. 55:60 的左子(紅),父 60 紅、叔叔(40 的左)為空(黑),異側 → 先對 60 右旋,再對 40 左旋:55B,子節點 40R、60R。
  4. 15:40R 的左子;叔叔 60R 為紅 → 40、60 改黑,55 改紅後因是根再塗黑。樹:55B(40B(15R),60B)。
  5. 20:15R 的右子;叔叔(40 的右)為空,異側 → 對 15 左旋、對 40 右旋:20B 成為 55 的左子,15R、40R 為其子。樹:55B(20B(15R, 40R),60B)。
  6. 5:15R 的左子;叔叔 40R 為紅 → 15、40 改黑,20 改紅;20 的父 55 為黑,結束。樹:55B(20R(15B(5R), 40B),60B)。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 5 題5 分

(Choose one best answer) Consider the integer array {52,21,40,88,33,57,46,71}\{52, 21, 40, 88, 33, 57, 46, 71\}. Using the two-pointer version of quicksort, what will the array look like after moving the first pivot (i.e., 5252) to its correct position? Note that the first and the second pointers start at the positions of 2121 and 7171, respectively.

(A) {21,40,33,46,52,71,57,88}\{21, 40, 33, 46, 52, 71, 57, 88\}
(B) {21,33,40,46,52,57,71,88}\{21, 33, 40, 46, 52, 57, 71, 88\}
(C) {33,21,40,46,52,57,88,71}\{33, 21, 40, 46, 52, 57, 88, 71\}
(D) {46,21,40,33,52,57,88,71}\{46, 21, 40, 33, 52, 57, 88, 71\}
(E) None of the above.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

雙指標快速排序會先選定樞紐值(pivot),再從左右兩端掃描:左指標尋找大於樞紐的元素,右指標尋找小於樞紐的元素,找到後交換。當兩指標交錯,將樞紐與右指標停留處交換,樞紐便到達正確位置。

本題樞紐為 5252,初始左指標位於 2121,右指標位於 7171。

解題方法

依照指標位置逐步掃描並交換:

  1. 左指標由左向右跳過小於 5252 的元素 21、4021、40,停在 8888。

  2. 右指標由右向左跳過大於 5252 的元素 7171,停在 4646。

  3. 88>5288>52 且 46<5246<52,交換兩者:

    {52,21,40,46,33,57,88,71}\{52, 21, 40, 46, 33, 57, 88, 71\}

  4. 左指標繼續跳過 46、3346、33,停在 5757;右指標向左跳過 88、5788、57,停在 3333。此時兩指標交錯。

  5. 將樞紐 5252 與右指標所在的 3333 交換:

    {33,21,40,46,52,57,88,71}\{33, 21, 40, 46, 52, 57, 88, 71\}

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 6 題5 分

(Select multiple correct answers) Which of the following statements is (are) true?

🖼️【此處有附圖,請對照原卷】

(A) Given a dense graph with negative weight edges but no negative weight cycles, applying Johnson’s algorithm on this graph will be faster than running Floyd-Warshall algorithm.
(B) The class NP contains problems that are solvable in polynomial time.
(C) The halting problem is an NP-hard problem.
(D) Ford-Fulkerson method can be used to find a maximum matching from the graph at the right side.
(E) Following (D), the graph has maximal cardinality 4.

🖼️ 本題附圖:
第 6 題附圖
圖看不清楚?展開原卷第 4 頁核對
原卷第 4 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

右側為二分圖,左側 L1∼L5L_1\sim L_5、右側 R1∼R4R_1\sim R_4(由上而下),邊為:L1R1L_1R_1、L2R1L_2R_1、L2R3L_2R_3、L3R2L_3R_2、L3R3L_3R_3、L3R4L_3R_4、L4R3L_4R_3、L5R3L_5R_3。

選項分析

  • (A) 錯誤。 Johnson 演算法的時間為 O(V2log⁡V+VE)O(V^2\log V+VE)(以 Fibonacci heap 實作 Dijkstra)。稠密圖 E=Θ(V2)E=\Theta(V^2) 時為 O(V3)O(V^3),與 Floyd–Warshall 的 Θ(V3)\Theta(V^3) 同階,不會比較快;Johnson 的優勢在稀疏圖。
  • (B) 正確。 多項式時間可解的問題(P)都屬於 NP(P⊆NPP\subseteq NP),所以 NP 中包含多項式時間可解的問題。
  • **(C) 正確。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 7 題5 分

(Select multiple correct answers) Which of the following statements is (are) true?

(A) Insertion sort performs in-place sorting operations.
(B) Finding the longest simple path from an unweighted graph can be solved by divide-and-conquer strategy.
(C) Recursion tree is a full binary tree.
(D) Quicksort is not an asymptotically optimal algorithm.
(E) An algorithm with fewer lines of code has lower time complexity than the one with more lines of code.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查排序演算法的空間與時間複雜度、最長簡單路徑問題的計算難度、遞迴樹的結構,以及程式碼長度與時間複雜度的差異。

題目未指定「漸近最優」採用哪種情況分析,也未說明「可用分治法解決」是否要求有效率的多項式時間演算法。以下依常見演算法考題慣例,以最壞情況分析快速排序,並將「分治法解決」解讀為能有效拆成較小子問題。

解題方法

逐項核對定義與複雜度:

  • 原地排序主要使用常數額外空間。
  • 最長簡單路徑是 NP-hard 問題,不能因為可以遞迴枚舉就視為有有效率的分治解法。
  • 遞迴樹的形狀由遞迴式決定,不必然是滿二元樹。
  • 漸近最優性須指定分析情況;快速排序最壞情況為 Θ(n2)\Theta(n^2)。
  • 程式碼行數不是時間複雜度的衡量方式。

選項分析

(A) 正確。 插入排序在原陣列中逐步移動元素並插入待排序項目,只需常數額外空間,因此屬於原地排序,額外空間複雜度為 O(1)O(1)。

(B) 錯誤。 最長簡單路徑要求路徑上的頂點不得重複;在一般圖上,判斷是否存在長度至少為指定值的簡單路徑是 NP-complete 問題,求最長路徑則是 NP-hard 問題。將圖切成子圖時,子問題間會受共用頂點及「不可重複使用頂點」的限制牽連,無法把子問題的解直接合併成原問題的解——這正是分治法成立的前提(子問題獨立、可合併)不成立;

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 8 題5 分

(Select multiple correct answers) Which of the following statements is (are) true?

(A) The solution of the recurrence T(n)=16T(n/4)+n2T(n)=16T(n/4)+n^2 is O(n2)O(n^2).
(B) The solution of the recurrence T(n)=4T(n/5)+n4/3T(n)=4T(n/5)+n^{4/3} is O(n4/3)O(n^{4/3}).
(C) The solution of the recurrence T(n)=T(n/4)+T(n/2)+n2T(n)=T(n/4)+T(n/2)+n^2 is O(nlog⁡n)O(n\log n).
(D) The solution of the recurrence T(n)=2T(n4)+log⁡nT(n)=2T(\sqrt[4]{n})+\sqrt{\log n} is O((log⁡n)(log⁡log⁡n))O((\log n)(\log\log n)).
(E) The solution of the recurrence T(n)=T(n−1)+1/nT(n)=T(n-1)+1/n is O(log⁡n)O(\log n).

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

遞迴式常用主定理、遞迴樹與調和級數求漸近成長率。主定理適用於 T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n),比較 f(n)f(n) 與臨界項 nlog⁡ban^{\log_b a};若兩者同階,解為 Θ(nlog⁡balog⁡n)\Theta(n^{\log_b a}\log n)。判斷選項中的 O(g(n))O(g(n)) 時,只要實際解的成長率不快於 g(n)g(n),敘述就成立;即使 g(n)g(n) 比實際解寬鬆也可以。

解題方法

逐一求出遞迴式的漸近解,再與各選項宣稱的上界比較。對於參數不是 nn 的冪次形式的遞迴式,可先換變數;對不等分割的遞迴式,則用遞迴樹追蹤每層工作量。

選項分析

(A) 錯誤。

T(n)=16T(n/4)+n2T(n)=16T(n/4)+n^2

主定理中 a=16a=16、b=4b=4,因此

nlog⁡ba=nlog⁡416=n2n^{\log_b a}=n^{\log_4 16}=n^2

非遞迴成本 n2n^2 與臨界項同階,所以

T(n)=Θ(n2log⁡n)T(n)=\Theta(n^2\log n)

這比 O(n2)O(n^2) 成長得快,故選項錯誤。

(B) 正確。

T(n)=4T(n/5)+n4/3T(n)=4T(n/5)+n^{4/3}

臨界項為

nlog⁡54n^{\log_5 4}

因為 log⁡54<1<4/3\log_5 4<1<4/3,所以 n4/3n^{4/3} 多項式地大於臨界項。再檢查正則條件:

4(n/5)4/3=454/3n4/34(n/5)^{4/3} =\frac{4}{5^{4/3}}n^{4/3}

其中 454/3<1\frac{4}{5^{4/3}}<1,符合主定理第三種情形,得到

T(n)=Θ(n4/3)T(n)=\Theta(n^{4/3})

因此 T(n)=O(n4/3)T(n)=O(n^{4/3}),選項正確。

(C) 錯誤。

T(n)=T(n/4)+T(n/2)+n2T(n)=T(n/4)+T(n/2)+n^2

在遞迴樹中,每個子問題的大小分別是父問題的 1/41/4 與 1/21/2。若某層節點的問題大小為 xx,它們的非遞迴工作量總和是各節點大小的平方和。從一層到下一層,這個總和的倍率為

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 9 題5 分

(Select multiple correct answers) Given a graph at the right side, which of the following statements is (are) true?

🖼️【此處有附圖,請對照原卷】

(A) To find the shortest path (i.e., path with minimum weight) from V0V_0 to V3V_3 correctly, greedy algorithm is applicable.
(B) Following the same task as (A), dynamic programming is applicable.
(C) From the stage perspective, the problem of finding the shortest path between the 4 stages shows optimal substructure.
(D) The path from V0V_0 to V3V_3 has minimum weight 77.
(E) The path from V0V_0 to V3V_3 has minimum weight 66.

🖼️ 本題附圖:
第 9 題附圖
圖看不清楚?展開原卷第 4 頁核對
原卷第 4 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

右側為四階段(stage)有向圖,邊由左向右:

  • Stage 0→1:V0→V1,1V_0\to V_{1,1}(3)、V0→V1,2V_0\to V_{1,2}(1)、V0→V1,3V_0\to V_{1,3}(5)、V0→V1,4V_0\to V_{1,4}(7)
  • Stage 1→2:V1,1→V2,1V_{1,1}\to V_{2,1}(2)、V1,1→V2,2V_{1,1}\to V_{2,2}(3)、V1,2→V2,1V_{1,2}\to V_{2,1}(9)、V1,2→V2,2V_{1,2}\to V_{2,2}(16)、V1,3→V2,1V_{1,3}\to V_{2,1}(5)、V1,3→V2,3V_{1,3}\to V_{2,3}(7)、V1,4→V2,1V_{1,4}\to V_{2,1}(10)、V1,4→V2,2V_{1,4}\to V_{2,2}(2)、V1,4→V2,3V_{1,4}\to V_{2,3}(4)
  • Stage 2→3:V2,1→V3V_{2,1}\to V_3(13)、V2,2→V3V_{2,2}\to V_3(1)、V2,3→V3V_{2,3}\to V_3(2)

核心觀念

多階段圖(multistage graph)的最短路徑是動態規劃的經典例題:令 d(v)d(v) 為 vv 到終點 V3V_3 的最短距離,則

d(v)=min⁡(v,w){ c(v,w)+d(w) }.d(v)=\min_{(v,w)}\{\,c(v,w)+d(w)\,\}.

這個遞迴成立是因為問題具有最佳子結構:最短路徑的任一段後綴,也必須是從該點出發的最短路徑。

解題方法(由後往前)

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 10 題5 分

(Select multiple correct answers) Given a graph at the right side, which of the following statements is (are) true?

🖼️【此處有附圖,請對照原卷】

(A) Kruskal algorithm is applicable to find a correct answer.
(B) Given the necessary inputs, executing Floyd-Warshall algorithm on this graph takes more time than executing Bellman-Ford algorithm.
(C) If specifying node A as the source and node D as the sink, executing Edmonds-Karp algorithm will return us “24” as an answer.
(D) Topological sort is applicable to find a correct answer.
(E) Node B, C, E, F form a strongly connected component.

🖼️ 本題附圖:
第 10 題附圖
圖看不清楚?展開原卷第 5 頁核對
原卷第 5 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

右側為有向加權圖:A→BA\to B(16)、A→FA\to F(13)、B→FB\to F(10)、F→BF\to B(4)、B→CB\to C(12)、C→FC\to F(9)、F→EF\to E(14)、E→CE\to C(7)、C→DC\to D(20)、E→DE\to D(4)。(這是 CLRS 最大流章節的範例網路,AA 為源點、DD 為匯點。)

選項分析

  • (A) 錯誤。 Kruskal 演算法求的是無向圖的最小生成樹;本圖是有向圖,題目要的答案(最短路徑或最大流)也不是生成樹問題,Kruskal 不適用。
  • (B) 正確。 在 ∣V∣=6|V|=6、∣E∣=10|E|=10 的圖上,Floyd–Warshall 是 Θ(V3)\Theta(V^3)(約 216 次鬆弛),Bellman–Ford 是 O(VE)O(VE)(約 60 次),前者花的時間較多。
  • (C) 錯誤。 以 AA 為源點、DD 為匯點的最大流是 23,不是 24。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 11 題5 分

請回答以下 C 語言程式碼執行後在螢幕上顯示之結果。

#include <stdio.h>

int main() {
int num1 = 025;
int num2 = num1;

printf("%X\n", num2);

return 0;

}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考 C 語言整數常數的進位判讀,以及 printf 的格式指定符。

  • 以 0 開頭的整數常數採用八進位表示,因此 025 是八進位數。
  • %X 會將整數以十六進位大寫字母格式輸出。

解題方法

先將 num1 的八進位值換算成十進位:

(025)8=2×8+5=21(025)_8 = 2 \times 8 + 5 = 21

num2 = num1,所以 num2 的值也是十進位 2121。再將 2121 換成十六進位:

21=1×16+5=(15)1621 = 1 \times 16 + 5 = (15)_{16}
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 12 題10 分

請回答以下 C 語言程式碼執行後在螢幕上顯示之結果。

#include <stdio.h>

void modifyValues(const int *ptr1, int *const ptr2) {
*ptr2 *= 2;
}

int main() {
int a = 10;
int b = 20;
const int *p1 = &a;
int *const p2 = &b;
const int *const p3 = &a;
modifyValues(p1, p2);
printf("%d, %d\n", a, b);

return 0;

}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 C 語言指標的 const 修飾位置,以及透過指標修改變數的效果:

  • const int *ptr:指標可改指向其他位置,但不可透過此指標修改所指向的整數。
  • int *const ptr:指標本身不可改指向其他位置,但可透過此指標修改所指向的整數。
  • const int *const ptr:指標本身與所指向的整數都不可透過此指標修改。

解題方法

先看 main 中各變數與指標的對應關係:

  • a 的初值為 10,p1 指向 a。p1 的型別是 const int *,但本題函式並未透過 ptr1 修改 a。
  • b 的初值為 20,p2 指向 b。p2 的型別是 int *const:p2 不能改指向,但可以透過它修改 b。
  • p3 指向 a,型別是 const int *const,本題沒有使用它。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 13 題10 分

請回答以下 C 語言程式碼執行後在螢幕上顯示之結果。

#include <stdio.h>

int main(void) {
unsigned int a = 0xFFFF0101;
unsigned char b = (unsigned char)a;
char *c = (char *)&a;

unsigned int *p = (unsigned int *)c;
*p <<= 6;

printf("%x, %x", b, *c);
return 0;

}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 無號整數位移與溢位、位元組序、指標型別轉換,以及 printf 的格式指定。

  • unsigned int 左移後若超出型別可表示範圍,結果依無號整數的模數規則保留低位元。
  • char * 可用來逐位元組觀察物件的記憶體表示;哪個位元組位於最低位址,取決於系統的位元組序。
  • printf 的 %x 要求對應引數型別為 unsigned int。可變參數函式不會依格式字串自動轉換引數型別。

解題方法

先看 b。unsigned char 只保留 a 的最低位元組;在一般 8 位元組元組環境中:

0xFFFF0101 mod 28=0x01\texttt{0xFFFF0101} \bmod 2^8 = \texttt{0x01}

因此 b 的值是 0x01。

接著,p 指向 a,*p <<= 6 將整個 unsigned int 左移 6 位。若採用常見的 32 位元 unsigned int:

0xFFFF0101×26=0x3FFFC04040\texttt{0xFFFF0101} \times 2^6 = \texttt{0x3FFFC04040}

只保留低 32 位元後:

0xFFC04040\texttt{0xFFC04040}
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 14 題9 分

Match the concepts on the left with the (simplistic) definitions on the right by writing a letter from 1 to 4 in each of the blanks.

(A) (2%) Overloading: ____
(B) (2%) Coercion: ____
(C) (2%) Aliasing: ____
(D) (3%) Polymorphism: ____

  1. Able to work with multiple types
  2. Converting automatically to the desired type
  3. Multiple things with the same name
  4. Multiple names for the same thing

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查程式語言中的四個基本概念:

  • Overloading(多載):多個不同的函式、運算子或操作使用相同名稱,實際執行哪一個由參數型別或數量等條件決定。
  • Coercion(強制轉型/自動轉型):程式語言自動把值轉換成所需的型別。
  • Aliasing(別名):同一個物件或資料可透過多個名稱存取。
  • Polymorphism(多型):同一段操作能適用於多種型別的資料。

解題方法

依照關鍵詞配對定義:

  • 「相同名稱」對應多載。
  • 「自動轉換型別」對應強制轉型。
  • 「同一事物有多個名稱」對應別名。
  • 「適用多種型別」對應多型。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 8 題共用同一段題幹

#include <iostream>
#include <string>
using namespace std;

class B {
public:
B() {}
~B() {}

virtual void m(int i) {
    cout << "B1" << endl;
}

virtual void m(double f) {
    cout << "B2" << endl;
}

};

class D : public B {
public:
D() {}
~D() {}

void m(int i) {
    cout << "D" << endl;
}

};

int main(int argc, char argv[]) {
D
dP = new D();
B* bP = dP;
B bo = *dP;
B& br = *dP;

dP->m(1);      // Line A
dP->m(2.0);    // Line B
bP->m(1);      // Line C
bP->m(2.0);    // Line D
br.m(1);       // Line E
br.m(2.0);     // Line F
bo.m(1);       // Line G
bo.m(2.0);     // Line H

}

第 15-(A) 題2 分

What is printed by Line A?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 C++ 的函式多載解析與虛擬函式動態繫結:

  • 編譯時依照物件運算式的靜態型別與引數型別,決定呼叫哪個函式版本。
  • 函式宣告為 virtual 時,執行時會依物件的動態型別,決定執行哪個覆寫版本。
  • D 宣告了 m(int),因此它覆寫 B 的虛擬函式 m(int)。

解題方法

Line A 是:

dP->m(1);
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15-(B) 題2 分

What is printed by Line B?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考查 C++ 繼承中的函式名稱隱藏,以及多載解析與虛擬函式呼叫的先後順序。

當衍生類別 D 宣告了名為 m 的成員函式,D::m 會隱藏基底類別 B 中所有同名的多載函式。透過 D* 呼叫 m 時,編譯器只在 D 的可見函式中進行多載解析。

解題方法

dP 的靜態型別是 D*。D 只宣告了:

void m(int i) {
    cout << "D" << endl;
}
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15-(C) 題2 分

What is printed by Line C?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考 C++ 的虛函式動態繫結。函式呼叫分兩步判定:

  1. 編譯期依據指標的靜態型別與引數型別,決定呼叫哪個函式簽章。
  2. 若該函式是虛函式,執行期再依據物件的實際型別,決定執行哪個類別的實作。

D 繼承自 B,且 D::m(int) 覆寫了 B::m(int)。即使 D::m(int) 沒有再次寫上 virtual,它仍沿用基底類別中的虛函式性質。

解題方法

Line C 為:

bP->m(1);
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15-(D) 題2 分

What is printed by Line D?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考查 C++ 的多載解析與虛擬函式動態繫結:

  • 多載解析在編譯時依照運算式的靜態型別與引數型別,決定呼叫哪個函式版本。
  • 若選中的函式是虛擬函式,執行時再依物件的動態型別決定使用哪個類別的實作。
  • D 中的 m(int) 覆寫了 B 的 m(int)。即使沒有再寫 virtual,它仍是虛擬函式。
  • D 宣告了自己的 m(int),會在以 D 型別進行名稱查找時遮蔽 B 的其他 m 多載;但透過 B* 呼叫時,名稱查找依 B 的介面進行。

解題方法

Line D 是:

bP->m(2.0);

bP 的靜態型別是 B*,所以編譯器先從 B 的多載中選擇最適合 double 引數的函式:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15-(E) 題2 分

What is printed by Line E?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 C++ 的虛擬函式動態繫結。呼叫虛擬函式時:

  1. 編譯器依據運算式的靜態型別與引數型別,決定呼叫哪一個多載函式。
  2. 執行時再依據物件的動態型別,決定執行哪個類別的覆寫版本。

解題方法

br 的宣告型別是 B&,因此 br.m(1) 先從 B 的多載函式中,依引數 1(型別為 int)選出 m(int)。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15-(F) 題2 分

What is printed by Line F?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考查 C++ 的靜態型別、函式多載解析與虛擬函式動態繫結:

  • 先依運算式的靜態型別與引數型別,決定呼叫哪個多載函式。
  • 若選中的函式是虛擬函式,再依物件的動態型別決定執行哪個覆寫版本。
  • br 的靜態型別是 B&,但它參照的是 D 物件;參照不會像物件複製那樣造成切割。

解題方法

Line F 是:

br.m(2.0);

br 的靜態型別為 B&,因此多載解析會在 B 可見的函式中進行:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15-(G) 題2 分

What is printed by Line G?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考「物件切割(object slicing)」與「虛擬函式的動態繫結」。

B bo = *dP; 會將 D 物件的 B 基底部分複製到 bo。因此,bo 是一個獨立的 B 物件,原本 D 物件中新增或覆寫的部分不會留在 bo 裡。

呼叫虛擬函式時,會依實際物件型別決定執行哪個函式;但物件切割後,bo 的實際型別就是 B。

解題方法

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15-(H) 題2 分

What is printed by Line H?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考「物件切割(object slicing)」與「函式多載解析」。B bo = *dP; 會把 D 物件中的 B 基底部分複製成一個獨立的 B 物件;bo 不再是 D 物件,因此無法透過它呼叫 D 的成員函式。

呼叫多載函式時,編譯器先依照物件的靜態型別及參數型別選出函式;若函式是虛擬函式,再依實際物件型別決定執行哪個覆寫版本。

解題方法

Line H 是:

bo.m(2.0);
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

其他考古題