111 民航特考三等 航空通信 計算機概論 考古題詳解

111 年・民航特考・三等・航空通信
試題代碼 計算機概論

第 一 題24 分

請回答下列問題: (一) 在正整數系統中,55 位數的十進制可以表示的最大數為何?55 位數的八進制可以表示的最大數為何?(6 分) (二) 十進制數 17.187517.1875 轉為二進制數是多少?十進制數 49.4062549.40625 轉為二進制數是多少?(6 分) (三) 十六進制數 9999 與十六進制數 9999 進行 OR 運算結果是多少?十六進制數 9999 與十六進制數 FF\text{FF} 進行 OR 運算結果是多少?(6 分) (四) 因為 I/O 設備的執行速度比 CPU 慢得多,所以 CPU 的執行必須採取可程式(Programmed)I/O 來同步外,還有哪兩種同步方法?(6 分)

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

這一題的完整詳解

(一)五位數的十進制與八進制最大值

核心觀念

在正整數的 nn 位數表示法中,若基底為 bb,每一位可使用的最大數字為 b−1b-1,因此最大值為:

bn−1b^n-1

解題方法

  1. 五位數十進制

十進制的基底為 1010,每位最大數字為 99:

105−1=100000−1=9999910^5-1=100000-1=99999

所以五位數十進制的最大數為:

99999\boxed{99999}
  1. 五位數八進制

八進制的基底為 88,每位最大數字為 77:

85−1=32768−1=327678^5-1=32768-1=32767

以八進制表示時,直接寫成五個最大位元:

777778\boxed{77777_8}

其十進制數值為:

777778=7(84)+7(83)+7(82)+7(8)+7=327671077777_8=7(8^4)+7(8^3)+7(8^2)+7(8)+7=32767_{10}

解題技巧

判斷基底為 bb、位數為 nn 時,直接套用:

最大值=bn−1\text{最大值}=b^n-1

八進制每一位只能使用 00 至 77,不可出現數字 88 或 99。


(二)十進制轉二進制

核心觀念

整數部分使用「除 22 取餘數」法;小數部分使用「乘 22 取整數位」法。

1. 17.187517.1875 轉為二進制

整數部分

17÷2=8餘 117\div 2=8\quad\text{餘 }1 8÷2=4餘 08\div 2=4\quad\text{餘 }0 4÷2=2餘 04\div 2=2\quad\text{餘 }0 2÷2=1餘 02\div 2=1\quad\text{餘 }0 1÷2=0餘 11\div 2=0\quad\text{餘 }1

由下往上讀取餘數:

1710=10001217_{10}=10001_2

小數部分

0.1875×2=0.3750.1875\times2=0.375

取整數位 00。

0.375×2=0.750.375\times2=0.75

取整數位 00。

0.75×2=1.50.75\times2=1.5

取整數位 11。

0.5×2=1.00.5\times2=1.0

取整數位 11,小數部分歸零。

因此:

0.187510=0.001120.1875_{10}=0.0011_2

合併整數與小數部分:

17.187510=10001.00112\boxed{17.1875_{10}=10001.0011_2}

2. 49.4062549.40625 轉為二進制

整數部分

49÷2=24餘 149\div2=24\quad\text{餘 }1 24÷2=12餘 024\div2=12\quad\text{餘 }0 12÷2=6餘 012\div2=6\quad\text{餘 }0 6÷2=3餘 06\div2=3\quad\text{餘 }0 3÷2=1餘 13\div2=1\quad\text{餘 }1 1÷2=0餘 11\div2=0\quad\text{餘 }1

由下往上讀取:

4910=110001249_{10}=110001_2

小數部分

0.40625×2=0.81250.40625\times2=0.8125

取整數位 00。

0.8125×2=1.6250.8125\times2=1.625

取整數位 11。

0.625×2=1.250.625\times2=1.25

取整數位 11。

0.25×2=0.50.25\times2=0.5

