108 年 國立臺灣大學地理環資系碩士班丙組《計算機概論與程式設計》
第 1 題15 分
迴圈(loop)是程式設計常見的程序。常用的迴圈類型,包括 for-loop 以及 while-loop 等,請分別闡述並舉例,使用這兩種迴圈類型的適當時機。
登入後即可作答並保存紀錄。
本題主要在考察程式設計中迴圈結構的理解與應用。需要說明 for-loop 和 while-loop 的基本概念、差異,並舉例說明各自適用的情境。
核心觀念: 迴圈結構 (Looping Constructs)
詳解:
迴圈是程式設計中重複執行一段程式碼的結構。for-loop 和 while-loop 是最常見的兩種迴圈類型,它們在結構和使用時機上有所不同。
-
for-loop (計數迴圈)
- 闡述: for-loop 通常用於已知迴圈執行次數的情況。它一般包含三個部分:初始化(迴圈變數的起始值)、條件判斷(迴圈繼續執行的條件)和更新(迴圈變數的遞增或遞減)。其語法結構通常為
for (初始化; 條件判斷; 更新) { 程式碼區塊 }。 - 適當時機與舉例: 當我們明確知道需要重複執行某段程式碼幾次時,for-loop 是最適合的選擇。
- 舉例 1: 遍歷陣列或列表中的所有元素。假設有一個包含 10 個整數的陣列
arr,我們想印出所有元素:
這裡,我們明確知道陣列有 10 個元素,所以迴圈從int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int i = 0; i < 10; i++) { cout << arr[i] << endl; }i=0開始,執行到i=9共 10 次。 - 舉例 2: 執行特定次數的計算。例如,計算前 100 個正整數的和:
這裡,我們明確知道需要加總從 1 到 100 的數字,共 100 次。int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; }
- 舉例 1: 遍歷陣列或列表中的所有元素。假設有一個包含 10 個整數的陣列
- 闡述: for-loop 通常用於已知迴圈執行次數的情況。它一般包含三個部分:初始化(迴圈變數的起始值)、條件判斷(迴圈繼續執行的條件)和更新(迴圈變數的遞增或遞減)。其語法結構通常為
-
while-loop (條件迴圈)
- 闡述: while-loop 在執行迴圈體之前,先檢查條件是否成立。只要條件為真,迴圈體就會一直執行,直到條件變為假為止。
第 2 題15 分
說明何謂「氣泡排序 (Bubble Sorting)」演算法,並以下列數字排列為例,說明該演算法如何進行從小排到大的過程。
數列: 2, 10, 6, 5, 12, 8
登入後即可作答並保存紀錄。
本題要求說明氣泡排序法的原理,並透過一個具體數列的排序過程來展示其運作方式。
核心觀念: 排序演算法 (Sorting Algorithms) - 氣泡排序法 (Bubble Sort)
詳解:
氣泡排序法是一種簡單的排序演算法。它重複地走訪要排序的列表,一次比較兩個相鄰的項目,如果它們的順序錯誤就交換它們。這個過程會重複進行,直到再也沒有需要交換,也就是列表已經排序完成。因為較小的元素會 lentamente 像氣泡一樣「浮」到列表的頂端(或較大的元素沉到底部,取決於排序方向),所以得名氣泡排序。
氣泡排序法的運作原理:
- 從列表的第一個元素開始,比較它與下一個元素。
- 如果第一個元素大於第二個元素(升序排序),則交換它們。
- 移動到下一對相鄰元素,重複比較和交換。
- 一直重複這個過程,直到列表的末尾。
- 完成一次完整的走訪後,列表的最大(或最小)元素會被放到其最終位置。
- 對列表剩下的部分(不包括已排序的元素)重複步驟 1-5,直到整個列表排序完成。
以數列 2, 10, 6, 5, 12, 8 為例,說明從小排到大的過程:
我們進行升序排序(從小到大)。
第一趟 (Pass 1):
- 比較 (2, 10) → 2 < 10,不交換。 數列: 2, 10, 6, 5, 12, 8
- 比較 (10, 6) → 10 > 6,交換。 數列: 2, 6, 10, 5, 12, 8
- 比較 (10, 5) → 10 > 5,交換。 數列: 2, 6, 5, 10, 12, 8
- 比較 (10, 12) → 10 < 12,不交換。 數列: 2, 6, 5, 10, 12, 8
- 比較 (12, 8) → 12 > 8,交換。 數列: 2, 6, 5, 10, 8, 12
經過第一趟,最大的元素 12 已經被放到最後的位置。
第 3 題10 分
說明何謂「正則表示式 (Regular Expression)」,並舉一例說明合適的使用時機。
登入後即可作答並保存紀錄。
本題主要考察對正則表示式(Regular Expression, 簡稱 Regex)概念的理解及其應用場景。
核心觀念: 字串模式匹配 (String Pattern Matching)
詳解:
正則表示式 (Regular Expression, Regex) 是一種用來描述字串模式的序列。它使用一種特殊的語法,可以定義一個搜尋模式,這個模式可以用来匹配、搜尋、取代或驗證字串。正則表示式是一種強大的工具,可以處理複雜的字串操作,例如驗證輸入格式、從大量文字中提取特定資訊等。
正則表示式的基本組成包括:
- 字面字元 (Literal Characters): 如
a,1,?等,它們匹配自身。 - 特殊字元 (Metacharacters): 具有特殊含義的字元,如:
.:匹配任何單一字元(換行符除外)。*:匹配前一個字元零次或多次。+:匹配前一個字元一次或多次。?:匹配前一個字元零次或一次。^:匹配字串的開頭。- `
第 4 題10 分
解釋物件導向程式設計中的繼承(Inheritance)、封裝(Encapsulation)的特性,並舉例說明合適的使用時機。
登入後即可作答並保存紀錄。
本題考察物件導向程式設計 (Object-Oriented Programming, OOP) 的兩個核心概念:繼承 (Inheritance) 和封裝 (Encapsulation)。需要說明其定義、特性,並舉例說明應用時機。
核心觀念: 物件導向程式設計 (OOP) 的三大特性(繼承、封裝、多型)。此題僅考前兩者。
詳解:
物件導向程式設計 (OOP) 是一種程式設計範式,它將程式的資料和操作封裝在稱為「物件」的單元中。OOP 的主要目標是提高程式碼的可重用性、可維護性和擴展性。繼承和封裝是 OOP 的兩個重要基石。
- 繼承 (Inheritance)
- 特性: 繼承允許一個類別(稱為子類別或衍生類別)繼承另一個類別(稱為父類別或基底類別)的屬性(資料成員)和方法(函數成員)。子類別可以重用父類別的程式碼,並且可以添加自己的新屬性或方法,或者修改(覆寫)父類別的方法。繼承體現了「is-a」的關係,例如「狗 is-a 動物」。
- 優點:
- 程式碼重用 (Code Reusability): 避免重複編寫相同的程式碼。
- 擴展性 (Extensibility): 可以在不修改現有程式碼的情況下,擴展現有類別的功能。
- 層次結構 (Hierarchical Structure): 建立類別之間的邏輯層次,使程式結構更清晰。
- 合適的使用時機與舉例:
- 時機: 當多個類別具有共同的屬性和行為,但又存在一些獨特的差異時。
- 舉例:
- 動物階層:
- 父類別:
Animal(具有屬性name,方法eat(),sleep()) - 子類別:
Dog繼承Animal(添加屬性breed,覆寫eat()方法,添加方法bark()) - 子類別:
Cat繼承Animal(添加屬性color,覆寫eat()方法,添加方法meow())
- 父類別:
- 車輛階層:
- 父類別:
Vehicle(屬性speed, 方法accelerate()) - 子類別:
Car繼承Vehicle(添加屬性numDoors, 方法openTrunk()) - 子類別:
Motorcycle繼承Vehicle(添加屬性hasSidecar, 方法wheelie())
- 父類別:
- 圖形物件:
- 父類別:
Shape(方法draw(),getArea()) - 子類別:
Circle繼承Shape(添加屬性radius) - 子類別:
Rectangle繼承Shape(添加屬性width,height)
- 父類別:
- 動物階層:
第 5 題15 分
SQL 語言 (Structured Query Language) 的命令包括三種類型: Data Definition Language、Data Manipulation Language 以及 Data Control Language,請分別簡要說明此三種類型語言的主要功能,且針對每種類型分別列舉兩個指令並說明該指令之功能。
登入後即可作答並保存紀錄。
本題考察對 SQL (Structured Query Language) 的基本分類及其功能的理解。需要說明三種主要 SQL 命令類型的功能,並為每種類型舉出兩個具體指令及其作用。
核心觀念: 資料庫語言 - SQL (Structured Query Language) 的分類
詳解:
SQL (Structured Query Language) 是一種用於管理關聯式資料庫的標準語言。它主要分為以下幾種類型:
-
Data Definition Language (DDL) - 資料定義語言
- 主要功能: DDL 用於定義和管理資料庫的結構,包括建立、修改和刪除資料庫物件(如表格、索引、檢視、使用者等)。它處理的是資料庫的「架構」。
- 指令範例:
CREATE TABLE:- 功能: 在資料庫中建立一個新的表格。需要指定表格名稱,以及表格中每個欄位的名稱、資料類型、約束條件(如主鍵、非空等)。
- 範例:
CREATE TABLE Students (StudentID INT PRIMARY KEY, Name VARCHAR(50) NOT NULL, Age INT);
ALTER TABLE:- 功能: 修改現有表格的結構。可以添加、刪除或修改表格的欄位,添加或刪除約束條件等。
- 範例:
ALTER TABLE Students ADD Email VARCHAR(100);(向 Students 表格添加一個 Email 欄位)
-
Data Manipulation Language (DML) - 資料處理語言
- 主要功能: DML 用於操作和查詢資料庫中的資料。它允許使用者插入、更新、刪除和檢索表格中的記錄(資料列)。
- 指令範例:
INSERT INTO:- 功能: 向表格中插入新的資料列。需要指定表格名稱,以及要插入的值。
- 範例:
INSERT INTO Students (StudentID, Name, Age) VALUES (101, 'Alice', 20);
SELECT:
第 6 題15 分
請解釋何謂序列化排程 (Serial Schedule),何謂「可序列化排程」(Serializable Schedule),試分別舉例說明之。
登入後即可作答並保存紀錄。
本題考察對資料庫交易管理中「序列化排程」和「可序列化排程」概念的理解。需要定義這兩個術語,並舉例說明。
核心觀念: 資料庫交易管理 (Database Transaction Management) - 並行控制 (Concurrency Control)
詳解:
在多使用者環境下,多個交易 (Transactions) 可能會同時存取和修改資料庫。為了確保資料的一致性,需要對交易的執行順序進行管理。排程 (Schedule) 就是交易操作的一個序列。
- 序列化排程 (Serial Schedule)
-
解釋: 序列化排程是指,在沒有任何並行執行的情況下,一個交易完全執行完畢後,再開始執行下一個交易。換句話說,多個交易是按順序一個接一個地執行的。
-
特性: 序列化排程保證了資料庫的一致性,因為每個交易獨立執行,不會受到其他交易的干擾。
-
舉例說明:
假設有兩個交易:- 交易 T1:讀取帳戶 A 的餘額,然後將其增加 100 元。
- 交易 T2:讀取帳戶 A 的餘額,然後將其減少 50 元。
假設帳戶 A 的初始餘額為 1000 元。
一個序列化排程可能是:
- T1 先執行,T2 後執行:
- T1 讀取 A 的餘額 (1000)。
- T1 更新 A 的餘額為 1000 + 100 = 1100。
- T1 提交。
- T2 讀取 A 的餘額 (1100)。
- T2 更新 A 的餘額為 1100 - 50 = 1050。
- T2 提交。
最終餘額:1050 元。
另一個序列化排程可能是:
- T2 先執行,T1 後執行:
- T2 讀取 A 的餘額 (1000)。
- T2 更新 A 的餘額為 1000 - 50 = 950。
- T2 提交。
- T1 讀取 A 的餘額 (950)。
- T1 更新 A 的餘額為 950 + 100 = 1050。
- T1 提交。
最終餘額:1050 元。
在這兩種序列化排程中,最終餘額都是 1050 元,這證明了序列化排程的一致性。
-
第 7 題10 分
在關聯式資料庫中,一個表格 (Table) 包含了若干個欄位 (Column) 以及任意個數的記錄 (Row)。表格中的一個欄位 (或多個欄位的組合) 要成為該表格的候選鍵 (Candidate Key) 必須要滿足哪兩個條件?請說明之。
登入後即可作答並保存紀錄。
本題考察關聯式資料庫理論中關於「候選鍵」的定義和條件。需要說明成為候選鍵的兩個必要條件。
核心觀念: 關聯式資料庫理論 - 鍵 (Keys)
詳解:
在關聯式資料庫中,表格 (Table) 由欄位 (Column) 和記錄 (Row) 組成。為了唯一識別每一條記錄,我們需要使用鍵 (Key)。鍵是表格中的一個或多個欄位的集合。
候選鍵 (Candidate Key) 是指一個表格中,能夠唯一識別每一條記錄的「最小」屬性集合。也就是說,一個欄位或一組欄位的組合,如果滿足以下兩個條件,就可以稱為候選鍵:
-
唯一性 (Uniqueness)
- 說明: 候選鍵必須能夠唯一地識別表格中的每一條記錄。這意味著,對於表格中的任意兩條記錄,它們在候選鍵欄位上的值組合是不同的。如果存在兩個不同的記錄具有相同的候選鍵值,那麼這個鍵就不是唯一的,也就不能作為候選鍵。
- 範例: 在一個
Students表格中,StudentID欄位必須是唯一的,沒有兩個學生會有相同的StudentID。如果Name欄位不是唯一的(可能有多個同名學生),那麼Name本身就不能成為候選鍵。
-
最小性 (Minimality) / 不可約性 (Irreducibility)
- 說明: 候選鍵必須是「最小」的。這意味著,如果候選鍵是由多個欄位組成的,那麼去掉其中任何一個欄位,這個鍵組合就不再是唯一的了。換句話說,候選鍵不能包含冗餘的欄位。如果一個包含 A、B 兩個欄位的組合 (A, B) 是唯一的,但單獨的 A 欄位已經足夠唯一,那麼 (A, B) 就不是最小的,(A) 才是候選鍵。
第 8 題10 分
請問以下語言執行後,變數count 的數值為何?
count =0;
for(i=5; i<=10; i=i+1)
for(j=1; j<=i; j=j+1)
for(k=1; k<=j; k=k+1)
if (i==j)
count = count + 1;
登入後即可作答並保存紀錄。
本題考察程式碼的執行流程分析,特別是多重迴圈的嵌套以及條件判斷對計數器的影響。需要仔細追蹤迴圈的迭代和條件判斷的觸發時機。
核心觀念: 程式碼執行流程、迴圈與條件判斷
詳解:
程式碼的初始狀態:count = 0。
我們有三個嵌套的 for 迴圈:
- 外層迴圈:
for(i=5; i<=10; i=i+1) - 中層迴圈:
for(j=1; j<=i; j=j+1) - 內層迴圈:
for(k=1; k<=j; k=k+1)
在最內層迴圈的迭代中,有一個條件判斷 if (i==j),如果條件成立,則執行 count = count + 1;。
我們需要找出 if (i==j) 這個條件會在哪種情況下成立,以及總共會成立多少次。
觀察迴圈結構:
i的範圍是從 5 到 10。j的範圍是從 1 到i。k的範圍是從 1 到j。
關鍵的條件是 if (i==j)。
我們需要分析 j 的值與 i 的值是否會相等。
- 當
i的值確定後,j的迴圈會從 1 開始,一直遞增到i。
讓我們逐一分析 i 的值:
-
當
i = 5時:j的迴圈會從 1 跑到 5 (j = 1, 2, 3, 4, 5)。- 在
j的哪個值時i == j? 當j = 5時,i(5) 等於j(5)。 - 此時,
k的迴圈會從 1 跑到j(也就是 5)。 if (i == j)(即if (5 == 5)) 成立。count會被增加 1。count變為 1。
-
當
i = 6時:j的迴圈會從 1 跑到 6 (j = 1, 2, 3, 4, 5, 6)。- 在
j的哪個值時i == j? 當j = 6時,i(6) 等於j(6)。 - 此時,
k的迴圈會從 1 跑到j(也就是 6)。 if (i == j)(即if (6 == 6)) 成立。count會被增加 1。count變為 1 + 1 = 2。
-
當
i = 7時:j的迴圈會從 1 跑到 7。- 當
j = 7時,i == j成立。 count增加 1。count變為 2 + 1 = 3。