106 銀行招考不分職等 合作金庫-資安防護系統管理人員 專業科目:程式設計、系統分析、資料結構及資料庫應用 考古題詳解
第 第一題 題20 分
請設計一個 APP,於程式啟動時,彈出對話框(Android 使用 AlertDialog、iOS 使用 UIAlertController),對話框標題顯示「行動銀行」,對話框訊息內容顯示「提醒您可安裝防毒軟體,以提升行動交易安全!」,並於對話框內由左至右加入三顆按鈕,說明如下表:
| 按鈕顯示文字 | 點選按鈕後的動作 |
|---|---|
| 下次提醒我 | 關閉對話框,下次程式啟動時,會再顯示本對話框。 |
| 了解更多 | 使用系統內建瀏覽器開啟以下網址「https://www.tabf.org.tw」。 |
| 不再提醒 | 關閉對話框,下次程式啟動時,不會再顯示本對話框。 |
(請擇一選擇以 Android 或 iOS 作答,Android 使用 JAVA 語言,iOS 使用 Objective-C 語言。如有非程式碼之相關屬性設定,請詳細敘述。)
登入後即可作答並保存紀錄。
核心觀念
本題考查 Android AlertDialog、按鈕事件處理,以及使用 SharedPreferences 保存「是否不再提醒」的狀態。
功能規則如下:
- 「下次提醒我」:只關閉對話框,不儲存禁止提醒狀態,因此下次啟動仍顯示。
- 「了解更多」:透過
Intent.ACTION_VIEW呼叫系統瀏覽器開啟指定頁面。 - 「不再提醒」:將設定值保存為
true,下次啟動時不再顯示。
本題選擇以 Android Java 作答。
解題方法
程式啟動時,在 Activity 的 onCreate 中讀取 SharedPreferences:
- 設定值不存在或為
false:顯示對話框。 - 設定值為
true:不顯示對話框。
Android AlertDialog 的三種按鈕通常可透過下列方法建立:
setNegativeButtonsetNeutralButtonsetPositiveButton
若依 Android 傳統按鈕排列由左至右配置為:
Negative:「下次提醒我」Neutral:「了解更多」Positive:「不再提醒」
Java 程式碼
package com.example.mobilebank;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final String PREF_NAME = "mobile_bank_settings";
private static final String KEY_NO_MORE_REMINDER = "no_more_reminder";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences preferences =
getSharedPreferences(PREF_NAME, MODE_PRIVATE);
boolean noMoreReminder =
preferences.getBoolean(KEY_NO_MORE_REMINDER, false);
if (!noMoreReminder) {
showSecurityReminder;
}
}
private void showSecurityReminder {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("行動銀行")
.setMessage("提醒您可安裝防毒軟體,以提升行動交易安全!")
// 由左至右:下次提醒我、了解更多、不再提醒
.setNegativeButton("下次提醒我",
(dialogInterface, which) -> {
// 不儲存任何設定,下次啟動時仍會顯示
dialogInterface.dismiss;
})
.setNeutralButton("了解更多",
(dialogInterface, which) -> {
Intent intent = new Intent(
Intent.ACTION_VIEW,
Uri.parse(")
);
startActivity(intent);
})
.setPositiveButton("不再提醒",
(dialogInterface, which) -> {
SharedPreferences preferences =
getSharedPreferences(
PREF_NAME,
MODE_PRIVATE
);
preferences.edit
.putBoolean(KEY_NO_MORE_REMINDER, true)
.apply;
dialogInterface.dismiss;
})
.setCancelable(false)
.create;
dialog.show;
}
}
非程式碼屬性設定
1. AndroidManifest.xml
主畫面 Activity 必須設定為程式啟動入口:
第 第二題 題20 分
請設計一個如下列三個圖所示,同時符合桌上型電腦、平板電腦和手機的 RWD 網頁。
假設手機的螢幕寬度是 500px、平板電腦的螢幕寬度是 768px。
登入後即可作答並保存紀錄。
核心觀念
本題考查 RWD(Responsive Web Design,響應式網頁設計),重點如下:
- 使用 HTML 建立頁面結構。
- 使用 CSS Media Query,依螢幕寬度套用不同版面。
- 使用 CSS Grid 或 Flexbox 進行欄位配置。
- 使用相對單位、
max-width、width: 100%,避免內容超出螢幕。 - 依題目指定的螢幕寬度,區分:
依附圖可將頁面分成:
- 頁首:紫色標題區。
- 導覽列:左側的交通、城市、景點、餐廳等選單。
- 主要內容:城市介紹。
- 資訊區:提供「有什麼、在哪裡、如何去」等資訊。
- 頁尾:版權資訊。
解題方法
以 CSS Grid 建立三種版面:
| 裝置 | 版面配置 |
|---|---|
| 桌上型電腦 | 頁首橫跨全版,下面分成導覽列、主要內容、資訊區三欄 |
| 平板電腦 | 頁首橫跨全版,導覽列在左側,主要內容在右側,資訊區移至下一列 |
| 手機 | 所有區塊改為由上而下排列 |
HTML 結構如下:
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>城市介紹</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="page">
<header class="header">
澎湖
</header>
<nav class="menu">
<a href="#">交通</a>
<a href="#">城市</a>
<a href="#">景點</a>
<a href="#">餐廳</a>
</nav>
<main class="content">
<h1>城市</h1>
<p>
澎湖位於臺灣海峽,是由多座島嶼所組成的縣市,
具有豐富的自然景觀與人文特色。
</p>
</main>
<aside class="information">
<section>
<h2>有什麼?</h2>
<p>介紹當地景點、特色活動與相關資訊。</p>
</section>
<section>
<h2>在哪裡?</h2>
<p>提供景點所在地及地理位置說明。</p>
</section>
<section>
<h2>如何去?</h2>
<p>提供交通方式及行程建議。</p>
</section>
</aside>
<footer class="footer">
© 2017 城市介紹網站
</footer>
</div>
</body>
</html>
CSS 可依三種裝置設定如下:
第 第三題 題20 分
在開發資訊系統的過程中,我們常常會需要用到 Publish-Subscribe 這樣的技術(例如 Java 訊息服務[Java Message Service],即包含此技術的實作)。
(一) 請說明此技術的運作過程。【10分】 (二) 請以 UML 的循序圖(sequence diagram)描述此技術的運作過程。【10分】
登入後即可作答並保存紀錄。
核心觀念
本題考查 Publish-Subscribe(發布—訂閱)訊息傳遞模式,以及其在 Java Message Service(JMS)中的運作方式。
Publish-Subscribe 的核心精神是:
- 發布者(Publisher)只負責將訊息送至特定主題(Topic)。
- 訂閱者(Subscriber)事先訂閱該主題。
- 訊息服務提供者(Message Service Provider/Broker)負責接收、保存、篩選及轉送訊息。
- 發布者不需要知道有哪些訂閱者,訂閱者也不需要知道發布者是誰。
- 同一則訊息可分別傳送給同一主題的多個訂閱者,形成一對多(one-to-many)的訊息傳遞。
JMS 中常見的訊息模型有兩種:
- Point-to-Point:透過 Queue 傳遞,一則訊息通常由一個消費者接收。
- Publish-Subscribe:透過 Topic 傳遞,同一則訊息可由多個訂閱者各自接收。
因此,本題的關鍵字是「Topic」、「Publisher」、「Subscriber」與「Message Broker」。
(一)Publish-Subscribe 技術的運作過程
1. 建立訊息服務連線
發布者與訂閱者先透過 JMS API 連接至 JMS Provider。JMS Provider 是實際負責訊息管理與傳輸的服務元件。
基本元件包括:
- Connection:與訊息服務的連線。
- Session:處理訊息建立與接收的工作階段。
- Topic:訊息發布的主題。
- MessageProducer:發布訊息的物件。
- MessageConsumer:接收訊息的物件。
2. 訂閱者訂閱 Topic
訂閱者向 JMS Provider 註冊自己對某一 Topic 的訂閱關係,例如:
SecurityAlertSystemEventTransactionNotice
訂閱完成後,JMS Provider 會記錄該訂閱者與 Topic 之間的關係。
訂閱可分為:
- 非持久訂閱(Non-durable Subscription):只有在訂閱者處於連線狀態時接收訊息;離線期間發布的訊息通常不會補送。
- 持久訂閱(Durable Subscription):即使訂閱者暫時離線,JMS Provider 仍可保存訊息,待訂閱者重新連線後傳送。
3. 發布者建立並發布訊息
發布者建立一則訊息,並將訊息送至指定的 Topic。例如發布一則資安事件通知:
- 事件類型:登入異常
- 發生時間:10:00
- 來源位址:192.168.1.10
發布者只需要指定 Topic,不需要指定個別訂閱者。
也就是說,發布者的概念是:
而不是:
4. JMS Provider 接收並處理訊息
JMS Provider 接收到訊息後,依據 Topic 的訂閱資料,找出所有符合條件的訂閱者。
若有 個有效訂閱者,則服務提供者會將該訊息分別交付給這 個訂閱者:
每個訂閱者皆可取得該訊息的副本,因此一位訂閱者處理訊息,不會使其他訂閱者無法取得該訊息。
5. 訂閱者接收並處理訊息
訂閱者可以透過兩種方式接收訊息:
- 同步接收:呼叫
receive等待訊息。 - 非同步接收:設定 MessageListener,由 JMS Provider 在訊息抵達時呼叫回呼方法。
在實務上,非同步接收常用於事件通知系統,例如:
- 資安告警
- 系統監控
- 交易異常通知
- 日誌分析
- 分散式系統事件同步
6. 確認訊息處理結果
訂閱者完成訊息處理後,可依 JMS 的工作階段設定進行確認(Acknowledgement)。
常見處理方式包括:
- Auto Acknowledge:系統自動確認。
- Client Acknowledge:由程式明確確認。
- Transaction:將訊息接收與處理納入交易。
若採用持久訂閱,服務提供者通常會依據訊息確認狀態,判斷訊息是否可以從保存區移除。
Publish-Subscribe 的主要特性
1. 解耦合
發布者不需要知道訂閱者的數量、位置或實作方式,訂閱者也不需要直接呼叫發布者。
因此可以降低:
- 模組之間的依賴性
- 系統整合的複雜度
- 新增功能對既有程式的影響
2. 一對多傳遞
同一則訊息可由多個訂閱者接收。例如同一筆資安告警,可同時送至:
- 資安監控系統
- 簡訊通知系統
- Email 通知系統
- 稽核紀錄系統
3. 非同步處理
發布者發布訊息後,不必等待所有訂閱者處理完成,即可繼續執行其他工作,提升系統反應速度與可擴充性。
4. 動態擴充
新增訂閱者只需訂閱既有 Topic,通常不必修改發布者程式,因此適合大型分散式系統。
5. 訊息可靠性
JMS Provider 可提供訊息保存、重送、持久訂閱及交易確認等機制,以提高訊息傳遞的可靠性。
(二)UML 循序圖
以下循序圖以 JMS Topic 為例,描述訂閱、發布、轉送與接收的流程。
第 第四題 題20 分
如果每個數字用來代表一筆資料的鍵值,而鍵值將以節點(node)之方式來呈現。現在有 13 筆鍵值資料 20、52、14、65、79、19、30、75、23、31、66、15 與 71 需要處理,請回答下述兩個問題:
(一) 依據上述給予的 13 筆鍵值資料建立一棵二元搜尋樹(只須畫出二元搜尋樹之樹狀圖)。【10分】 (二) 根據小題 (一) 之結果,畫出刪除鍵值為 52 之節點並經過重新調整後的二元搜尋樹;此外,須簡單陳述重新調整節點之原則。【10分】
登入後即可作答並保存紀錄。
核心觀念
本題考查二元搜尋樹(Binary Search Tree, BST)的建立與刪除。
二元搜尋樹須符合以下性質:
- 每一節點左子樹所有鍵值均小於該節點鍵值。
- 每一節點右子樹所有鍵值均大於該節點鍵值。
- 建立二元搜尋樹時,依題目給定的鍵值順序逐筆插入。
- 刪除節點時:
- 葉節點:直接刪除。
- 僅有一個子節點:由該子節點接替。
- 同時具有左右子樹:以其中序後繼或中序前驅接替,再刪除原接替節點。
本題為資料結構題,無涉及法條;以下依二元搜尋樹之標準定義作答。
解題方法
題目給定的插入順序為:
插入時依序與目前節點比較:
- 小於目前節點,向左走。
- 大於目前節點,向右走。
- 抵達空位置時,將該鍵值放入該處。
例如:
- ,放在 的右側。
- ,放在 的左側。
- ,因此放在 的左側。
- ,因此放在 的左側。
(一)建立二元搜尋樹
依序插入所有鍵值後,二元搜尋樹如下:
20
/ \
14 52
\ / \
19 30 65
/ / \
15 23 79
\ /
31 75
/
66
\
71
驗證各節點的順序關係:
- 左側為 ,均小於 。
- 右側為 ,均大於 。
- 左側的 均小於 。
- 右側的 均大於 。
- 左側為 ,均小於 。
因此符合二元搜尋樹的定義。
(二)刪除鍵值 52 並調整
節點 同時具有左子樹與右子樹,不能直接刪除後只接一側子樹,必須選擇替代節點。
本解採用「中序後繼」:
- 的中序後繼,是其右子樹中鍵值最小的節點。
- 的右子樹根為 ,而 沒有左子樹,因此中序後繼為 。
- 以 取代原本的 。
- 再刪除原右子樹中的 。原本的 只有右子樹,因此由其右子節點 接替。
刪除後的二元搜尋樹如下:
20
/ \
14 65
\ \
19 79
/ /
15 75
/
66
\
71
刪除後仍符合:
例如新根節點 :
- 左子樹為 等原本屬於 左側的節點,均小於 。
- 右子樹為 ,均大於 。
第 第五題 題20 分
ER(Entity-Relationship)圖如上所示,寫出 SQL 指令產生以下結果: 哪一公司(COMPANY)所承接之個案(CASE)其女性(mang_sex='F')個案管理者(MANAGER)最多?多少人?
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- 多個資料表的
JOIN。 - 使用
WHERE篩選女性管理者:mang_sex = 'F'。 - 依公司分組:
GROUP BY。 - 計算每家公司女性個案管理者人數:
COUNT(DISTINCT mang_id)。 - 找出人數最大值,並處理最高人數相同的公司。
資料表關聯如下:
COMPANY.com_id = CASE.com_idCASE.case_id = CASEMANAGER.case_idCASEMANAGER.mang_id = MANAGER.mang_id
由於題目問的是「多少人」,同一位女性管理者即使負責同一家公司的多個個案,也只能計算一次,因此使用:
解題方法
先將四個資料表連接,再篩選女性管理者,依公司分組計算人數:
接著,再從各公司的統計結果中找出最大值。
以下以 SQL Server 語法表示;因為 CASE 可能是保留字,使用 [CASE] 表示資料表名稱:
WITH FemaleCount AS
(
SELECT
C.com_id,
C.com_name,
COUNT(DISTINCT M.mang_id) AS female_manager_count
FROM COMPANY AS C
JOIN [CASE] AS CA
ON C.com_id = CA.com_id
JOIN CASEMANAGER AS CM
ON CA.case_id = CM.case_id
JOIN MANAGER AS M
ON CM.mang_id = M.mang_id
WHERE M.mang_sex = 'F'
GROUP BY C.com_id, C.com_name
)
SELECT
com_name,
female_manager_count
FROM FemaleCount
WHERE female_manager_count =
(
SELECT MAX(female_manager_count)
FROM FemaleCount
);
SQL 執行邏輯
COMPANY與[CASE]連接,取得每個公司的個案。[CASE]與CASEMANAGER連接,取得每個個案的管理者。CASEMANAGER與MANAGER連接,取得管理者性別。WHERE M.mang_sex = 'F'只保留女性管理者。GROUP BY C.com_id, C.com_name依公司統計。COUNT(DISTINCT M.mang_id)計算每家公司不重複的女性管理者人數。MAX(female_manager_count)找出最大人數。- 外層查詢回傳達到最大值的公司;若有同分公司,會全部列出。