國立中山大學 111 年 《計算機概論與程式設計》

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

第 1 題1 分

Which of the following is the binary representation of (6.625)10(6.625)_{10}?

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

這一題的完整詳解

核心觀念

本題考查十進位小數轉換為二進位數的方法。

二進位數各位的權值為:

⋯ ,23,22,21,20,2−1,2−2,2−3,⋯\cdots,2^3,2^2,2^1,2^0,2^{-1},2^{-2},2^{-3},\cdots

其中:

  • 整數部分使用 20,21,22,…2^0,2^1,2^2,\ldots
  • 小數部分使用 2−1,2−2,2−3,…2^{-1},2^{-2},2^{-3},\ldots

因此,需將 (6.625)10(6.625)_{10} 分成整數部分 66 與小數部分 0.6250.625,分別轉換。

解題方法

一、整數部分 66 轉為二進位

利用 22 的冪次分解:

6=4+2=22+216=4+2=2^2+2^1

因此:

位值222^2212^1202^0
數值421
是否取用110

所以:

(6)10=(110)2(6)_{10}=(110)_2

二、小數部分 0.6250.625 轉為二進位

將小數部分依序乘以 22,每次取整數部分作為下一位二進位小數:

計算整數部分下一個小數部分
0.625×2=1.250.625\times 2=1.2510.25
0.25×2=0.50.25\times 2=0.500.5
0.5×2=1.00.5\times 2=1.010

依序得到二進位小數位:

101101

因此:

(0.625)10=(0.101)2(0.625)_{10}=(0.101)_2

三、合併整數與小數部分

(6.625)10=(110.101)2(6.625)_{10}=(110.101)_2

驗算如下:

(110.101)2=1×22+1×21+0×20+1×2−1+0×2−2+1×2−3(110.101)_2 =1\times2^2+1\times2^1+0\times2^0 +1\times2^{-1}+0\times2^{-2}+1\times2^{-3}
🔒

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

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

免費註冊

第 2 題1 分

If you have a disk that has a capacity of Petabyte (PB), that is equal to

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

這一題的完整詳解

核心觀念

本題考查儲存容量單位的換算,以及十進位單位與二進位表示法之間的近似關係。

在磁碟容量的十進位標準中:

1 PB=1015 bytes1\ \text{PB}=10^{15}\ \text{bytes}

而選項全部使用 22 的次方,因此需將 101510^{15} 轉換成接近的 22 次方。

由於:

210=1024≈1032^{10}=1024\approx 10^3

所以:

250=(210)5≈(103)5=10152^{50}=(2^{10})^5\approx (10^3)^5=10^{15}

因此:

1 PB≈250 bytes1\ \text{PB}\approx 2^{50}\ \text{bytes}

解題方法

利用基本換算:

210≈1032^{10}\approx 10^3

將 101510^{15} 改寫成每 10310^3 一組:

1015=(103)5≈(210)510^{15}=(10^3)^5\approx (2^{10})^5

再計算次方:

(210)5=250(2^{10})^5=2^{50}

所以,11 PB 約等於 2502^{50} bytes。

需注意嚴格數值上:

250=1,125,899,906,842,6242^{50}=1,125,899,906,842,624

約為 1.126×10151.126\times 10^{15} bytes,與 101510^{15} bytes 同一數量級。考試中的選項採用此近似換算。

選項分析

  • (A) 2202^{20} bytes:錯誤

220≈1062^{20}\approx 10^6 bytes,約為 MB 等級,不是 PB。

  • (B) 2302^{30} bytes:錯誤
🔒

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

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

免費註冊

第 3 題1 分

How many bits in length are used for IP address in IPv4?

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

這一題的完整詳解

核心觀念

IPv4(Internet Protocol version 4)使用 32 bits 表示一個 IP 位址。

IPv4 位址通常分成 4 組,每組以 8 bits 表示,並以十進位數字呈現,中間用句點分隔,例如:

192.168.1.1192.168.1.1

每組數值範圍為 00~255255,因為:

28=2562^8=256

因此每組需要 8 bits,總長度為:

8×4=32 bits8 \times 4=32\text{ bits}

IPv4 位址的總數量為:

2322^{32}

解題方法

題目詢問 IPv4 IP address 的位元長度。直接套用 IPv4 位址的格式:

8 bits⏟第 1 組+8 bits⏟第 2 組+8 bits⏟第 3 組+8 bits⏟第 4 組=32 bits\underbrace{8\text{ bits}}_{\text{第 1 組}} + \underbrace{8\text{ bits}}_{\text{第 2 組}} + \underbrace{8\text{ bits}}_{\text{第 3 組}} + \underbrace{8\text{ bits}}_{\text{第 4 組}} =32\text{ bits}

所以 IPv4 位址長度是 32 bits。

選項分析

🔒

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

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

免費註冊

第 4 題1 分

Which of the following statement about the Unicode is not true?

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

這一題的完整詳解

核心觀念

本題考查 ASCII 與 Unicode 的字元編碼系統。

  • ASCII 使用 7 bits 表示字元,共有 27=1282^7=128 個基本字元。
  • Extended ASCII 通常使用 8 bits,因此可表示 28=2562^8=256 個字元。
  • Unicode 的目標是統一表示世界各地文字,不只支援英文,也支援中文、日文、韓文、阿拉伯文等多種語言。
  • Unicode 早期常以 16 bits 作為基本字元表示概念;現代 Unicode 實際上具有多種編碼方式,例如 UTF-8、UTF-16 與 UTF-32。

本題依照考試常見的基礎資訊概論定義判斷。

解題方法

題目問的是 「關於 Unicode 的敘述何者不正確」,可先找出明顯屬於 Extended ASCII 的特徵:

28=2562^8=256

「包含 256 個字元」是 8-bit Extended ASCII 的典型描述,並不是 Unicode 的字元數量。

Unicode 的設計目標是涵蓋全球文字,其字元數遠超過 256 個,因此選項 (B) 為錯誤敘述。

選項分析

(A) An extended version of the ASCII

此敘述在基礎教材中通常視為正確。

Unicode 可視為 ASCII 的延伸概念,並且保留 ASCII 的基本字元配置。ASCII 的英文字母、數字與常用符號,在 Unicode 中具有相同的編碼位置。

不過嚴格來說,Unicode 並不是單純把 ASCII 擴充成另一個 8-bit 字元集,而是一套更完整的國際化字元標準;本題採用概論課程的簡化說法,因此判定為正確。

(B) It contains 256 characters

此敘述錯誤。

256 個字元是 8 bits 字元編碼所能表示的數量:

28=2562^8=256

這通常是 Extended ASCII 的描述。Unicode 需要表示全世界各種語言的文字,字元數量遠大於 256,因此不能說 Unicode 只包含 256 個字元。

(C) It is not only for English but also international use

此敘述正確。

ASCII 主要針對英文與基本符號設計;Unicode 的主要目的則是支援國際化文字,例如:

🔒

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

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

免費註冊

第 5 題1 分

Three security goals are ____.

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

這一題的完整詳解

核心觀念

本題考查資訊安全的三大核心目標,稱為 CIA triad:

  1. Confidentiality(機密性):只有經授權的使用者能存取資訊,防止資料遭未授權揭露。
  2. Integrity(完整性):確保資料在儲存、傳輸與處理過程中未遭未授權竄改。
  3. Availability(可用性):授權使用者在需要時,能正常取得系統與資料服務。

因此,三大安全目標為:

Confidentiality+Integrity+Availability\text{Confidentiality}+\text{Integrity}+\text{Availability}

解題方法

判斷此題的關鍵,是辨認選項中是否完整列出 CIA 三要素:

  • Confidentiality
  • Integrity
  • Availability

題目問的是「security goals」,也就是資訊安全希望達成的目標,不是加密技術、攻擊類型或其他輔助性質。

選項分析

(A) Confidentiality, cryptography, and nonrepudiation

錯誤。

  • Confidentiality 是安全目標。
  • Cryptography(密碼學)是實現機密性、完整性、身分認證等功能的技術領域,不是三大核心安全目標之一。
  • Nonrepudiation(不可否認性)是安全服務,可透過數位簽章等方式,使訊息傳送者不能否認曾經送出訊息,但不屬於 CIA 三要素。

此選項混入技術與其他安全服務,缺少 Integrity 與 Availability。

(B) Confidentiality, encryption, and reliability

錯誤。

  • Confidentiality 是安全目標。
  • Encryption(加密)是保護資料機密性的具體方法,不是安全目標本身。
  • Reliability(可靠性)表示系統能穩定、正確地運作,雖然與資訊系統品質有關,但不是標準 CIA 三大安全目標。

此選項以加密技術取代 Integrity,且缺少 Availability。

(C) Confidentiality, integrity, and availability

正確。

🔒

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

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

免費註冊

第 6 題1 分

If the longest path in a binary tree contained exactly four nodes, what is the minimum number of nodes that could be in the entire tree?

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

這一題的完整詳解

核心觀念

本題考的是二元樹中的「最長路徑」(longest path),通常也稱為樹的直徑(diameter)。

  • 路徑是由相鄰節點連成的序列。
  • 題目明確指出最長路徑包含 4 個節點。
  • 因此,該路徑至少需要存在 4 個不同節點。
  • 題目沒有要求二元樹必須是完整二元樹(complete binary tree)或滿二元樹(full binary tree),所以樹可以退化成單一路徑。

若以邊數表示,4 個節點的路徑包含:

4−1=3 條邊4-1=3\text{ 條邊}

解題方法

要使整棵樹的節點數最少,直接讓整棵二元樹本身就是這條最長路徑即可:

A−B−C−DA-B-C-D

其中:

  • 節點 AA 與 BB 相鄰;
  • 節點 BB 與 CC 相鄰;
  • 節點 CC 與 DD 相鄰。

此樹共有 4 個節點,且從 AA 到 DD 的路徑包含 4 個節點。由於整棵樹只有這 4 個節點,不存在更長的路徑,因此最長路徑正好包含 4 個節點。

所以最小節點數為:

4\boxed{4}

選項分析

🔒

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

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

免費註冊

第 7 題1 分

Which of the following data structures is static in the sense that it does not change size as data items are inserted or deleted?

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

這一題的完整詳解

核心觀念

本題考查資料結構的「大小是否會隨資料增刪而改變」。

所謂 static data structure(靜態資料結構),是指資料結構建立後,其可容納的元素數量固定;插入或刪除資料時,不會改變整體配置的大小。

典型代表是 array(陣列):

  • 建立陣列時即指定長度。
  • 陣列長度固定,例如 int A[10] 可容納 1010 個元素。
  • 插入或刪除元素只會改變目前使用的資料內容,不會自動增加或減少陣列容量。

相對地,**dynamic data structure(動態資料結構)**會在資料增刪時,透過節點配置、釋放等方式改變結構大小。

解題方法

判斷每個選項是否屬於靜態資料結構,關鍵在於區分:

  1. 該資料結構的「抽象操作規則」。
  2. 該資料結構是否會隨元素增刪而改變容量或節點數量。

題目問的是資料結構本身的典型分類,而不是某個特定實作方式。因此,應判斷各資料結構的標準特性。

陣列在宣告時決定容量。例如:

int A[5];

此陣列的容量就是 55。即使刪除其中一個元素,陣列仍然保留 55 個位置;插入資料也不會使它自動變成 66 個位置。因此符合 static 的定義。

選項分析

(A) Array

正確。

陣列在建立時即決定大小,例如:

int A[10];

其配置空間固定為 1010 個元素。插入、刪除資料只會調整元素內容、索引位置或目前使用數量,不會改變陣列本身的容量。

因此,Array 是本題所指的靜態資料結構。

(B) Singly linked list

錯誤。

單向鏈結串列由多個節點組成,每個節點通常包含:

  • 資料欄位
  • 指向下一個節點的指標
🔒

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

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

免費註冊

第 8 題1 分

Which one of the following is NOT the characteristic of TCP protocol?

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

這一題的完整詳解

核心觀念

本題主要測驗計算機網路(Computer Networks)傳輸層(Transport Layer)中,TCP(Transmission Control Protocol,傳輸控制協定) 與 UDP(User Datagram Protocol,使用者資料包協定) 的核心特性差異。

傳輸層兩大主要協定的特性對比如下:

  1. TCP:
  • 連線導向(Connection-oriented):傳輸資料前必須先透過「三次交握(3-way Handshake)」建立連線,結束時需進行四次揮手(4-way Teardown)。
  • 可靠傳輸(Reliable Delivery):提供錯誤控制(Error Control)(包含同位檢查碼 Checksum、確認機制 ACK、逾時重傳 Retransmission、序號 Sequence Number 避免重複與保證循序)。
  • 流量控制(Flow Control):利用滑動視窗(Sliding Window)防止接收端緩衝區溢位。
  • 壅塞控制(Congestion Control):利用慢啟動(Slow Start)、壅塞避免(Congestion Avoidance)、快速重傳與快速恢復機制,避免網路鏈路過度壅塞。
  1. UDP:
  • 非連線導向(Connectionless):不需事先交握建立連線,直接將封包送出。
  • 盡力而為(Best-Effort / Unreliable):不保證送達、不保證順序、不提供壅塞控制與流量控制,具有較低的延遲與標頭開銷(Header Overhead)。

解題方法

題目詢問「何者不是 TCP 協定的特性(NOT the characteristic of TCP protocol)」。

切入點為檢視各選項中屬於 TCP 與 UDP 的典型對比關鍵詞:

  • 連線導向(Connection-oriented)與非連線導向(Connectionless)在邏輯上互相矛盾,必有一者非 TCP 特性。
  • TCP 屬於連線導向協定,因此「Connectionless」必定屬於 UDP 而非 TCP。

選項分析

🔒

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

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

免費註冊

第 9 題1 分

Which of the following methods is suitable for preventing the falsification of medical records?

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

這一題的完整詳解

核心觀念

本題的核心觀念在於醫療資訊安全(Medical Information Security)中的資料完整性(Integrity)、防竄改(Tamper-resistance)與不可否認性(Non-repudiation),以及**區塊鏈(Blockchain)**技術在醫療資料防偽上的應用。

  1. 防偽與防竄改需求(Tamper-proofing):
    病歷屬於高度敏感且具法律效力的醫療紀錄。傳統集中式資料庫(Centralized Database)若擁有管理者權限,存在被惡意修改、偽造或刪除的風險。防範病歷偽造的核心在於確保紀錄自生成後具備「不可竄改性」與「完整追溯性(Auditability)」。
  2. 區塊鏈(Blockchain)架構:
    區塊鏈本質上是一種分散式帳本技術(Distributed Ledger Technology, DLT),結合了以下關鍵技術以達成防偽:
  • 密碼學雜湊串接(Cryptographic Hash Chaining):每個區塊記錄前一個區塊的雜湊值(Previous Hash),任何對歷史病歷的竄改都會導致該區塊及其後所有區塊的雜湊值連鎖失效。
  • 分散式共識機制(Consensus Mechanism):資料經多數節點共同驗證與儲存,單一機構或惡意節點無法單方面竄改資料。
  • 非對稱加密與數位簽章(Asymmetric Cryptography & Digital Signature):醫師或醫療院所寫入病歷時皆需以私鑰簽章,確保來源真實性且無法否認。

解題方法

  1. 鎖定題幹核心動詞與名詞:
    題幹詢問何種方法適合用於「preventing the falsification of medical records(防止醫療病歷被偽造/竄改)」。解題切入點為比對各選項的技術核心目標是否具備「防偽、防篡改、保證資料真實與完整」之資安特性。
  2. 評估技術對應性:
  • 區塊鏈的代表性核心特徵即為「不可竄改(Immutability)」與「去中心化驗證(Decentralized Verification)」,廣泛應用於電子病歷交換(EMR sharing)、處方箋防偽、臨床試驗資料防竄改等場景。
  • 其餘選項分屬自然語言處理、深度學習、資訊檢索、資料儲存壓縮等領域,均不具備防範資料被偽造的機制。

選項分析

  • (A) Natural Language Process(自然語言處理):錯誤。
  • 主要用途為讓電腦理解、解析與生成人類的自然語言文字。在醫學領域多用於臨床病摘自動分類、非結構化病歷轉結構化資料、醫學命名實體辨識(NER)等,屬於文字處理與理解工具,不具備資料防偽或防止竄改的安全功能。
  • (B) Neural Network(類神經網路):錯誤。
🔒

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

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

免費註冊

第 10 題1 分

The digital transformation of smart medical has always been a hot topic and paid more attention in the post-epidemic era. Which of the following falls within its scope?

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

這一題的完整詳解

核心觀念

本題測驗「智慧醫療(Smart Healthcare / Smart Medicine)之數位轉型(Digital Transformation)範疇與後疫情時代應用」。

智慧醫療的本質在於將現代資訊通訊技術(ICT,如物聯網 IoT/IoMT、人工智慧 AI、雲端運算、5G 通訊、大數據分析)導入醫療照護的全生命週期。其數位轉型涵蓋範疇極廣,包含:

  1. 預防與衛教(健康促進、互動式衛教、個人健康管理)。
  2. 診斷與個人化治療(精準醫療、基因體定序、AI 輔助診斷)。
  3. 醫療服務交付模式的重構(遠距醫療、虛擬門診、遠端監控)。
  4. 照護延續與照護網絡(智慧長照、穿戴式感測、居家遠距監測)。

在後疫情時代(post-epidemic era),為減少院內群聚交叉感染、提升偏鄉與居家醫療可近性,並加速精準化治療的落地,上述四大構面皆為智慧醫療數位轉型推動的關鍵核心領域。


解題方法

本題問何者落在智慧醫療數位轉型的範疇之內。解題切入點為檢視 (A)、(B)、(C)、(D) 各項應用是否具備「醫療照護需求」結合「數位資訊科技」的特徵:

  • 互動式健康衛教(Interactive health education)利用多媒體、App、聊天機器人與穿戴式科技,打破單向衛教限制,屬於數位醫療的預防醫學層面。
  • 精準醫療(Precision medicine)利用次世代定序(NGS)與大數據、AI 演算法進行個人化精確治療,是當前智慧醫療的核心亮點。
  • 遠距醫療(Telemedicine)結合 5G、視訊串流與電子病歷整合,在後疫情時代成為主流醫療交付手段。
  • 智慧長照醫療(Smart long-term care medical)透過物聯網感測器、跌倒偵測及雲端照護系統,解決高齡化社會的照護痛點。

四者皆毫無疑問屬於其範疇,因此選 (E) All of the above。


🔒

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

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

免費註冊

第 11 題1 分

Which of the following is used to store the instruction currently being executed?

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

這一題的完整詳解

核心觀念

本題考查 CPU 執行指令時,各種暫存器與記憶體的功能。

在指令週期中,CPU 會先從主記憶體擷取指令,接著將「目前正在執行的指令」暫時放入特定暫存器,供控制單元解碼與執行。此暫存器稱為 Instruction Register,指令暫存器,簡稱 IR。

因此,儲存目前正在執行之指令的元件是 Instruction register。

解題方法

判斷關鍵在於題幹的描述:

store the instruction currently being executed

也就是「儲存目前正在執行的指令」。

CPU 執行指令的大致流程如下:

  1. Fetch(擷取):依照 Program Counter 的內容,從記憶體取得下一道指令。
  2. 放入 Instruction Register:將取得的指令放入指令暫存器。
  3. Decode(解碼):控制單元分析指令內容。
  4. Execute(執行):依照指令要求進行運算或資料存取。

其中,Program Counter 負責指出下一道指令的位置;Instruction Register 則保存目前已擷取、正在解碼或執行的指令。

選項分析

(A) Program counter

錯誤。Program Counter(程式計數器,簡稱 PC)用來儲存「下一道要被擷取之指令的記憶體位址」,不是儲存指令本身。

例如,若 PC 的內容為位址 10001000,表示 CPU 下一步要從記憶體位址 10001000 擷取指令;PC 並不保存該指令的完整內容。

(B) Cache memory

🔒

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

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

免費註冊

第 12 題1 分

x=01001010x=01001010, y=11001100y=11001100. What is the Hamming distance between xx and yy?

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

這一題的完整詳解

核心觀念

Hamming distance(漢明距離)是指兩個等長字串在相同位置上,所含符號不同的個數。對二進位字串而言,就是逐位比較,計算不同的位元數。

公式為:

dH(x,y)=∑i=1n[xi≠yi]d_H(x,y)=\sum_{i=1}^{n}[x_i\ne y_i]

其中 [xi≠yi][x_i\ne y_i] 表示第 ii 位不同時記為 11,相同時記為 00。

解題方法

將兩個 8 位元字串逐位比較:

位置xxyy是否不同
101是
211否
300否
400否
511否
601是
710是
800否

不同的位置為第 11、66、77 位,因此:

dH(x,y)=3d_H(x,y)=3

也可利用 XOR 判斷不同位元:

x⊕y=01001010⊕11001100=10000110x\oplus y = 01001010\oplus11001100 = 10000110
🔒

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

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

免費註冊

第 13 題1 分

Which one of the following is an unsupervised learning method?

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

這一題的完整詳解

核心觀念

本題考查機器學習的分類:監督式學習(supervised learning)與非監督式學習(unsupervised learning)。

  • 監督式學習:訓練資料包含輸入資料 XX 及正確答案或標籤 YY,模型學習由 XX 預測 YY。
  • 非監督式學習:訓練資料只有輸入資料 XX,沒有事先提供的正確標籤,模型自行尋找資料中的群組、結構或分布。
  • K-means 的目標是將資料分成 KK 個群集,使同一群集內的資料彼此相似,因此屬於非監督式學習。

解題方法

判斷各選項所屬的學習類型即可。關鍵問題是:

訓練時是否需要已知的正確答案或類別標籤?

K-means 不需要事先知道每筆資料的類別,而是指定群集數 KK,透過反覆計算群中心與重新分群,自動形成群集。

