109 年 國立成功大學生物醫學工程學系碩士班乙組《計算機概論》

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

第 1 題20 分

  1. (20%) Data conversion
    (a) Convert decimal (30.25)10(30.25)_{10} into the binary format.
    (b) Convert hexadecimal (F3A)16(\text{F3A})_{16} into the decimal, binary and octal formats.
    (c) Convert decimal (−7.1875)10(-7.1875)_{10} into the IEEE-32 floating-point standards with 1-bit sign, 8-bit exponent of bias 127, 23-bit mantissa.

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

這一題的完整詳解

核心觀念

本題考查三種進位制轉換,以及 IEEE-754 單精度浮點數格式:

  • 整數部分:可使用連續除以 2 取餘數。

  • 小數部分:可使用連續乘以 2 取整數部分。

  • 十六進位與二進位:每一個十六進位數字對應 4 個二進位位元。

  • IEEE-32 格式包含:

    sign  ∣  exponent  ∣  fraction\text{sign}\;|\;\text{exponent}\;|\;\text{fraction}

    其中:

    • sign:1 位
    • exponent:8 位,採偏移值 127127
    • fraction(mantissa):23 位,不記錄正規化後最前面的隱藏位元 11

解題方法

(a)將 (30.25)10(30.25)_{10} 轉換為二進位

整數部分

將 3030 連續除以 22,記錄餘數:

30÷2=15 餘 015÷2=7 餘 17÷2=3 餘 13÷2=1 餘 11÷2=0 餘 1\begin{array}{rcl} 30\div 2&=&15\text{ 餘 }0\\ 15\div 2&=&7\text{ 餘 }1\\ 7\div 2&=&3\text{ 餘 }1\\ 3\div 2&=&1\text{ 餘 }1\\ 1\div 2&=&0\text{ 餘 }1 \end{array}

由下往上讀取餘數:

(30)10=(11110)2(30)_{10}=(11110)_2

小數部分

將 0.250.25 連續乘以 22,記錄每次的整數部分:

0.25×2=0.5→00.5×2=1.0→1\begin{array}{rcl} 0.25\times 2&=&0.5\quad\rightarrow 0\\ 0.5\times 2&=&1.0\quad\rightarrow 1 \end{array}

因此:

(0.25)10=(0.01)2(0.25)_{10}=(0.01)_2

合併整數部分與小數部分:

(30.25)10=(11110.01)2\boxed{(30.25)_{10}=(11110.01)_2}

(b)將 (F3A)16(\mathrm{F3A})_{16} 轉換為十進位、二進位與八進位

轉換為十進位

十六進位中:

F=15,A=10\mathrm{F}=15,\qquad \mathrm{A}=10

因此:

(F3A)16=15×162+3×161+10×160=15×256+3×16+10=3840+48+10=389810\begin{aligned} (\mathrm{F3A})_{16} &=15\times 16^2+3\times 16^1+10\times 16^0\\ &=15\times 256+3\times 16+10\\ &=3840+48+10\\ &=\boxed{3898_{10}} \end{aligned}

轉換為二進位

每個十六進位數字對應 4 位二進位:

F→11113→0011A→1010\begin{aligned} \mathrm{F}&\rightarrow 1111\\ 3&\rightarrow 0011\\ \mathrm{A}&\rightarrow 1010 \end{aligned}

所以:

(F3A)16=(111100111010)2\boxed{(\mathrm{F3A})_{16}=(111100111010)_2}

轉換為八進位

將二進位數由右至左每 3 位分組:

111100111010→111  100  111  010111100111010 \rightarrow 111\;100\;111\;010

各組轉為八進位:

1112=7,1002=4,1112=7,0102=2111_2=7,\qquad 100_2=4,\qquad 111_2=7,\qquad 010_2=2

因此:

(F3A)16=(7472)8\boxed{(\mathrm{F3A})_{16}=(7472)_8}

(c)將 (−7.1875)10(-7.1875)_{10} 轉換為 IEEE-32

第一步:轉換為二進位

整數部分:

🔒

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

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

免費註冊

第 2 題20 分

  1. (20%) Describe the layers of TCP/IP protocol and match the following to one or more layers of the
    TCP/IP protocol:
    (a) route determination
    (b) responsibility for handling frames between adjacent nodes
    (c) transforming bits to the electromagnetic wave

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

這一題的完整詳解

這題考查 TCP/IP 協定模型的層級結構及其功能。TCP/IP 模型通常被描述為四層或五層,這裡我們以常見的四層模型來解釋。