取整數位 00。

0.5×2=1.00.5\times2=1.0

取整數位 11。

因此:

0.4062510=0.0110120.40625_{10}=0.01101_2

合併後:

49.4062510=110001.011012\boxed{49.40625_{10}=110001.01101_2}

解題技巧

小數部分可先換成分數:

0.1875=316=324=0.001120.1875=\frac{3}{16}=\frac{3}{2^4}=0.0011_2 0.40625=1332=1325=0.0110120.40625=\frac{13}{32}=\frac{13}{2^5}=0.01101_2

驗算時可將二進制小數位依序乘上:

2−1,2−2,2−3,…2^{-1},2^{-2},2^{-3},\ldots

例如:

0.011012=0⋅2−1+1⋅2−2+1⋅2−3+0⋅2−4+1⋅2−50.01101_2 =0\cdot2^{-1}+1\cdot2^{-2}+1\cdot2^{-3}+0\cdot2^{-4}+1\cdot2^{-5} =14+18+132=1332=0.40625=\frac14+\frac18+\frac1{32} =\frac{13}{32} =0.40625
🔒

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

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

免費註冊

第 二 題27 分

請回答下列問題: (一) 一台主機使用 TCP/IP 協定套件(protocol suite)與另一台主機通信,在應用層(application layer),其發送或接收的資料單位是訊息(message),請問在網路層(network layer)和資料鏈結層(data-link layer)的發送或接收的資料單位各是什麼?(6 分) (二) 有一多程式(multiprogramming)作業系統使用分配方案並劃分 100 MB100\text{ MB} 可用記憶體分為 10 MB10\text{ MB}、12 MB12\text{ MB}、18 MB18\text{ MB}、20 MB20\text{ MB} 和 40 MB40\text{ MB} 五個分區。第一個執行的程式需要 17 MB17\text{ MB} 並占用第三個分區。第二個程式需要 8 MB8\text{ MB} 並占用第一個分區。第三個程式需要 11 MB11\text{ MB} 並占用第二個分區,第四個程式需要 20 MB20\text{ MB} 並占用第四個分區,最後,第五個程式需要 39 MB39\text{ MB} 並占用第五個分區,則使用的總記憶體是多少?總共浪費了多少記憶體?浪費了多少記憶體百分比?(9 分) (三) 死鎖(Deadlock)並不總是發生,死鎖有四個必要條件,其中何謂「Mutual exclusion」?何謂「Resource holding」?(6 分) (四) 假設您要為某個單位長官設定 Windows 個人電腦網路,與網路有關的設定參數有——電腦名稱:Chairman,工作群組:Admin,IP:192.168.110.26192.168.110.26,DNS:168.95.1.1168.95.1.1,請問還要設定 Netmask 和 Gateway 為何?電腦才能正確上網?(6 分)

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

這一題的完整詳解

(一)TCP/IP 各層資料單位

核心觀念

TCP/IP 協定套件在不同網路層級,資料單位名稱不同:

  • 應用層:訊息(message)
  • 傳輸層:區段(segment,TCP)或資料報(datagram,UDP)
  • 網路層:封包(packet),亦可稱 IP 資料報(IP datagram)
  • 資料鏈結層:訊框(frame)

解題方法

題目已知應用層資料單位為 message,只需依序判斷網路層與資料鏈結層的資料封裝名稱。

應用層的訊息向下傳遞時,經過網路層會封裝成 IP 封包;再向下經過資料鏈結層時,會加上資料鏈結層標頭與尾端資訊,形成訊框。

解題技巧

記憶順序可寫成:

Message→Segment→Packet→Frame\text{Message} \rightarrow \text{Segment} \rightarrow \text{Packet} \rightarrow \text{Frame}

本題未詢問傳輸層,因此只需回答:

  • 網路層:封包(packet/IP datagram)
  • 資料鏈結層:訊框(frame)

(二)固定分區配置與記憶體浪費