其基本流程如下:

  1. 隨機選取 KK 個初始群中心。
  2. 將每筆資料分配給距離最近的群中心。
  3. 重新計算每個群集的中心:
    μj=1∣Cj∣∑xi∈Cjxi\boldsymbol{\mu}_j=\frac{1}{|C_j|}\sum_{\mathbf{x}_i\in C_j}\mathbf{x}_i
  4. 重複步驟 2、3,直到群集分配穩定或達到停止條件。

K-means 通常最小化群內平方誤差:

J=∑j=1K∑xi∈Cj∥xi−μj∥2J=\sum_{j=1}^{K}\sum_{\mathbf{x}_i\in C_j}\|\mathbf{x}_i-\boldsymbol{\mu}_j\|^2

這個過程不需要人工提供每筆資料的標籤,因此是非監督式學習。


選項分析

(A) K-means:正確

K-means 是典型的非監督式分群演算法。它根據資料點之間的距離,自動將資料分成 KK 群,不需要訓練標籤。

例如,將病人依照年齡、血壓與血糖數值分群時,資料不必先標記為「高風險」或「低風險」,演算法會依資料相似程度自行分組。

其常見時間複雜度為:

O(nKdi)O(nKdi)

其中:

  • nn:資料筆數
  • KK:群集數量
  • dd:特徵維度
  • ii:迭代次數

空間複雜度通常為:

O(nd+Kd)O(nd+Kd)

若另外儲存每筆資料的群集標籤,還需約 O(n)O(n) 的額外空間。


(B) Support Vector Machine(SVM):錯誤

SVM 通常是監督式學習方法,需要已知的類別標籤。

在分類問題中,SVM 會尋找一個能分隔不同類別的超平面,並最大化兩類資料之間的間隔(margin)。其訓練資料必須包含類別答案,例如:

yi∈{−1,+1}y_i\in\{-1,+1\}

因此 SVM 的基本形式不屬於非監督式學習。

🔒

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

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

免費註冊

第 14 題1 分

(a) System Program, (b) Application Program, (c) Operating System, and (d) CPU, can be arranged in order of proximity to the user. Which of the following order is correct?

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

這一題的完整詳解

核心觀念

本題考查電腦系統各層次與使用者之間的距離。一般可依「使用者最常直接接觸」到「最接近硬體」排列如下:

User→Application Program→System Program→Operating System→CPU\text{User} \rightarrow \text{Application Program} \rightarrow \text{System Program} \rightarrow \text{Operating System} \rightarrow \text{CPU}

各名詞意義如下:

  • Application Program(應用程式):直接協助使用者完成工作的程式,例如文書處理器、瀏覽器、計算機程式與遊戲。
  • System Program(系統程式):提供系統管理、程式開發與執行支援的程式,例如編譯器、組譯器、連結器、載入器、命令解譯器與檔案工具。
  • Operating System(作業系統):管理硬體資源並提供系統服務的核心軟體,例如程序管理、記憶體管理、檔案管理與輸入輸出管理。
  • CPU(中央處理器):實際執行機器指令的硬體,位於整個系統的最底層,距離使用者最遠。

因此,距離使用者由近到遠為:

Application Program→System Program→Operating System→CPU\boxed{\text{Application Program} \rightarrow \text{System Program} \rightarrow \text{Operating System} \rightarrow \text{CPU}}

對應題目代號即為:

b,a,c,d\boxed{b,a,c,d}

解題方法

判斷這類題目的關鍵,是先區分「應用程式」與「系統程式」的使用對象,再判斷軟體與硬體的上下層關係。

  1. 使用者直接操作的是應用程式,因此 Application Program 最接近使用者。
  2. 應用程式的執行與開發,常由編譯器、連結器、命令解譯器等 System Program 提供支援,因此系統程式位於應用程式之下。
  3. 系統程式需要透過 Operating System 使用硬體資源,因此作業系統比系統程式更接近硬體。
  4. 作業系統最後仍須透過 CPU 執行指令,所以 CPU 位於最底層。

排列結果為:

b→a→c→db \rightarrow a \rightarrow c \rightarrow d

選項分析

(A) a, b, c, d

此選項將 System Program 放在 Application Program 之前,表示系統程式比應用程式更接近使用者。

🔒

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

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

免費註冊

第 15 題1 分

Which of the following statement about GPU is not true?

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

這一題的完整詳解

核心觀念

本題考查 GPU(Graphics Processing Unit,圖形處理器)的基本定義、硬體架構與應用場合,重點包括:

  1. GPU 的全名與功能。
  2. GPU 與 CPU 的架構差異。
  3. GPU 適合大量平行運算的原因。
  4. GPU 的典型應用環境。

CPU 通常具有少量但功能強大的核心,擅長處理複雜、依序執行的通用工作;GPU 則通常具有大量運算核心,擅長同時處理大量相似的資料,例如影像中的像素。

解題方法

判斷各選項是否符合 GPU 的基本特性,尤其注意 GPU 的核心數量與 CPU 的比較。

GPU 的典型特徵可整理如下:

比較項目CPUGPU
核心數量較少通常較多
單核心功能複雜且通用結構較簡化
擅長工作序列式、分支多的程式大量平行運算
常見用途作業系統、應用程式控制圖形、影像、矩陣與科學運算

因此,若某選項說 GPU 通常比 CPU 擁有更少的核心,便與 GPU 的基本架構相反。

選項分析

(A) GPU stands for graphic processor unit

GPU 的標準全名是 Graphics Processing Unit,中文為「圖形處理器」。嚴格而言,選項中的 graphic processor unit 並非最標準的英文寫法,應為 graphics processing unit。

不過本選項顯然是在考 GPU 的英文全名概念,通常視為正確敘述,不能作為本題主要錯誤選項。

(B) GPU is a separate computer and can be more powerful than CPU

GPU 是一種處理器,而不是一台獨立的電腦。獨立顯示卡上的 GPU 雖然具有自己的運算核心與記憶體,能夠獨立執行大量運算,但仍然必須搭配 CPU、主記憶體、儲存裝置與作業系統,不能直接等同於一台完整電腦。

「GPU 在圖形或平行運算方面可能比 CPU 更強」是合理的;但「GPU 是一台 separate computer」並不精確。

🔒

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

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

免費註冊

第 16 題1 分

If the function int volume(int x = 1, int y = 1, int z = 1); is called by the expression volume(7,8), how many default arguments are used?

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

這一題的完整詳解

核心觀念

本題考查 C++ 函式的「預設引數」(default argument)。

函式宣告如下:

int volume(int x = 1, int y = 1, int z = 1);

代表:

  • x 未提供時,使用 1
  • y 未提供時,使用 1
  • z 未提供時,使用 1

函式呼叫時,若實際傳入的引數數量少於參數數量,缺少的參數會採用預設值。

解題方法

呼叫式為:

volume(7, 8);

依照由左至右的參數對應:

參數傳入值
x7
y8
z未提供,使用預設值 1

因此,實際效果相當於:

volume(7, 8, 1);

只有參數 z 使用預設值,所以使用了 11 個 default argument。

若函式內部計算體積,則可視為:

x×y×z=7×8×1=56x \times y \times z = 7 \times 8 \times 1 = 56
🔒

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

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

免費註冊

第 17 題1 分

If a=1.0a=1.0, b=6.0b=6.0 and c=4.0c=4.0, then what is printed by

printf("%.2f", sqrt(a+b*c));

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

這一題的完整詳解

核心觀念

本題考查三個重點:

  1. 運算子優先順序:乘法 * 優先於加法 +。
  2. 平方根函式 sqrt:計算輸入值的平方根。
  3. printf 的格式指定字串 "%.2f":以浮點數格式輸出,並固定顯示小數點後 2 位。

已知:

a=1.0,b=6.0,c=4.0a=1.0,\quad b=6.0,\quad c=4.0

解題方法

先依照 C 語言的運算子優先順序計算括號內的內容:

a+b∗c=a+(b×c)a+b*c=a+(b\times c)

代入數值:

1.0+6.0×4.0=1.0+24.0=25.01.0+6.0\times4.0 =1.0+24.0 =25.0

接著計算平方根:

25.0=5.0\sqrt{25.0}=5.0

因此,sqrt(a+b*c) 的結果為浮點數 5.05.0。

最後觀察輸出格式:

printf("%.2f", sqrt(a+b*c));

其中:

  • %f:以浮點數格式輸出。
  • .2:小數點後固定輸出 2 位。
  • 因此 5.05.0 會顯示為:
5.00

程式逐步追蹤

步驟運算內容結果
1b*c6.0*4.0 = 24.0
2a+b*c1.0+24.0 = 25.0
3sqrt(25.0)5.0
4printf("%.2f", ...)5.00

若完整撰寫程式,通常需引入:

🔒

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

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

免費註冊

第 18 題1 分

Which of the following C code is used to declare a two-dimensional array of integers with 5 rows and 3 columns?

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

這一題的完整詳解

核心觀念

C 語言的二維整數陣列宣告格式為:

資料型別 陣列名稱[列數][欄數];

因此,宣告「5 列、3 欄」的整數二維陣列,應寫成:

int data[5][3];

其中:

  • int:每個元素都是整數型別。
  • data:陣列名稱。
  • 第一個 [5]:表示有 5 列。
  • 第二個 [3]:表示每列有 3 欄。
  • 總元素數量為:
5×3=155 \times 3 = 15

有效索引範圍為:

  • 列索引:0~4
  • 欄索引:0~2

解題方法

直接套用 C 語言二維陣列的宣告規則:

int data[rows][columns];\texttt{int data[rows][columns];}

題目指定:

rows=5,columns=3rows = 5,\qquad columns = 3

代入後:

int data[5][3];

存取元素時,使用兩個索引:

data[列索引][欄索引]

例如:

data[0][0] = 10; // 第 1 列、第 1 欄
data[4][2] = 20; // 第 5 列、第 3 欄

逐步對應如下:

程式碼意義
data[0][0]第 1 列第 1 欄
data[0][2]第 1 列第 3 欄
data[4][0]第 5 列第 1 欄
data[4][2]第 5 列第 3 欄

選項分析

(A) int data[5,3];

錯誤。

C 語言的陣列維度必須使用兩組獨立的中括號:

data[5][3]

[5,3] 中的逗號不是分隔列數與欄數的語法。在 C 語言中,逗號運算子會使 5,3 的結果為 3,因此這並不代表 5 列 3 欄的二維陣列。


🔒

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

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

免費註冊

第 19 題1 分

What is the output of the following statements?

int x = 3;

switch (x+1) {

    case 3:

        printf("3 ");

    case 4:

        printf("4 ");

    case 5:

        printf("5 ");

        break;

    case 6:

        printf("6 ");

    default:

        printf("X");

}

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

這一題的完整詳解

核心觀念

本題考查 C 語言 switch 的執行機制,重點包括:

  1. switch (expression) 會先計算 expression 的值。
  2. 程式從與該值相符的 case 開始執行。
  3. case 本身不會自動形成區塊;若沒有遇到 break,會繼續執行下一個 case,此現象稱為「穿透」(fall-through)。
  4. 遇到 break 後,立即跳出整個 switch 結構。
  5. default 只有在沒有任何 case 符合時才會執行;若程式已從某個 case 穿透到 default,則 default 內的敘述也會執行。

解題方法與逐步追蹤

先計算 switch 括號中的表達式:

x+1=3+1=4x+1=3+1=4

因此,程式會從:

case 4:

開始執行,而不是從 case 3 開始。

逐步執行如下:

執行位置動作輸出
case 4:執行 printf("4 ");4
case 5:因前一段沒有 break,繼續執行 printf("5 ");4 5
break;跳出 switch停止執行
case 6:不會執行無
default:不會執行無

因此完整輸出為:

4 5

選項分析

  • (A) 3 4 5 6 X:錯誤
🔒

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

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

免費註冊

第 20 題1 分

Which following is the correct way to create a dictionary in Python?

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

這一題的完整詳解

核心觀念

Python 的 dictionary(字典)是由「鍵(key):值(value)」配對組成的資料結構,使用大括號 {} 建立,基本語法如下:

dictionary = {key1: value1, key2: value2}

其中:

  • 鍵與值之間使用冒號 :
  • 不同的鍵值配對之間使用逗號 ,
  • 每個鍵必須具備唯一性
  • 字串通常以單引號或雙引號包住

本題要求建立含有兩組資料的字典:

{
 'name': 'alice',
 'score': 60
}

解題方法

逐一檢查字典語法中的兩個關鍵符號:

  1. 鍵和值之間必須使用冒號 :
  2. 不同配對之間必須使用逗號 ,

正確形式為:

students = {'name': 'alice', 'score': 60}

因此正確選項是(E)。

選項分析

(A) students = {'name'=>'alice'; 'score'=>60}

錯誤,原因有兩項:

  • Python 字典的鍵和值之間必須使用冒號 :,不能使用 =>
  • 不同項目之間必須使用逗號 ,,不能使用分號 ;

=> 常見於部分其他程式語言或語法表示法,並非 Python dictionary 的建立語法。


(B) students = {'name'='alice'; 'score'=60}

錯誤,原因有兩項:

  • 鍵和值之間不能使用等號 =
  • 不同項目之間不能使用分號 ;

等號 = 是 Python 的指定運算子,例如:

students = ...

但在字典內部,必須使用冒號表示鍵值關係。


(C) students = {'name':'alice'; 'score':60}

錯誤。

🔒

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

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

免費註冊

第 21 題1 分

What is the output of this code in Python?

list = ['a', 'b', 'c', 'd', 'e']

print(list[1:])

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

這一題的完整詳解

核心觀念

本題考查 Python 的:

  • 串列(list)索引
  • 切片(slicing)語法
  • 索引從 0 開始

題目建立串列:

list = ['a', 'b', 'c', 'd', 'e']

其索引位置如下:

索引內容
0'a'
1'b'
2'c'
3'd'
4'e'

Python 的切片語法為:

list[start:end]

其規則是:

  • 從 start 開始取
  • 取到 end 的前一個位置
  • end 未寫出時,代表取到串列結尾

因此:

list[1:]

表示從索引 1 開始,一直取到最後。

解題方法

先判斷索引 1 對應的元素:

list[1] == 'b'

由於冒號後方沒有指定結束索引:

list[1:]

等同於:

list[1:5]

因此會依序取出索引 1、2、3、4 的元素:

['b', 'c', 'd', 'e']

執行 print 後,輸出為:

['b', 'c', 'd', 'e']

逐步追蹤(Trace)

原始串列:

list = ['a', 'b', 'c', 'd', 'e']

索引對照:

索引: 0 1 2 3 4
內容: 'a' 'b' 'c' 'd' 'e'

執行:

list[1:]

取值範圍:

從索引 1 開始 → 索引 1、2、3、4

取出的內容:

['b', 'c', 'd', 'e']

最後輸出:

['b', 'c', 'd', 'e']

選項分析

(A) []

🔒

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

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

免費註冊

第 22 題1 分

What does the following Python program fragment do?

s=0

for i in range(3,10):

    s+=i

print(s)

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

這一題的完整詳解

核心觀念

本題考查 Python 的 range 函式與 for 迴圈累加機制。

range(3,10) 的規則是:

  • 起始值為 33,包含 33
  • 終止值為 1010,不包含 1010
  • 預設間隔為 11

因此,迴圈變數 i 依序取得:

3,4,5,6,7,8,93,4,5,6,7,8,9

程式中的 s+=i 等同於:

s = s + i

代表將每次的 i 加到變數 s 中。


解題方法與逐步追蹤

程式如下:

s = 0

for i in range(3, 10):
 s += i

print(s)

逐次追蹤如下:

執行次數i累加前的 s執行 s += i 後的 s
第 1 次303
第 2 次437
第 3 次5712
第 4 次61218
第 5 次71825
第 6 次82533
第 7 次93342

所以最後輸出:

s=3+4+5+6+7+8+9=42s=3+4+5+6+7+8+9=42

程式的功能是計算:

3+4+5+6+⋯+93+4+5+6+\cdots+9

選項分析

(A) Calculate the sum of 1+2+⋯+101+2+\cdots+10

錯誤。range(3,10) 不會從 11 開始,也不包含 1010,因此不會計算 11、22 與 1010。


(B) Calculate the sum of 1+4+7+101+4+7+10

🔒

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

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

免費註冊

第 23 題1 分

Which of the following statements about the format specifier for printf() function in C is incorrect?

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

這一題的完整詳解

核心觀念

本題考查 C 語言 printf 的格式指定字元(format specifier)。格式指定字元放在 % 之後,用來指定輸出資料的表示方式。

常見格式如下:

格式指定字元功能
%d以十進位輸出有號整數
%x以十六進位輸出整數,使用小寫英文字母
%X以十六進位輸出整數,使用大寫英文字母
%f以浮點數格式輸出
%c輸出單一字元
%s輸出字串

標準 C 語言的 printf 並沒有 %b 這個用來輸出二進位數的格式指定字元。


解題方法

逐一比對各選項與標準 C 語言中 printf 的格式指定字元定義:

  1. 判斷 %b 是否為標準格式。
  2. 判斷 %d、%x、%f 的用途。
  3. 再檢查選項 (E) 的「以上皆非」是否成立。

只要有一個選項正確描述了錯誤內容,該選項即為答案。


選項分析

(A) %b is used to print a binary number

此敘述錯誤。

在標準 C 語言中,printf 沒有 %b 格式指定字元,因此不能直接使用:

int n = 10;
printf("%b", n);

若要輸出二進位,通常需要自行撰寫轉換程式,例如:

#include <stdio.h>

void printBinary(unsigned int n) {
 if (n > 1)
 printBinary(n / 2);
 printf("%d", n % 2);
}

int main(void) {
 printBinary(10);
 return 0;
}

執行追蹤:

  • 10÷2=510 \div 2 = 5,餘數 00
  • 5÷2=25 \div 2 = 2,餘數 11
  • 2÷2=12 \div 2 = 1,餘數 00
  • 11 不再遞迴,輸出 11
  • 依遞迴返回順序輸出:1010

因此,十進位 1010 的二進位表示為 10101010。

部分非標準函式庫或特定編譯器可能額外支援 %b,但在標準 C 語言考試中,應判定 %b 並非 printf 的標準格式指定字元。


(B) %d is used to print a decimal number

此敘述正確。

🔒

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

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

免費註冊

第 24 題1 分

Consider an array declaration int data[5]={1,2,3,4,5}; in C. What is the value of data[5]?

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

這一題的完整詳解

核心觀念:C 語言陣列索引從 0 開始

宣告:

int data[5] = {1, 2, 3, 4, 5};

代表陣列共有 55 個元素,合法索引範圍為:

0≤index≤40 \leq \text{index} \leq 4

各索引對應如下:

索引值
data[0]1
data[1]2
data[2]3
data[3]4
data[4]5

因此,data[5] 已經超出陣列的合法範圍。

解題方法

判斷陣列存取是否合法,先看陣列大小,再確認索引是否落在合法範圍。

此題中:

int data[5];

陣列大小為 55,索引從 00 開始,因此最後一個合法元素是:

data[4]

而:

data[5]

是對陣列界限外記憶體位置的存取。C 語言不會自動將它視為 00,也不會依照數列規律推算為 66。讀取此位置的值屬於未定義行為(undefined behavior),程式結果不可預期。

概念上的索引追蹤如下:

🔒

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

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

免費註冊

第 25 題1 分

Which of the following C code is used to declare two pointers of integer?

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

這一題的完整詳解

核心觀念

本題考查 C 語言的「宣告子(declarator)」規則,重點是判斷星號 * 究竟套用在哪一個變數上。

在 C 語言中:

  • int *p;:宣告 p 為「指向 int 的指標」。
  • int p;:宣告 p 為 int 整數。
  • 同一個宣告句中的每個變數,都必須各自寫出適用的 *。

因此,若要宣告兩個指向整數的指標,應寫成:

int *p, *q;

解題方法

逐一解析變數宣告中的每個宣告子:

int *p, *q;

可拆成:

int *p;
int *q;

兩者都表示:

  • p 的型別是 int *
  • q 的型別是 int *

所以這正是「宣告兩個整數指標」。

必須注意,宣告開頭的 int 是基本型別,而 * 只會作用在緊接著的宣告子上,不會自動套用到同一行的所有變數。


選項分析

(A) int *p,q;

錯誤。

此宣告等同於:

int *p;
int q;

因此:

  • p 是指向 int 的指標
  • q 是一般的 int 整數

只有一個指標,不是兩個指標。


(B) int *p,*q;

正確。

此宣告等同於:

int *p;
int *q;
🔒

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

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

免費註冊

第 26 題1 分

Which of the following code could not be used to ignore all remaining characters in the current input line?

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

這一題的完整詳解

核心觀念

本題考查 C 語言的「清空目前輸入列」技巧,以及下列函式的特性:

  • scanf("%c", &ch):讀取一個字元,包括空白與換行字元。
  • getchar:從標準輸入讀取一個字元並回傳。
  • while 與 do...while 迴圈的執行時機。
  • 輸入列中的換行字元 '\n' 必須被讀取,迴圈才會停止。

若要忽略目前輸入列剩餘的所有字元,可持續讀取字元,直到讀到換行字元:

while (讀取到的字元 != '\n')
 繼續讀取;

假設目前輸入列為:

abc123\n

若程式開始執行時,輸入列中尚有 abc123\n,正確的清除動作會依序讀取:

'a' → 'b' → 'c' → '1' → '2' → '3' → '\n'

讀到 '\n' 後停止。


解題方法

逐一檢查每個選項是否具備以下兩項條件:

  1. 每次迴圈確實讀取一個輸入字元。
  2. 讀到 '\n' 時停止。

只要符合這兩個條件,就能忽略目前輸入列剩餘的字元。


選項分析

(A) do {scanf("%c", &ch);} while (ch != '\n');

此程式使用 do...while:

do {
 scanf("%c", &ch);
} while (ch != '\n');

do...while 會先執行迴圈本體,再判斷條件。

每次執行:

scanf("%c", &ch);