TCP/IP 模型層級:

  1. 應用層 (Application Layer):
    提供應用程式與網路之間的介面,處理應用程式的特定協定,如 HTTP、FTP、SMTP、DNS 等。

  2. 傳輸層 (Transport Layer):
    負責端對端 (end-to-end) 的資料傳輸,提供兩種主要的傳輸服務:TCP (Transmission Control Protocol) 提供可靠的、面向連接的服務,而 UDP (User Datagram Protocol) 提供不可靠的、無連接的服務。此層處理分段 (segmentation)、重組、流量控制和錯誤檢查。

  3. 網路層 (Internet Layer / Network Layer):
    負責主機之間的封包傳輸,處理邏輯位址 (IP 位址) 和路由選擇 (routing)。IP (Internet Protocol) 是此層的核心協定。此層將傳輸層的資料單元 (segment/datagram) 封裝成封包 (packet)。

  4. 網路介面層 (Network Interface Layer / Link Layer / Data Link Layer):
    負責在物理鏈路上傳輸資料框 (frame),處理實體位址 (MAC 位址)、錯誤偵測,以及如何將資料傳送至物理媒介。它包含了傳統 OSI 模型中的資料鏈結層和實體層的功能。


將下列功能匹配至 TCP/IP 模型中的一個或多個層級:

🔒

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

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

免費註冊

第 3 題20 分

  1. (20%) Please give the major features of object-oriented programming language (OOP) and briefly describe
    each feature by an example.

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

這一題的完整詳解

這題主要考查物件導向程式設計 (Object-Oriented Programming, OOP) 的核心概念及其應用。OOP 是一種程式設計範式,它將程式的資料與操作資料的方法封裝 (encapsulate) 在稱為「物件 (object)」的單元中。

物件導向程式設計 (OOP) 的主要特性:

  1. 封裝 (Encapsulation):

    • 描述: 將資料 (屬性,attributes) 和操作資料的方法 (methods) 綁定在一起,形成一個獨立的單元(物件)。封裝也包括資訊隱藏 (information hiding),即將物件的內部狀態對外部隱藏,只允許透過公開的介面 (public methods) 來存取和修改。這有助於保護資料的完整性,並簡化程式的使用。
    • 範例: 假設我們有一個 BankAccount 類別。帳戶餘額 (balance) 是其私有屬性 (private attribute),外部程式無法直接存取或修改。但我們提供了公開的方法,如 deposit(amount) 和 withdraw(amount),以及 getBalance() 來存取餘額。這樣,即使在 deposit 或 withdraw 方法中進行了額外的驗證(例如檢查存款金額是否為正),外部程式也不需要知道這些細節。
    class BankAccount {
        private double balance; // 私有屬性
    
        public void deposit(double amount) { // 公開方法
            if (amount > 0) {
                this.balance += amount;
                System.out.println("Deposit successful.");
            } else {
                System.out.println("Deposit amount must be positive.");
            }
        }
    
        public double getBalance() { // 公開方法
            return this.balance;
        }
    }
    
  2. 繼承 (Inheritance):

    • 描述: 允許一個類別 (子類別,subclass 或 derived class) 繼承另一個類別 (父類別,superclass 或 base class) 的屬性和方法。這促進了程式碼的重用,並建立類別之間的「is-a」關係。子類別可以擴充或修改父類別的功能。
    • 範例: 假設我們有一個父類別 Vehicle,它有 speed 屬性和 move() 方法。我們可以創建一個子類別 Car,它繼承 Vehicle 的屬性和方法,並且可以添加自己特有的屬性(如 numberOfDoors)和方法(如 openTrunk())。
    class Vehicle { // 父類別
        protected int speed;
        public void move() {
            System.out.println("Vehicle is moving.");
        }
    }
    
    class Car extends Vehicle { // 子類別,繼承 Vehicle
        private int numberOfDoors;
        public void openTrunk() {
            System.out.println("Trunk is opened.");
        }
    }
    
  3. 多型 (Polymorphism):

    • 描述: 意為「多種形態」。在 OOP 中,多型允許我們使用父類別的參考變數來指向子類別的物件,並且在執行時根據物件的實際類型來決定呼叫哪個方法。這通常透過方法重載 (method overloading) 和方法重寫 (method overriding) 實現。方法重寫是實現運行時多型的關鍵。
    • 範例: 考慮一個 Shape 父類別,它有一個 draw() 方法。然後有兩個子類別 Circle 和 Square,它們各自重寫了 draw() 方法來繪製自己的形狀。
🔒

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

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

免費註冊

