115 一般警察特考二等 刑事警察人員類別犯罪分析組 計算機概論(包括計算機結構、資料結構、程式設計) 考古題詳解
第 一 題20 分
物件導向程式設計中的封裝(encapsulation)為何意?試述之。
登入後即可作答並保存紀錄。
核心觀念
封裝(encapsulation)是物件導向程式設計的基本概念,指將資料(屬性)與操作資料的方法組合在同一個類別或物件中,並透過存取控制限制外部直接接觸物件內部狀態。外部程式通常透過物件提供的公開介面(如方法)使用功能,而不是任意修改內部資料。
解題方法
作答時掌握兩個重點:
- 結合資料與行為:類別將描述物件狀態的屬性,與讀取或改變狀態的方法放在一起。
- 控制存取與保護狀態:透過
private、public等存取修飾詞,隱藏內部資料,並規定外部如何使用物件。
第 二 題20 分
電腦中的儲存系統有那些種類?試述之。
登入後即可作答並保存紀錄。
核心觀念
儲存系統是電腦用來保存資料與程式的各類裝置和技術。依照與處理器的距離、存取速度、容量、成本及是否能在斷電後保留資料,可整理成儲存階層:越靠近 CPU,速度越快、單位容量成本越高、容量通常越小;越靠近階層底部,速度越慢、容量越大、單位容量成本越低。
解題方法
本題為申論題,宜先說明儲存系統的分類原則,再依儲存階層由上而下列出種類,並交代各自的用途與特性。回答時也要區分揮發性記憶體與非揮發性儲存裝置。
各類儲存系統
-
暫存器(Register) 位於 CPU 內部,直接供處理器使用,用來暫存指令、位址或運算中的資料。存取速度最快、容量最小,成本最高;斷電後資料消失。
-
快取記憶體(Cache) 位於 CPU 與主記憶體之間,保存近期或常用的指令與資料,以縮短 CPU 等待主記憶體的時間。速度快於主記憶體,容量較小,通常採用 SRAM;屬揮發性記憶體。
-
主記憶體(Main Memory) CPU 執行程式時,主要存放目前使用中的指令與資料。以 RAM 為主,容量大於快取、速度較慢;一般 RAM 在斷電後資料會消失。ROM 則可保存韌體等內容,通常具有非揮發性。
第 三 題20 分
使用陣列(array)和單向鏈結串列(singly linked list)來儲存資料,各有什麼優缺點?試述之。
登入後即可作答並保存紀錄。
核心觀念
本題考查**陣列(array)與單向鏈結串列(singly linked list)**的儲存方式,以及兩者在記憶體配置、存取效率、插入與刪除操作上的差異。
陣列將元素存放在一段連續的記憶體位置,通常以索引存取;單向鏈結串列則由一個個節點組成,每個節點存放資料與指向下一個節點的指標,節點不必連續配置。
解題方法
比較時可依序看四個面向:存取方式、記憶體配置、插入與刪除、容量與額外空間。
| 比較面向 | 陣列 | 單向鏈結串列 |
|---|---|---|
| 記憶體配置 | 元素通常連續存放,位置可依索引計算 | 節點可分散存放,以指標連接 |
| 存取元素 | 可直接依索引存取第 個元素,時間為 | 須從表頭逐節點往後搜尋,存取第 個元素需 |
| 搜尋 | 若未排序,通常需逐項搜尋,為 ;若依索引取值則為 | 通常須逐節點搜尋,為 |
| 插入與刪除 | 在中間插入或刪除,常須搬移後續元素,最壞為 | 已知欲操作節點的前一節點時,調整指標即可完成,為 ;但若須先搜尋位置,仍需 |
| 容量調整 | 固定大小陣列容量受建立時的配置限制;動態陣列擴充時可能須另配空間並複製元素 | 可隨節點增減而彈性成長或縮小,受可用記憶體限制 |
| 額外空間 | 不需為每個元素儲存連結指標 | 每個節點須額外儲存下一個節點的指標 |
| 快取與實作 | 連續配置通常有較佳的記憶體區域性,遍歷效率佳 | 節點分散且須追蹤指標,遍歷時可能有較多記憶體存取;也須處理指標與節點配置 |
優缺點整理
陣列的優點
- 索引存取快速:能直接計算元素位置,適合頻繁依索引讀取或修改資料。
- 額外空間較少:不須在每個元素旁存放鏈結指標。
- 遍歷效率佳:元素連續存放,通常有較好的快取區域性。
- 結構簡單:操作與實作較直接。
陣列的缺點
第 四 題20 分
請說明何謂電腦作業系統中的死結(deadlock)?死結發生的必要條件有那些?
登入後即可作答並保存紀錄。
核心觀念
作業系統中的死結(deadlock),是指一組行程各自持有部分資源,同時等待其他行程所持有的資源,因而形成循環等待;在等待關係未被打破前,這些行程都無法繼續執行。
解題方法:判斷死結的四項必要條件
依 Coffman 條件,死結發生時必須同時具備下列四項條件:
-
互斥(Mutual Exclusion) 至少有一種資源不能由多個行程同時使用,必須由單一行程獨占。例如印表機在特定列印工作完成前,不能同時供另一行程使用。
-
持有並等待(Hold and Wait) 行程已持有至少一項資源,同時又等待取得其他資源。例如行程持有印表機,並等待磁碟機。
第 五 題20 分
下列 C 語言程式的執行結果為何?請詳細敘述執行過程。
#include <stdio.h>
void foo1(int* xp, int* yp){ int temp = *xp; *xp = *yp; *yp = temp; }
void foo2(int arr[], int size){ int i; for (i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); }
void foo3(int arr[], int n){ int i, j, swapped; for (i = 0; i < n - 1; i++) { swapped = 0; for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { foo1(&arr[j], &arr[j + 1]); swapped = 1; } } if (swapped == 0) break; foo2(arr, n); } }
int main() { int arr[] = {47, 98, 27, 33, 7, 23, 5, 58}; int n = sizeof(arr) / sizeof(arr[0]); foo3(arr, n); return 0; }
登入後即可作答並保存紀錄。
核心觀念
本題考 C 語言的指標與陣列傳遞,以及 **Bubble Sort(氣泡排序法)**的執行過程。
foo3(arr, n)中,陣列arr傳入函式後可視為指向首元素的指標,因此函式內修改arr[j]會直接改變main中的原陣列。foo1(&arr[j], &arr[j + 1])傳入兩個元素的位址,透過指標交換兩個元素的值。- 內層迴圈逐一比較相鄰元素;若左邊較大就交換。每一趟結束時,尚未排序部分中最大的元素會移到末端。
- 每趟開始時
swapped設為0;發生交換便設為1。若整趟都沒有交換,代表陣列已排序,便提前結束。 foo2(arr, n)在每一趟有發生交換後印出整個陣列;若沒有交換,程式會先break,不會印出該趟結果。
解題方法
初始陣列為:
逐趟依序比較相鄰元素;遇到左值大於右值時立即交換。每趟結束後,若 swapped 為 1,就呼叫 foo2 印出目前陣列。
第 1 趟: 依序比較索引 至 的相鄰元素,較大的值逐步往右移,最後最大值 移至末端。
- 與 :不交換
- 與 :交換,陣列變為
[47, 27, 98, 33, 7, 23, 5, 58] - 與 :交換,變為
[47, 27, 33, 98, 7, 23, 5, 58] - 與 :交換,變為
[47, 27, 33, 7, 98, 23, 5, 58] - 與 :交換,變為
[47, 27, 33, 7, 23, 98, 5, 58] - 與 :交換,變為
[47, 27, 33, 7, 23, 5, 98, 58] - 與 :交換,變為
[47, 27, 33, 7, 23, 5, 58, 98]
本趟有交換,因此印出:
47 27 33 7 23 5 58 98
第 2 趟: 比較索引 至 的相鄰元素。 移至倒數第二個位置。
- 與 :交換,變為
[27, 47, 33, 7, 23, 5, 58, 98] - 與 :交換,變為
[27, 33, 47, 7, 23, 5, 58, 98] - 與 :交換,變為
[27, 33, 7, 47, 23, 5, 58, 98] - 與 :交換,變為
[27, 33, 7, 23, 47, 5, 58, 98] - 與 :交換,變為
[27, 33, 7, 23, 5, 47, 58, 98] - 與 :不交換