都會讀取一個字元。格式控制字串為 "%c",因此空白、標點及換行字元都會被讀取,不會自動跳過空白。

當讀到:

ch == '\n'

條件 ch != '\n' 為假,迴圈停止。

例如輸入列為 abc\n:

次數讀入的字元ch != '\n'動作
1'a'真繼續
2'b'真繼續
3'c'真繼續
4'\n'假停止

因此 (A) 可以達成目的。


(B) do {ch = getchar;} while (ch != '\n');

此程式同樣使用 do...while:

do {
 ch = getchar;
} while (ch != '\n');

getchar 每次讀取一個字元,並將結果指定給 ch。

讀到一般字元時,條件:

ch != '\n'

為真,繼續讀取;讀到換行字元時,條件為假,迴圈停止。

因此 (B) 可以忽略目前輸入列剩餘的所有字元。


🔒

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

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

免費註冊

第 27 題1 分

What is the output of the following program?

int a[10] = {3,2,3,4,5,4,7,1,3,2};

int b[10] = {0,0,0,0,0,0,0,0,0,0};

for(i = 0; i < 10; i=i+1)

    b[a[i]-1] = b[a[i]-1] + 1;

printf("%d", b[2]);

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

這一題的完整詳解

核心觀念

本題考查:

  1. 陣列索引從 0 開始
  2. 利用計數陣列統計數值出現次數
  3. 陣列元素的間接存取
  4. for 迴圈逐一處理資料

已知:

a={3,2,3,4,5,4,7,1,3,2}a = \{3,2,3,4,5,4,7,1,3,2\}

陣列 b 初始全部為 00:

b={0,0,0,0,0,0,0,0,0,0}b = \{0,0,0,0,0,0,0,0,0,0\}

程式核心:

b[a[i]-1] = b[a[i]-1] + 1;

當 a[i] = k 時,會將:

b[k-1]

增加 11。因此,b[k-1] 用來記錄數值 kk 在陣列 a 中出現的次數。

題目最後輸出:

printf("%d", b[2]);

因為:

b[2] 對應的是數值 2+1=3b[2] \text{ 對應的是數值 } 2+1=3

所以 b[2] 代表數值 33 在 a 中的出現次數。


解題方法:逐步追蹤

逐一查看陣列 a 的元素,並將對應的 b[a[i]-1] 加 11。

iia[i]被增加的元素b 的變化
03b[2]b[2] = 1
12b[1]b[1] = 1
23b[2]b[2] = 2
34b[3]b[3] = 1
45b[4]b[4] = 1
54b[3]b[3] = 2
67b[6]b[6] = 1
71b[0]b[0] = 1
83b[2]b[2] = 3
92b[1]b[1] = 2

最後的 b 為:

b={1,2,3,2,1,0,1,0,0,0}b = \{1,2,3,2,1,0,1,0,0,0\}

因此:

b[2]=3b[2] = 3

也可直接在原陣列中數值 33 的出現次數:

3,2,3,4,5,4,7,1,3,23,2,\boxed{3},4,5,4,7,1,\boxed{3},2
🔒

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

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

免費註冊

第 28 題1 分

What is the output of this code in Python?

r = lambda q: q * 2

s = lambda q: q * 3

x = 2

x = r(x)

x = s(x)

x = r(x)

print (x)

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

這一題的完整詳解

核心觀念

本題考查 Python 的:

  • lambda 匿名函式
  • 函式呼叫與回傳值
  • 變數重新指定
  • 程式碼依序執行的特性

lambda q: q * 2 的意思是:建立一個函式,輸入參數 q 後,回傳 q×2q \times 2。

因此:

r = lambda q: q * 2

等同於定義一個「輸入值乘以 22」的函式。

s = lambda q: q * 3

則是定義一個「輸入值乘以 33」的函式。

解題方法

程式會由上而下依序執行,每次將計算結果重新指定給變數 x。

初始值:

x=2x = 2

第一次執行

x = r(x)

函式 r 會將輸入值乘以 22:

x=r(2)=2×2=4x = r(2) = 2 \times 2 = 4

此時:

x=4x = 4

第二次執行

x = s(x)

函式 s 會將輸入值乘以 33:

x=s(4)=4×3=12x = s(4) = 4 \times 3 = 12

此時:

x=12x = 12

第三次執行

x = r(x)

再次使用函式 r:

x=r(12)=12×2=24x = r(12) = 12 \times 2 = 24

最後執行:

print(x)

輸出:

24

逐步追蹤表

執行指令計算結果x 的值
x = 2初始值22
x = r(x)2×22 \times 244
x = s(x)4×34 \times 31212
🔒

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

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

免費註冊

第 29 題1 分

What is the output of this code in C++?

#include<iostream>

using namespace std;

class Constructor1 {

public:

    Constructor1()

    { cout << "constructor1 called" << endl; }

};

class Constructor2 {

public:

    Constructor2()

    { cout << "constructor2 called" << endl; }

};

class Derived: public Constructor1, public Constructor2 {

public:

    Derived()

    { cout << "Derived's constructor called" << endl; }

};

int main()

{

    Derived d;

    return 0;

}

(A) constructor1 called
constructor2 called
Derived's constructor called

(B) constructor2 called
constructor1 called
Derived's constructor called

(C) Derived's constructor called

(D) Compile error

(E) None of the above

校方公布看官方參考答案 ▾
官方參考答案A校方公布

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

這一題的完整詳解

核心觀念:多重繼承的建構順序

本題考查 C++ 中「衍生類別建構物件時,基底類別建構子的呼叫順序」。

Derived 繼承兩個基底類別:

class Derived: public Constructor1, public Constructor2

繼承列表的順序為:

  1. Constructor1
  2. Constructor2

C++ 建構衍生類別物件時,固定依照以下順序:

  1. 先呼叫基底類別建構子,順序依繼承列表排列。
  2. 再執行衍生類別建構子的本體。
  3. 最後才完成物件建立。

因此,建立 Derived d; 時,會先建立 Constructor1 部分,再建立 Constructor2 部分,最後執行 Derived 建構子的內容。

解題方法與逐步追蹤

關鍵程式碼如下:

class Derived: public Constructor1, public Constructor2 {
public:
 Derived
 {
 cout << "Derived's constructor called" << endl;
 }
};

執行:

Derived d;

逐步追蹤如下:

第 1 步:呼叫 Constructor1 建構子

cout << "constructor1 called" << endl;

輸出:

constructor1 called

第 2 步:呼叫 Constructor2 建構子

cout << "constructor2 called" << endl;

輸出:

constructor2 called

第 3 步:執行 Derived 建構子本體

cout << "Derived's constructor called" << endl;

輸出:

Derived's constructor called

因此完整輸出為:

🔒

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

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

免費註冊

第 30 題1 分

Assuming that tt is an array and tPtr is a pointer to that array, which expression refers to the address of element 5 of the array?

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

這一題的完整詳解

核心觀念

本題主要測驗 C/C++ 語言中陣列(Array)與指標(Pointer)的對等關係,以及**取址運算子(Address-of Operator &)與反參考運算子(Dereference Operator *)**的運算規則:

  1. 陣列名稱的指標衰退(Array to Pointer Decay):
    在 C/C++ 中,一維陣列名稱 t 在大部分運算式中會自動衰退為「指向其首個元素(索引 0)的指標」,型態相當於 &t[0]。
  2. 指標算術(Pointer Arithmetic)與下標運算(Subscripting)的等價性:
    根據 C 語言標準規範,下標運算式 E1[E2] 定義上完全等價於 *((E1) + (E2))。
  3. 取址(Address)與取值(Value)的區別:
  • 題目要求取得「第 5 個元素的位址(address)」。
  • & 代表取址運算,回傳該元素的記憶體位址(指標型態)。
  • * 代表取值(解引用),取得指標所指向位址之實體內容。

解題方法

  1. 鎖定目標元素與需求:
  • 題目指定為「element 5(索引為 5 的元素,即 t[5])」。
  • 要求的是該元素的「位址(address)」,因此表示式必須是指標型態(Pointer),指向 t[5]。
  1. 推導標準寫法:
  • 最直接的取址語法為:對元素 t[5] 套用取址運算子 &,得到 &t[5]。
  • 依據指標運算等價替換:
    &t[5]  ⟺  &(∗(t+5))  ⟺  t+5\&t[5] \iff \&(*(t + 5)) \iff t + 5
  • 題目中已宣告 tPtr 指向該陣列(即 tPtr = t;),故:
    &tPtr[5]  ⟺  tPtr+5\&tPtr[5] \iff tPtr + 5
  1. 檢視各選項與官方答案:
  • 選項 (E) 寫作 &t[5],為標準且最無歧義的取址運算式。

選項分析

  • (A) *(tPtr+5):錯誤。

  • tPtr + 5 代表將指標向前移動 5 個元素距離,指向索引 5 元素的位址(型態為指標)。

  • 最外層加上反參考運算子 *,其作用為取出該位址所存放的數值(Value)。

  • 因此此式代表的是「索引 5 元素的值(Value)」,而非其位址。

  • (B) tPtr[5]:錯誤。

  • 根據 C 語言定義,tPtr[5] 完全等價於 *(tPtr + 5)。

🔒

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

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

免費註冊

第 31 題2 分

Which of the following network attacks is threatening integrity?

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

這一題的完整詳解

核心觀念

本題考查資訊安全的 CIA 三要素:

  • 機密性(Confidentiality):防止未授權者取得或閱讀資料。
  • 完整性(Integrity):確保資料在傳輸或儲存過程中未被未授權修改、刪除或偽造。
  • 可用性(Availability):確保合法使用者能正常取得服務與資源。

判斷網路攻擊威脅哪一項,重點在於觀察攻擊者的主要行為:

  • 偷看、竊取資料:通常威脅機密性。
  • 修改、偽造傳輸內容:威脅完整性。
  • 癱瘓服務、阻止正常存取:威脅可用性。

解題方法

逐一判斷各攻擊的核心作用:

  1. 是否攔截並修改通訊內容?
  2. 是否只是竊取或觀察資料?
  3. 是否讓系統或網路服務無法正常提供服務?

本題中,能直接威脅「完整性」的是攻擊者介入雙方通訊,並修改傳遞內容的攻擊,即 Man-in-the-middle。

選項分析

(A) Man-in-the-middle(中間人攻擊)——正確

中間人攻擊是指攻擊者插入通訊雙方之間,使雙方誤以為彼此直接通訊。攻擊者可以攔截、轉送,甚至修改訊息後再傳給接收者。

例如:

  1. 使用者傳送「匯款給甲」的指令。
  2. 攻擊者攔截訊息。
  3. 攻擊者將內容修改為「匯款給乙」。
  4. 伺服器收到遭竄改的訊息。

資料內容已被未授權修改,因此直接威脅資料的完整性。中間人攻擊也可能威脅機密性與身分驗證,但本題詢問威脅完整性的攻擊,故選此項。

(B) Denial of service(阻斷服務攻擊)——錯誤

阻斷服務攻擊的目的,是大量消耗伺服器的頻寬、處理能力或連線資源,使合法使用者無法正常使用服務。

它主要破壞的是:

Availability(可用性)\text{Availability(可用性)}

攻擊重點是「無法使用服務」,不是修改資料內容,因此不是本題所問的完整性威脅。

(C) Packet sniffing(封包側錄)——錯誤

封包側錄是利用網路監聽工具擷取傳輸中的封包,藉此取得帳號、密碼、訊息或其他敏感資料。

其主要威脅為:

🔒

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

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

免費註冊

第 32 題2 分

Which of the following is NOT a necessary condition for deadlock?

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

這一題的完整詳解

核心觀念

本題測驗作業系統(Operating System)中「死結(Deadlock)的四個必要條件(Coffman conditions)」。

在作業系統中,死結是指一組行程(Processes)中的每一個行程都在等待另一個行程所持有的資源,導致所有行程皆無法繼續執行的永久僵局。根據 Coffman(1971)的研究,死結若要發生,必須同時滿足以下四個必要條件(Necessary Conditions):

  1. 互斥(Mutual Exclusion):至少有一個資源必須處於非共享狀態,一次只能由一個行程使用。
  2. 持有並等待(Hold and Wait):行程必須持有至少一個資源,並同時等待取得被其他行程所持有的額外資源。
  3. 不可搶奪(No Preemption):資源無法被強制搶奪,必須由持有該資源的行程主動釋放。
  4. 循環等待(Circular Wait):存在一組行程 {P0,P1,…,Pn}\{P_0, P_1, \dots, P_n\},其中 P0P_0 等待 P1P_1 所持有的資源,P1P_1 等待 P2P_2 所持有的資源,…\dots,PnP_n 則等待 P0P_0 所持有的資源,形成資源相依的封閉環路。

只要破壞其中任何一個條件,即可預防(Prevent)死結的發生。


解題方法

本題詢問「何者**不是(NOT)**死結的必要條件」:

  1. 檢索 Coffman 四大必要條件:Mutual exclusion、Hold and wait、No preemption、Circular wait。
  2. 比對選項:
  • 選項 (A)、(C)、(D)、(E) 皆屬於死結的四大必要條件。
  • 選項 (B) **Convoy effect(護衛效應 / 列車效應)**是 CPU 排程(CPU Scheduling)中的現象,與死結的成因無關,故為非必要條件,即為本題所求。

選項分析

  • (A) Circular wait(循環等待):錯誤(屬於必要條件)。
  • 解釋:行程間形成閉環狀的資源等待鏈。
🔒

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

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

免費註冊

第 33 題2 分

Which one of the following operations is not performed by ALU (Arithmetic/Logic Unit)?

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

這一題的完整詳解

核心觀念

ALU(Arithmetic/Logic Unit,算術邏輯單元)是 CPU 中負責執行「資料運算」的部件,主要功能包括:

  • 算術運算:如加法、減法
  • 邏輯運算:如 AND、OR、NOT、XOR
  • 位元移位:如左移、右移、循環移位(circular shift)

ALU 的輸入通常來自暫存器或記憶體,運算結果會寫回暫存器,並可能更新狀態旗標,例如 Zero、Carry、Overflow、Negative。

相對地,Jump 是「改變程式執行流程」的控制操作。它會將程式計數器 PC(Program Counter)改成跳躍目標位址,使 CPU 從另一個指令位置繼續執行,主要由控制單元與 PC 更新機制處理,而非 ALU 的資料運算功能。

解題方法

判斷各選項是否屬於 ALU 的工作即可:

  1. 若操作是對資料進行算術運算、邏輯運算或位元移位,屬於 ALU 的職責。
  2. 若操作是改變指令執行順序、更新 PC,屬於控制單元的職責。
  3. 從各選項中找出不屬於資料運算的指令。

AND、OR、Circular shift 與 Addition 都是對資料內容進行運算;Jump 則是改變下一個要執行的指令位址。因此不由 ALU 執行的是 Jump。

選項分析

(A) AND

AND 是逐位元的邏輯運算。例如:

1010 AND 1100=10001010 \mathbin{\text{ AND }} 1100 = 1000

每一個位元只有在兩個輸入位元皆為 11 時,結果才為 11。這是典型的邏輯運算,由 ALU 執行。

因此此選項錯誤。

(B) OR

OR 同樣是逐位元的邏輯運算。例如:

1010 OR 1100=11101010 \mathbin{\text{ OR }} 1100 = 1110
🔒

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

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

免費註冊

第 34 題2 分

What is the smallest negative number using 1’s complement in a 64-bits computer?

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

這一題的完整詳解

核心觀念

本題考查 64 位元 1’s complement(1 的補數)表示法的數值範圍。

在 nn 位元電腦中:

  • 最高位元為符號位元:
  • 00 表示正數
  • 11 表示負數
  • 負數以其正數二進位表示逐位反相得到。
  • 1’s complement 有兩種零:
  • +0=000⋯000+0=000\cdots000
  • −0=111⋯111-0=111\cdots111

因此,64 位元中有:

  • 11 個符號位元
  • 6363 個數值位元

正數最大值為:

263−12^{63}-1

由於負數採 1’s complement 表示,最小的負數為正數最大值的相反數:

−(263−1)-(2^{63}-1)

所以數值範圍為:

−(263−1)≤x≤263−1-(2^{63}-1)\leq x\leq 2^{63}-1

解題方法

64 位元 1’s complement 的負數形成方式,是將正數的每一個位元反相。

正數最大值為 63 個數值位元全為 11:

011111⋯111011111\cdots111

其數值為:

263−12^{63}-1

將此位元形式逐位反相:

100000⋯000100000\cdots000

在 1’s complement 中,這個位元組合代表:

−(263−1)-(2^{63}-1)

因此,64 位元 1’s complement 能表示的最小負數為:

−(263−1)\boxed{-(2^{63}-1)}

選項分析

(A) −263-2^{63}

錯誤。

−263-2^{63} 是 **64 位元 2’s complement(二的補數)**能表示的最小值,因為 2’s complement 的範圍為:

🔒

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

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

免費註冊

第 35 題2 分

The widest range of free software licenses available under license terms approved by the Free Software Foundation and the Open Source Software Community. Which of the following statements is inappropriate?

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

這一題的完整詳解

核心觀念

本題考查自由軟體(Free Software)、開放原始碼軟體(Open Source Software)與 GNU GPL 授權條款的基本精神。

自由軟體並不代表「沒有版權」或「任何人可以毫無限制地使用」。其核心是:

  1. 軟體仍受著作權(copyright)保護。
  2. 著作權人透過授權條款,明確授予使用者執行、研究、重製、散布及修改軟體的權利。
  3. GNU GPL(GNU General Public License)特別強調使用者的自由,並透過 copyleft 機制要求衍生作品在散布時繼續以相容的自由授權方式提供。

因此,GPL 的重點不是禁止使用者修改軟體,而是保障使用者能夠合法地使用與修改軟體。

解題方法

題目問的是「Which statement is inappropriate?」,也就是找出不符合自由軟體授權精神的敘述。

判斷順序如下:

  1. GNU GPL 是否保障使用者的自由?
  2. 授權條款是否允許複製、散布與修改?
  3. 敘述是否與「使用者可以修改軟體」的核心精神矛盾?

自由軟體授權通常允許使用者:

  • 執行程式;
  • 研究程式如何運作;
  • 重製程式;
  • 散布程式;
  • 修改程式;
  • 散布修改後的版本。

因此,只要選項主張「使用者不得修改軟體」,就與 GNU GPL 的基本精神相矛盾。

選項分析

(A) The GNU GPL can protect the rights of software publishers.

GNU GPL 可以透過著作權與授權條款保護軟體發布者的權利,因此此敘述正確。

自由軟體仍然具有著作權。軟體作者或發布者可以:

  • 保留著作權聲明;
  • 規定他人使用軟體時必須遵守 GPL;
  • 要求散布修改版本時提供相應的授權條款;
  • 要求提供對應的原始碼或取得原始碼的方式。

所以,GPL 並不是放棄著作權,而是利用著作權來保障軟體自由使用與持續開放的條件。

(B) Guaranteed freedom for end users (individuals, organizations, businesses) to operate, learn and share.

此敘述正確。

自由軟體授權的使用者不限於個人,也包括:

  • 個人使用者;
  • 學校與研究機構;
  • 非營利組織;
  • 公司與商業機構。

使用者在符合授權條款的前提下,通常可以:

  • 執行軟體;
  • 學習及研究軟體的運作方式;
  • 複製並分享軟體;
  • 修改後再使用或散布。

這正是 Free Software Foundation 所強調的使用者自由。

🔒

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

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

免費註冊

第 36 題2 分

Which of the following is an appropriate statement about the Python language?

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

這一題的完整詳解

核心觀念

本題考查 Python 的程式設計典範(programming paradigms)。

  • 物件導向程式設計(Object-Oriented Programming, OOP):以物件(object)與類別(class)為核心,將資料與操作資料的方法封裝在一起,並支援封裝、繼承、多型等概念。
  • 程序導向程式設計(Procedure-Oriented Programming, POP):以程序(procedure)、函式(function)或執行步驟為核心,按照程式流程逐步完成工作。

Python 是一種多典範程式語言(multi-paradigm programming language),同時支援:

  1. 物件導向程式設計(OOP)
  2. 程序導向程式設計(POP)
  3. 函數式程式設計(functional programming)等

因此,Python 並不限定程式設計者只能使用單一種程式設計方式。


解題方法

判斷本題只需分別確認 Python 是否支援 OOP 與 POP。

Python 中可以建立類別與物件,例如:

class Student:
 def __init__(self, name):
 self.name = name

 def introduce(self):
 print("I am " + self.name)

student = Student("Amy")
student.introduce

上述程式使用 class 建立 Student 類別,並建立 student 物件,屬於物件導向程式設計。

Python 也可以直接以函式與順序流程撰寫程式,例如:

def add(a, b):
 return a + b

result = add(2, 3)
print(result)

這段程式沒有建立類別,主要透過函式完成工作,屬於程序導向的寫法。

🔒

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

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

免費註冊

第 37 題2 分

Which of the following statement about recursive functions is true?

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

這一題的完整詳解

核心觀念

本題考查計算機科學中**遞迴(Recursion)與迭代(Iteration)**的本質差異、實作機制及其在記憶體與執行效率上的特性:

  1. 控制架構:遞迴透過「函式自我呼叫(Function self-calling)」與「基本情況(Base case)」來控制重複行為與終止;迭代則使用條件式迴圈架構(如 for、while)。
  2. 狀態保存與區域變數:在等價邏輯下,非遞迴(迭代)常需顯式宣告多個輔助變數(例如計數器、前項暫存變數、顯式堆疊指標等);遞迴則將狀態轉移封裝在函式參數與系統呼叫堆疊(Call Stack)中,常規程式碼中宣告的區域變數通常較少。
  3. 效能代價:遞迴執行時每一次函式呼叫均伴隨訊框(Stack Frame)的推入與彈出(Push/Pop)、暫存器保存與還原,通常耗費額外的時間與記憶體空間(O(n)O(n) 呼叫堆疊深度),並非用來提升執行速度。