第 4 題20 分

  1. (20%) Using the Unified Modeling Language (UML) diagram (or flowchart) for program to convert the
    decimal to binary using modular function and stack data structure with push and pop functions. Also, please
    give pseudocode or any programming language.

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

這一題的完整詳解

這題要求使用 UML 圖(例如流程圖)或文字描述,來設計一個將十進位數轉換為二進位的程式,並要求使用模組化函數和堆疊 (stack) 資料結構。最後需要提供偽碼或任一程式語言的實作。

核心概念:

  • 十進位轉二進位: 傳統方法是持續除以 2 取餘數,直到商為 0。餘數依倒序排列即為二進位表示。
  • 堆疊 (Stack): 一種後進先出 (LIFO, Last-In, First-Out) 的資料結構。適合用來暫存除以 2 取餘數的結果,因為我們需要倒序讀取這些餘數。
  • 模組化函數: 將程式分解成獨立的、可重用的函數,例如一個負責轉換的函數,以及可能用於堆疊操作的函數。

UML 流程圖 (Flowchart) 概念描述:

  1. 主程式 (Main Program):

    • 開始 (Start)
    • 提示使用者輸入一個十進位整數 decimalNumber。
    • 讀取 decimalNumber。
    • 呼叫 decimalToBinary(decimalNumber) 函數。
    • 顯示轉換後的二進位字串。
    • 結束 (End)
  2. decimalToBinary(decimalNumber) 函數:

    • 開始 (Start)
    • 宣告一個空堆疊 binaryStack (用於存放二進位數字)。
    • 宣告一個空字串 binaryString (用於儲存最終結果)。
    • 迴圈 (While decimalNumber > 0):
      • 計算餘數:remainder = decimalNumber % 2
      • 將餘數 remainder 壓入堆疊 binaryStack.push(remainder)。
      • 更新 decimalNumber:decimalNumber = decimalNumber / 2 (整數除法)。
    • 迴圈 (While binaryStack is not empty):
      • 從堆疊彈出一個元素:digit = binaryStack.pop()
      • 將彈出的數字 digit 轉換為字串,並附加到 binaryString 後面:binaryString = binaryString + toString(digit)。
    • 如果原始輸入 decimalNumber 為 0,則 binaryString 應為 "0"。 (這個情況需要特別處理,例如在迴圈前判斷,或在迴圈後檢查 binaryString 是否為空)
    • 返回 binaryString。
    • 結束 (End)

偽碼 (Pseudocode):

🔒

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

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

免費註冊

