108 年 國立臺灣大學地理環資系碩士班丙組《計算機概論與程式設計》

📄 試題原卷 免費註冊後即可對照原始考卷 PDF免費註冊

第 1 題15 分

迴圈(loop)是程式設計常見的程序。常用的迴圈類型,包括 for-loop 以及 while-loop 等,請分別闡述並舉例,使用這兩種迴圈類型的適當時機。

登入後即可作答並保存紀錄。

這一題的完整詳解

本題主要在考察程式設計中迴圈結構的理解與應用。需要說明 for-loop 和 while-loop 的基本概念、差異,並舉例說明各自適用的情境。

核心觀念: 迴圈結構 (Looping Constructs)

詳解:

迴圈是程式設計中重複執行一段程式碼的結構。for-loop 和 while-loop 是最常見的兩種迴圈類型,它們在結構和使用時機上有所不同。

  1. for-loop (計數迴圈)

    • 闡述: for-loop 通常用於已知迴圈執行次數的情況。它一般包含三個部分:初始化(迴圈變數的起始值)、條件判斷(迴圈繼續執行的條件)和更新(迴圈變數的遞增或遞減)。其語法結構通常為 for (初始化; 條件判斷; 更新) { 程式碼區塊 }。
    • 適當時機與舉例: 當我們明確知道需要重複執行某段程式碼幾次時,for-loop 是最適合的選擇。
      • 舉例 1: 遍歷陣列或列表中的所有元素。假設有一個包含 10 個整數的陣列 arr,我們想印出所有元素:
        int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (int i = 0; i < 10; i++) {
            cout << arr[i] << endl;
        }
        
        這裡,我們明確知道陣列有 10 個元素,所以迴圈從 i=0 開始,執行到 i=9 共 10 次。
      • 舉例 2: 執行特定次數的計算。例如,計算前 100 個正整數的和:
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        
        這裡,我們明確知道需要加總從 1 到 100 的數字,共 100 次。
  2. while-loop (條件迴圈)

    • 闡述: while-loop 在執行迴圈體之前,先檢查條件是否成立。只要條件為真,迴圈體就會一直執行,直到條件變為假為止。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2 題15 分

說明何謂「氣泡排序 (Bubble Sorting)」演算法,並以下列數字排列為例,說明該演算法如何進行從小排到大的過程。
數列: 2, 10, 6, 5, 12, 8

登入後即可作答並保存紀錄。

這一題的完整詳解

本題要求說明氣泡排序法的原理,並透過一個具體數列的排序過程來展示其運作方式。

核心觀念: 排序演算法 (Sorting Algorithms) - 氣泡排序法 (Bubble Sort)

詳解:

氣泡排序法是一種簡單的排序演算法。它重複地走訪要排序的列表,一次比較兩個相鄰的項目,如果它們的順序錯誤就交換它們。這個過程會重複進行,直到再也沒有需要交換,也就是列表已經排序完成。因為較小的元素會 lentamente 像氣泡一樣「浮」到列表的頂端(或較大的元素沉到底部,取決於排序方向),所以得名氣泡排序。

氣泡排序法的運作原理:

  1. 從列表的第一個元素開始,比較它與下一個元素。
  2. 如果第一個元素大於第二個元素(升序排序),則交換它們。
  3. 移動到下一對相鄰元素,重複比較和交換。
  4. 一直重複這個過程,直到列表的末尾。
  5. 完成一次完整的走訪後,列表的最大(或最小)元素會被放到其最終位置。
  6. 對列表剩下的部分(不包括已排序的元素)重複步驟 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 的兩個重要基石。

  1. 繼承 (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) 是一種用於管理關聯式資料庫的標準語言。它主要分為以下幾種類型:

  1. 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 欄位)
  2. 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) 就是交易操作的一個序列。

  1. 序列化排程 (Serial Schedule)
    • 解釋: 序列化排程是指,在沒有任何並行執行的情況下,一個交易完全執行完畢後,再開始執行下一個交易。換句話說,多個交易是按順序一個接一個地執行的。

    • 特性: 序列化排程保證了資料庫的一致性,因為每個交易獨立執行,不會受到其他交易的干擾。

    • 舉例說明:
      假設有兩個交易:

      • 交易 T1:讀取帳戶 A 的餘額,然後將其增加 100 元。
      • 交易 T2:讀取帳戶 A 的餘額,然後將其減少 50 元。
        假設帳戶 A 的初始餘額為 1000 元。

      一個序列化排程可能是:

      • T1 先執行,T2 後執行:
        1. T1 讀取 A 的餘額 (1000)。
        2. T1 更新 A 的餘額為 1000 + 100 = 1100。
        3. T1 提交。
        4. T2 讀取 A 的餘額 (1100)。
        5. T2 更新 A 的餘額為 1100 - 50 = 1050。
        6. T2 提交。
          最終餘額:1050 元。

      另一個序列化排程可能是:

      • T2 先執行,T1 後執行:
        1. T2 讀取 A 的餘額 (1000)。
        2. T2 更新 A 的餘額為 1000 - 50 = 950。
        3. T2 提交。
        4. T1 讀取 A 的餘額 (950)。
        5. T1 更新 A 的餘額為 950 + 100 = 1050。
        6. T1 提交。
          最終餘額:1050 元。

      在這兩種序列化排程中,最終餘額都是 1050 元,這證明了序列化排程的一致性。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 7 題10 分

在關聯式資料庫中,一個表格 (Table) 包含了若干個欄位 (Column) 以及任意個數的記錄 (Row)。表格中的一個欄位 (或多個欄位的組合) 要成為該表格的候選鍵 (Candidate Key) 必須要滿足哪兩個條件?請說明之。

登入後即可作答並保存紀錄。

這一題的完整詳解

本題考察關聯式資料庫理論中關於「候選鍵」的定義和條件。需要說明成為候選鍵的兩個必要條件。

核心觀念: 關聯式資料庫理論 - 鍵 (Keys)

詳解:

在關聯式資料庫中,表格 (Table) 由欄位 (Column) 和記錄 (Row) 組成。為了唯一識別每一條記錄,我們需要使用鍵 (Key)。鍵是表格中的一個或多個欄位的集合。

候選鍵 (Candidate Key) 是指一個表格中,能夠唯一識別每一條記錄的「最小」屬性集合。也就是說,一個欄位或一組欄位的組合,如果滿足以下兩個條件,就可以稱為候選鍵:

  1. 唯一性 (Uniqueness)

    • 說明: 候選鍵必須能夠唯一地識別表格中的每一條記錄。這意味著,對於表格中的任意兩條記錄,它們在候選鍵欄位上的值組合是不同的。如果存在兩個不同的記錄具有相同的候選鍵值,那麼這個鍵就不是唯一的,也就不能作為候選鍵。
    • 範例: 在一個 Students 表格中,StudentID 欄位必須是唯一的,沒有兩個學生會有相同的 StudentID。如果 Name 欄位不是唯一的(可能有多個同名學生),那麼 Name 本身就不能成為候選鍵。
  2. 最小性 (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。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

其他考古題