解題方法

比對遞迴與非遞迴常式(以經典的階乘或費氏數列為典型代表)之結構與運算機制:

  • 遞迴版本:
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}

空間複雜度:O(n)O(n)(呼叫堆疊);程式內無額外區域變數(或極少)。

  • 非遞迴(迭代)版本:
int factorial(int n) {
int result = 1; // 輔助/區域變數
for (int i = 2; i <= n; i++) { // 迴圈計數器變數
result *= i;
}
return result;
}

空間複雜度:O(1)O(1);函式內必須顯式宣告如 result、i 等多個區域變數來維持當前狀態與計數。

由此比對可知,遞迴常式通常具備「比等價的非遞迴常式使用更少區域變數」的語法結構特徵。


🔒

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

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

免費註冊

第 38 題2 分

Given a row-major array A(i,j)A(i,j) is defined as −2≤i≤6-2\leq i\leq 6, −6≤j≤−2-6\leq j\leq -2, where the location of A(2,−4)A(2,-4) is 100 as the base address and the location of A(4,−3)A(4,-3) is 122. Which of the following is the correct storage size for an element stored in the array?

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

這一題的完整詳解

核心觀念

本題考查二維陣列的:

  • Row-major order(列優先儲存)
  • 陣列元素的儲存位置計算
  • 每個元素所占的儲存單位數

Row-major order 的意思是:先依序儲存同一列的所有欄元素,再儲存下一列。

陣列範圍為:

−2≤i≤6,−6≤j≤−2-2\leq i\leq 6,\qquad -6\leq j\leq -2

因此每一列共有:

(−2)−(−6)+1=5(-2)-(-6)+1=5

個元素。

設每個元素的儲存大小為 ww,則列優先下,A(i,j)A(i,j) 與 A(i′,j′)A(i',j') 的位置差為:

[(i′−i)×每列元素數+(j′−j)]×w\big[(i'-i)\times \text{每列元素數}+(j'-j)\big]\times w

解題方法

已知:

A(2,−4) 的位置=100A(2,-4)\text{ 的位置}=100 A(4,−3) 的位置=122A(4,-3)\text{ 的位置}=122

從 A(2,−4)A(2,-4) 移動到 A(4,−3)A(4,-3):

  1. 列索引由 22 增加到 44,共跨越 22 列。
  2. 每列有 55 個元素,因此跨越:
2×5=102\times 5=10

個元素位置。

  1. 欄索引由 −4-4 增加到 −3-3,再前進 11 個元素。

所以總共前進:

10+1=1110+1=11

個元素。

兩個位置相差:

122−100=22122-100=22

因此:

11w=2211w=22 w=2w=2

每個陣列元素的儲存大小為 22。


選項分析

(A) 1

錯誤。

若每個元素占 11 單位,兩元素間相差 1111 個單位,則 A(4,−3)A(4,-3) 的位置應為:

100+11×1=111100+11\times 1=111
🔒

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

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

免費註冊

第 39 題2 分

According to Amdahl's Law, what is the speedup gain for an application that is 60% parallel and we run it on a machine with 6 processing cores (compared to the machine with 1 core)?

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

這一題的完整詳解

核心觀念:Amdahl’s Law

Amdahl’s Law 用來估計程式在增加處理器核心數後,整體執行速度最多能提升多少。關鍵在於:

  • 程式中可平行化的部分,才能由多核心共同處理。
  • 無法平行化的部分,仍只能依序執行,會限制整體加速效果。

Amdahl’s Law 公式為:

S(N)=1(1−P)+PNS(N)=\frac{1}{(1-P)+\frac{P}{N}}

其中:

  • S(N)S(N):使用 NN 個核心時,相對於單核心的 speedup
  • PP:可平行化比例
  • 1−P1-P:不可平行化比例
  • NN:處理器核心數

解題方法

題目給定:

P=0.6,1−P=0.4,N=6P=0.6,\qquad 1-P=0.4,\qquad N=6

代入公式:

S(6)=1(1−0.6)+0.66S(6)=\frac{1}{(1-0.6)+\frac{0.6}{6}}

先計算平行化部分在 6 核心下所需的時間比例:

0.66=0.1\frac{0.6}{6}=0.1

因此總執行時間比例為:

0.4+0.1=0.50.4+0.1=0.5

相對於單核心的加速倍率為:

S(6)=10.5=2S(6)=\frac{1}{0.5}=2

所以使用 6 個核心後,速度是單核心的 2 倍。

選項分析

  • (A) 1.2:錯誤。
    未依照 Amdahl’s Law 分離不可平行化部分與可平行化部分,計算結果不符合公式。

  • (B) 2:正確。
    由公式可得:

🔒

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

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

免費註冊

第 40 題2 分

Given the relation below:

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

The relation is:

XABC
257
336
442
622

What values will be retrieved by the following SQL statement?

SELECT A, B FROM X WHERE X.B = X.C

本題附圖正在準備中,以下為原卷對應頁面:
原卷第 9 頁

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

這一題的完整詳解

核心觀念

本題考查 SQL 的 WHERE 條件篩選,以及關聯式資料表中的欄位比較。

SQL 語句為:

SELECT A, B FROM X WHERE X.B = X.C

意思是:

  1. 從資料表 X 中逐筆檢查資料。
  2. 只保留欄位 B 與欄位 C 數值相等的資料列。
  3. 對符合條件的資料列,只輸出欄位 A、B。

解題方法

逐列比較 BB 與 CC:

資料列ABCB=CB=C?
1257否
2336否
3442否
4622是

只有最後一列符合 B=CB=C,其 A=6A=6、B=2B=2。

因此查詢結果為:

(A,B)=(6,2)(A,B)=(6,2)

若以逐筆追蹤表示:

🔒

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

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

免費註冊

第 41 題2 分

Which of the following bit patterns violates odd parity check?

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

這一題的完整詳解

核心觀念

Odd parity(奇同位檢查)的規則是:整組 bit pattern 中,1 的總數必須是奇數。

若 1 的總數為偶數,則表示違反 odd parity check。

判斷公式可寫成:

奇同位成立  ⟺  ∑(所有 bit 中的 1)≡1(mod2)\text{奇同位成立} \iff \sum \text{(所有 bit 中的 1)} \equiv 1 \pmod{2}

因此,本題只要逐一計算各選項中 1 的個數即可。

解題方法

逐項計算 1 的數量:

  • 1 的數量為奇數:通過 odd parity check
  • 1 的數量為偶數:違反 odd parity check

選項分析

(A) 00011111

其中有:

5 個 15 \text{ 個 } 1

55 是奇數,符合 odd parity,不違反。

(B) 01010101

其中有:

4 個 14 \text{ 個 } 1
🔒

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

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

免費註冊

第 42 題2 分

Which one of the following is a loopback address?

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

這一題的完整詳解

核心觀念

本題考查 IPv4 位址的特殊用途。

**Loopback address(回送位址)**是指主機用來指向「自己」的 IP 位址。資料封包送往回送位址時,不會經過實體網路卡,也不會傳送到其他主機,而是在本機內部回送,常用於:

  • 測試 TCP/IP 協定堆疊是否正常
  • 測試本機網路服務
  • 讓程式連線至同一台電腦上的服務

IPv4 的回送位址保留範圍為:

127.0.0.0/8127.0.0.0/8

也就是從 127.0.0.0 到 127.255.255.255。其中最常見的回送位址是:

127.0.0.1

因此本題答案為 127.0.0.1。

解題方法

判斷特殊 IPv4 位址時,可先辨認第一個八位元組:

  • 127:回送位址
  • 255.255.255.255:區域網路廣播位址
  • 0.0.0.0:未指定位址
  • 224~239:多點傳送位址
  • 一般其他範圍:通常是單點傳送位址

選項 (A) 的第一個八位元組為 127,且 127.0.0.1 是最典型的 loopback address。

選項分析

(A) 127.0.0.1:正確

127.0.0.0/8 整個網段都保留作為 IPv4 回送用途。

127.0.0.1 通常代表本機本身,等同於:

localhost

當使用者對 127.0.0.1 發出連線時,封包會在本機內部處理,不會送往外部網路。

(B) 255.255.255.255:錯誤

255.255.255.255 是 IPv4 的有限廣播位址(limited broadcast address)。

🔒

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

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

免費註冊

第 43 題2 分

Which one of the following is NOT considered as a basic concept in object-oriented programming (OOP)?

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

這一題的完整詳解

核心觀念

本題考查物件導向程式設計(Object-Oriented Programming, OOP)的基本概念。OOP 將資料與操作資料的方法封裝成「物件(object)」;常見核心概念包括:

  • Encapsulation(封裝)
  • Inheritance(繼承)
  • Polymorphism(多型)
  • Data abstraction(資料抽象化)

這些概念共同用來提升程式的模組化、可重用性、可維護性與安全性。

**Parallelism(平行性)**則是指同時執行多個工作或運算流程,屬於並行計算、平行計算與作業系統等領域的概念,並非 OOP 的基本核心概念。

解題方法

判斷每個選項是否屬於 OOP 的典型四大概念:

  1. 是否描述物件如何隱藏資料?
  2. 是否描述類別之間的階層與重用?
  3. 是否描述同一介面具有不同實作?
  4. 是否描述將複雜細節隱藏,只呈現必要功能?

符合上述特徵者屬於 OOP 基本概念;若是在描述多個程序同時執行,則不屬於 OOP 核心概念。

選項分析

(A) Parallelism

**Parallelism(平行性)**是將工作分割成多個部分,使其同時執行,以提升運算效率。例如多核心處理器同時執行多個執行緒。

它主要涉及:

  • 平行計算
  • 多核心處理
  • 執行緒與程序
  • 分散式系統

平行性可與物件導向程式搭配使用,但本身不是 OOP 的基本概念。

因此,(A) 是正確答案。

(B) Inheritance

**Inheritance(繼承)**允許子類別(subclass)取得父類別(superclass)的資料與方法,並可進一步擴充或覆寫功能。

例如:

class Animal
 method speak

class Dog inherits Animal
 method speak

Dog 繼承 Animal 的特性,能重用既有程式碼,並建立類別階層。

因此,Inheritance 是 OOP 的基本概念,本選項不是答案。

🔒

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

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

免費註冊

第 44 題2 分

An image can be represented in HSV color space. Here ‘V’ means

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

這一題的完整詳解

核心觀念

本題測驗數位影像處理與計算機圖學中常見的色彩空間(Color Space)模型——HSV 色彩模型(亦常稱 HSB 模型)。

在 HSV 模型中,色彩由三個維度構成:

  1. H(Hue,色相):代表色彩的基本屬性(如紅、綠、藍、黃等),以角度 0∘∼360∘0^\circ \sim 360^\circ 表示。
  2. S(Saturation,飽和度):代表色彩的純度或鮮豔程度,範圍為 0∼10 \sim 1(或 0%∼100%0\% \sim 100\%),值越低越接近灰色。
  3. V(Value,明度/色彩值):代表光的明亮程度,因此在計算機視覺與影像處理教科書中,常與 Brightness(亮度)互為通用術語(即 HSB 中的 B)。其數值範圍為 0∼10 \sim 1(或 0%∼100%0\% \sim 100\%),V=0V = 0 表示全黑。

解題方法

  1. 辨識縮寫定義:
  • HSV 縮寫源自 Hue, Saturation, Value。
  • 在數位影像處理領域(如 OpenCV、Adobe 圖形軟體或主流數位影像教科書),HSV 與 HSB(Hue, Saturation, Brightness)指的是同一種圓柱坐標色彩模型,因此「Value」所指的物理意義與視覺屬性即為「Brightness(明度/亮度)」。
  1. 比對選項:
  • 選項中並未列出單詞「Value」,但列出了與 Value 意義完全同義的 (C) Brightness。
  • 故本題的 'V' 即代表 Brightness。

選項分析

  • (A) Hue:錯誤。
    Hue 是 HSV 模型中的 'H',表示「色相」。

  • (B) Saturation:錯誤。
    Saturation 是 HSV 模型中的 'S',表示「飽和度」。

🔒

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

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

免費註冊

第 45 題2 分

In machine learning, when the result of testing error is significantly larger than the training error, it is called

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

這一題的完整詳解

核心觀念

本題考查機器學習中的 過度擬合(Overfitting)。

模型訓練時會利用 training data 調整參數,使訓練誤差(training error)降低;模型完成訓練後,再使用未參與訓練的 testing data 評估其泛化能力。

當模型出現下列情況:

Testing Error≫Training Error\text{Testing Error} \gg \text{Training Error}

表示模型在訓練資料上表現很好,卻無法有效處理新的資料。這通常代表模型不只學到資料中的一般規律,也記住了訓練資料中的雜訊與特殊細節,即稱為 過度擬合。

其典型特徵如下:

  • Training error:低
  • Testing error:高
  • 泛化能力:差
  • 常見原因:模型過於複雜、訓練資料不足、訓練過久

解題方法

直接比較題目描述與各名詞的定義:

題目指出 testing error 顯著大於 training error,代表模型對訓練資料適應良好,但對新資料表現不佳。

這正是過度擬合的定義,因此答案為:

Overfitting\boxed{\text{Overfitting}}

選項分析

(A) Underfitting

錯誤。Underfitting(欠擬合)表示模型過於簡單,連訓練資料的規律都無法學好,因此通常呈現:

  • Training error:高
  • Testing error:高

本題是 training error 很低、testing error 顯著較高,與欠擬合相反。

(B) Overfitting

正確。Overfitting(過度擬合)表示模型過度適應訓練資料,甚至記住訓練資料中的雜訊,導致:

🔒

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

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

免費註冊

第 46 題2 分

Which of the following statements is incorrect for the transport layer?

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

這一題的完整詳解

核心觀念

本題考查傳輸層(Transport Layer)中 TCP 與 UDP 的特性,以及傳輸層與網路層在位址使用上的關係。

協定可靠性連線方式主要識別資訊
TCP可靠傳輸連線導向IP 位址 + Port number
UDP不保證可靠無連線IP 位址 + Port number

IP 位址主要屬於網路層,用來識別不同主機;Port number 屬於傳輸層,用來識別同一主機上的不同應用程式。TCP 與 UDP 都必須透過 IP 位址,才能將資料送往正確的目的主機。

解題方法

逐一檢查各選項是否符合 TCP、UDP 的基本定義:

  1. 判斷 TCP 是否可靠且連線導向。
  2. 判斷 TCP 是否涉及 IP 位址。
  3. 判斷 UDP 是否不可靠且無連線。
  4. 判斷 UDP 是否也使用 IP 位址。

其中第 4 點是本題關鍵:UDP 雖然不可靠且無連線,但仍然必須依靠 IP 位址傳送資料。因此「UDP 不使用 IP 位址」是錯誤敘述。

選項分析

(A) TCP is a reliable and connection-oriented protocol

正確。

TCP 是可靠、連線導向的傳輸層協定。傳送資料前,必須先經過三向交握建立連線;傳輸過程中具備序號、確認訊息、重傳、流量控制與壅塞控制等機制,以確保資料可靠且依序抵達。

(B) TCP uses the IP address

正確。

TCP/IP 通訊中,TCP 端點通常由 IP 位址與埠號共同識別,例如:

TCP endpoint=(IP address,Port number)\text{TCP endpoint}=(\text{IP address},\text{Port number})

IP 位址負責找出目的主機,Port number 則負責找出主機上的目的應用程式。因此 TCP 通訊確實涉及 IP 位址。

🔒

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

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

免費註冊

第 47 題2 分

Which of the following statements is incorrect for the Ransomware?

(a) It is a type of denial-of-service attack

(b) It will encrypt the files to prevent the access

(c) It will lock the computer to prevent the normal usage

(d) It often uses phishing as an entry point

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

這一題的完整詳解

核心觀念

Ransomware(勒索軟體)是一種以勒索為目的的惡意軟體,主要機轉是:

  1. 入侵電腦或網路系統。
  2. 加密使用者的重要檔案,使檔案無法正常讀取。
  3. 部分勒索軟體會鎖定整台電腦,阻止使用者正常操作。
  4. 要求受害者支付贖金,以換取解密金鑰或恢復使用權。
  5. 常見入侵途徑包括 phishing(網路釣魚)、惡意附件、惡意連結、漏洞攻擊及弱密碼。

Denial-of-service attack(阻斷服務攻擊,DoS)的核心目標,是大量消耗伺服器或網路資源,使合法使用者無法取得服務;它通常不以加密受害者檔案及索取贖金為主要特徵。

因此,勒索軟體與阻斷服務攻擊是不同類型的資安威脅。

解題方法

本題要求找出「對 Ransomware 的描述不正確者」。

判斷時掌握勒索軟體的三個代表特徵:

  • 加密檔案,阻止存取。
  • 鎖定電腦,阻止正常使用。
  • 以釣魚信件等方式作為入侵入口。

再將這些特徵與 DoS 的定義比較即可。勒索軟體的主要分類是 malware(惡意軟體),不是 DoS attack,因此不正確的敘述是 (a)。

選項分析

(a) It is a type of denial-of-service attack

錯誤。

Ransomware 的主要作法是加密檔案或鎖定系統,藉此限制受害者使用資料與電腦,並進一步要求贖金。DoS 則是透過大量請求或資源耗用,使服務停止回應。

雖然勒索軟體可能造成使用者無法使用系統,產生類似「服務中斷」的結果,但「造成無法使用」不代表它就是 DoS 攻擊。兩者的攻擊機制與分類不同。

(b) It will encrypt the files to prevent the access

正確。

檔案加密是最典型的勒索軟體行為。攻擊者將檔案轉換成無法直接讀取的密文,使用者必須取得解密金鑰才能恢復存取。

🔒

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

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

免費註冊

第 48 題2 分

Which of the following data structures is in LIFO (Last In First Out) order?

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

這一題的完整詳解

核心觀念

本題考查資料結構的存取順序,重點是區分:

  • LIFO(Last In, First Out):後進先出
  • FIFO(First In, First Out):先進先出

**Stack(堆疊)**只能從同一端進行加入與刪除:

  • 加入資料:push
  • 移除資料:pop

最後加入堆疊的元素,會最先被取出,因此符合:

LIFO=Last In, First Out\text{LIFO}=\text{Last In, First Out}

例如依序將 AA、BB、CC 放入 Stack:

A→B→CA \rightarrow B \rightarrow C

取出順序為:

C→B→AC \rightarrow B \rightarrow A

因此 Stack 的資料存取順序就是後進先出。

解題方法

判斷資料結構的關鍵,在於觀察「資料加入與移除的位置」以及「移除順序」。

若資料只能從同一端加入與移除,則最晚加入的資料會最先離開,形成 LIFO,這正是 Stack 的特性。

相對地,Queue 從尾端加入資料、從前端移除資料,因此最早加入的資料會最先離開,形成 FIFO。

選項分析

(A) Array

Array(陣列)是一種以索引儲存資料的結構,元素可依索引直接存取,例如:

A[0],A[1],A[2],…A[0], A[1], A[2], \ldots

陣列本身沒有規定一定要遵守 LIFO 或 FIFO。使用者可以依需求存取任意索引位置,因此不能直接判定為 LIFO。

錯誤。

(B) General Array

General Array(一般陣列)同樣是以索引方式儲存與存取資料,沒有固定的加入與移除規則。

🔒

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

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

免費註冊

第 49 題2 分

If users including individuals, organizations, and enterprises can obtain computing, computing power, and shared software and hardware resource application services through the Internet, which of the following computing modes belong to the above statements?

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

這一題的完整詳解

核心觀念

本題考查**雲端運算(Cloud Computing)**的基本定義與特徵。

根據美國國家標準與技術研究院(NIST SP 800-145)的權威定義:
雲端運算是一種運算模式,使用者可透過網路(特別是網際網路)隨選存取(On-demand network access)一個由共享且可配置的運算資源集(例如:網路、伺服器、儲存設備、應用軟體及服務),並能以極少的管理成本或服務提供者介入,快速佈建與釋放這些資源。其三大服務模式包含:

  1. 軟體即服務(SaaS):透過網路提供軟體應用服務(如 Google Workspace、Microsoft 365)。
  2. 平台即服務(PaaS):提供開發環境與軟體工具集(如 Google App Engine)。
  3. 基礎架構即服務(IaaS):提供最底層的虛擬化運算能力、伺服器與硬體儲存資源(如 AWS EC2、Azure VM)。

題幹敘述「個人、組織與企業等使用者能透過網際網路取得運算能力,以及共享的軟硬體資源應用服務」,正是雲端運算的標準定義。


解題方法

由題幹提取三大關鍵詞進行模式比對:

  1. 「through the Internet」:以網際網路作為資源傳輸與存取的中介。
  2. 「shared software and hardware resource application services」:提供高度共享且虛擬化的軟硬體資源(涵蓋 IaaS、PaaS、SaaS)。
  3. 「obtain computing, computing power」:使用者按需獲取彈性運算效能,無需在本地端自建昂貴硬體。

將上述特徵比對各選項所代表之技術層級與架構模式,即可直接鎖定代表「以網路為基礎提供隨選共享資源之運算架構」的 Cloud(雲端運算)。


選項分析

  • (A) 錯誤。Client/server(主從式架構):
    是一種分散式運算架構,將任務分為「發出請求的客戶端(Client)」與「提供服務或資料的伺服端(Server)」。
🔒

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

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

免費註冊

第 50 題2 分

In application layer protocols including HTTP, SMTP, and FTP, what mechanism is usually used to translate the host name provided by the user into an IP address?

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

這一題的完整詳解

核心觀念

本題考查電腦網路架構中應用層(Application Layer)的名稱解析機制(Name Resolution)。
在網際網路協定(IP)網路中,主機之間實際進行路由與通訊時是依賴數值型的 IP 位址(如 IPv4 的 32 位元位址或 IPv6 的 128 位元位址);然而使用者習慣使用具有語意且易記的主機名稱或網域名稱(Host Name / Domain Name,例如 www.google.com)。因此,網路系統需要一套分散式的名稱解析服務,在使用者發起 HTTP、SMTP、FTP 等連線前,將人類可讀的主機名稱轉換為機器可尋址的 IP 位址,這項關鍵服務即為網域名稱系統(Domain Name System, DNS)。