核心觀念

本題考固定分區(fixed partitioning)配置與內部碎裂(internal fragmentation)。

固定分區中,每個程式必須配置到一個完整分區。程式實際需要的記憶體小於分區大小時,剩餘空間無法再配置給其他程式,稱為內部碎裂,也就是浪費的記憶體。

解題方法

各程式的配置情形如下:

程式所需記憶體使用分區分區大小浪費記憶體
第一個1717 MB第三分區1818 MB18−17=118-17=1 MB
第二個88 MB第一分區1010 MB10−8=210-8=2 MB
第三個1111 MB第二分區1212 MB12−11=112-11=1 MB
第四個2020 MB第四分區2020 MB20−20=020-20=0 MB
第五個3939 MB第五分區4040 MB40−39=140-39=1 MB

五個程式實際使用的記憶體總量為:

17+8+11+20+39=95 MB17+8+11+20+39=95\text{ MB}

五個分區總容量為:

10+12+18+20+40=100 MB10+12+18+20+40=100\text{ MB}

因此,內部浪費的記憶體為:

100−95=5 MB100-95=5\text{ MB}

浪費記憶體百分比以總可用記憶體 100100 MB 為分母:

5100×100%=5%\frac{5}{100}\times 100\%=5\%

解題技巧

每個分區的浪費量直接使用:

浪費量=分區大小−程式需求量\text{浪費量}=\text{分區大小}-\text{程式需求量}

快速驗算:

1+2+1+0+1=5 MB1+2+1+0+1=5\text{ MB}

由於所有分區均已配置,總分區容量為 100100 MB;程式實際需求總量為 9595 MB,兩者差額即為浪費量。


(三)死鎖的必要條件

核心觀念

死鎖(deadlock)成立必須同時具備四個必要條件:

  1. Mutual exclusion(互斥)
  2. Resource holding/Hold and wait(持有並等待)
  3. No preemption(不可剝奪)
  4. Circular wait(循環等待)

題目要求說明前兩項。

1. Mutual exclusion(互斥)

🔒

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

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

免費註冊

第 三 題24 分

請回答下列問題: (一) 以下程式執行後,輸出顯示什麼?(6 分)

#include <stdio.h>
int main(void) {
    int x = 4, y = 2;
    for (int i = 1; i <= x; i++) {
        for (int j = 1; j < i; j++) {
            printf("%d", y);
            y++;
        }
        printf("\n");
    }
}

(二) 在 C 程式設計中,儲存類別指示器(storage-class specifiers)除了 auto 外,還有哪三個?(6 分) (三) 以下程式執行時,輸入兩個正整數為 8787 和 66,則輸出顯示什麼?(6 分)

#include <stdio.h>
unsigned int f1(unsigned int x, unsigned int y){
    if (2 == y) return x;
    else return x + f1(x, y - 1);
}
int main(void){
    printf("%s", "請輸入兩個正整數: ");
    unsigned int a, b;
    scanf_s("%u%u", &a, &b);
    printf("結果為 %u\n", f1(a, b));
}

(四) 以下程式執行後,輸出顯示什麼?(6 分)

#include <stdio.h>
void f2(const int a[], size_t i, size_t j) {
    if (i < j) {
        f2(a, i + 1, j);
        printf("%d ", a[i]);
    }
}
int main(void){
    int a[10] = { 18, 13, 11, 12, 16, 10, 19, 17, 14, 15 };
    puts("結果是:");
    f2(a, 0, 10);
    puts("");
}

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

這一題的完整詳解

第三題(一)

核心觀念

本小題考查雙層 for 迴圈的執行順序,以及變數 y 在迴圈中的累加變化。

外層迴圈控制 i=1i=1 到 44;內層迴圈執行條件為 j<ij<i,因此每一列會執行 i−1i-1 次。

解題方法

逐次列出各次外層迴圈:

ii內層迴圈執行次數輸出內容執行後的 yy
10空白列2
2123
32345
435678

內層迴圈每執行一次便印出目前的 y,再執行 y++。每次外層迴圈結束後,printf("\n") 換行。

解題技巧

第一列內層迴圈完全不執行,因此輸出結果的第一行是空白行。數字不以空格分隔,必須按照連續字元判讀。

【答案】


2
34
567

第三題(二)

核心觀念

儲存類別指示器(storage-class specifiers)用來描述變數或函式的儲存期間、連結性及作用範圍。

依照命題當年(民國 111 年)C 程式設計常用分類,除了 auto 外,另外三個是:

  1. register
  2. static
  3. extern

解題方法

  • auto:區域變數的預設儲存類別,儲存期間通常為所在區塊執行期間。
  • register:建議編譯器將變數配置於暫存器中,以提升存取效率;不能對其使用取址運算子 &。
  • static:使變數具有靜態儲存期間。區域 static 變數離開函式後仍保留其值;檔案層級的 static 則限制連結範圍於該原始檔案。
  • extern:宣告變數或函式定義在其他位置,主要用於跨檔案共用外部名稱。

解題技巧

題目明確要求「除了 auto 外的三個」,依傳統 C 課本與考試分類直接回答:

register、static、extern\boxed{\texttt{register、static、extern}}

【答案】

register、static、extern。


第三題(三)

核心觀念

本小題考查遞迴函式。函式 f1(x,y) 的定義為:

