114 身心障礙特考四等 資訊處理類科 程式設計概要 考古題詳解
第 一 題25 分
請說明下列物件導向程式設計的概念:
(一)列出物件導向程式設計的四個核心特性。(5 分)
(二)列出類別(Class)與物件(Object)之間的差異。(10 分)
(三)請說明相較於結構化程式設計,使用物件導向程式設計的優點。(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題測驗物件導向程式設計的核心特性,以及類別與物件的關係;最後比較物件導向與結構化程式設計的設計方式和優點。
物件導向程式設計(Object-Oriented Programming, OOP)以「物件」為基本單位,將資料與操作資料的方法組合在一起,並透過類別描述物件的共通結構與行為。
解題方法
(一)四個核心特性通常答:封裝、抽象、繼承、多型。作答時列出名稱,再各用一句話說明,能清楚呈現概念。
(二)比較類別與物件,可從「定義與實例」、「是否占有執行期資源」、「包含內容」三個面向說明。記住:類別是藍圖,物件是依藍圖建立的實例。
(三)比較兩種程式設計方式時,先說明結構化程式設計以程序或函式為組織重心,物件導向則以物件為組織重心;再說明物件導向如何改善資料保護、程式重用、維護與擴充。
(一)物件導向程式設計的四個核心特性
- 封裝(Encapsulation):將資料與操作資料的方法集中於同一物件,並透過存取權限控制外部對資料的使用,降低資料遭不當修改的風險。
- 抽象(Abstraction):保留使用者需要的功能介面,隱藏內部實作細節,讓使用者專注於「能做什麼」,不必知道「如何做到」。
- 繼承(Inheritance):子類別可以承接父類別的屬性與方法,並在此基礎上新增或調整功能,減少重複程式碼。
- 多型(Polymorphism):不同類別的物件可以透過相同介面接受操作,並依各自類別提供不同的實際行為。
(二)類別(Class)與物件(Object)的差異
| 比較面向 | 類別(Class) | 物件(Object) |
|---|---|---|
| 定義 | 描述一類事物的共同屬性與行為,是建立物件的藍圖或模板。 | 依類別建立的具體實例,具有該類別定義的屬性與行為。 |
| 抽象程度 | 抽象的型別或設計描述。 | 執行期間可操作的具體個體。 |
| 內容 | 定義資料欄位、方法及存取規則。 | 持有欄位的實際值,並可呼叫類別所定義的方法。 |
第 二 題25 分
請撰寫下列兩個遞迴函式 findMin() 及 findMax(),分別找出給定的數列中最小及最大數。
Minimum Function
def findMin(arr, n): ____
Maximum Function
def findMax(arr, n): ____
Main Program
arr = [12, 1, 1234, 45, 67, 1]
n = len(arr)
print("Minimum element of array:", findMin(arr, n))
print("Maximum element of array:", findMax(arr, n))
登入後即可作答並保存紀錄。
核心觀念
本題考遞迴與陣列最值搜尋。遞迴函式會將原問題縮小為規模更小的同類問題,直到遇到「基本情況」為止。
令 n 表示陣列前 n 個元素的數量:
- 當
n == 1,唯一的元素就是最小值,也是最大值。 - 當
n > 1,先找出前n-1個元素的最小值或最大值,再與第n個元素比較。
解題方法
先處理基本情況:n == 1 時,回傳 arr[0]。接著取出 arr[n-1],也就是目前考慮的最後一個元素,並與前 n-1 個元素的最值比較。
def findMin(arr, n):
if n == 1:
return arr[0]
return min(findMin(arr, n - 1), arr[n - 1])
def findMax(arr, n):
if n == 1:
return arr[0]
return max(findMax(arr, n - 1), arr[n - 1])
以題目陣列 arr = [12, 1, 1234, 45, 67, 1] 為例,最小值的遞迴比較依序為:
第 三 題25 分
(一)請說明如何以一個單層迴圈找出下列 numbers 數列內的第二大數字。(10 分)
(二)請說明此問題需處理的特殊狀況。(5 分)
(三)請以 Python 語法寫一個單層 while 迴圈,找出下列 numbers 數列中的第二大數字。(10 分)
numbers = [41, 134, 24, 189, …, 127] # 假設已經有多個數值
登入後即可作答並保存紀錄。
核心觀念
本題考查單層迴圈與串流式追蹤最大值。從左到右各讀取一次數列,以兩個變數分別記錄目前最大值與第二大值,不必排序,也不需要巢狀迴圈。
以下將「第二大」定義為第二大的不同數值。因此,若最大值重複出現,重複的最大值不算第二大;例如 [9, 9, 5] 的第二大數字是 5。
解題方法
設定 largest 記錄目前最大值、second 記錄目前第二大值。逐一檢查每個數字 x:
- 若 ,原本的最大值降為第二大值,再以 更新最大值。
- 否則,若 ,以 更新第二大值。
- 其他情況不更新;尤其 時,因為相同數值不算第二大,不應更新
second。
例如依序讀取 41, 134, 24, 189:
| 讀入數字 | largest | second |
|---|---|---|
| 41 | 41 | 尚未取得 |
| 134 | 134 | 41 |
| 24 | 134 | 41 |
| 189 | 189 | 134 |
每個數字只檢查一次,時間複雜度為 ;只使用固定數量的變數,額外空間複雜度為 。
特殊狀況
- 數列少於兩個不同數值:不存在第二大的不同數字,應回報「無第二大值」。
- 最大值重複:重複的最大值不能當成第二大值,例如
[7, 7, 3]的第二大值是3。 - 全部數值相同:例如
[7, 7, 7],沒有第二大值。 - 負數或零:不能直接把
largest、second初始化為0,否則全為負數時會出錯。應以第一個數字初始化最大值,第二大值則用None表示尚未取得。 - 空數列:沒有第一個數字可初始化,因此不存在第二大值。
Python 單層 while 迴圈
第 四 題25 分
下列 HTML 程式有一些錯誤,請列出錯誤的行號並更正成正確的語法。(25 分)
(a) <!DOCTYPE html>
(b) <html>
(c) <head>
(d) <title>Test Page
(e) </head>
(f) <body>
(g) <h1>Welcome to this Info Page</h2>
(h) <p>This should be <b>bold text.<p>
(i) <a href="www.more.com">More Examples</a>
(j) <img src="image.jpg" alt="Test Image">
(k) <ul>
(l) <li>Item 1
(m) <li>Item 2
(n) <li>Item 3
(o) </ul>
(p) <form action="submit.php" method="post">
(q) Name: <input type="text" name="go">
(r) <input type="submit" value="Submit">
(s) </form>
(t) </body>
(u) </html>
登入後即可作答並保存紀錄。
核心觀念
本題考查 HTML 文件的基本結構與標籤配對,包括文件標頭、標題、標題文字、段落、粗體文字、超連結、清單項目及表單欄位。HTML 標籤通常以起始標籤與結束標籤包住內容,例如 <title>標題</title>;結束標籤須使用斜線,並與起始標籤的名稱相同。
解題方法
由上而下檢查標籤是否完整配對、巢狀順序是否正確,以及標籤屬性是否符合用途。題目中的行號代表各行位置;需要更正的行號為 (d)、(g)、(h)、(i)、(l)、(m)、(n)。
- (d) 標題未結束:
<title>的文字內容缺少</title>。 - (g) 結束標籤不相符: 起始標籤是
<h1>,卻以</h2>結束,應改為</h1>。 - (h) 標籤未正確巢狀閉合:
<b>未結束,段落也以另一個<p>開頭而未結束。應先關閉粗體,再關閉段落。 - (i) 超連結網址缺少通訊協定:
href應使用完整網址,例如以 ` 開頭。 - (l)、(m)、(n) 清單項目未結束: 每個
<li>項目都應以</li>結束。
其餘行的 HTML 標籤在本題所要求的基本語法檢查中無須更正。
錯誤行更正
| 行號 | 原因 | 更正後語法 |
|---|---|---|
| (d) | <title> 缺少結束標籤 | <title>Test Page</title> |