解題方法

  1. 分析通訊流程需求:
  • 使用者在瀏覽器或用戶端輸入包含主機名稱的目標位址(例如 ftp.example.com、mail.example.com)。
  • 傳輸層與網路層建立連線(如 TCP 三向交握、IP 封包封裝)前,必須先取得該主機對應的目標 IP 位址。
  1. 對應協定功能:
  • 負責「主機名稱 →\rightarrow IP 位址」(正向解析,Forward DNS Lookup)以及「IP 位址 →\rightarrow 主機名稱」(反向解析,Reverse DNS Lookup)的標準應用層協定正是 DNS。
  • DNS 運作於應用層,預設使用 UDP/TCP 連接埠 53,為 HTTP、SMTP、FTP 等上層協定提供基礎的位址解析支援。

選項分析

  • (A) FTP(File Transfer Protocol,檔案傳輸協定):錯誤。
  • FTP 是專門用於在網路上的用戶端與伺服器之間進行檔案上傳與下載的應用層協定(預設使用 TCP port 20 傳輸資料、TCP port 21 傳輸控制指令),並不具備將主機名稱解析為 IP 位址的功能。
  • (B) Database(資料庫):錯誤。
  • 資料庫為組織、儲存與管理資料的通用系統。
🔒

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

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

免費註冊

第 51 題2 分

Assume the execution time of a running program is 50(log⁡n2)+850(\log n^2)+8, then what is the most suitable time complexity?

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

這一題的完整詳解

核心觀念

本題考查 Big-OO 時間複雜度,以及對 log⁡n2\log n^2 與 (log⁡n)2(\log n)^2 的辨識。

時間複雜度只保留輸入規模 nn 增大時的主要成長項,常數倍與低階常數項會被忽略。因此:

50log⁡(n2)+850\log(n^2)+8

中的常數 5050 與 88 不影響其漸近成長率。

依對數公式:

log⁡(n2)=2log⁡n\log(n^2)=2\log n

所以:

50log⁡(n2)+8=50(2log⁡n)+8=100log⁡n+850\log(n^2)+8 =50(2\log n)+8 =100\log n+8

其主要成長項為 log⁡n\log n,故時間複雜度為:

O(log⁡n)O(\log n)

解題方法

判斷此題的關鍵是區分:

log⁡(n2)\log(n^2)

與

(log⁡n)2(\log n)^2

兩者並不相同。

本題寫成 log n^2,依通常數學運算慣例解讀為:

log⁡(n2)\log(n^2)

利用對數性質:

log⁡(n2)=2log⁡n\log(n^2)=2\log n

因此原執行時間:

50log⁡(n2)+8=100log⁡n+850\log(n^2)+8 =100\log n+8

忽略常數倍 100100 與常數項 88 後,得到:

O(log⁡n)O(\log n)

選項分析

(A) O(log⁡n2)O(\log n^2)

若將此選項依數學慣例解讀為:

O(log⁡(n2))O(\log(n^2))

則它與 O(log⁡n)O(\log n) 等價,因為:

log⁡(n2)=2log⁡n\log(n^2)=2\log n

而 Big-OO 會忽略常數倍。

不過本題要求「最適合」的時間複雜度,應將結果化簡為最標準的形式,因此選擇 (C),而非保留未化簡的寫法。

(B) O((log⁡n)2)O((\log n)^2)

錯誤。

🔒

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

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

免費註冊

第 52 題2 分

According to the definition of the major topics of information ethics, “When can information be used for free? Under what circumstances should it be used with a payment or with the consent of the owner?” What does this statement mean?

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

這一題的完整詳解

核心觀念

本題考查資訊倫理的四大議題,常以 PAPA 縮寫表示:

  • Privacy:隱私
  • Accuracy:正確性
  • Property:財產權
  • Accessibility:可接近性/存取權

題幹詢問:

何時資訊可以免費使用?在什麼情況下,使用資訊必須付費或取得所有者同意?

關鍵在於「資訊的所有權、使用權、授權與付費」問題,這屬於資訊倫理中的 Property(財產權)。

資訊雖然可以透過網路取得,不代表使用者 automatically 擁有自由重製、修改、散布或商業利用的權利。若資訊受著作權、專利權、商標權、營業秘密或授權條款保護,使用時可能需要:

  1. 取得著作權人或所有者同意;
  2. 支付授權費;
  3. 遵守使用範圍與授權條件。

因此,本題答案為 (D) Property。


解題方法

判斷資訊倫理題目時,可先將題幹中的關鍵語意對應到 PAPA 四大議題:

題幹關鍵概念對應議題
誰可以取得或使用資訊Accessibility
資訊是否正確、完整、可靠Accuracy
個人資料是否受到保護Privacy
誰擁有資訊、是否需要授權或付費Property

本題出現「免費使用」、「付費」、「所有者同意」等字眼,核心是資訊的所有權與使用權,而不是資訊能否被取得。因此應選擇 Property。


選項分析

(A) Accessibility

Accessibility 是「資訊的可接近性或存取權」,主要探討:

  • 誰可以取得資訊;
  • 哪些人有權存取資料;
  • 資訊是否對使用者開放;
  • 是否存在數位落差或存取限制。

本選項與「能不能取得資訊」有關,但題目重點是「使用資訊是否需要付費或獲得所有者同意」,屬於所有權與授權問題,因此錯誤。

(B) Accuracy

🔒

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

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

免費註冊

第 53 題2 分

Which of the following statement is not the responsibility of an operation system?

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

這一題的完整詳解

核心觀念

本題考查作業系統(Operating System, OS)的核心功能與硬體分工邊界。

作業系統是一組控制與協調電腦硬體資源、並為應用程式提供服務的系統軟體。其核心職責包括:

  1. 行程與處理器管理(Process/CPU Management):負責行程的建立、排班(Scheduling)、同步與終止。
  2. 記憶體管理(Memory Management):負責主記憶體的配置(Allocation)、回收、保護與虛擬記憶體對應。
  3. 設備與輸出入管理(Device & I/O Management):透過設備驅動程式(Device Drivers)控制周邊設備,接收輸入並導出輸出。
  4. 檔案系統與儲存管理(File System & Storage Management):管理次級儲存裝置的目錄結構與資料存取。
  5. 使用者介面(User Interface):透過 CLI(命令列介面)或 GUI(圖形化介面)與使用者溝通互動。

關鍵分工界線:
作業系統負責載入(Load)程式至記憶體並設定 CPU 暫存器(如 Program Counter, PC),進行排班與分派(Dispatch);然而,逐條抓取、解碼並**實際執行(Execute)**機器指令的工作,是由硬體核心——**中央處理器(CPU)**來完成,並非作業系統的軟體職責。


解題方法

從「軟體職責(OS Responsibility)」與「硬體功能(Hardware Functionality)」的角色劃分切入分析:

  • 作業系統扮演的是「資源管理者(Resource Allocator)」與「控制程式(Control Program)」,負責監督程式的運作環境、配置系統資源與協調 I/O。
  • 指令週期的運作(Instruction Cycle:Fetch →\to Decode →\to Execute →\to Store)完全是由 CPU 控制單元(Control Unit, CU)與算術邏輯單元(Arithmetic Logic Unit, ALU)等硬體電路直接驅動執行。因此,「執行程式本體」屬於硬體 CPU 的核心功能,非作業系統本身的責任。

🔒

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

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

免費註冊

第 54 題2 分

Which of the following data type conversion may result in data loss?

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

這一題的完整詳解

核心觀念

本題考查程式語言(以 C/C++ 與 Java 為代表)中的資料型別轉換(Data Type Conversion)、記憶體位元寬度(Bit Width)與資料遺失(Data Loss)機制。

  1. 型別擴展與窄化(Widening vs. Narrowing Conversion):
  • 擴展轉換(Widening / Promotion):將儲存空間較小或數值範圍較窄的型別轉換為較大的型別(例如 char →\to int、float →\to double)。此類轉換屬於安全轉換,通常允許隱式轉換(Implicit Conversion),不會造成高位元截斷。
  • 窄化轉換(Narrowing / Demotion):將儲存空間較大或數值範圍較廣的型別轉換為較小的型別(例如 int →\to char)。此時高位元(Higher-order bits)會被硬性捨棄(截斷,Truncation),當原始數值超出目標型別的表示範圍時,會導致嚴重數值失真與資料遺失。
  1. 常見基本型別的位元寬度(以典型 32/64 位元環境為準):
  • bool:通常佔 1 個位元組(8 bits),數值僅有 0(false)或 1(true)。
  • char:1 個位元組(8 bits),表示範圍為 −128∼127-128 \sim 127(有號)或 0∼2550 \sim 255(無號)。
  • short:2 個位元組(16 bits),範圍為 −32,768∼32,767-32,768 \sim 32,767。
  • int:4 個位元組(32 bits),範圍為 −231∼231−1-2^{31} \sim 2^{31}-1(約 −2.14×109∼2.14×109-2.14 \times 10^9 \sim 2.14 \times 10^9)。
  • long:在 32 位元系統或 64 位元 Windows 為 4 個位元組,在 64 位元 Linux/macOS 為 8 個位元組(至少 ≥32\ge 32 bits)。
  • float:IEEE 754 單精確度浮點數(32 bits),含 1 個符號位元、8 個指數位元、23 個假數位元。
  • double:IEEE 754 雙精確度浮點數(64 bits),含 1 個符號位元、11 個指數位元、52 個假數位元。

解題方法

判斷資料型別轉換是否可能導致資料遺失,首要切入點為比對「來源型別」與「目標型別」的位元寬度大小及型別提升階層(Type Promotion Hierarchy):

bool→char→short→int→long→float→double\text{bool} \xrightarrow{} \text{char} \xrightarrow{} \text{short} \xrightarrow{} \text{int} \xrightarrow{} \text{long} \xrightarrow{} \text{float} \xrightarrow{} \text{double}
  • 順向箭頭轉換(由左至右)為「擴展轉換」,目標型別空間大於或等於來源型別。
  • 逆向箭頭轉換(由右至左)為「窄化轉換」,會發生位元截斷。

本題中,(B) 選項由 4 位元組(32 bits)的 int 轉換為 1 位元組(8 bits)的 char,屬於典型的窄化轉換。以下追蹤二進位截斷過程:

假設整數 x=300x = 300:

  • 32 位元 int 表示式為:
    00000000 00000000 00000001 00101100
  • 強制轉換為 8 位元 char 時,高位的 24 個位元直接丟棄,僅保留最低 8 位元:
    00101100(十進位值為 4444)

轉換後的數值由 300300 變為 4444,發生絕對的數值改變與資料遺失。


選項分析

🔒

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

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

免費註冊

第 55 題2 分

Which of the following statement is true?

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

這一題的完整詳解

核心觀念

本題考查基本邏輯閘與布林代數,重點包括:

  • NOT gate:反相閘,只有一個輸入。
  • AND gate:所有輸入皆為 11 時,輸出才為 11。
  • OR gate:任一輸入為 11 時,輸出即為 11。
  • XOR gate:兩個輸入不同時輸出 11。
  • NOR gate:OR gate 輸出再反相。
  • De Morgan 定律:
A⋅B‾=A‾+B‾\overline{A\cdot B}=\overline{A}+\overline{B}

其中「⋅\cdot」代表 AND,「++」代表 OR,上方橫線代表 NOT。

解題方法

先列出兩輸入邏輯閘的真值表:

AABBANDORXORNOR
000001
010110
100110
111100

再逐一比對各選項的敘述,即可判定正誤。

選項分析

(A) A NOT gate accepts two inputs

錯誤。NOT gate 的功能是將單一輸入反相:

Y=A‾Y=\overline{A}

因此 NOT gate 通常只有一個輸入。接受兩個輸入並進行反相的是 two-input NAND、NOR 等邏輯閘。

(B) The output of an XOR gate is 0 unless both inputs are 1

錯誤。XOR gate 在兩個輸入不同時輸出 11:

