111 民航特考三等 航空通信 計算機概論 考古題詳解
第 一 題24 分
請回答下列問題: (一) 在正整數系統中, 位數的十進制可以表示的最大數為何? 位數的八進制可以表示的最大數為何?(6 分) (二) 十進制數 轉為二進制數是多少?十進制數 轉為二進制數是多少?(6 分) (三) 十六進制數 與十六進制數 進行 OR 運算結果是多少?十六進制數 與十六進制數 進行 OR 運算結果是多少?(6 分) (四) 因為 I/O 設備的執行速度比 CPU 慢得多,所以 CPU 的執行必須採取可程式(Programmed)I/O 來同步外,還有哪兩種同步方法?(6 分)
登入後即可作答並保存紀錄。
(一)五位數的十進制與八進制最大值
核心觀念
在正整數的 位數表示法中,若基底為 ,每一位可使用的最大數字為 ,因此最大值為:
解題方法
- 五位數十進制
十進制的基底為 ,每位最大數字為 :
所以五位數十進制的最大數為:
- 五位數八進制
八進制的基底為 ,每位最大數字為 :
以八進制表示時,直接寫成五個最大位元:
其十進制數值為:
解題技巧
判斷基底為 、位數為 時,直接套用:
八進制每一位只能使用 至 ,不可出現數字 或 。
(二)十進制轉二進制
核心觀念
整數部分使用「除 取餘數」法;小數部分使用「乘 取整數位」法。
1. 轉為二進制
整數部分
由下往上讀取餘數:
小數部分
取整數位 。
取整數位 。
取整數位 。
取整數位 ,小數部分歸零。
因此:
合併整數與小數部分:
2. 轉為二進制
整數部分
由下往上讀取:
小數部分
取整數位 。
取整數位 。
取整數位 。
取整數位 。
取整數位 。
因此:
合併後:
解題技巧
小數部分可先換成分數:
驗算時可將二進制小數位依序乘上:
例如:
第 二 題27 分
請回答下列問題: (一) 一台主機使用 TCP/IP 協定套件(protocol suite)與另一台主機通信,在應用層(application layer),其發送或接收的資料單位是訊息(message),請問在網路層(network layer)和資料鏈結層(data-link layer)的發送或接收的資料單位各是什麼?(6 分) (二) 有一多程式(multiprogramming)作業系統使用分配方案並劃分 可用記憶體分為 、、、 和 五個分區。第一個執行的程式需要 並占用第三個分區。第二個程式需要 並占用第一個分區。第三個程式需要 並占用第二個分區,第四個程式需要 並占用第四個分區,最後,第五個程式需要 並占用第五個分區,則使用的總記憶體是多少?總共浪費了多少記憶體?浪費了多少記憶體百分比?(9 分) (三) 死鎖(Deadlock)並不總是發生,死鎖有四個必要條件,其中何謂「Mutual exclusion」?何謂「Resource holding」?(6 分) (四) 假設您要為某個單位長官設定 Windows 個人電腦網路,與網路有關的設定參數有——電腦名稱:Chairman,工作群組:Admin,IP:,DNS:,請問還要設定 Netmask 和 Gateway 為何?電腦才能正確上網?(6 分)
登入後即可作答並保存紀錄。
(一)TCP/IP 各層資料單位
核心觀念
TCP/IP 協定套件在不同網路層級,資料單位名稱不同:
- 應用層:訊息(message)
- 傳輸層:區段(segment,TCP)或資料報(datagram,UDP)
- 網路層:封包(packet),亦可稱 IP 資料報(IP datagram)
- 資料鏈結層:訊框(frame)
解題方法
題目已知應用層資料單位為 message,只需依序判斷網路層與資料鏈結層的資料封裝名稱。
應用層的訊息向下傳遞時,經過網路層會封裝成 IP 封包;再向下經過資料鏈結層時,會加上資料鏈結層標頭與尾端資訊,形成訊框。
解題技巧
記憶順序可寫成:
本題未詢問傳輸層,因此只需回答:
- 網路層:封包(packet/IP datagram)
- 資料鏈結層:訊框(frame)
(二)固定分區配置與記憶體浪費
核心觀念
本題考固定分區(fixed partitioning)配置與內部碎裂(internal fragmentation)。
固定分區中,每個程式必須配置到一個完整分區。程式實際需要的記憶體小於分區大小時,剩餘空間無法再配置給其他程式,稱為內部碎裂,也就是浪費的記憶體。
解題方法
各程式的配置情形如下:
| 程式 | 所需記憶體 | 使用分區 | 分區大小 | 浪費記憶體 |
|---|---|---|---|---|
| 第一個 | MB | 第三分區 | MB | MB |
| 第二個 | MB | 第一分區 | MB | MB |
| 第三個 | MB | 第二分區 | MB | MB |
| 第四個 | MB | 第四分區 | MB | MB |
| 第五個 | MB | 第五分區 | MB | MB |
五個程式實際使用的記憶體總量為:
五個分區總容量為:
因此,內部浪費的記憶體為:
浪費記憶體百分比以總可用記憶體 MB 為分母:
解題技巧
每個分區的浪費量直接使用:
快速驗算:
由於所有分區均已配置,總分區容量為 MB;程式實際需求總量為 MB,兩者差額即為浪費量。
(三)死鎖的必要條件
核心觀念
死鎖(deadlock)成立必須同時具備四個必要條件:
- Mutual exclusion(互斥)
- Resource holding/Hold and wait(持有並等待)
- No preemption(不可剝奪)
- Circular wait(循環等待)
題目要求說明前兩項。
1. Mutual exclusion(互斥)
第 三 題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 分) (三) 以下程式執行時,輸入兩個正整數為 和 ,則輸出顯示什麼?(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 在迴圈中的累加變化。
外層迴圈控制 到 ;內層迴圈執行條件為 ,因此每一列會執行 次。
解題方法
逐次列出各次外層迴圈:
| 內層迴圈執行次數 | 輸出內容 | 執行後的 | |
|---|---|---|---|
| 1 | 0 | 空白列 | 2 |
| 2 | 1 | 2 | 3 |
| 3 | 2 | 34 | 5 |
| 4 | 3 | 567 | 8 |
內層迴圈每執行一次便印出目前的 y,再執行 y++。每次外層迴圈結束後,printf("\n") 換行。
解題技巧
第一列內層迴圈完全不執行,因此輸出結果的第一行是空白行。數字不以空格分隔,必須按照連續字元判讀。
【答案】
2
34
567
第三題(二)
核心觀念
儲存類別指示器(storage-class specifiers)用來描述變數或函式的儲存期間、連結性及作用範圍。
依照命題當年(民國 111 年)C 程式設計常用分類,除了 auto 外,另外三個是:
registerstaticextern
解題方法
auto:區域變數的預設儲存類別,儲存期間通常為所在區塊執行期間。register:建議編譯器將變數配置於暫存器中,以提升存取效率;不能對其使用取址運算子&。static:使變數具有靜態儲存期間。區域static變數離開函式後仍保留其值;檔案層級的static則限制連結範圍於該原始檔案。extern:宣告變數或函式定義在其他位置,主要用於跨檔案共用外部名稱。
解題技巧
題目明確要求「除了 auto 外的三個」,依傳統 C 課本與考試分類直接回答:
【答案】
register、static、extern。
第三題(三)
核心觀念
本小題考查遞迴函式。函式 f1(x,y) 的定義為:
當 大於 時,每一層遞迴都加上一次 ,直到 才停止。
解題方法
輸入:
依函式定義展開:
第 四 題25 分
請回答下列問題:(每小題 5 分,共 25 分) (一) 說明如何用一個陣列(array)來實現 2 個堆疊(stacks)? (二) 有一二元樹的中序追蹤(inorder traversal)為 ,其前序追蹤(preorder traversal)為 ,請畫出此二元樹。 (三) 畫出將 插入初始為空的二元搜尋樹(binary search tree)中的結果。 (四) 有一 hash 函數 ,假設 分別給定輸入 ,若使用 separate chaining hash table,請畫出結果。 (五) 使用插入排序法(insertion sort)來對序列 進行由小到大的排序,寫出排序過程。
登入後即可作答並保存紀錄。
(一)用一個陣列實現兩個堆疊
核心觀念
堆疊(stack)遵守後進先出(LIFO, Last In First Out)。利用同一個長度為 的陣列,可讓兩個堆疊分別由陣列兩端向中央成長,以共享未使用的空間。
解題方法
設陣列為 :
- 堆疊一(Stack 1)由左向右成長。
- 堆疊二(Stack 2)由右向左成長。
- 設
top1 = -1,表示 Stack 1 為空。 - 設
top2 = n,表示 Stack 2 為空。
配置方式如下:
基本操作:
- Stack 1 push:先令
top1 = top1 + 1,再將資料存入 。 - Stack 1 pop:取出 ,再令 `top1 = top1 - 1$。
- Stack 2 push:先令 `top2 = top2 - 1A[top2]$。
- Stack 2 pop:取出 ,再令 `top2 = top2 + 1$。
兩個堆疊共用陣列,因此陣列滿載的條件為:
此時兩個堆疊之間已無剩餘空間。
解題技巧
此方法的優點是兩個堆疊可彈性分享空間。若兩個堆疊各自固定分配半數陣列,容易造成一邊已滿、另一邊仍有大量空間的浪費。
【答案】
使用同一陣列,讓 Stack 1 從索引 向右成長,Stack 2 從索引 向左成長;當 時表示陣列已滿。
(二)由中序與前序追蹤畫出二元樹
核心觀念
二元樹追蹤規則如下:
- 前序(preorder):根、左子樹、右子樹,即 Root-Left-Right。
- 中序(inorder):左子樹、根、右子樹,即 Left-Root-Right。
前序追蹤的第一個節點必定是整棵樹的根。
題目給定:
中序:
前序:
解題方法
前序第一個符號為 ,因此整棵樹根節點為 。
中序中,根節點 將樹分成:
- 左子樹:
- 右子樹:
左子樹的前序為:
因此左子樹根為 ,其左子節點為 ,右子樹為 。
右子樹的前序為:
因此右子樹根為 ,其左子樹為 ,右子節點為 。
二元樹如下:
+
/ \
+ *
/ \ / \
a * + g
/ \ / \
b c * f
/ \
d e
解題技巧
處理前序與中序時,先找前序第一個節點作為根,再到中序中定位該根,根的左邊即左子樹,右邊即右子樹。運算式中的括號也可用來快速確認子樹範圍。
【答案】
所求二元樹為:
+
/ \
+ *
/ \ / \
a * + g
/ \ / \
b c * f
/ \
d e
(三)建立二元搜尋樹
核心觀念
二元搜尋樹(Binary Search Tree, BST)符合:
- 左子樹所有節點值小於根節點。
- 右子樹所有節點值大於根節點。
- 插入資料時,從根節點開始逐層比較,直到找到空的位置。
題目插入順序為:
解題方法
依序插入:
- :成為根節點。
- :放在 的左邊。
- :放在 的右邊。
- 且 :放在 的右邊。
- :放在 的右邊。
- ,但 :放在 的右邊。
- ,但 :放在 的左邊。
- ,但 :放在 $9