113 一般警察特考三等 警察資訊管理人員 物件導向程式設計 考古題詳解
第 一 題15 分
請寫出下列 Python 程式碼的執行結果,並解析程式碼內容,說明如何得到執行結果。
class X: def init(self, a): self.a = a
def fun(self):
self.a *= 3
class Y(X): def init(self, b): super().init(3) self.b = b
def fun(self):
self.a += 2
obj = Y(21) obj.fun() print(obj.a, obj.b)
登入後即可作答並保存紀錄。
核心觀念
本題考查 Python 的繼承、建構子呼叫、方法覆寫與實例屬性。
class Y(X)表示Y繼承X。super.__init__(3)呼叫父類別X的建構子,將self.a設為3。Y自行定義的fun覆寫了X.fun。呼叫obj.fun時,會執行Y.fun。self.a與self.b是物件的實例屬性。
解題方法
依照程式執行順序追蹤屬性值:
- 執行
obj = Y(21),呼叫Y.__init__(21)。 super.__init__(3)呼叫X.__init__(3),因此self.a = 3。- 回到
Y.__init__,執行self.b = 21。
第 二 題15 分
請寫出下列 C++ 程式碼的執行結果,並解析程式碼內容,說明如何得到執行結果。
#include <stdio.h> #include <stdlib.h>
#define NUM 10
void fun1(int *, int);
int main(void) { int a[NUM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
fun1(a, 5);
printf("\n");
return 0;
}
void fun1(int *b, int size) { if (size > 0) { fun1(b + 1, size - 1); printf("%d_", *b); } }
登入後即可作答並保存紀錄。
核心觀念
本題考遞迴函式的呼叫順序,以及陣列名稱作為函式引數時轉換成首元素指標的特性。
呼叫 fun1(a, 5) 時,a 傳入函式後成為指向 a[0] 的指標。每次遞迴呼叫都以 b + 1 傳入下一個陣列元素的位置,並將 size 減 1。size 降至 0 時停止遞迴;之後函式返回,才執行 printf,因此元素會以遞迴呼叫的反向順序輸出。
解題方法
程式的停止條件是 size > 0 不成立。從初始呼叫開始,各層參數如下:
| 呼叫層次 | b 指向的元素 | size | 後續動作 |
|---|---|---|---|
| 1 | a[0],值為 1 | 5 | 先呼叫下一層 |
| 2 | a[1],值為 2 | 4 | 先呼叫下一層 |
| 3 | a[2],值為 3 | 3 | 先呼叫下一層 |
第 三 題40 分
請以物件導向語言設計一個簡易文字模式介面的班級成績計算程式。程式需包含學生(Student)與班級(Class)二個類別。
學生類別內資料需包含:
- 學生姓名。
- 中、英、數三科個別成績。
- 平均成績(三科成績加總除以 )。
學生類別函數需包含:
- 輸入學生姓名。
- 輸入學生各科成績。
- 顯示學生姓名與成績(各科成績與平均成績)。
- 計算學生平均成績。
班級類別內資料需包含:
- 班級名稱。
- 學生類別資料。
- 班級各科平均成績與總平均成績。
- 總平均成績為各科平均成績加總除以 。
- 班級各科成績最高分同學的姓名及成績。
班級類別函數需包含:
- 計算班級各科平均成績與總平均成績。
- 計算與顯示各科成績最高分學生的姓名及成績。
作答內容除程式碼外,亦須繪製統一塑模語言(UML)之類別圖。程式語言可採用 C++、C#、Java 或 Python。程式內變數與函數的命名必須具有可讀性,另須撰寫完整的程式碼,以驗證程式執行的正確性。
登入後即可作答並保存紀錄。
核心觀念
本題考查物件導向程式設計的類別設計、資料封裝、物件組合,以及陣列或集合的統計計算。
Student負責保存一位學生的姓名、三科成績與平均成績,並提供輸入、計算及顯示功能。Class負責保存班級名稱及多位Student物件,並計算班級各科平均、總平均,以及各科最高分學生。- 班級「總平均」依題意是三科班級平均的平均:
這也等於所有學生三科成績總和除以學生人數再除以 。
解題方法
採用 Python 設計兩個類別。Class 以學生串列保存多個 Student 物件,形成「一個班級包含多位學生」的組合關係。
計算流程如下:
- 逐一輸入學生姓名及三科成績,建立
Student物件。 - 每位學生計算個人平均:三科成績加總除以 。
Class分別加總全班各科成績,再除以學生人數,得到各科平均。- 將三科班級平均加總後除以 ,得到班級總平均。
- 各科最高分學生以該科成績的最大值判定;若有同分最高,列出所有最高分學生。
UML 類別圖
┌──────────────────────────────────┐
│ Student │
├──────────────────────────────────┤
│ - name: str │
│ - chinese_score: float │
│ - english_score: float │
│ - math_score: float │
│ - average_score: float │
├──────────────────────────────────┤
│ + input_name: None │
│ + input_scores: None │
│ + calculate_average: float │
│ + display: None │
└──────────────────────────────────┘
▲
│ 0..*
┌──────────────────────────────────┐
│ Class │
├──────────────────────────────────┤
│ - class_name: str │
│ - students: list[Student] │
│ - subject_averages: dict │
│ - overall_average: float │
│ - top_students: dict │
├──────────────────────────────────┤
│ + calculate_averages: None │
│ + calculate_and_display_tops: │
│ None │
└──────────────────────────────────┘
完整程式碼
第 四 題
物件導向程式設計中的單例(Singleton)設計模式,目的在確保整個系統中只有一個此類別的實例化物件,以保障在多使用者環境下關鍵資料唯一性的資料安全。請依下列類別圖實作出一個在單執行緒環境下的單例模式程式碼,且 Main 函數執行結果如下:
產品編號:1
產品名稱:個人電腦
作答可選用 C++、C#、Java 或 Python,但副檔名須依使用的程式語言來命名。
(一) 請撰寫 Program 程式碼。(15 分)
(二) 請撰寫 ProductManager 程式碼。(15 分)
(此題原卷文字擷取不全,請參考原卷)
登入後即可作答並保存紀錄。
核心觀念
本題考查 Singleton(單例)設計模式,要求 ProductManager 在整個程式中只建立一個實例。
實作重點如下:
- 建構子設為
private,禁止外部使用new ProductManager。 - 使用
static欄位保存唯一實例。 - 提供公開的
Instance屬性,讓外部取得唯一的ProductManager物件。 - 使用
pid管理產品編號,每新增一項產品便遞增 1。 AddProduct建立並回傳Product物件。- 題目指定單執行緒環境,因此不需額外實作執行緒同步機制。
解題方法
類別關係如下:
Program.Main透過ProductManager.Instance取得管理者實例。- 呼叫
AddProduct("個人電腦")。 ProductManager將產品編號由 0 遞增為 1。- 建立產品物件並回傳。
Program印出產品編號與產品名稱。
(一)Program.cs 程式碼
using System;
class Program
{
static void Main(string[] args)
{
ProductManager manager = ProductManager.Instance;
Product product = manager.AddProduct("個人電腦");
Console.WriteLine("產品編號:" + product.Id);
Console.WriteLine("產品名稱:" + product.Name);
}
}