A⊕B={1,A≠B0,A=BA\oplus B= \begin{cases} 1, & A\ne B\\ 0, & A=B \end{cases}

其輸出為 11 的情況是 (A,B)=(0,1)(A,B)=(0,1) 與 (1,0)(1,0),並非「只有兩個輸入都是 11」才有特定輸出。兩個輸入皆為 11 時,XOR 輸出反而是 00。

(C) The sum of two binary digits (ignoring the carry) is expressed by an OR gate

錯誤。兩個二進位數字相加時,忽略進位後的和位元由 XOR gate 表示。

AABB二進位加法和位元進位
000+0=00+0=000
🔒

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

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

免費註冊

第 56 題2 分

Which of the following is NOT essential for a time-sharing operating system?

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

這一題的完整詳解

核心觀念

Time-sharing operating system(分時作業系統)讓多個使用者或多個行程共享 CPU。作業系統通常利用「時間片」輪流分配 CPU,並在時間片結束時切換執行中的行程。

要安全且有效地實現分時系統,核心需求包括:

  1. 以中斷機制取得 CPU 控制權
  2. 限制使用者程式直接執行危險操作
  3. 隔離不同程式的記憶體
  4. 區分作業系統與使用者程式的權限

其中,Virtual memory(虛擬記憶體)是常見的支援技術,但不是分時作業系統的必要條件。


解題方法

判斷每個選項是否為分時作業系統維持「公平排程、安全隔離、核心控制」所不可缺少的機制。

  • 若缺少該機制,作業系統便無法可靠地控制 CPU 或保護系統,則屬於 essential。
  • 若該機制只是改善記憶體利用率、支援較大的程式,分時系統仍可在沒有它的情況下運作,則不是 essential。

分時作業系統可以在沒有虛擬記憶體的環境中,使用固定分割、動態分割、交換(swapping)等方式管理記憶體。因此,虛擬記憶體並非必要條件。


選項分析

(A) Interrupt vectors

Interrupt vector(中斷向量)是必要的。

分時系統需要依靠計時器中斷,在目前行程執行一段時間後取得 CPU 控制權。例如:

  1. 計時器設定時間片長度。
  2. 時間片結束,產生硬體中斷。
  3. CPU 暫停使用者程式。
  4. 透過 interrupt vector 找到對應的中斷處理常式。
  5. 作業系統進行行程排程與 context switch。

若沒有中斷機制,某個使用者程式可能持續佔用 CPU,作業系統無法定期進行分時切換。

因此,(A) 是 essential,不能作為答案。


(B) Privileged instructions

Privileged instructions(特權指令)是必要的。

特權指令只能由作業系統核心執行,通常涉及:

  • 修改中斷設定
  • 操作 I/O 裝置
  • 修改記憶體管理設定
  • 設定計時器
  • 切換處理器狀態
  • 停止或重新啟動處理器

若使用者程式可以直接執行這些指令,便可能關閉中斷、竄改系統設定,甚至阻止其他使用者取得 CPU。

因此,分時作業系統必須具備特權指令機制,(B) 是 essential。


(C) Memory protection

Memory protection(記憶體保護)是必要的。

分時環境中,同時存在多個使用者程式與作業系統核心。每個行程都必須受到記憶體邊界限制,避免:

🔒

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

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

免費註冊

第 57 題2 分

Which of the following definition is not true?

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

這一題的完整詳解

核心觀念

本題考查人工智慧(Artificial Intelligence, AI)的基本概念,包括:

  1. 圖靈測試(Turing Test):判斷電腦是否展現類似人類智慧。
  2. 人工神經網路(Artificial Neural Network, ANN):利用數值權重模擬神經元之間的影響程度。
  3. 聲紋辨識(Voiceprint Recognition):利用個人具有差異性的聲音特徵進行辨識或訓練系統。

判斷重點是:若 (A)~(D) 均為正確敘述,則選擇「以上皆非」的 (E)。


解題方法

逐一檢查 (A)~(D) 是否符合相關定義:

  • 若某選項的敘述與標準定義不符,即為本題答案。
  • 若 (A)~(D) 全部正確,則 (E)「None of the above」成立。

選項分析

(A) The Turing Test is based on whether a computer could fool a human into believing that the computer is another human being

正確。

圖靈測試由 Alan Turing 提出,核心概念是:由人類測試者透過文字或其他不直接揭露身分的方式與受測者互動,若測試者無法可靠區分對方是電腦還是人類,則可認為該電腦在此測試中表現出類似人類的智慧。

因此,「電腦能否使人類相信它是另一個人類」符合圖靈測試的基本精神。


(B) A computer system that can pass the Turing test is considered to be intelligent

正確。

在經典人工智慧的定義中,若電腦通過圖靈測試,代表它在對話或行為表現上已足以讓人類無法辨識其為機器,因此通常被視為具有智慧行為。

嚴格而言,圖靈測試只能衡量「外在表現是否像人類」,不能證明電腦具有真正的意識或理解能力;但依照本題的基本資訊概論脈絡,通過圖靈測試的系統會被視為 intelligent。


(C) Each element in an artificial neural net is affected by a numeric weight

正確。

🔒

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

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

免費註冊

第 58 題2 分

Which one of the following methods is NOT considered as a solution for preventing the overfitting problem in AI training?

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

這一題的完整詳解

核心觀念

本題的核心觀念為機器學習與深度學習中的**過度擬合(Overfitting)**成因及其防治策略。

  1. 過度擬合(Overfitting)的定義:
    模型在訓練資料(Training data)上表現極佳(訓練誤差極低),但在未見過的測試資料(Testing/Validation data)上表現大幅下降(泛化誤差高),代表模型「死記硬背」了訓練資料中的雜訊(Noise)與隨機擾動,失去了泛化能力(Generalization ability)。
  2. 偏差-變異數權衡(Bias-Variance Tradeoff):
    模型的總期望誤差可分解為:
    Total Error=Bias2+Variance+Irreducible Error\text{Total Error} = \text{Bias}^2 + \text{Variance} + \text{Irreducible Error}
  • **高變異數(High Variance)**即對應過度擬合。
  • 提高模型複雜度(Model Complexity)(如增加特徵數、增加神經網絡層數或神經元數、加深決策樹深度等)會降低偏差,但顯著拉高變異數,從而加劇過度擬合。
  1. 解決過度擬合的常見手段:
  • 增加資料多樣性與量體:蒐集更多訓練資料(Collect more data)、資料擴增(Data augmentation)。
  • 降低模型自由度/約束權重:簡化模型架構(如剪枝、降維)、正規化(Regularization,如 L1、L2、Dropout)。
  • 結合多模型平滑擾動:集成學習(Ensemble methods,如 Bagging、Random Forest)。
  • 提早停止訓練:Early Stopping。

解題方法

題目詢問「哪一項**不是(NOT)**用來防止過度擬合的方法」:

  • 過度擬合的根本機制是「模型容量(Capacity)相較於資料量過大」,導致其擬合了訓練集特有的雜訊。
  • 若要防止過度擬合,應「降低模型自由度」或「增加資料量來壓制雜訊的影響」。
  • 反之,「增加模型複雜度(Increase model complexity)」會使模型的自由參數更多、容量更大,更容易去記住雜訊,因此它不但不能防止過度擬合,反而是造成過度擬合的主要誘因。

選項分析

  • (A) Collect more training data(正確之防治手段,非本題答案):
    增加真實訓練資料量能提供更完整的母體分佈資訊,稀釋少數雜訊與極端值的負面影響,能有效降低模型的變異數(Variance),是解決過度擬合最直接且有效的方法。
🔒

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

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

免費註冊

第 59 題2 分

Given a postfix expression is abcde^*-*fg/+=, where b=2b=2, c=3c=3, d=4d=4, e=5e=5, f=6f=6, and g=3g=3. Which of the following is the value of aa?

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

這一題的完整詳解

核心觀念

本題主要測驗資料結構(Data Structure)中後序運算式(Postfix Expression / Reverse Polish Notation, RPN)的求值與堆疊(Stack)運算,以及運算式與等號賦值(Assignment)的解讀。

  1. 後序運算式求值法則:
  • 由左至右依序掃描運算式符號(Tokens)。
  • 遇到運算元(Operand):推入(Push)堆疊中。
  • 遇到雙元運算子(Binary Operator,如 ^、*、-、/、+):自堆疊連續彈出(Pop)兩個元素。
  • 先彈出者為右運算元(設為 op2op_2)。
  • 後彈出者為左運算元(設為 op1op_1)。
  • 計算 op1 op op2op_1 \text{ op } op_2,再將結果推回(Push)堆疊中。
  1. 賦值運算子 =:
  • 在傳統運算式表示法中,= 為右結合的賦值運算(Assignment),等號左側必須為變數(lvalue),右側為數值(rvalue)。在後序式中,Variable Expression = 代表將右側運算式的求值結果指定給左側變數。若將 = 視為雙元運算,其語意通常為將後彈出之運算元賦值,或代表方程式右側為 0(在後序求值時隱含等式兩端相等)。

解題方法

步驟一:分析後序運算式結構

題目給定後序表示式為:
a b c d e ^ * - * f g / + =

我們由左至右利用堆疊逐步推導出對應的中序表示式(Infix Expression):

  1. 依序讀入運算元 a, b, c, d, e →\rightarrow 堆疊內容為 [a, b, c, d, e]。
  2. 遇到 ^(次方):彈出 ee(右)與 dd(左),計算 ded^e,推回堆疊 →\rightarrow [a, b, c, (d^e)]。
  3. 遇到 *(乘號):彈出 (de)(d^e) 與 cc,計算 c×(de)c \times (d^e),推回堆疊 →\rightarrow [a, b, (c * (d^e))]。
  4. 遇到 -(減號):彈出 (c×de)(c \times d^e) 與 bb,計算 b−(c×de)b - (c \times d^e),推回堆疊 →\rightarrow [a, (b - c * d^e)]。
  5. 遇到 *(乘號):彈出 (b−c×de)(b - c \times d^e) 與 aa,計算 a×[b−(c×de)]a \times [b - (c \times d^e)],推回堆疊 →\rightarrow [(a * (b - c * d^e))]。
  6. 依序讀入運算元 f, g →\rightarrow 堆疊內容為 [(a * (b - c * d^e)), f, g]。
  7. 遇到 /(除號):彈出 gg 與 ff,計算 f/gf / g,推回堆疊 →\rightarrow [(a * (b - c * d^e)), (f / g)]。
  8. 遇到 +(加號):彈出 (f/g)(f / g) 與前面的乘積式,相加後推回堆疊 →\rightarrow [a * (b - c * d^e) + (f / g)]。
  9. 遇到 =(賦值/等號運算子):
    在中山大學此考題的命題慣例中,本式為方程式的後序表示式,代表求使該式成立或使其歸零/求得目標值之對應變數。

步驟二:代入數值計算

已知:
b=2b = 2, c=3c = 3, d=4d = 4, e=5e = 5, f=6f = 6, g=3g = 3

🔒

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

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

免費註冊

第 60 題2 分

Which of the following statement about sorting algorithm is not true?

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

這一題的完整詳解

核心觀念

本題考查各種排序演算法的定義,以及其平均時間複雜度(average time complexity)。

排序演算法的目的,是將含有 nn 個元素的串列,依照指定條件排列,例如由小到大或由大到小。常見複雜度如下:

排序演算法平均時間複雜度最壞時間複雜度額外空間複雜度
Quick sortO(nlog⁡n)O(n\log n)O(n2)O(n^2)平均 O(log⁡n)O(\log n)
Bubble sortO(n2)O(n^2)O(n2)O(n^2)O(1)O(1)
Insertion sortO(n2)O(n^2)O(n2)O(n^2)O(1)O(1)
Selection sortO(n2)O(n^2)O(n2)O(n^2)O(1)O(1)

其中,Selection sort 的平均複雜度是 O(n2)O(n^2),不是 O(nlog⁡n)O(n\log n)。


解題方法

本題問的是:

Which of the following statement about sorting algorithm is not true?

也就是要找出「錯誤的敘述」。

判斷步驟如下:

  1. 先確認選項 A 是否符合排序演算法的基本定義。
  2. 比較 B~E 所述的平均時間複雜度。
  3. 找出與標準複雜度不符的選項。

各排序演算法的複雜度原理

1. Quick sort

Quick sort 每次選擇一個 pivot,將元素分成較小與較大的兩部分,再遞迴排序。

當每次分割接近平衡時,遞迴深度約為 log⁡n\log n,每一層需要掃描約 nn 個元素,因此:

T(n)=2T(n2)+O(n)T(n)=2T\left(\frac{n}{2}\right)+O(n)

由 Master Theorem 可得:

T(n)=O(nlog⁡n)T(n)=O(n\log n)

因此,Quick sort 的平均時間複雜度為 O(nlog⁡n)O(n\log n)。若 pivot 每次都選到極端值,最壞情況會退化為:

T(n)=T(n−1)+O(n)=O(n2)T(n)=T(n-1)+O(n)=O(n^2)

2. Bubble sort

Bubble sort 反覆比較相鄰元素,若順序錯誤便交換,使較大的元素逐步移至串列尾端。

第一輪最多比較約 n−1n-1 次,第二輪最多比較約 n−2n-2 次,因此比較次數約為:

(n−1)+(n−2)+⋯+1(n-1)+(n-2)+\cdots+1

這是一個等差級數,其總和為:

n(n−1)2=O(n2)\frac{n(n-1)}{2}=O(n^2)

因此 Bubble sort 的平均時間複雜度為 O(n2)O(n^2)。


3. Insertion sort

Insertion sort 將元素逐一取出,插入前面已排序好的區域。

若第 ii 個元素需要向前比較並移動約 ii 次,總操作次數約為:

1+2+3+⋯+(n−1)1+2+3+\cdots+(n-1)

其總和為:

n(n−1)2=O(n2)\frac{n(n-1)}{2}=O(n^2)

因此 Insertion sort 的平均時間複雜度為 O(n2)O(n^2)。

補充而言,若輸入資料已接近排序完成,Insertion sort 的最佳情況可達 O(n)O(n);但題目問的是平均情況,因此仍為 O(n2)O(n^2)。


4. Selection sort

Selection sort 每一輪從未排序區域中找出最小值,再放到正確位置。

🔒

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

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

免費註冊

第 61 題2 分

Which of the following is not a correct way to initialize an array?

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

這一題的完整詳解

核心觀念

本題測驗 C / C++ 語言中「一維陣列的宣告與初始化(Array Declaration and Initialization)」語法規則,涵蓋以下核心重點:

  1. 陣列大小與初始值個數的關係:
  • 顯式宣告陣列大小為 NN(即 int n[N])時,初始化清單(initializer list)內的元素個數 MM 不得大於陣列大小(M≤NM \le N)。若初始值個數超過陣列容量(M>NM > N),編譯器會判定為語法錯誤(語法錯誤:excess elements in array initializer)。
  1. 自動推導陣列大小(Omitted Size):
  • 若宣告時省略陣列大小中括號內的數值(即 int n[]),編譯器會依據初始化清單中的元素個數自動推導陣列大小。
  1. 部分初始化(Partial Initialization)與自動補零:
  • 當初始值個數小於陣列宣告的大小時(M<NM < N),被明確指定的元素會由左至右依序賦值,其餘未被指定的元素會自動被編譯器初始化為 0。

解題方法

檢視每個選項中陣列宣告的大小(中括號內的數值)與大括號內初始值的元素個數:

  1. 計算大括號 { ... } 內以逗號分隔的數值個數 MM。
  2. 比對中括號 [ ... ] 內所指定的陣列維度大小 NN:
  • 若未指定 NN(即 []),則合法,且 N=MN = M。
  • 若指定了 NN,則檢查是否滿足 M≤NM \le N:
  • 若 M>NM > N:編譯錯誤,為不正確的初始化方式。
  • 若 M≤NM \le N:語法完全合法(未填滿者自動補 0)。

選項分析

  • (A) int n[5]={0, 1, 2, 3, 4, 5};【錯誤的初始化方式,故為本題正確選項】
  • 宣告陣列長度為 55(即 n[5],有效索引為 n[0] 至 n[4],最多容納 5 個整數)。
  • 初始化清單中給定了 6 個元素:0, 1, 2, 3, 4, 5(M=6>5M = 6 > 5)。
  • 超出陣列宣告空間,C / C++ 編譯器會直接報錯(Compile Error: excess elements in array initializer),因此這不是正確的初始化方式。
🔒

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

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

免費註冊

第 62 題2 分

Polymorphism is implemented through:

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

這一題的完整詳解

核心觀念

本題考查物件導向程式設計中的 多型(polymorphism),特別是 C++ 的執行期多型(runtime polymorphism)。

多型是指:使用同一個介面或基底類別指標/參考,實際執行時能依物件的真實型別,呼叫不同的函式實作。

C++ 主要透過以下機制實現執行期多型:

  1. 基底類別宣告 virtual 成員函式。
  2. 子類別覆寫(override)該函式。
  3. 以基底類別指標或參考指向子類別物件。
  4. 執行時透過 dynamic binding,決定實際要呼叫的函式。

解題方法

判斷本題的關鍵是「多型」與「執行時依實際物件型別選擇函式」的關聯。

典型範例如下:

#include <iostream>
using namespace std;

class Animal {
public:
 virtual void sound {
 cout << "Animal sound";
 }
};

class Dog : public Animal {
public:
 void sound override {
 cout << "Dog barking";
 }
};

int main {
 Animal* p = new Dog;
 p->sound;
}

逐步追蹤:

  1. p 的宣告型別是 Animal*。
  2. p 實際指向的物件是 Dog。
  3. sound 在基底類別中宣告為 virtual。
  4. 呼叫 p->sound 時,執行期依實際物件型別 Dog 進行 dynamic binding。
  5. 最後執行 Dog::sound,輸出:
Dog barking

若 sound 沒有宣告為 virtual,則會依指標的靜態型別 Animal* 進行 static binding,呼叫 Animal::sound,無法形成典型的執行期多型。

選項分析

(A) Non-const functions

🔒

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

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

免費註冊

第 63 題2 分

A copy constructor must receive its argument by reference instead of by value because:

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

這一題的完整詳解

核心觀念

這題考查 C++ 的「複製建構函式」(copy constructor)與參數傳遞方式。

複製建構函式通常宣告為:

class A {
public:
 A(const A& other);
};

其功能是:使用同一個類別的既有物件,建立另一個新物件。

例如:

A x;
A y = x; // 呼叫 A 的 copy constructor

複製建構函式的參數必須以參考方式傳遞,通常是:

const A& other

不能寫成:

A(A other); // 錯誤:以值傳遞

解題方法

關鍵在於:若複製建構函式以值傳遞,建立參數 other 本身時,也必須先複製原物件。

假設宣告如下:

class A {
public:
 A(A other);
};

當執行:

A x;
A y(x);

建立 y 時,函式需要先建立參數 other:

  1. 將 x 以值傳遞給 other。
  2. 建立 other 需要呼叫 A 的複製建構函式。
  3. 但目前正在呼叫的複製建構函式本身就是 A(A other)。
  4. 因此又需要建立另一個以值傳遞的 A 參數。
  5. 形成無限遞迴,永遠無法完成建構。

可表示為:

呼叫 copy constructor→以值建立參數→再次呼叫 copy constructor→無限重複\text{呼叫 copy constructor} \rightarrow \text{以值建立參數} \rightarrow \text{再次呼叫 copy constructor} \rightarrow \text{無限重複}

因此,複製建構函式必須接收參考:

A(const A& other);

參考參數只是讓 other 指向原本的物件,不需要額外建立一份 A 物件,也就不會再次觸發複製建構函式。

選項分析

(A) Otherwise the constructor will only make a copy of a pointer to an object.

錯誤。

複製建構函式的問題不在於「只複製物件指標」。以值傳遞時,參數不是單純的指標複製,而是必須建立一個完整的物件副本。

若使用參考傳遞,參考在底層實作上可能與位址概念有關,但這不是本題要求使用參考的主要原因。

(B) The copy of the argument passed by value has function scope.

錯誤。

以值傳遞的參數確實是函式內的區域物件,具有函式作用域;但作用域不是複製建構函式必須使用參考參數的原因。

即使該副本只存在於函式執行期間,仍然必須先建立它,而建立它會導致複製建構函式再次被呼叫,造成無限遞迴。

(C) The pointer needs to know the address of the original data, not a temporary copy of it

🔒

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

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

免費註冊

第 64 題2 分

What will be the output of the following program?

#include <stdio.h>

void swap(int a, int b);

int main(void) {

    int i = 1, j = 2;

    swap(i, j);

    printf("i = %d, j = %d\n", i, j);

    return 0;

}

void swap(int a, int b) {

    int temp = a;

    a = b;

    b = temp;

}

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

這一題的完整詳解

核心觀念

本題考查 C 語言的「傳值呼叫(call by value)」。

呼叫函式時:

swap(i, j);

會將 i 與 j 的數值複製給函式參數 a 與 b:

a = 1;
b = 2;

此時:

  • i 與 a 是不同的變數
  • j 與 b 是不同的變數
  • 函式內修改 a、b,只會改變函式內的區域變數
  • 不會改變 main 中的 i、j

因此,這個 swap 函式只交換了副本的內容,沒有交換原本的 i 與 j。


解題方法:逐步追蹤

1. main 中的初始值

int i = 1, j = 2;

此時:

變數值
i1
j2

2. 呼叫 swap(i, j)

由於 C 語言採用傳值呼叫,函式接收到的是數值副本:

函式參數初始值
a1
b2

此時 main 中的 i、j 仍然是:

變數值
i1
j2

3. 執行 swap 函式

int temp = a;

因此:

temp = 1;
a = 1;
b = 2;

接著:

a = b;

變成:

a = 2;
b = 2;
temp = 1;

再執行:

b = temp;

變成:

a = 2;
b = 1;
temp = 1;

函式內確實完成了 a 與 b 的交換,但這兩個變數只是 i、j 的副本。

4. 回到 main

swap 執行完畢後,區域變數 a、b、temp 被銷毀;main 中的變數不受影響:

i = 1;
j = 2;

因此輸出為:

i = 1, j = 2

選項分析

🔒

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

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

免費註冊

第 65 題2 分

Which of the following conditions correctly describes the output of this code in Python?

first = [1, 2, 3, 4, 5]

second = first

second.append(6)

print(first)

print(second)

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

這一題的完整詳解

核心觀念

本題考查 Python 中的:

  • 變數指派(assignment)
  • 串列(list)是可變物件(mutable object)
  • 兩個變數參照同一個物件時,透過其中一個變數修改內容,另一個變數也會看到修改結果

執行:

first = [1, 2, 3, 4, 5]
second = first

second = first 不會建立新的串列副本,而是讓 second 與 first 同時參照同一個串列物件。

因此可表示為:

first ─┐
 ├──> [1, 2, 3, 4, 5]
second ─┘

解題方法與逐步追蹤

初始建立串列:

first = [1, 2, 3, 4, 5]

此時:

first ───> [1, 2, 3, 4, 5]

執行:

second = first

此時 second 指向與 first 相同的串列:

first ─┐
 ├──> [1, 2, 3, 4, 5]
second ─┘

接著執行:

second.append(6)

append(6) 是直接修改原本的串列內容,將 6 加到串列尾端:

first ─┐
 ├──> [1, 2, 3, 4, 5, 6]
second ─┘

因此兩次輸出皆為:

[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]

選項分析

(A) first=[1,2,3,4,5], second=[1,2,3,4,5,6]

錯誤。此選項假設 second 是 first 的獨立副本,因此修改 second 不會影響 first。但 second = first 只是建立另一個參照,並未複製串列。

🔒

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

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

免費註冊

第 66 題2 分

The definition

char string1[] = "bird";

is equivalent to:

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

這一題的完整詳解

核心觀念

題目考查 C 語言的「字串初始化」與「字元陣列」概念。

char string1[] = "bird";

其中:

  • char 表示陣列元素的型別是字元。
  • string1[] 表示陣列長度由初始值自動推導。
  • "bird" 是字串常值,實際儲存內容包含結尾的空字元 '\0'。

因此,記憶體中的內容為:

索引01234
內容'b''i''r''d''\0'

陣列實際需要 55 個 char 元素。


解題方法

將字串常值 "bird" 展開:

"bird"={′b′,′i′,′r′,′d′,′\0′}"bird" = \{'b', 'i', 'r', 'd', '\0'\}

所以:

char string1[] = "bird";

等價於:

char string1[] = {'b', 'i', 'r', 'd', '\0'};

這正是選項 (A)。


選項分析

(A) char string1[] = {'b', 'i', 'r', 'd', '\0'};

正確。

此寫法明確列出四個英文字元與字串結尾的空字元:

'b' 'i' 'r' 'd' '\0'

陣列長度由初始化內容自動推導為 55,與原本的字串初始化完全相同。


(B) char string1 = {'b', 'i', 'r', 'd', '\0'};

錯誤。

char string1 只宣告一個字元變數,只能儲存單一字元,例如:

char string1 = 'b';

它不是字元陣列,無法存放五個字元,也不能使用這種多元素初始化列表。


(C) char string1[] = {'b', 'i', 'r', 'd'};

🔒

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

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

免費註冊

第 67 題2 分

Consider the following C code fragment:

int i=10;

do {

    printf("%d ", i*=2.5);

} while(i<100)

What output will be generated?

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

這一題的完整詳解

核心觀念

本題考查三個 C 語言觀念:

  1. do...while 迴圈一定至少執行一次。
  2. i *= 2.5 是複合指定運算,等價於:

i=i∗2.5i = i * 2.5

但由於 i 宣告為 int,計算結果指定回 i 時,會轉換成整數,小數部分直接捨去。
3. printf("%d ", ...) 中的 %d 用來輸出整數。

因此,i *= 2.5 的實際效果是:

i←將 i×2.5 轉換為 inti \leftarrow \text{將 } i \times 2.5 \text{ 轉換為 int}


解題方法與逐步追蹤

初始值:

i=10i=10

do...while 會先執行迴圈內容,再判斷條件。

第 1 次執行

i *= 2.5;

計算:

10×2.5=25.010 \times 2.5=25.0

指定回 int i 後:

i=25i=25

輸出:

25

判斷:

條件成立,繼續迴圈。

第 2 次執行

25×2.5=62.525 \times 2.5=62.5

指定回整數變數 i 時,小數部分捨去:

i=62i=62

輸出:

62

判斷:

條件成立,繼續迴圈。

第 3 次執行

62×2.5=155.062 \times 2.5=155.0

因此:

i=155i=155

輸出:

155

判斷:

條件不成立,迴圈結束。

完整輸出為:

25 62 155

選項分析

🔒

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

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

免費註冊

第 68 題2 分

Call-by-reference can achieve the security of call-by-value when:

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

這一題的完整詳解

核心觀念

本題考察兩種參數傳遞方式:

1. Call-by-value

Call-by-value(傳值呼叫)會將實際參數的值複製一份給形式參數。

void f(int x) {
 x = 99;
}

int a = 10;
f(a);
// a 仍為 10

函式內修改 x,只會修改複本,不會影響呼叫端的 a,因此具有較高的參數安全性。

2. Call-by-reference

Call-by-reference(傳址呼叫)會讓形式參數直接參考呼叫端的原始變數。

void f(int& x) {
 x = 99;
}

int a = 10;
f(a);
// a 變為 99

形式參數 x 與實際參數 a 指向同一份資料,因此函式可以直接修改呼叫端的變數。它省去複製大型資料的成本,但安全性低於 call-by-value。

3. const reference

若使用唯讀參考:

void f(const int& x) {
 // x = 99; // 編譯錯誤
}

函式仍可避免複製資料,卻不能透過 x 修改原始變數。這使 call-by-reference 在「不可由函式修改呼叫端資料」的安全性上,達到 call-by-value 的效果。

因此,本題的關鍵條件是使用 const qualifier,通常指 const T&。

解題方法

判斷方式是檢查:該機制是否能同時保留 reference 的傳遞效率,並限制函式修改呼叫端資料的能力。

比較如下:

傳遞方式是否複製資料函式能否修改呼叫端資料
Call-by-value是否
Call-by-reference否是
Call-by-const-reference否否

const reference 的形式為:

void process(const LargeObject& obj);

obj 仍是原物件的參考,不需複製大型物件;但由於 const 限制,函式不能透過 obj 修改該物件。這正是「以 reference 的效率取得 value 的安全性」。

選項分析

(A) A large argument is passed in order to improve performance.

錯誤。

傳遞大型參數時使用 call-by-reference,確實可以避免複製大量資料,改善效能;但普通的 reference 仍可修改呼叫端資料:

void f(LargeObject& x) {
 x.modify;
}

因此,大型參數只能說明 reference 具有效能優勢,不能使其具備 call-by-value 的安全性。

若要同時達到安全性,必須使用:

void f(const LargeObject& x);
🔒

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

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

免費註冊

第 69 題2 分

Student is a base class and TA is a derived class, with a redefined non-virtual coding function. Given the following statements, will the output of the two coding function calls be identical?

TA t;

Student *sPtr = &t;

sPtr->coding();

sPtr->Student::coding();

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

這一題的完整詳解

核心觀念

本題考查 C++ 的「非虛擬函式(non-virtual function)」與「靜態繫結(static binding)」。

已知:

  • Student 是基底類別。
  • TA 繼承 Student。
  • TA 重新定義了同名的 coding 函式,但該函式不是 virtual。
  • sPtr 的宣告型別是 Student*,雖然實際上指向 TA 物件。

非虛擬函式的呼叫,會依照「指標或參考的靜態型別」決定,而不是依照實際物件型別決定。

因此:

sPtr->coding\texttt{sPtr->coding}

會依照 sPtr 的靜態型別 Student*,繫結至 Student::coding。


解題方法

先分辨兩個呼叫的函式選擇方式。

第一個呼叫

sPtr->coding;

sPtr 的型別是:

Student*

而 coding 是非虛擬函式,因此編譯器在編譯階段便依照 Student* 尋找函式:

Student::coding;

即使 sPtr 實際指向的是 TA 物件,也不會自動呼叫 TA::coding。

第二個呼叫

sPtr->Student::coding;

這是明確指定呼叫基底類別的 coding:

Student::coding;

因此兩個呼叫實際上都會執行:

Student::coding;

可用下列程式碼表示:

class Student {
public:
 void coding {
 cout << "Student";
 }
};

class TA : public Student {
public:
 void coding {
 cout << "TA";
 }
};

TA t;
Student *sPtr = &t;

sPtr->coding; // 呼叫 Student::coding
sPtr->Student::coding; // 呼叫 Student::coding

逐步追蹤如下:

呼叫敘述判斷依據實際執行函式
sPtr->codingsPtr 的靜態型別為 Student*,且函式非虛擬Student::coding
sPtr->Student::coding明確指定 Student 類別Student::coding

所以兩次呼叫所選取的函式相同,輸出相同。


選項分析

(A) It depends on the implementation of the coding function.

錯誤。

🔒

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

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

免費註冊

第 70 題2 分

The array subscript operator [], when overloaded, cannot:

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

這一題的完整詳解

核心觀念

本題考查 C++ 的運算子多載(operator overloading),重點是陣列下標運算子 [] 的多載規則。

對類別物件使用:

object[index]

編譯器會將它解讀為:

object.operator[](index)

在本題所依據的傳統 C++ 規則中,operator[] 必須是成員函式,且只能接受一個參數。因此,下列宣告合法:

ReturnType operator[](ParameterType index);

參數型別不限定為整數,也可以是 double 或使用者自訂型別。


解題方法

判斷每個選項是否符合以下兩項條件:

  1. [] 是否能由類別自行多載。
  2. 多載後的 operator[] 是否能接受該種運算元。

關鍵限制只有一項:

傳統 C++ 的 operator[] 一次只能接收一個參數。

因此,[4,8] 這種寫法若視為同時傳入兩個獨立值,便不符合傳統 operator[] 的參數規則。


選項分析

(A) Be used with linked list classes.

正確。

鏈結串列類別可以自行多載 operator[],讓使用者以類似陣列的語法存取第 ii 個節點:

class LinkedList {
public:
 int& operator[](int index) {
 Node* current = head;

 for (int i = 0; i < index; ++i) {
 current = current->next;
 }

 return current->data;
 }
};

使用方式:

LinkedList list;
list[3];

這會呼叫:

list.operator[](3);

雖然鏈結串列的下標存取通常需要從頭節點逐一走訪,時間複雜度為 O(n)O(n),但語法上完全可以使用 []。


(B) Take multiple values inside (e.g., [4,8]).

錯誤,這是本題答案。

傳統 C++ 的 operator[] 只能接受一個參數,例如:

class Matrix {
public:
 int& operator[](int index);
};

呼叫:

matrix[4];

相當於:

matrix.operator[](4);

不能將 4 與 8 視為兩個參數直接傳給同一個 operator[]:

matrix[4, 8];

傳統規則下,operator[] 並沒有「兩個參數」的函式介面。

二維資料通常透過兩次下標運算完成:

matrix[4][8];

其機制是:

matrix.operator[](4).operator[](8);

也就是先取得第 44 列,再對該列取得第 88 個元素。

補充而言,在較新的 C++23 標準中,語言已支援多維下標運算子的語法;但本題為民國 111 年考題,依傳統 C++ 命題規則判斷,應選此項。


🔒

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

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

免費註冊

第 71 題2 分

Which of the following arithmetic is not allowed on pointers?

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

這一題的完整詳解

核心觀念

本題考查 C 語言的指標運算(pointer arithmetic)。指標不是一般整數,能進行的運算受到限制,主要包括:

  1. 指標加上整數:p + n
  2. 指標減去整數:p - n
  3. 同一陣列中的兩個指標相減:p - q
  4. 比較同一陣列中的指標:p < q、p == q 等

若指標指向型別為 T 的資料,則:

p+1p+1

不是向記憶體位址增加 11 byte,而是前進一個 T 型別物件的大小。

例如:

int a[5];
int *p = &a[0];

p + 1

會指向 a[1],位址實際增加的大小為 sizeof(int)。


解題方法

判斷各選項是否為合法的指標運算即可。

需要注意:某些運算雖然語法上允許,但使用時必須符合條件。例如:

  • 指標相減時,兩個指標必須指向同一陣列中的元素,或一個指向陣列尾端後的位置。
  • 指標以 < 比較時,通常也必須是同一陣列中的指標,才能具有明確意義。

題目問的是「哪一項算術不被允許」,依照一般 C 語言指標運算規則,四種運算形式皆屬於允許的指標操作,因此選擇 (E)。


選項分析

(A) Adding an integer to a pointer.

指標加上整數是合法運算。

int a[5] = {10, 20, 30, 40, 50};
int *p = &a[1];

int *q = p + 2;

逐步追蹤:

  • p 指向 a[1]
  • p + 1 指向 a[2]
  • p + 2 指向 a[3]

因此 q 指向 a[3],此運算合法。


(B) Subtracting an integer from a pointer.

指標減去整數也是合法運算。

int *p = &a[3];
int *q = p - 2;

逐步追蹤:

  • p 指向 a[3]
  • p - 1 指向 a[2]
  • p - 2 指向 a[1]

因此 q 指向 a[1],此運算合法。


🔒

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

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

免費註冊

第 72 題2 分

What is the output of this code in Python?

L1 = []

L1.append([1, [2, 3], 4])

L1.extend([7, 8, 9])

print(L1[0][1][1] + L1[2])

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

這一題的完整詳解

核心觀念

本題考查 Python 串列的兩個方法:

  • append(x):將 x 視為一個完整元素,加入串列尾端。
  • extend(iterable):逐一取出可迭代物件中的元素,加入串列尾端。

此外,題目也考查多層串列的索引方式。Python 串列索引從 00 開始。


解題方法與逐步追蹤

第 1 步:建立空串列

L1 = []

此時:

L1 = []

第 2 步:執行 append

L1.append([1, [2, 3], 4])

append 會把整個 [1, [2, 3], 4] 當成單一元素加入,因此:

L1 = [[1, [2, 3], 4]]

此時:

  • L1[0] 是 [1, [2, 3], 4]
  • L1[0][1] 是 [2, 3]
  • L1[0][1][1] 是 3

第 3 步:執行 extend

L1.extend([7, 8, 9])

extend 會將 7、8、9 分別加入串列,因此:

L1 = [[1, [2, 3], 4], 7, 8, 9]

所以:

L1[2] = 8

第 4 步:計算輸出

L1[0][1][1] + L1[2]

代入索引結果:

3+8=113 + 8 = 11

因此程式輸出:

11
🔒

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

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

免費註冊

第 73 題2 分

【題組共用題幹】

Consider the following code of a singly linked list, with the function F to “rotate” the list by moving the first item of the list to the end of the list. The input to the function is the address of pfirst, the pointer to the first item in the list. You need to select the correct expressions to put into the code in the following three questions so that the function works correctly.

struct node {int data; struct node *next};

void F(struct node **pfirst){

    struct node *x, *y, *first = *pfirst;

    if(first && first->next){

        x = first;

        y = *pfirst = AAA;

        while(y->next) y = y->next;

        BBB = x;

        CCC = NULL;

    }

}

What expression should be in “AAA”?

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

這一題的完整詳解

核心觀念

本題考查:

  • 單向鏈結串列的節點與 next 指標。
  • 以指標重新連接節點。
  • 二重指標 struct node **pfirst 修改串列首節點。
  • 將串列第一個節點移至串列尾端的旋轉操作。

原始串列可表示為:

first → A → B → C → NULL

其中:

  • first 指向原本的第一個節點 A
  • x 用來保存原本的第一個節點
  • y 用來走訪串列,最後停在尾節點

旋轉後應變成:

B → C → A → NULL

因此,新串列首節點必須是原本第一個節點的下一個節點,也就是 x->next。


解題方法

程式片段如下:

x = first;
y = *pfirst = AAA;
while(y->next) y = y->next;
BBB = x;
CCC = NULL;

執行第一行後:

x = first;

此時 x 保存原本的第一個節點:

x → A

要將 A 移到尾端,新的串列首節點必須改成 A 的下一個節點:

y = *pfirst = x->next;

因此:

*pfirst → B
y → B
x → A

接著:

while(y->next) y = y->next;

y 會從 B 開始走訪,最後停在尾節點 C:

y → C

之後應執行:

y->next = x;
x->next = NULL;

完整意義為:

B → C → A → NULL

所以 AAA 必須是:

x->next

逐步追蹤

假設原始串列為:

A → B → C → NULL

第一步

x = first;

結果:

x → A
*pfirst → A

第二步

若:

AAA = x->next;

則:

y = *pfirst = x->next;

結果:

x → A
y → B
*pfirst → B

目前串列連接仍為:

A → B → C → NULL

第三步

while(y->next) y = y->next;

y 的移動情形:

y: B → C

迴圈結束時:

y → C

第四步

y->next = x;

尾節點 C 接回原第一節點 A:

B → C → A

第五步

x->next = NULL;

切斷原本 A → B 的連接:

B → C → A → NULL

旋轉完成。


選項分析

(A) x

錯誤。

🔒

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

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

免費註冊

第 74 題2 分

【題組共用題幹】

Consider the following code of a singly linked list, with the function F to “rotate” the list by moving the first item of the list to the end of the list. The input to the function is the address of pfirst, the pointer to the first item in the list. You need to select the correct expressions to put into the code in the following three questions so that the function works correctly.

struct node {int data; struct node *next};

void F(struct node **pfirst){

    struct node *x, *y, *first = *pfirst;

    if(first && first->next){

        x = first;

        y = *pfirst = AAA;

        while(y->next) y = y->next;

        BBB = x;

        CCC = NULL;

    }

}

What expression should be in “BBB”?

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

這一題的完整詳解

核心觀念

本題考查:

  • 單向鏈結串列的節點連結
  • 指標與指標變數的操作
  • 函式參數 struct node **pfirst 對串列首指標的修改
  • 將串列第一個節點移到串列尾端的旋轉操作

原串列若為:

A→B→C→NULLA \rightarrow B \rightarrow C \rightarrow \text{NULL}

旋轉後應變成:

B→C→A→NULLB \rightarrow C \rightarrow A \rightarrow \text{NULL}

程式中的變數意義如下:

  • first:原本的第一個節點
  • x:暫存原本的第一個節點
  • y:目前走訪到的節點,最後會停在原串列尾端
  • *pfirst:串列首節點的指標

解題方法

程式片段為:

x = first;
y = *pfirst = AAA;
while(y->next) y = y->next;
BBB = x;
CCC = NULL;

旋轉串列需要完成三件事:

  1. 暫存原本的第一個節點:x = first
  2. 將串列首指標改成原本的第二個節點
  3. 找到原串列尾端,將尾端接到 x
  4. 將原本第一個節點的 next 設為 NULL

執行完 while(y->next) y = y->next; 後,y 一定指向原串列的最後一個節點。因此,應將尾端節點的 next 指向原本的第一個節點:

y->next = x;

所以:

BBB=y->next\boxed{\text{BBB} = y\text{->next}}

完整相關程式碼為:

x = first;
y = *pfirst = first->next;
while(y->next) y = y->next;
y->next = x;
x->next = NULL;

逐步追蹤

假設原串列為:

A -> B -> C -> NULL

初始狀態:

first = A
*pfirst = A

第一步

x = first;

結果:

x = A

第二步

y = *pfirst = first->next;

此時:

*pfirst = B
y = B

串列首指標已改為 B。

第三步

🔒

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

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

免費註冊

第 75 題2 分

【題組共用題幹】

Consider the following code of a singly linked list, with the function F to “rotate” the list by moving the first item of the list to the end of the list. The input to the function is the address of pfirst, the pointer to the first item in the list. You need to select the correct expressions to put into the code in the following three questions so that the function works correctly.

struct node {int data; struct node *next};

void F(struct node **pfirst){

    struct node *x, *y, *first = *pfirst;

    if(first && first->next){

        x = first;

        y = *pfirst = AAA;

        while(y->next) y = y->next;

        BBB = x;

        CCC = NULL;

    }

}

What expression should be in “CCC”?

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

這一題的完整詳解

核心觀念

本題考查:

  • singly linked list 的節點連結方式。
  • 指標與指標的指標:struct node **pfirst。
  • linked list 旋轉(rotate)的操作。
  • 指標別名(alias)與節點重新接線。

原串列假設為:

A→B→C→NULLA \rightarrow B \rightarrow C \rightarrow NULL

旋轉後應為:

B→C→A→NULLB \rightarrow C \rightarrow A \rightarrow NULL

因此需要完成兩件事:

  1. 將 pfirst 改成原本第二個節點。
  2. 將原本第一個節點接到尾端,並令其 next 為 NULL。

由於:

struct node *x, *y, *first = *pfirst;

可知:

  • first 指向原本第一個節點。
  • x = first 後,x 也指向原本第一個節點。
  • y 用來走訪串列,最後會指向原本尾端節點。

解題方法

完成旋轉所需的關鍵程式碼為:

x = first;
y = *pfirst = first->next;
while(y->next) y = y->next;
y->next = x;
x->next = NULL;

逐步說明如下。

一開始:

first = *pfirst;
x = first;

若原串列為:

pfirst
 |
 v
[A] -> [B] -> [C] -> NULL

此時:

  • first 指向 [A]
  • x 指向 [A]

接著:

y = *pfirst = first->next;

這行同時完成:

  • first->next 指向 [B]
  • *pfirst 改指向 [B]
  • y 指向 [B]

串列的新起點已經改為 [B]:

pfirst
 |
 v
[B] -> [C] -> NULL

[A] -> [B]

執行:

while(y->next) y = y->next;

迴圈結束時,y 指向尾端節點 [C]。

接著:

y->next = x;

將尾端 [C] 接到原本第一個節點 [A]:

[B] -> [C] -> [A] -> [B] ...

此時形成循環,因此最後必須執行:

x->next = NULL;

也就是切斷原本 [A] 到 [B] 的連結:

[B] -> [C] -> [A] -> NULL

所以 CCC 必須是:

x->next

逐步追蹤(trace)

以串列:

🔒

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

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

免費註冊

第 76 題2 分

What will be the declaration of the following requirements?

(i) An array of 10 pointers to integer named a.

(ii) A pointer of 10 integers named p.

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

這一題的完整詳解

核心觀念

本題考查 C 語言的「陣列與指標宣告語法」,關鍵在於:

  1. [] 的優先權高於 *
  2. 括號可以改變運算順序
  3. 宣告必須從變數名稱向外閱讀

C 語言中:

  • *a[10] 解析為「長度為 10 的陣列,元素是指向整數的指標」
  • (*p)[10] 解析為「指向含有 10 個整數之陣列的指標」

完整宣告為:

int *a[10];\texttt{int *a[10];}

以及:

int (*p)[10];\texttt{int (*p)[10];}

解題方法

(i) An array of 10 pointers to integer named a

題意是:

a 是一個陣列,共有 10 個元素;每個元素都是「指向整數的指標」。

宣告時先從變數名稱 a 開始:

a[10]\texttt{a[10]}

表示 a 是長度為 10 的陣列。

再在 a 前方加上 *:

*a[10]\texttt{*a[10]}

由於 [] 優先權高於 *,其實際解析方式是:

*(a[10])\texttt{*(a[10])}

因此代表:

a 是一個包含 10 個「整數指標」的陣列。

完整形式為:

int *a[10];\texttt{int *a[10];}

(ii) A pointer of 10 integers named p

題意是:

p 是一個指標,指向含有 10 個整數的陣列。

先表示「含有 10 個整數的陣列」:

p[10]\texttt{p[10]}

若直接寫成 *p[10],由於 [] 優先權較高,會被解讀為:

*(p[10])\texttt{*(p[10])}

這代表「長度為 10 的陣列,元素是指標」,並不是「指向長度為 10 的整數陣列」。

因此必須用括號先把 *p 綁在一起:

(*p)[10]\texttt{(*p)[10]}

其解析方式是:

  1. *p:p 是指標
  2. (*p)[10]:該指標指向一個含有 10 個整數的陣列

完整形式為:

int (*p)[10];\texttt{int (*p)[10];}

選項分析

(A) a[10]; *p[10];

第一部分 a[10]:

  • 只能表示 a 是長度為 10 的陣列
  • 沒有 *,無法表示陣列元素是整數指標

第二部分 *p[10]:

  • 依照優先權解析為 *(p[10])
  • 表示 p 是「含有 10 個指標的陣列」
  • 不表示 p 是指向 10 個整數的指標

因此整體錯誤。


(B) **a[10]; *p[10];

第一部分 **a[10]:

解析為:

**(a[10])\texttt{**(a[10])}

表示:

  • a 是長度為 10 的陣列
  • 每個元素是「指向指標的指標」

也就是「array of 10 pointers to pointers to integer」,不是「array of 10 pointers to integer」。

第二部分 *p[10]:

  • 表示 p 是長度為 10 的指標陣列
  • 不是指向 10 個整數的指標

因此錯誤。


(C) *a[10]; (*p)[10];

第一部分 *a[10]:

解析為:

*(a[10])\texttt{*(a[10])}

表示 a 是長度為 10 的陣列,陣列元素為整數指標,符合第 (i) 項。

🔒

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

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

免費註冊

第 77 題2 分

Which of the following gives the number of elements in the array int a[]?

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

這一題的完整詳解

核心觀念

本題主要測驗 C/C++ 語言中陣列(Array)的大小計算與 **sizeof 運算子(operator)**的基本觀念:

  1. sizeof 運算子性質:
  • sizeof 是 C/C++ 的內建單元運算子(在編譯時期計算求值),用來取得某型別或變數在記憶體中所佔用的位元組數(Bytes)。
  • 當 sizeof 套用於具備明確定義長度的靜態陣列識別字 a(且尚未退化成指標)時,sizeof(a) 代表的是整個陣列佔據的總記憶體位元組數。
  1. 陣列元素數量的數學公式:
    陣列在記憶體中是連續配置的,所有元素型別相同且佔用相同大小。若欲求得陣列元素數量(長度 NN),其公式為:
元素個數=整個陣列佔用的總位元組數單一元素佔用的位元組數\text{元素個數} = \frac{\text{整個陣列佔用的總位元組數}}{\text{單一元素佔用的位元組數}}

以宣告為整數陣列的 int a[] 為例:

  • 整個陣列總位元組數:sizeof(a)
  • 單一元素位元組數:sizeof(int) 或 sizeof(a[0]) 或 sizeof(*a)

解題方法

  1. 求分子(整個陣列的總空間):
    題目宣告之陣列為 int a[](假設在原範疇中有初始化,編譯器已知其完整大小)。使用 sizeof(a) 可以取得此陣列在記憶體中所佔用的總位元組數。

  2. 求分母(單一元素空間):
    該陣列的元素型別為 int,因此每一個元素佔用的位元組數即為 sizeof(int)。

  3. 計算元素總數:
    將總位元組數除以單一元素位元組數,即得陣列元素個數:

元素個數=sizeof(a)sizeof(int)\text{元素個數} = \frac{\text{sizeof}(a)}{\text{sizeof}(\text{int})}

對應選項即為 sizeof(a)/sizeof(int)。


選項分析

  • (A) sizeof(a):錯誤。
  • sizeof(a) 回傳的是整個陣列所佔據的總位元組數(Total bytes),而非元素數量。例如,若陣列有 10 個 int 元素,在 32 位元或 64 位元系統下(sizeof(int) 通常為 4 位元組),sizeof(a) 的結果為 10×4=4010 \times 4 = 40 位元組。
🔒

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

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

免費註冊

第 78 題2 分

Consider the following function and code segment.

void me( int x, int & y )

{

    x = 10;

    y = x + 1;

}

int main()

{

    // other code ...

    int j = 5;

    int k = 3;

    me(j, k);

    // other code ..

}

After the call to me(j, k); what are the values of jj and kk?

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

這一題的完整詳解

核心觀念:參數傳值與參數參照

函式宣告為:

void me(int x, int& y)

其中:

  • int x:以「傳值」方式傳入,函式內的 x 是原變數的副本。
  • int& y:以「參照」方式傳入,y 是原變數的別名,函式內修改 y 會直接修改呼叫端的變數。

主程式初始值為:

int j = 5;
int k = 3;

呼叫:

me(j, k);

因此:

  • x 取得 j 的副本,初始為 55。
  • y 參照到 k,因此 y 與 k 指向同一個整數資料。

解題方法:逐行追蹤程式

函式內容為:

void me(int x, int& y)
{
 x = 10;
 y = x + 1;
}

逐步追蹤如下:

執行步驟xyjk
呼叫函式前——53
傳入函式後5353
執行 x = 10;10353
執行 y = x + 1;1011511

關鍵在於:

  1. x = 10 只修改區域副本 x,不會影響 j。
  2. y = x + 1 先計算 10+1=1110+1=11。
  3. 因為 y 是 k 的參照,所以這個 1111 會直接存入 k。

因此函式執行完畢後:

🔒

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

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

免費註冊

第 79 題2 分

Assume this code fragment is embedded in an otherwise correct and complete program. What should be the output from this code segment?

{

    for(int i=0;i<5;i++)

    {

        ...

        ...

    }

    cout << i << endl;

}

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

這一題的完整詳解

核心觀念:for 迴圈變數的作用域

本題考查 C++ 中變數的「作用域(scope)」。

在下列宣告中:

for (int i = 0; i < 5; i++)
{
 ...
}

i 是在 for 迴圈的初始化區段中宣告的變數。依 C++ 的作用域規則,i 只存在於這個 for 迴圈敘述內,包括:

  • 迴圈的初始化部分:int i = 0
  • 條件判斷:i < 5
  • 迴圈本體:{ ... }
  • 更新運算:i++

當 for 迴圈結束後,變數 i 的作用域也隨之結束,因此後面的:

cout << i << endl;

已經不在 i 的有效作用域內,會造成編譯錯誤。

解題方法與逐步追蹤

程式片段可整理如下:

{
 for (int i = 0; i < 5; i++)
 {
 ...
 ...
 }

 cout << i << endl;
}

逐步判斷:

  1. 執行 int i = 0,建立變數 i,初值為 00。
  2. 判斷 i<5i < 5:
  • 0<50 < 5,成立,執行迴圈本體。
  1. 執行 i++,此時 i=1i=1。
  2. 依序經過 i=1,2,3,4i=1,2,3,4,皆會執行迴圈本體。
  3. 當 i=5i=5 時,判斷 5<55<5 不成立,迴圈結束。
  4. 迴圈結束時,i 的作用域也結束。
  5. cout << i << endl; 嘗試使用已離開作用域的變數,因此程式無法通過編譯,不會產生正常輸出。

迴圈內部的 i 值變化如下:

階段i 的值結果
初始化0執行迴圈
第一次更新後1執行迴圈
第二次更新後2執行迴圈
第三次更新後3執行迴圈
第四次更新後4執行迴圈
第五次更新後5結束迴圈

重點在於:雖然迴圈結束時概念上曾經有過 i=5,但該變數已不再存在於後續敘述的作用域中。

選項分析

(A) 5

錯誤。

🔒

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

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

免費註冊

第 80 題2 分

Consider the following C code fragment:

int x=38;

int *p=&x;

Which of the following code will output 38?

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

這一題的完整詳解

核心觀念

本題考查 C 語言的指標、取址運算子 & 與解參照運算子 *。

已知:

int x = 38;
int *p = &x;

其關係如下:

  • x:整數變數,值為 38
  • &x:取得 x 的記憶體位址,型別為 int *
  • p:儲存 x 位址的指標,型別為 int *
  • *p:取出 p 所指向的整數,也就是 x 的值 38

運算子具有下列互消關係:

*&x = x &*p = p

但要注意:*&x 的結果是整數值,而 &*p 的結果是位址。


解題方法

先判斷每個運算式的實際結果與型別,再檢查是否符合 printf("%d", ...) 的格式要求。

%d 要求傳入的引數型別為 int。因此,只有「結果是整數值 38,且型別為 int」的選項能正確輸出 38。


選項分析

(A) printf("%d", &*p);

依照運算順序:

  1. *p:取出 p 指向的變數 x,結果代表 x
  2. &*p:再取得該變數的位址

因此:

&*p = &x

結果是 x 的位址,型別為 int *,不是整數值 38。

而 %d 需要 int,卻傳入了指標,會造成未定義行為,不能視為輸出 38。

錯誤。


(B) printf("%d", *&p);

依照運算順序:

  1. &p:取得指標變數 p 本身的位址,型別為 int **
  2. *&p:解參照該位址,取回 p

因此:

*&p = p

結果是指向 x 的指標,型別為 int *,不是 x 的內容 38。

同樣地,%d 與指標型別不相容,會造成未定義行為。

錯誤。


(C) printf("%d", *&x);

依照運算順序:

🔒

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

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

免費註冊

第 81 題2 分

Which of the following C statements is incorrect?

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

這一題的完整詳解

核心觀念

本題考查 C 語言的 enum 列舉型別,以及 typedef 為型別建立別名的語法。

列舉宣告的基本形式如下:

  • 建立匿名列舉型別並宣告變數:

enum {Spade, Heart, Diamond, Club} suit;

  • 建立具名列舉型別並宣告變數:

enum suit {Spade, Heart, Diamond, Club} t;

  • 使用 typedef 為列舉型別建立別名:

typedef enum {Spade, Heart, Diamond, Club} Suit;

其中:

  • Spade、Heart、Diamond、Club 是列舉常數。
  • 若未指定數值,第一個列舉常數預設為 00,後續依序遞增,因此:

Spade=0,Heart=1,Diamond=2,Club=3\text{Spade}=0,\quad \text{Heart}=1,\quad \text{Diamond}=2,\quad \text{Club}=3

  • typedef 必須搭配至少一個宣告子,才能指定新的型別別名。

解題方法

逐一檢查每個敘述是否符合 C 語言的宣告結構:

  1. 是否正確使用 enum 型別指定子。
  2. 若含有 typedef,是否有提供新的型別名稱。
  3. 若沒有 typedef,是否有宣告變數或列舉標籤。
  4. 確認大括號後的識別字扮演的是型別別名、列舉標籤或變數。

本題的關鍵在於辨認 typedef enum {...}; 是否真的建立了型別別名。

選項分析

(A) typedef enum {Spade, Heart, Diamond, Club };

此敘述不正確。

typedef 的作用是替某個既有型別建立別名,標準形式必須在列舉宣告後提供名稱,例如:

typedef enum {Spade, Heart, Diamond, Club} Suit;

原敘述在 } 後直接接分號,沒有提供任何 typedef 名稱。因此沒有宣告出新的型別別名,不符合正確的 typedef 宣告要求。

