113 地方特考四等 資訊處理 程式設計概要 考古題詳解
第 一 題30 分
(一) 請針對 C++、Java 及 Python 三種程式語言,以列表方式比較四種特性:執行方式(編譯或直譯)、物件導向繼承機制、性能(執行速度)、應用場景。
(二) 請用 C、C#、C++、Java 或 Python 程式語言撰寫一個程式,定義一個 100 元素的陣列。每一個元素可以儲存的資料包含 10 個字元長度的字串,用以儲存姓名;一個整數用以儲存薪資;及一個浮點數用以儲存年資,提供使用者一筆一筆輸入這些資料。
登入後即可作答並保存紀錄。
核心觀念
本題比較的是語言的執行方式、繼承模型、執行效能與典型應用。判斷時要區分「原始碼如何轉成可執行指令」與「執行時是否仍需要虛擬機器或直譯器」。
| 特性 | C++ | Java | Python |
|---|---|---|---|
| 執行方式 | 通常先編譯成機器碼,再由作業系統執行 | 原始碼先編譯成位元碼,再由 Java 虛擬機器(JVM)執行;JVM 可透過即時編譯(JIT)轉成機器碼 | 通常由直譯器執行;常見實作會先轉成位元碼,再由直譯器或虛擬機器執行 |
| 物件導向繼承機制 | 支援單一及多重繼承 | 類別僅能直接繼承一個類別;可實作多個介面 | 支援單一及多重繼承 |
| 性能(執行速度) | 通常較快,能直接產生原生機器碼,且可細緻控制記憶體與資源 | 通常居中;JIT 可提升熱點程式的速度,但仍受 JVM 執行環境影響 | 通常較慢;動態型別與執行時檢查等因素會增加成本 |
| 應用場景 | 作業系統、遊戲引擎、嵌入式系統、需要高效能或精細控制資源的程式 | 企業系統、伺服器應用、Android 應用及跨平台程式 | 資料分析、人工智慧、快速開發、自動化腳本及網頁後端 |
解題方法
比較效能時以「通常」描述,因為實際速度會受程式寫法、編譯器、執行環境及工作負載影響。Java 並非單純直譯:Java 編譯器先將程式編譯為位元碼,再交由 JVM 執行。Python 也常會先產生位元碼,但一般仍歸類為直譯式語言。
解題技巧
記住三個辨識重點:
- **C++:**通常編譯為原生機器碼;類別可多重繼承。
- **Java:**編譯為位元碼,由 JVM 執行;類別單一繼承,可實作多個介面。
- **Python:**常見使用方式是由直譯器執行;支援多重繼承,適合快速開發與資料應用。
(二)建立 100 筆員工資料陣列並逐筆輸入
核心觀念
本題考查陣列、結構化資料與輸入。每筆資料包含姓名、薪資、年資三個欄位,因此可先定義一個代表「員工」的資料型別,再建立可存放 100 筆員工資料的陣列。
以下以 C++ 作答。姓名欄位使用 std::string,並以輸入檢查限制最多 10 個字元;薪資使用整數型別,年資使用浮點數型別。題目未指定姓名長度的字元編碼方式,以下依 C++ std::string::size 的位元組長度處理。
解題方法
先定義 Employee 結構,讓每個元素同時包含姓名、薪資與年資;再宣告 Employee employees[100]。使用迴圈逐筆輸入,共執行 100 次。姓名以 getline 讀取,避免遇到空白時只讀取到名字的一部分;薪資與年資則分別以整數及浮點數格式讀取。
第 二 題25 分
(一) 請將下列 C++ 語言的迴圈程式以 for 迴圈方式改寫,並寫出此程式片段輸出的結果。
原程式:
{
}
(二) 下列 C++ 程式有一行錯誤,使得編譯無法通過。請列出那一行錯誤,並寫出正確程式碼。修正後執行此程式,使用者輸入 153 後輸出為何?
#include <iostream>using namespace std;int main(){int number, originalNumber, remainder, result = 0;cout << "請輸入三位數:";cin >> number;originalNumber = number;while (originalNumber != 0){remainder = originalNumber % 10;result += remainder * remainder * remainderoriginalNumber /= 10;}cout << "輸出為:" << result;return 0;}
(三) 執行下列 C++ 程式,當使用者輸入 32,其輸出結果為何?
#include <iostream>
using namespace std;
int main()
{
}
(四) 請利用 C、C#、C++、Java 或 Python 程式語言寫一個副程式,求二個正整數的最大公因數(GCD)及最小公倍數(LCM)。
登入後即可作答並保存紀錄。
核心觀念
for 迴圈的三個部分依序是「初始設定、繼續條件、每次迴圈後的更新」。原程式先令 i = 1,當 i <= 10 時執行迴圈,並在每次迴圈結尾將 i 加一。
解題方法
將初始設定 i = 1 放入 for 的第一欄,條件 i <= 10 放入第二欄,並將原本迴圈本體最後的 i++ 移至第三欄:
for (int i = 1; i <= 10; i++)
{
if (i < 5 && i != 2)
std::cout << 'X';
}
逐一檢查 到 :只有 同時符合 且 ,因此各輸出一個 X。
解題技巧
&& 表示「且」,兩側條件都成立才會執行輸出。改寫迴圈時,需確認更新仍發生在每次迴圈本體執行之後。
(二)找出編譯錯誤並計算輸出
核心觀念
C++ 敘述通常以分號 ; 結尾。程式利用 % 10 逐位取出個位數,再將各位數立方後加總。
解題方法
第 12 行少了結尾分號。正確程式碼為:
result += remainder * remainder * remainder;
修正後輸入 153,迴圈依序取出各位數:
remainder | result 累加 |
|---|---|
| 3 | |
| 5 | |
| 1 |
因此程式最後輸出:
請輸入三位數:153
輸出為:153
解題技巧
從右向左拆位時,每輪以 originalNumber % 10 取出末位,再以 originalNumber /= 10 去掉末位。檢查編譯錯誤時,可先查看每個敘述是否有必要的分號。
(三)輸入 32 時的輸出
核心觀念
條件 x % i == 0 用來判斷 是否為 的因數。此程式逐一檢查 i,遇到因數便輸出;當 i == x 時,輸出換行、重新提示並讀入新的 x。
解題方法
輸入 後,i 從 1 開始遞增。32 的因數為 ,所以依序輸出這些數字。
第 三 題30 分
(一) 下列 C++ 程式,當程式執行後輸入二個正整數「7 10」,其輸出為何?
#include <iostream>
using namespace std;
void getNumbers(int& input1, int& input2);
void function1(int& var1, int& var2);
void function2(int var1, int var2);
void showResult(int result1, int result2);
int main()
{
}
void getNumbers(int& input1, int& input2)
{
}
void function1(int& var1, int& var2)
{
}
void showResult(int result1, int result2)
{
}
(二) 若 C++ 程式包含下列宣告:
class Automobile
{
};
且主程式(main function)包含下列宣告,並設定完成其 member 變數中的值:
Automobile Toyota, Nissan;
下列那些指令敘述(statements)在主程式中是合法的(legal),那些是不合法的(illegal)?
Toyota.price = 5233.99;
Nissan.setPrice(4000.24);
double aPrice, aProfit;
aPrice = Nissan.getPrice();
aProfit = Nissan.getProfit();
aProfit = Toyota.getProfit();
Toyota = Nissan;
(三) 請說明物件導向程式中多型(Polymorphism)的概念。多型通常可以透過多載(Overloading)和覆寫(Overriding)來實現,請說明多載與覆寫的定義與特性。
登入後即可作答並保存紀錄。
核心觀念
本題考查三項 C++ 基礎:
- 參照傳遞與值傳遞:參數宣告中的
&表示參照,函式可直接修改呼叫端變數;未使用&時則是值傳遞,函式取得的是副本。 - 類別的存取權限:
public成員可由主程式存取;private成員只能由該類別的成員函式存取。 - 多型、多載與覆寫:多型讓相同介面或呼叫形式能依情境呈現不同功能;多載依參數不同區分函式,覆寫則由衍生類別重新定義基底類別的虛擬函式。
(一)輸入兩個正整數後的輸出
解題方法
getNumbers 的參數是參照:
void getNumbers(int& input1, int& input2);
因此輸入的 7、10 會直接存入 main 中的 first、second。接著,function1 也以參照接收兩個變數:
void function1(int& var1, int& var2)
函式將兩個值交換:
temp = var1:暫存first的值 。var1 = var2:將second的值 指派給first。var2 = temp:將暫存的 指派給second。
交換後 first = 10、second = 7。showResult 以值傳遞接收兩數,但它只負責輸出,不會改變呼叫端變數。
輸出
輸入二個正整數:7 10
二個數輸出結果為:10 7
(二)主程式中的敘述是否合法
核心觀念與判斷方法
price 與 profit 是 private 成員,主程式不能直接存取。setPrice、getPrice 是 public 成員函式,主程式可以呼叫;getProfit 是 private 成員函式,主程式不能呼叫。
以下逐一判斷:
| 敘述 | 判斷 | 理由 |
|---|---|---|
Toyota.price = 5233.99; | 不合法 | price 是 private 資料成員,主程式不能直接存取。 |
Nissan.setPrice(4000.24); | 合法 | setPrice 是 public 成員函式,可由主程式呼叫。 |
double aPrice, aProfit; | 合法 | 這是一般區域變數的宣告,與類別存取權限無關。 |
第 四 題15 分
(一) 請說明下列二個 PHP 程式的輸出結果。
<!DOCTYPE html>
<html>
<body>
<?php
$
while ($i < 6) {
$
$
$
}
?>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<?php
$
function myTest() {
\quad echo "<p>Variable x inside function is: \x</p>";`
}
myTest();
echo "<p>Variable x outside function is: \$x</p>";
?>
</body>
</html>
(二) 請寫一個 PHP 程式,隨機產生一個 0–100 的數。若該數小於等於 50,則輸出該數及「小」;若大於 50 小於 100,則輸出該數及「大」。
例如當產生 65 時,輸出為「65 大」。
登入後即可作答並保存紀錄。
核心觀念
本題考查 PHP 的 while 迴圈、break 敘述、函式中的變數作用範圍,以及亂數函式與條件判斷。
while (條件)會在每次執行前檢查條件;條件成立時執行迴圈本體。break會立即結束所在的迴圈。- PHP 函式有自己的區域變數範圍。函式外宣告的變數,不會自動成為函式內可用的變數。
rand(最小值, 最大值)可產生指定範圍內的整數,兩端界限皆包含在內。
解題方法
(一)說明程式輸出
1. while 迴圈與 break
初始值為 $i = 1。每次迴圈先檢查 $i < 6,接著判斷 $i == 3;若成立就執行 break,不再執行該次後續敘述。
$i 值 | $i < 6 | $i == 3 | 執行結果 |
|---|---|---|---|
| 1 | 成立 | 不成立 | 輸出 1,再將 $i 加 1 |
| 2 | 成立 | 不成立 | 輸出 2,再將 $i 加 1 |
| 3 | 成立 | 成立 | 執行 break,結束迴圈 |
當 $i 等於 3 時,break 先於 echo 執行,因此不會輸出 3。程式輸出為:
12
輸出的數字之間沒有空格或換行,因為 echo $i; 只輸出數值本身。
2. 函式內外的變數作用範圍
$x = 5; 宣告在函式外,屬於全域範圍。myTest 內的 $x 不會自動取得函式外的值,因此函式內的 echo 會輸出空值;HTML 標籤與文字仍會輸出。
函式呼叫後,函式外的 `