110 專技高考高等考試 資訊技師 程式設計 考古題詳解
第 一 題20 分
假設有一家新成立不久的 L 公司,欲進行員工基本資料的建立。其基本資料包括有 ID(所有員工一旦被招募進入公司的第一天,就會給予一個 ID(數字))、姓(Last name)、名(First name)、年齡和月薪。
請利用 Java 或 C++ 實作一完整程式,可以在命令行(command line)依序傳入一系列的所有員工基本資料,並將其存入一個文字檔中(例如「salary.txt」)。最後,也能夠算印出當月所有員工薪水加總之後的總平均、最低薪水和最高薪水(三者均為浮點數,取到小數第一位)。
請適當地加入例外處理,讓使用者能夠依其需求,連續地在控制台輸入資料。亦即若其中有資料格式不符,可以印出例如「Invalid input! Try again!」或「輸入資料格式不符,請重新輸入!」的警示語,隨後程式還可以繼續進行到所有的資料輸入正確為止(例如使用者可以到最後才打入結束指標(end-of-file indicator)結束繼續輸入)。
一旦輸入結束,即提示或告知檔案已關閉(File Close),並進行「總員工人數」、「總平均薪水」、「最低薪水」和「最高薪水」的印出顯示。
以下是利用 Java 實作時的執行範例。請使用 Java 或 C++ 的語法撰寫程式碼。
假如未有任何的輸入:
Enter Employee ID, Last name, First name, and Monthly-salary
(Enter end-of-file indicator(CTRL+Z) to end input.)
?
close file
Silly! Nothing input!
正確輸入及最後執行的結果:
Enter Employee ID, Last name, First name, and Monthly-salary
(Enter end-of-file indicator(CTRL+Z) to end input.)
? 羅 ○華 56789
Invalid input.Try again!
? 1 羅 ○華 56789
? 2 林 ○曾 3456a
Invalid input.Try again!
? 2 林 ○曾 34567
? 3 劉 ○俊 23488
? 4 林 ○君 56789
? 5 方 ○滿 55555
?
close file
There are 5 employees considered
Average Salary in this month: 45437.6
Highest Salary in this month: 56789.0
Lowest Salary in this month: 23488.0
存到「salary.txt」裡的內容為:
1 羅 ○華 56789.0
2 林 ○曾 34567.0
3 劉 ○俊 23488.0
4 林 ○君 56789.0
5 方 ○滿 55555.0
登入後即可作答並保存紀錄。
核心觀念
本題考查命令列輸入、資料驗證、文字檔輸出、例外處理與統計計算:
- 逐筆輸入與結束條件:每筆資料包含員工 ID、姓、名、月薪;使用者輸入 EOF(例如 Windows 控制台的
Ctrl+Z,再按 Enter)結束輸入。 - 資料驗證:ID 與月薪須為數字。格式錯誤時顯示警告,略過該筆並繼續讀取。
- 檔案輸出:每筆有效資料寫入
salary.txt。 - 統計公式:若有效員工數為 ,薪水總和為 ,則平均薪水為 ;另以逐筆比較求最高與最低薪水。三個薪水統計值均格式化至小數第一位。
題目範例沒有輸入年齡;因此依範例欄位,程式以 ID、姓、名、月薪作為輸入資料。每筆資料以空白分隔。
解題方法
採用「逐行讀取、逐筆驗證、有效才寫檔並更新統計」的流程:
- 用
BufferedReader逐行讀取控制台輸入。輸入空白行時忽略;遇到 EOF 時結束。 - 每行必須恰有四個欄位,並確認 ID、月薪可解析為數字;月薪須為非負數。
- 欄位不符時顯示錯誤訊息,不寫入檔案,也不計入統計。
- 有效資料寫入檔案,同時累加薪水總和並更新最高、最低薪水。
- 輸入結束後關閉檔案,再依有效員工數決定輸出統計值或「沒有輸入資料」訊息。
Java 參考程式
第 二 題30 分
假設臺灣 XX 食品技師協會欲針對各類「生鮮食材新鮮度」的判定,能夠依據較科學性的方法,乃打算研發出一套能夠應用「色彩計畫」進行食材「自然顏色與光澤外觀」和「新鮮度」關係等級的對照表資料庫。
為達到此目標,乃擬定先期先發展出一套色彩轉換雛型系統程式。此系統得符合下列幾項基本的使用要求和程序:
- 輸入所收集到「用相機所拍攝到的食材的 RGB 值」(所使用的相機已被精確校正,其所拍攝到 RGB 即代表真實色);
- RGB 的 3 個頻道值範圍均在 0~255 之間;
- 為了讓此系統的使用者能對色澤外觀有較直觀的感覺和判別,得將 RGB 值轉成和「人眼視覺三層性(Hue 色相、Saturation 飽和度、Value 明暗度)」相關的 HSV 色彩空間的表示法;
- 可以輸入每筆建築相關顏色 RGB;隨後,即進行計算轉換成 HSV 值後,再將相關的 RGB 和 HSV 值輸出顯示。
假設你就是此套系統的雛型開發師,請利用 Java 或 C++ 撰寫一個以「圖形使用者介面」(Graphical User Interface, GUI)設計,並以 RGBbase 為超類別(Superclass)和 HSV_ColorSpace 為繼承的子類別之系統程式。(30 分)
以下是利用 Java 和 JFrame 實作時的執行範例。
提示:
- 在此作答中,RGB 轉換成 HSV 的方法(Method)或函式(Function)不需要實踐,僅以黑箱的方式處理即可,例如:
Public void RGB_to_HSV(double rValue, double gValue, double bValue){...}
- Target Color 的顯示以及其他元件(例如 labels 文字)全部就用 Default 的顏色(或文字字型和大小)設定,在此只是用來直觀視覺式的 Demo 輔助,你不需要實踐程式碼。
🖼️【此處有附圖,請對照原卷】
圖中初始畫面包含:
R Value:50
G Value:50
B Value:190
Target Color
輸入錯誤時顯示視窗:
Input Error in RGB Values
For input string: "a"
正確執行後顯示:
RGB Values = (50.0, 50.0, 190.0)
HSV Values = (240.0, 73.7, 74.5)
介面包含 Compute & Show、Clear All 及 Close 按鈕。
登入後即可作答並保存紀錄。
核心觀念
本題主要考三件事:Java 類別繼承、Swing 圖形介面與事件處理,以及輸入資料的解析和範圍檢查。
RGBbase 儲存 RGB 三個頻道值;HSV_ColorSpace 繼承 RGBbase,負責提供 RGB 轉 HSV 的方法。題目允許將轉換方法視為黑箱,因此程式只需安排呼叫方法及顯示轉換結果。
RGB 轉 HSV 常用的定義為:令 、、,並令 、、,則明度 ,飽和度在 時為 。色相 依最大頻道決定;題目範例中藍色頻道最大,因此 。
解題方法
介面提供三個文字欄位輸入 RGB,按下 Compute & Show 後依序解析數值、檢查是否在 至 範圍、設定目標色,呼叫 RGB 轉 HSV 方法,最後顯示 RGB 與 HSV。若輸入不是整數,使用 NumberFormatException 捕捉並顯示錯誤訊息。
以下程式將轉換方法保留為黑箱,與題目提示相符;實際 HSV 數值由該黑箱程序設定。以題目範例輸入 、、 時,顯示結果為 、、。
第 三 題25 分
請使用 Java 或 C++ 語法撰寫「Switch 敘述流程控制」為主的水果超商計價程式碼。
這個程式會列出四種(例如蘋果、木瓜、香蕉和西瓜)所銷售的水果名稱做選擇,並同時要求輸入其量秤所得的磅重。每輸入一筆資料(水 果名稱代碼和量秤磅重)後,即會印出該筆售價。隨後會再要求使用者繼續輸入下一筆不同的水果資料,直到此相關購買資料全部輸入完成。最後,再列出該交易的總售價金額。
以下是利用 Java 實作時的執行範例。(25 分)
🖼️【此處有附圖,請對照原卷】
執行範例:
Type the end-of-file indicator to terminate input:
On UNIX/Linux/macOS type <Ctrl> d then press Enter
On Windows type <Ctrl> z then press Enter
1)Enter the fruit type Chosen (integer values in the range 1-4) AND 2)Pounds weighted
1:Apple(20/pound) 2:Banana(10/pound) 3:Papaya(30/pound) 4:Watermelon(10/pound)
? 1 10
Apple price:200.0
1)Enter the fruit type Chosen (integer values in the range 1-4) AND 2)Pounds weighted
1:Apple(20/pound) 2:Banana(10/pound) 3:Papaya(30/pound) 4:Watermelon(10/pound)
? 3 20
Papaya price:600.0
1)Enter the fruit type Chosen (integer values in the range 1-4) AND 2)Pounds weighted
1:Apple(20/pound) 2:Banana(10/pound) 3:Papaya(30/pound) 4:Watermelon(10/pound)
? 2 5
Banana price:50.0
1)Enter the fruit type Chosen (integer values in the range 1-4) AND 2)Pounds weighted
1:Apple(20/pound) 2:Banana(10/pound) 3:Papaya(30/pound) 4:Watermelon(10/pound)
? 4 10
Watermelon price:100.0
1)Enter the fruit type Chosen (integer values in the range 1-4) AND 2)Pounds weighted
1:Apple(20/pound) 2:Banana(10/pound) 3:Papaya(30/pound) 4:Watermelon(10/pound)
?
Selling Report:
Total selling price is 950
登入後即可作答並保存紀錄。
核心觀念
本題主要考查 switch 分支選擇、重複輸入與累計總額。每筆資料包含水果代碼與磅重,依代碼查出單價後計算該筆售價,再加入交易總額。
計算公式為:
題目指定以輸入結束符號表示資料輸入完成;Java 可用 Scanner.hasNextInt 判斷是否還有下一筆水果代碼。
解題方法
程式以迴圈逐筆讀取資料,每次先顯示水果選單,再輸入代碼與磅重。switch 依代碼設定水果名稱及單價,接著計算並輸出該筆售價,並將售價累加至總額。當輸入結束時,離開迴圈並輸出交易總額。
以下程式假設輸入為整數代碼 1 至 4,磅重為數值;遇到無效代碼時會提示並略過該筆。
第 四 題25 分
請依據下列 Java 程式碼執行後,回答輸出結果為何?(25 分)
public class CollectionArrayList4Colors { public static void main(String[] args) { String[] colors = { "RED", "Green", "BLUE", "CYAN", "MAGENTA", "YELLOW", "WHITE", "GRAY", "BLACK" }; List<String> list = new ArrayList<String>();
for (String color : colors) {
list.add(color);
}
System.out.println("ArrayList: ");
for (int count = 0; count < list.size(); count++) {
System.out.printf("%s ", list.get(count));
}
String[] removeNeutrals = { "GRAY", "BLACK", "WHITE" };
List<String> removeList = new ArrayList<String>();
for (String color : removeNeutrals) {
removeList.add(color);
}
removeColors(list, removeList);
convertToLowercaseStrings(list);
System.out.printf("%n%nArrayList after converting to Lowercase and calling removeColors:%n");
for (String color : list) {
System.out.printf("%s ", color);
}
}//end main
private static void removeColors(Collection<String> collection1,
Collection<String> collection2) {
Iterator<String> iterator = collection1.iterator();
while (iterator.hasNext()) {
if (collection2.contains(iterator.next())) {
iterator.remove();
}
}
}//end removeColors
private static void convertToLowercaseStrings(List<String> list) {
ListIterator<String> iterator = list.listIterator();
while (iterator.hasNext()) {
String color = iterator.next();
iterator.set(color.toLowerCase());
}
}//end convertToLowercaseStrings
}//end class CollectionArrayList4Colors
輸出結果:
ArrayList:
RED Green BLUE CYAN MAGENTA YELLOW WHITE GRAY BLACK
ArrayList after converting to Lowercase and calling removeColors:
red green blue cyan magenta yellow
登入後即可作答並保存紀錄。
核心觀念
本題考查 Java 集合框架中 ArrayList 的新增、走訪、刪除與修改:
ArrayList會依新增順序保存元素。Collection.contains(x)會檢查集合中是否有與x相等的元素;字串比較區分大小寫。Iterator.remove會刪除迭代器最近一次回傳的元素,適合在走訪集合時同步刪除。ListIterator.set(x)會將最近一次回傳的元素替換為x。String.toLowerCase會傳回字串的小寫形式。此程式未指定地區設定;這些英文字母轉成小寫的結果不受影響。
解題方法
先依程式執行順序追蹤 list:
for (String color : colors)逐一將colors的元素加入list,因此清單內容與原陣列順序相同:
RED, Green, BLUE, CYAN, MAGENTA, YELLOW, WHITE, GRAY, BLACK
- 第一段
for迴圈依索引從0到list.size - 1取出元素並印出。此時尚未呼叫刪除或轉小寫方法,所以輸出為:
RED Green BLUE CYAN MAGENTA YELLOW WHITE GRAY BLACK
removeList收入GRAY、BLACK、WHITE。呼叫removeColors(list, removeList)後,方法用迭代器走訪list;