可將其與正確寫法比較:

  • 錯誤:typedef enum {...};
  • 正確:typedef enum {...} Suit;

(B) typedef enum {Spade, Heart, Diamond, Club } Suit;

此敘述正確。

這會建立一個匿名列舉型別,並以 Suit 作為它的型別別名。之後可以宣告:

Suit card;

其效果相當於使用一個列舉型別表示花色。

列舉常數的值為:

🔒

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

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

免費註冊

第 82 題2 分

Suppose the output of the following C code fragment is 0xffff00003a04:

int x=38;

int *p=&x;

printf("%p", p);

What is the output of printf("%p", p+3);?

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

這一題的完整詳解

核心觀念

本題考查兩個重點:

  1. int *p 是指向 int 的指標。
  2. 指標加法會依照所指向資料型態的大小進行位移,不是單純增加相同的數字。

對於 int *p 而言:

p+n=p 的位址+n×sizeof(int)p+n = p \text{ 的位址} + n \times \text{sizeof(int)}

本題依選項設計,採用常見環境:

sizeof(int)=4 bytes\text{sizeof(int)}=4\text{ bytes}

因此:

p+3=p 的位址+3×4p+3 = p\text{ 的位址} + 3\times 4

解題方法

已知:

p=0xffff00003a04p=0xffff00003a04