第 5 題20 分

  1. (20%) The following figure is an acquired ECG waveform (signal from heart beats). Assume that the
    sampling rate is 200 Hz, i.e. 200 ECG data points per second.
    (a) Please write a segment of program using your familiar computer language or pseudo code to detect peak-
    to-peak amplitude (between two x's in the figure) and peak-to-peak interval (t) .
    (b) Convert the peak-to-peak interval to hear rate in terms of beats per minute (BPM). Draw a flowchart to
    express your algorithm and assumptions in (a)-(b).
    🖼️【此處有附圖,請對照原卷】
🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 1 頁

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

這一題的完整詳解

這題考查對 ECG (心電圖) 波形的理解,以及如何從數位訊號中提取資訊(峰值、間隔),並進一步計算心率。題目要求使用程式碼或偽碼來實現,並繪製流程圖。

核心概念:

  • ECG 波形: 代表心臟電活動的圖形。常見的波形有 P 波、QRS 波群、T 波等。題目中標示的 t 和 x 指的是特定的時間點或振幅。
  • 峰值到峰值振幅 (Peak-to-Peak Amplitude): 在一個週期內,訊號的最大值與最小值之間的差值。題目中的 x 標示可能代表 QRS 波群的最高點和最低點。
  • 峰值到峰值間隔 (Peak-to-Peak Interval): 在一個週期內,兩個連續相同特徵點之間的時間差。題目中的 t 標示代表了兩個 QRS 波群之間的時間間隔。
  • 取樣率 (Sampling Rate): 每秒鐘採集的資料點數。題目給定為 200 Hz,表示每秒有 200 個數據點。
  • 心率 (Heart Rate): 每分鐘心跳的次數 (Beats Per Minute, BPM)。

假設與圖形解讀:

  • 圖中 t 代表兩個連續的 QRS 波群(或心跳週期)之間的時間間隔。
  • 圖中的 x 標示,從圖形上看,似乎是指 QRS 波群的最高點和最低點。因此,峰值到峰值振幅是這兩個點之間的垂直距離。
  • 我們需要找到圖中一個完整的 QRS 波群(或一個心跳的關鍵特徵點)的起始和結束,或兩個連續關鍵點之間的時間。從圖示看,t 標示的兩個箭頭指向了兩個連續的波峰(或波谷,這裡看起來是 QRS 波群的頂端)。

(a) 程式碼/偽碼來偵測峰值到峰值振幅和間隔

為了偵測峰值,我們需要遍歷 ECG 數據點。通常,QRS 波群是 ECG 中最顯著的波形,其振幅也最大。我們可以通過尋找局部最大值和最小值來近似。

偽碼 (Pseudocode):

// 假設 ECG 數據以一個數值陣列 (ecg_data) 表示,
// 陣列索引代表時間點,實際時間由索引和取樣率計算。
// sampling_rate = 200 Hz (200 data points per second)

FUNCTION detect_peak_to_peak(ecg_data, sampling_rate):
    
    // 尋找峰值到峰值振幅 (Peak-to-Peak Amplitude)
    // 這裡我們假設 QRS 波群是主要振盪,尋找局部極大值和極小值
    // 簡單起見,直接找整個訊號的最大值和最小值
    // 更精確的做法需要尋找 QRS 波群的起始和結束點,並在其中找極值
    
    min_amplitude = ecg_data[0]
    max_amplitude = ecg_data[0]
    
    FOR i FROM 1 TO length(ecg_data) - 1 DO
        IF ecg_data[i] < min_amplitude THEN
            min_amplitude = ecg_data[i]
        END IF
        IF ecg_data[i] > max_amplitude THEN
            max_amplitude = ecg_data[i]
        END IF
    END FOR
    
    peak_to_peak_amplitude = max_amplitude - min_amplitude

    // 尋找峰值到峰值間隔 (Peak-to-Peak Interval)
    // 這需要識別連續的 QRS 波群。一個簡單的方法是尋找連續的局部最大值。
    // 實際應用中,會使用更複雜的演算法(如 R-peak detection)。
    // 這裡我們模擬圖中的 't',假設找到兩個連續的顯著峰值。
    
    // 尋找第一個峰值 (例如,第一個顯著的局部最大值)
    // 這裡我們假設找到第一個 R 波峰的時間點 (index_peak1)
    // 為了簡化,假設我們已經知道第一個峰值的位置,例如 index_peak1
    // 例如,在圖中,第一個 'x' 似乎在 t=0.25s 附近,第二個在 t=0.75s 附近。
    // 實際程式需要演算法來偵測。
    
    // 假設我們有一個 R-peak 偵測函數,返回所有 R 波峰的時間點 (以秒為單位)
    // r_peak_times = detect_r_peaks(ecg_data, sampling_rate) 
    
    // 這裡我們用一個簡化的方法,尋找一個局部最大值作為一個心跳的標誌
    // 找到第一個局部最大值 (R-peak) 的索引
    peak1_index = find_first_local_maximum(ecg_data) 
    
    // 找到下一個局部最大值 (R-peak) 的索引
    peak2_index = find_next_local_maximum(ecg_data, peak1_index) 

    // 計算兩個峰值之間的樣本數
    num_samples_interval = peak2_index - peak1_index
    
    // 計算間隔時間 (秒)
    peak_to_peak_interval_sec = num_samples_interval / sampling_rate
    
    // 如果需要,可以找到所有峰值,然後計算平均間隔
    // For simplicity, we use the first two detected peaks.

    RETURN peak_to_peak_amplitude, peak_to_peak_interval_sec

END FUNCTION

// 輔助函數 (簡化版本,實際需要更複雜的演算法)
FUNCTION find_first_local_maximum(data):
    // 尋找第一個局部最大值點的索引
    // 例如,遍歷數據,找到一個點,其值大於其前後鄰居
    // 這裡僅為示意,實際需要處理邊界條件和雜訊
    FOR i FROM 1 TO length(data) - 2 DO
        IF data[i] > data[i-1] AND data[i] > data[i+1] THEN
            RETURN i // 返回索引
        END IF
    END FOR
    RETURN 0 // 找不到,返回預設值

FUNCTION find_next_local_maximum(data, start_index):
    // 從 start_index 開始,尋找下一個局部最大值點的索引
    FOR i FROM start_index + 1 TO length(data) - 2 DO
        IF data[i] > data[i-1] AND data[i] > data[i+1] THEN
            RETURN i // 返回索引
        END IF
    END FOR
    RETURN length(data) - 1 // 找不到,返回結尾

Python 實作範例 (簡化):

🔒

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

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

免費註冊

其他考古題