113 高普考高考三級 電子工程 計算機概論 考古題詳解
第 一 題20 分
試述佇列(queue)與堆疊(stack)的工作原理及其特性,並分別舉出此兩種資料結構在電腦系統中實際應用的例子。
登入後即可作答並保存紀錄。
核心觀念
佇列(queue)與堆疊(stack)都是線性資料結構,主要差別在於資料加入與取出的順序:
- 佇列:先進先出(FIFO, First In First Out)。先加入的資料先取出。
- 堆疊:後進先出(LIFO, Last In First Out)。最後加入的資料先取出。
兩者的基本操作時間通常為 ;若以陣列實作,佇列須處理容量與首尾索引,堆疊則由頂端索引記錄目前可操作的位置。
解題方法
作答時先說明兩種結構的加入、取出位置及順序,再補充主要操作與特性,最後各舉電腦系統中的實際應用。以資料依序加入 為例,可直接看出兩者取出順序不同。
佇列(queue)
佇列在一端加入資料,稱為隊尾(rear);在另一端取出資料,稱為隊首(front)。若依序加入 ,取出順序為 。
常見操作如下:
- enqueue:在隊尾加入資料。
- dequeue:從隊首取出資料。
- front/peek:查看隊首資料,但不取出。
佇列遵守 FIFO,適合依到達先後處理工作的情境。若以固定大小陣列實作,常用**環狀佇列(circular queue)**讓索引繞回陣列起點,避免已取出的位置無法再利用。
第 二 題20 分
中央處理器(CPU)在處理指令(instruction)時包含哪些步驟?請依運作順序列出這些步驟並詳細說明。
登入後即可作答並保存紀錄。
核心觀念
本題考查 CPU 的指令週期(instruction cycle),也就是 CPU 如何依序擷取指令、解讀指令並完成指定操作。基本流程為:
擷取指令(Fetch)→ 指令解碼(Decode)→ 擷取運算元(Operand Fetch)→ 執行(Execute)→ 儲存結果(Write-back)→ 更新指令位址。
各教材對步驟的細分略有差異;有些會將「擷取運算元」併入解碼,或將「更新指令位址」視為流程控制的一部分。答題時應清楚交代各階段的功能與先後關係。
解題方法
依指令執行的時間順序,從「取得下一條指令」開始,說明 CPU 如何決定指令意義、取得資料、執行操作,再保存結果並準備下一條指令。
-
擷取指令(Fetch) 程式計數器(Program Counter, PC)保存下一條待執行指令的位址。CPU 將該位址送至記憶體位址暫存器(MAR),向主記憶體讀取指令,並將指令載入記憶體資料暫存器(MDR),再送入指令暫存器(IR)。一般情況下,PC 會更新為下一條順序指令的位址;若指令是跳躍或分支指令,則稍後可能改成目標位址。
-
指令解碼(Decode) 控制單元(Control Unit)分析 IR 中的操作碼(opcode),判斷指令要執行的動作,例如加法、資料搬移或跳躍;同時辨識運算元的位置、定址方式及所需的控制訊號。
第 三 題20 分
什麼是物件導向程式設計(object oriented programming)?它包含哪些基本原則?試述這些原則的意義及使用這些原則的優點。
登入後即可作答並保存紀錄。
核心觀念
物件導向程式設計(Object-Oriented Programming, OOP)是一種以「物件」為核心組織程式的方法。物件將資料與操作資料的方法結合;程式透過物件彼此互動,完成所需功能。
OOP 常以「類別」與「物件」來描述:
- 類別(class):物件的設計藍圖,定義資料欄位及可執行的方法。
- 物件(object):依類別建立的個體,具有自己的狀態,並能執行類別所定義的行為。
例如,以「銀行帳戶」作為類別,可定義帳戶餘額及存款、提款等方法;建立的每一個帳戶則是各自獨立的物件。
基本原則及意義
OOP 的基本原則通常概括為封裝、抽象、繼承、多型。其中封裝與抽象關注如何管理及呈現物件;繼承與多型則協助建立可延伸、可替換的類別架構。
一、封裝(encapsulation)
將資料與操作資料的方法集中在同一個物件或類別中,並透過存取權限控制外部能否直接讀取或修改內部資料。外部通常透過公開的方法與物件互動。
例如,帳戶餘額不讓外部任意改寫,而是透過存款、提款方法調整,並在方法中檢查金額是否符合規則。
**優點:**保護資料完整性、降低物件內部實作與外部程式之間的依賴;日後修改內部實作時,只要對外介面不變,使用者端程式通常不必跟著修改。
二、抽象(abstraction)
只呈現使用者需要的功能與介面,隱藏不必要的實作細節。使用者知道如何呼叫功能,不必了解其內部如何完成。
例如,使用者呼叫「列印」功能即可輸出文件,不需要知道印表機如何處理資料及控制硬體。
**優點:**降低理解與使用複雜系統的負擔,讓程式設計者能以較高層次描述問題,也能將實作細節與使用方式分開。
三、繼承(inheritance)
由既有類別建立新類別,使新類別取得原類別的資料與方法,並可增加或改寫自身的功能。原類別通常稱為父類別或基底類別,新類別稱為子類別或衍生類別。
例如,「電動車」可繼承「車輛」類別的基本屬性與行為,再加入電池容量等特有資料及充電方法。
第 四 題20 分
在作業系統(operating system)中,何謂長程排班程式(long-term scheduler)?何謂短程排班程式(short-term scheduler)?請詳細說明它們的功用與工作原理。
登入後即可作答並保存紀錄。
核心觀念
本題考查作業系統的行程排班層級。長程排班程式與短程排班程式都負責安排工作,但決策發生的時機不同:
- 長程排班程式(long-term scheduler,又稱 job scheduler):從後備工作佇列選取工作,將其載入記憶體並建立為行程,使它進入就緒佇列。
- 短程排班程式(short-term scheduler,又稱 CPU scheduler):從記憶體中的就緒佇列選取一個行程,分派 CPU 給它執行。
兩者的主要差異在於:長程排班決定哪些工作進入系統;短程排班決定哪個已就緒的行程現在使用 CPU。
解題方法
依照「行程從提交到取得 CPU」的流程說明兩種排班程式,即可交代其功能與工作原理:
長程排班程式
工作提交後,通常先存放在磁碟上的後備工作佇列。長程排班程式會依作業系統的政策,從佇列中挑選工作,將工作載入主記憶體並建立行程,讓行程進入就緒狀態、等待 CPU。
它的主要功用如下:
- 控制多道程式度:決定同時進入記憶體、等待或使用 CPU 的行程數量。
- 調節系統負載:避免一次引入過多工作,造成記憶體與其他資源過度競爭。
第 五 題20 分
請詳細說明下列 Python 語言程式的執行過程,並寫出程式的輸出。
max = 150 goal = list(range(3, max, 2)) goal.insert(0, 2)
index = 1 target = 0
while index < len(goal): target = goal[index] ** 2 while target <= goal[-1]: if target in goal: goal.remove(target) target = target + goal[index] * 2 index = index + 1
print(goal) print(len(goal))
登入後即可作答並保存紀錄。
核心觀念
本題考 Python 的 range、串列索引與長度、巢狀 while 迴圈,以及 list.remove 的行為。程式以類似「篩法」的方式,從奇數候選值中移除合數,最後留下不超過 149 的質數。
range(3, 150, 2)從 3 開始,每次增加 2,且不包含終點 150,因此產生 3、5、7、……、149。goal.insert(0, 2)將 2 插入索引 0,讓串列成為從 2 起始的奇數候選值。goal[index]取得索引index的元素;goal[-1]取得串列最後一個元素。goal.remove(x)移除串列中第一個值為x的元素。若x不在串列中,串列不變。len(goal)回傳串列目前的元素數量。
解題方法
先追蹤外層迴圈選出的除數,再觀察內層迴圈如何從該除數的平方開始,每次增加其兩倍,逐一檢查奇數倍數是否仍在 goal 中。移除操作會縮短串列,但 index 仍依照程式明確指定的方式逐次加 1。
初始串列為:
外層迴圈從 index = 1 開始,因此第一個除數是 goal[1] = 3,不會用 2 作為除數。內層迴圈從 起,每次加 ,檢查 9、15、21、……、直到 149;其中仍在串列中的數字會被移除。
後續外層迴圈依序使用當時的 goal[index] 作為除數。移除合數會讓串列索引位置改變,因此除數不會依原始串列的固定位置直接遞增;不過程式逐輪取出當下索引的值,持續移除相應的奇數倍數。
執行過程
此篩法會移除所有不大於 149、且可被小於或等於其平方根的奇數質數整除的合數。因為 ,實際需要的奇數除數為 3、5、7、11。
| 除數 | 從平方開始的檢查序列 | 移除的數字 |
|---|---|---|
| 3 | 9、15、21、……、147 | 9、15、21、……、147 中尚在串列的數 |
| 5 | 25、35、45、……、145 | 25、35、45、……、145 中尚在串列的數 |