p+3 表示指標向後移動 3 個 int 的位置,每個 int 佔 4 bytes:

3×4=123\times 4=12

將 12 轉為十六進位:

1210=0x0c12_{10}=0x0c

所以:

0xffff00003a04+0x0c=0xffff00003a100xffff00003a04+0x0c =0xffff00003a10

因此:

printf("%p", p+3);

輸出的位址為:

0xffff00003a10

逐步追蹤

表達式位址變化
p0xffff00003a04
p+10xffff00003a08
p+20xffff00003a0c
🔒

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

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

免費註冊

第 83 題2 分

If the line:

friend class A;

appears in class B, and the line:

friend class B;

appears in class C, then:

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

這一題的完整詳解

核心觀念:C++ 的 friend 關係

在 C++ 中,若類別 B 內出現:

friend class A;

代表:

  • A 是 B 的 friend。
  • A 的成員函式與成員物件可以存取 B 的 private 與 protected 成員。
  • B 並不因此取得 A 的私有成員存取權。
  • friend 關係不具備反向性,也不具備傳遞性。

本題的兩條宣告可表示為:

class B {
 friend class A;
};

因此:

A→BA \rightarrow B

表示 A 可以存取 B 的私有成員。

class C {
 friend class B;
};

因此:

B→CB \rightarrow C

表示 B 可以存取 C 的私有成員。

整體關係為:

A→B→CA \rightarrow B \rightarrow C

但這不會自動推出:

A→CA \rightarrow C

也不會推出:

C→BC \rightarrow B

或:

B→AB \rightarrow A

解題方法

逐一確認每個類別的 friend 對象:

  1. friend class A; 出現在 B 中
    → A 可以存取 B 的私有成員。

  2. friend class B; 出現在 C 中
    → B 可以存取 C 的私有成員。

  3. friend 關係不會沿著類別鏈自動傳遞,也不會雙向成立。

因此只有「A 能存取 B 的 private 變數」符合題意。


選項分析

(A) Class A is a friend of class C.

錯誤。

A 是 B 的 friend,而 B 是 C 的 friend,但 friend 關係不具傳遞性:

A 是 B 的 friend∧B 是 C 的 friend⇏A 是 C 的 friendA \text{ 是 } B \text{ 的 friend} \land B \text{ 是 } C \text{ 的 friend} \not\Rightarrow A \text{ 是 } C \text{ 的 friend}

若要讓 A 存取 C 的私有成員,必須在 C 中明確宣告:

friend class A;

(B) Class A can access private variables of class B.

正確。

因為在 B 中宣告:

friend class A;
🔒

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

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

免費註冊

第 84 題2 分

Since the postfix increment operator returns objects by value and the prefix increment operator returns objects by reference:

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

這一題的完整詳解

核心觀念

本題考查 C++ 的前置遞增(prefix increment)與後置遞增(postfix increment):

  • 前置遞增:++x
  • 後置遞增:x++

兩者都會使物件的值增加 11,差別在於「運算式回傳的值」以及「回傳方式」。

前置遞增

++x;

其概念可表示為:

x = x + 1;
return x;

前置遞增通常回傳遞增後的物件參考,因此可以直接取得新值,也不必額外建立儲存舊值的暫存物件。

後置遞增

x++;

其概念可表示為:

temporary = x;
x = x + 1;
return temporary;

後置遞增會先保存原本的值,再將物件加 11,最後回傳包含「遞增前原值」的暫存物件。

因此:

  • 實際物件的值:已經增加 11
  • 運算式的回傳值:遞增前的舊值

解題方法

判斷本題的關鍵是分清楚兩件事:

  1. 運算子是否改變原物件。
  2. 運算子回傳的是新值還是舊值。

設:

int x = 5;

執行:

int y = x++;

逐步追蹤如下:

步驟x 的值暫存回傳值y 的值
初始5——
保存舊值55—
x 遞增65—
指派回傳值655

所以執行完畢後:

x == 6
y == 5

後置遞增的運算式確實可以放入較大的運算式中,例如:

int result = x++ + 10;

若原本 x == 5,則:

  • x++ 提供給加法的值為 55
  • x 執行後變成 66
  • result 為 1515

選項分析

(A) Prefix increment has slightly more overhead than postfix increment.

錯誤。

前置遞增通常直接將物件增加 11,再回傳遞增後的物件參考:

++x;

後置遞增則通常必須:

  1. 複製原本的值。
  2. 將原物件遞增。
  3. 回傳保存舊值的暫存物件。

因此一般而言,後置遞增的額外負擔較大,前置遞增不會比後置遞增有更多此類額外成本。

(B) The postfix increment operator returns the actual incremented object with its new value.

錯誤。

後置遞增會改變實際物件,但它回傳的是遞增前的舊值。

例如:

int x = 5;
int y = x++;

執行後:

🔒

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

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

免費註冊

第 85 題2 分

virtual destructors must be used when:

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

這一題的完整詳解

核心觀念

本題考查 C++ 的「多型刪除」與 virtual destructor。

當基底類別指標指向衍生類別物件時:

Base* ptr = new Derived;

若透過 Base* 執行:

delete ptr;

基底類別的 destructor 必須宣告為 virtual,才能確保刪除時依序呼叫:

  1. Derived::~Derived
  2. Base::~Base

此機制稱為虛擬解構函式(virtual destructor)。

若基底類別 destructor 不是 virtual,透過基底類別指標刪除衍生類別物件,會產生未定義行為(undefined behavior),可能造成衍生類別資源未釋放、記憶體洩漏等問題。

class Base {
public:
 virtual ~Base {}
};

class Derived : public Base {
public:
 ~Derived {}
};

Base* ptr = new Derived;
delete ptr; // 正確,會呼叫 Derived::~Derived
 // 接著呼叫 Base::~Base

若寫成:

class Base {
public:
 ~Base {}
};

則:

Base* ptr = new Derived;
delete ptr; // 未定義行為

解題方法

判斷關鍵在於:

是否使用基底類別指標,指向衍生類別物件,並透過該基底指標執行 delete?

符合下列形式時,基底類別 destructor 必須是 virtual:

Base* p = new Derived;
delete p;

delete 的靜態型別是 Base*,但實際物件型別是 Derived。若 destructor 為虛擬函式,C++ 會根據實際物件型別進行動態繫結,完整執行衍生類別與基底類別的解構流程。

因此正確選項是:

(B) delete is used on a base-class pointer that points to a derived-class object.

選項分析

(A) The constructor in the base class is virtual.

錯誤。

C++ 不允許 constructor 宣告為 virtual。建立物件時,必須先執行基底類別 constructor,再執行衍生類別 constructor;constructor 不透過一般虛擬函式機制進行動態分派。

因此基底類別 constructor 是否為 virtual,不能作為使用 virtual destructor 的條件。

(B) delete is used on a base-class pointer that points to a derived-class object.

🔒

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

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

免費註冊

第 86 題2 分

What should be filled in the following blanks if we want to print {0:[90, 'Alice'],1:[87, 'Bob'],2:[93, 'Apple']} in this Python code?

x = [90,87,93]

y = ('Alice','Bob','Apple')

z = {}

for i in range(len(x)):

    ____

print(z)

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

這一題的完整詳解

核心觀念

本題考查 Python 中:

  • list(串列)的索引存取:x[i]、y[i]
  • dict(字典)的鍵值指定:z[i] = value
  • 逗號建立 tuple(元組)
  • range(len(x)) 的迴圈追蹤

目標輸出為:

{0: [90, 'Alice'], 1: [87, 'Bob'], 2: [93, 'Apple']}

因此每次迴圈都必須將:

  • x[i] 作為數值
  • y[i] 作為姓名
  • 兩者組成一個串列 [x[i], y[i]]
  • 再存入字典 z 的第 i 個鍵

解題方法

原始資料為:

x = [90, 87, 93]
y = ('Alice', 'Bob', 'Apple')
z = {}

len(x) = 3,所以:

range(len(x)) = range(3)

迴圈變數 i 依序為 0,1,20,1,2。

正確填入:

z[i] = [x[i], y[i]]

逐步追蹤如下:

ix[i]y[i]執行後的 z
009090'Alice'{0: [90, 'Alice']}
118787'Bob'{0: [90, 'Alice'], 1: [87, 'Bob']}
229393'Apple'{0: [90, 'Alice'], 1: [87, 'Bob'], 2: [93, 'Apple']}

因此最後會印出題目指定的結果。


選項分析

(A) z[i]=[x[i],y[i]]

正確。

方括號會建立一個串列,例如當 i = 0 時:

[x[0], y[0]] = [90, 'Alice']

因此:

z[0] = [90, 'Alice']

三次迴圈後,恰好得到:

{0: [90, 'Alice'], 1: [87, 'Bob'], 2: [93, 'Apple']}

(B) z[i]=x[i],y[i]

錯誤。

Python 中逗號會建立 tuple,因此這行等同於:

z[i] = (x[i], y[i])

最後結果為:

🔒

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

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

免費註冊

第 87 題2 分

What is the output of the following Python code?

print([(a,b) for a in range(3) for b in range(a)])

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

這一題的完整詳解

核心觀念

本題考查 Python 的:

  1. range 產生的整數範圍。
  2. 巢狀 list comprehension(串列生成式)。
  3. 巢狀 for 迴圈的執行順序。
  4. Tuple(元組)(a, b) 的建立方式。

程式碼為:

[(a, b) for a in range(3) for b in range(a)]

其結構等價於:

result = []

for a in range(3):
 for b in range(a):
 result.append((a, b))

外層先固定一個 a,再執行完整的內層迴圈,依序產生所有符合條件的 (a, b)。


解題方法與逐步追蹤

1. 判斷外層 a 的範圍

range(3)

產生:

a=0,1,2a = 0,1,2

2. 判斷每個 a 對應的 b 範圍

內層為:

range(a)

range(a) 會產生從 00 到 a−1a-1 的整數,因此:

  • 當 a=0a=0 時,range(0) 為空集合,不產生任何 tuple。
  • 當 a=1a=1 時,range(1) 產生 b=0b=0。
  • 當 a=2a=2 時,range(2) 產生 b=0,1b=0,1。

逐步追蹤如下:

外層 a內層 range(a)產生的 tuple
00range(0),無元素無
11b=0b=0(1,0)(1,0)
22b=0,1b=0,1(2,0),(2,1)(2,0),(2,1)

因此串列內容為:

[(1, 0), (2, 0), (2, 1)]

Python 實際輸出會在 tuple 內的逗號後加上空格:

[(1, 0), (2, 0), (2, 1)]

選項中的空格屬於排版差異,內容相同。


選項分析

(A) [(1,0),(2,0),(2,1)]

正確。

當 a=1a=1 時產生 (1,0)(1,0);當 a=2a=2 時產生 (2,0)(2,0) 與 (2,1)(2,1),完整結果正是:

[(1, 0), (2, 0), (2, 1)]

(B) [(0,0),(1,1),(2,2)]

錯誤。

此選項相當於令 b=ab=a,但題目中的 b 是從 range(a) 產生,最大值只能到 a−1a-1,不包含 aa。

此外,當 a=0a=0 時,range(0) 沒有任何元素,因此不會產生 (0,0)(0,0)。


(C) [(1,0),(2,1),(2,1)]

🔒

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

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

免費註冊

第 88 題2 分

Consider the recursive function:

int fun1(int n)

{

    if (1==n)

        return 1;

    else

        return fun1(n-1) + 2*n - 1;

}

Which of these expressions could replace a call to this function?

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

這一題的完整詳解

核心觀念

本題考查:

  • 遞迴函式的逐步展開
  • 遞迴關係式的推導
  • 等差數列總和
  • 判斷某個數學式是否等價於函式回傳值

函式為:

int fun1(int n)
{
 if (1 == n)
 return 1;
 else
 return fun1(n-1) + 2*n - 1;
}

當 n>1n>1 時,每次遞迴會:

  1. 將參數由 nn 減為 n−1n-1
  2. 加上 2n−12n-1

因此可寫成遞迴關係式:

f(1)=1f(1)=1 f(n)=f(n−1)+2n−1f(n)=f(n-1)+2n-1

解題方法:逐步展開

將函式逐步展開:

f(n)=f(n−1)+(2n−1)f(n)=f(n-1)+(2n-1) f(n−1)=f(n−2)+(2(n−1)−1)f(n-1)=f(n-2)+\bigl(2(n-1)-1\bigr)

代回可得:

f(n)=f(n−2)+(2n−1)+(2n−3)f(n)=f(n-2)+(2n-1)+(2n-3)

持續展開至 f(1)f(1):

f(n)=1+3+5+⋯+(2n−1)f(n)=1+3+5+\cdots +(2n-1)

前 nn 個奇數的總和為:

1+3+5+⋯+(2n−1)=n21+3+5+\cdots +(2n-1)=n^2

因此:

f(n)=n2\boxed{f(n)=n^2}

也可用數學歸納法驗證:

假設 f(n−1)=(n−1)2f(n-1)=(n-1)^2,則

f(n)=f(n−1)+2n−1=(n−1)2+2n−1=n2−2n+1+2n−1=n2\begin{aligned} f(n) &=f(n-1)+2n-1\\ &=(n-1)^2+2n-1\\ &=n^2-2n+1+2n-1\\ &=n^2 \end{aligned}

且基本情形成立:

f(1)=1=12f(1)=1=1^2

所以對所有正整數 nn,函式回傳值皆為 n2n^2。


逐步追蹤(trace)

以 n=4n=4 為例:

f(4)=f(3)+7=(f(2)+5)+7=((f(1)+3)+5)+7=1+3+5+7=16\begin{aligned} f(4) &=f(3)+7\\ &=(f(2)+5)+7\\ &=((f(1)+3)+5)+7\\ &=1+3+5+7\\ &=16 \end{aligned}

而:

42=164^2=16

兩者相符。


選項分析

🔒

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

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

免費註冊

第 89 題2 分

Consider the following C code fragment:

char *str1="Hello";

char str2[]={'W','o','r','l','d',0};

int i;

for(i=0;i<5;i++)

    str2[5-i-1]=str1[i/2];

printf("%s", str2);

What output will be generated?

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

這一題的完整詳解

核心觀念

本題考查:

  1. C 語言陣列索引從 00 開始。
  2. 整數除法的無條件捨去:
    i/2i/2
  3. char 陣列以空字元 '\0' 作為 C 字串結尾。
  4. 迴圈中同時改變陣列指定位置的字元。
  5. printf("%s", str2) 會從 str2[0] 開始輸出,直到遇到 '\0' 為止。

初始資料

char *str1 = "Hello";
char str2[] = {'W', 'o', 'r', 'l', 'd', 0};

str1 指向字串:

索引012345
str1Hello'\0'

str2 是可修改的字元陣列:

索引012345
str2 初始值World'\0'

迴圈中的指定敘述為:

str2[5-i-1] = str1[i/2];

可整理為:

str2[4-i] = str1[i/2];

逐步追蹤(Trace)

i 的範圍是 00 到 44,且 i/2 採用整數除法。

ii/2修改位置 str2[4-i]寫入字元 str1[i/2]修改後的 str2
00str2[4]str1[0] = 'H'WorlH\0
10str2[3]str1[0] = 'H'WorHH\0
21str2[2]str1[1] = 'e'WoeHH\0
31str2[1]str1[1] = 'e'WeeHH\0
42str2[0]str1[2] = 'l'leeHH\0

迴圈結束後:

str2 = {'l', 'e', 'e', 'H', 'H', 0};

因此:

🔒

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

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

免費註冊

第 90 題2 分

Consider the following C++ code fragment:

int &max(int &a, int &b)

{

    if(a>b) return a;

    return b;

}

int main()

{

    int x=35, y=42;

    max(x,y)=10;

    max(x,y)++;

    cout << x << ", " << y;

}

What output will be generated?

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

這一題的完整詳解

核心觀念

本題考查 C++ 的:

  1. 參考回傳值(reference return)
  2. 左值(lvalue)可直接被賦值或遞增
  3. 函式每次呼叫時,都會依照當下的變數值判斷回傳 a 或 b

函式宣告:

int &max(int &a, int &b)

表示:

  • a、b 以參考方式傳入,不會建立副本。
  • 函式回傳型態為 int&,也就是回傳某個原有整數變數的參考。
  • return a; 回傳呼叫端變數的別名。
  • return b; 同樣回傳呼叫端變數的別名。

因此,max(x,y) 不只是取得較大數值,也能直接代表 x 或 y 本身。


解題方法

先依照程式執行順序追蹤變數值。

第一步:初始值

int x=35, y=42;

因此:

x=35,y=42x=35,\qquad y=42

第二步:執行 max(x,y)=10;

呼叫:

max(x,y)

此時:

a 參考 x
b 參考 y

比較:

if(a>b)

也就是:

35>4235>42

結果為假,因此執行:

return b;

函式回傳 y 的參考,所以:

max(x,y)=10;

等同於:

y=10;

此時:

x=35,y=10x=35,\qquad y=10

第三步:執行 max(x,y)++;

此時再次呼叫:

max(x,y)

現在的值為:

x=35,y=10x=35,\qquad y=10

比較:

35>1035>10

結果為真,因此執行:

return a;

函式回傳 x 的參考,因此:

max(x,y)++;

等同於:

x++;

執行後:

x=36,y=10x=36,\qquad y=10

第四步:輸出

cout << x << ", " << y;
🔒

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

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

免費註冊

其他考古題

111 年國立中山大學的其他科目

國立中山大學《計算機概論與程式設計》其他年度

其他學校的《計算機概論與程式設計》