f1(x,y)={x,y=2x+f1(x,y−1),y≠2f1(x,y)= \begin{cases} x, & y=2\\ x+f1(x,y-1), & y\ne 2 \end{cases}

當 yy 大於 22 時,每一層遞迴都加上一次 xx,直到 y=2y=2 才停止。

解題方法

輸入:

x=87,y=6x=87,\qquad y=6

依函式定義展開:

🔒

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

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

免費註冊

第 四 題25 分

請回答下列問題:(每小題 5 分,共 25 分) (一) 說明如何用一個陣列(array)來實現 2 個堆疊(stacks)? (二) 有一二元樹的中序追蹤(inorder traversal)為 (a+(b∗c))+(((d∗e)+f)∗g)(a + (b * c)) + (((d * e) + f) * g),其前序追蹤(preorder traversal)為 ++a∗bc∗+∗defg+ + a * b c * + * d e f g,請畫出此二元樹。 (三) 畫出將 3,1,4,6,9,2,5,73, 1, 4, 6, 9, 2, 5, 7 插入初始為空的二元搜尋樹(binary search tree)中的結果。 (四) 有一 hash 函數 h(x)=x(mod10)h(x) = x \pmod{10},假設 xx 分別給定輸入 {4371,1323,6173,4199,4344,9679,1989}\{4371, 1323, 6173, 4199, 4344, 9679, 1989\},若使用 separate chaining hash table,請畫出結果。 (五) 使用插入排序法(insertion sort)來對序列 3,1,4,1,5,9,2,6,53, 1, 4, 1, 5, 9, 2, 6, 5 進行由小到大的排序,寫出排序過程。

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

這一題的完整詳解

(一)用一個陣列實現兩個堆疊

核心觀念

堆疊(stack)遵守後進先出(LIFO, Last In First Out)。利用同一個長度為 nn 的陣列,可讓兩個堆疊分別由陣列兩端向中央成長,以共享未使用的空間。

解題方法

設陣列為 A[0…n−1]A[0 \dots n-1]:

  • 堆疊一(Stack 1)由左向右成長。
  • 堆疊二(Stack 2)由右向左成長。
  • 設 top1 = -1,表示 Stack 1 為空。
  • 設 top2 = n,表示 Stack 2 為空。

配置方式如下:

Stack 1⟶[未使用空間]⟵Stack 2\text{Stack 1} \quad \longrightarrow \quad [\text{未使用空間}] \quad \longleftarrow \quad \text{Stack 2}

基本操作:

  • Stack 1 push:先令 top1 = top1 + 1,再將資料存入 A[top1]A[top1]。
  • Stack 1 pop:取出 A[top1]A[top1],再令 `top1 = top1 - 1$。
  • Stack 2 push:先令 `top2 = top2 - 1,再將資料存入,再將資料存入 A[top2]$。
  • Stack 2 pop:取出 A[top2]A[top2],再令 `top2 = top2 + 1$。

兩個堆疊共用陣列,因此陣列滿載的條件為:

top1+1=top2top1+1=top2

此時兩個堆疊之間已無剩餘空間。

解題技巧

此方法的優點是兩個堆疊可彈性分享空間。若兩個堆疊各自固定分配半數陣列,容易造成一邊已滿、另一邊仍有大量空間的浪費。

【答案】

使用同一陣列,讓 Stack 1 從索引 00 向右成長,Stack 2 從索引 n−1n-1 向左成長;當 top1+1=top2top1+1=top2 時表示陣列已滿。


(二)由中序與前序追蹤畫出二元樹

核心觀念

二元樹追蹤規則如下:

  • 前序(preorder):根、左子樹、右子樹,即 Root-Left-Right。
  • 中序(inorder):左子樹、根、右子樹,即 Left-Root-Right。

前序追蹤的第一個節點必定是整棵樹的根。

題目給定:

中序:

(a+(b∗c))+(((d∗e)+f)∗g)(a+(b*c))+(((d*e)+f)*g)

前序:

++a∗bc∗+∗defg+ \quad + \quad a \quad * \quad b \quad c \quad * \quad + \quad * \quad d \quad e \quad f \quad g

解題方法

前序第一個符號為 ++,因此整棵樹根節點為 ++。

中序中,根節點 ++ 將樹分成:

  • 左子樹:(a+(b∗c))(a+(b*c))
  • 右子樹:(((d∗e)+f)∗g)(((d*e)+f)*g)

左子樹的前序為:

+a∗bc+ \quad a \quad * \quad b \quad c

因此左子樹根為 ++,其左子節點為 aa,右子樹為 b∗cb*c。

右子樹的前序為:

∗+∗defg* \quad + \quad * \quad d \quad e \quad f \quad g

因此右子樹根為 ∗*,其左子樹為 (d∗e)+f(d*e)+f,右子節點為 gg。

二元樹如下:

 +
 / \
 + *
 / \ / \
 a * + g
 / \ / \
 b c * f
 / \
 d e

解題技巧

處理前序與中序時,先找前序第一個節點作為根,再到中序中定位該根,根的左邊即左子樹,右邊即右子樹。運算式中的括號也可用來快速確認子樹範圍。

【答案】

所求二元樹為:

 +
 / \
 + *
 / \ / \
 a * + g
 / \ / \
 b c * f
 / \
 d e

(三)建立二元搜尋樹

核心觀念

二元搜尋樹(Binary Search Tree, BST)符合:

  • 左子樹所有節點值小於根節點。
  • 右子樹所有節點值大於根節點。
  • 插入資料時,從根節點開始逐層比較,直到找到空的位置。

題目插入順序為:

3,1,4,6,9,2,5,73,1,4,6,9,2,5,7

解題方法

依序插入:

  1. 33:成為根節點。
  2. 1<31<3:放在 33 的左邊。
  3. 4>34>3:放在 33 的右邊。
  4. 6>36>3 且 6>46>4:放在 44 的右邊。
  5. 9>3,9>4,9>69>3,9>4,9>6:放在 66 的右邊。
  6. 2<32<3,但 2>12>1:放在 11 的右邊。
  7. 5>3,5>45>3,5>4,但 5<65<6:放在 66 的左邊。
  8. 7>3,7>4,7>67>3,7>4,7>6,但 7<97<9:放在 $9
🔒

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

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

免費註冊

其他考古題