113 地方特考四等 資訊處理 程式設計概要 考古題詳解

113 年・地方特考・四等・資訊處理
試題代碼 程式設計概要

第 一 題30 分

(一) 請針對 C++、Java 及 Python 三種程式語言,以列表方式比較四種特性:執行方式(編譯或直譯)、物件導向繼承機制、性能(執行速度)、應用場景。

(二) 請用 C、C#、C++、Java 或 Python 程式語言撰寫一個程式,定義一個 100 元素的陣列。每一個元素可以儲存的資料包含 10 個字元長度的字串,用以儲存姓名;一個整數用以儲存薪資;及一個浮點數用以儲存年資,提供使用者一筆一筆輸入這些資料。

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

這一題的完整詳解

核心觀念

本題比較的是語言的執行方式、繼承模型、執行效能與典型應用。判斷時要區分「原始碼如何轉成可執行指令」與「執行時是否仍需要虛擬機器或直譯器」。

特性C++JavaPython
執行方式通常先編譯成機器碼,再由作業系統執行原始碼先編譯成位元碼,再由 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 讀取,避免遇到空白時只讀取到名字的一部分;薪資與年資則分別以整數及浮點數格式讀取。

🔒

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

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

免費註冊

第 二 題25 分

(一) 請將下列 C++ 語言的迴圈程式以 for 迴圈方式改寫,並寫出此程式片段輸出的結果。

原程式:

int i=1;int\ i=1;

while (i≤10)while\ (i\leq 10) {

if (i<5 && i≠2)\quad if\ (i<5\ \&\&\ i\neq 2)

std::cout≪′X′;\qquad\quad std::cout\ll 'X';

i++;\quad i++; }

(二) 下列 C++ 程式有一行錯誤,使得編譯無法通過。請列出那一行錯誤,並寫出正確程式碼。修正後執行此程式,使用者輸入 153 後輸出為何?

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int number, originalNumber, remainder, result = 0;
  6. cout << "請輸入三位數:";
  7. cin >> number;
  8. originalNumber = number;
  9. while (originalNumber != 0)
  10. {
  11. remainder = originalNumber % 10;
  12. result += remainder * remainder * remainder
  13. originalNumber /= 10;
  14. }
  15. cout << "輸出為:" << result;
  16. return 0;
  17. }

(三) 執行下列 C++ 程式,當使用者輸入 32,其輸出結果為何?

#include <iostream>

using namespace std;

int main() {

int x;\quad int\ x;

cout≪"請輸入一個正整數:";\quad cout\ll "請輸入一個正整數:";

cin≫x;\quad cin\gg x;

for (int i=1; x>0; i++)\quad for\ (int\ i=1;\ x>0;\ i++)

{\quad \{

if (x%i==0)\qquad\quad if\ (x\%i==0)

cout≪i≪"";\qquad\qquad\quad cout\ll i\ll " ";

if (x==i)\qquad\quad if\ (x==i)

{\qquad\quad \{

i=0;\qquad\qquad\quad i=0;

cout≪"\n";\qquad\qquad\quad cout\ll "\backslash n";

cout≪"請輸入一個正整數:";\qquad\qquad\quad cout\ll "請輸入一個正整數:";

cin≫x;\qquad\qquad\quad cin\gg x;

}\qquad\quad \}

}\quad \}

return 0;\quad return\ 0; }

(四) 請利用 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';
}

逐一檢查 i=1i=1 到 1010:只有 i=1,3,4i=1,3,4 同時符合 i<5i<5 且 i≠2i\neq 2,因此各輸出一個 X。

解題技巧

&& 表示「且」,兩側條件都成立才會執行輸出。改寫迴圈時,需確認更新仍發生在每次迴圈本體執行之後。

(二)找出編譯錯誤並計算輸出

核心觀念

C++ 敘述通常以分號 ; 結尾。程式利用 % 10 逐位取出個位數,再將各位數立方後加總。

解題方法

第 12 行少了結尾分號。正確程式碼為:

result += remainder * remainder * remainder;

修正後輸入 153,迴圈依序取出各位數:

remainderresult 累加
333=273^3=27
527+53=15227+5^3=152
1152+13=153152+1^3=153

因此程式最後輸出:

請輸入三位數:153
輸出為:153

解題技巧

從右向左拆位時,每輪以 originalNumber % 10 取出末位,再以 originalNumber /= 10 去掉末位。檢查編譯錯誤時,可先查看每個敘述是否有必要的分號。

(三)輸入 32 時的輸出

核心觀念

條件 x % i == 0 用來判斷 ii 是否為 xx 的因數。此程式逐一檢查 i,遇到因數便輸出;當 i == x 時,輸出換行、重新提示並讀入新的 x。

解題方法

輸入 x=32x=32 後,i 從 1 開始遞增。32 的因數為 1,2,4,8,16,321,2,4,8,16,32,所以依序輸出這些數字。

🔒

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

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

免費註冊

第 三 題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() {

int first, second;\quad int\ first,\ second;

getNumbers(first, second);\quad getNumbers(first,\ second);

function1(first, second);\quad function1(first,\ second);

showResult(first, second);\quad showResult(first,\ second);

return 0;\quad return\ 0; }

void getNumbers(int& input1, int& input2) {

cout≪"輸入二個正整數:";\quad cout\ll "輸入二個正整數:";

cin≫input1≫input2;\quad cin\gg input1\gg input2; }

void function1(int& var1, int& var2) {

int temp;\quad int\ temp;

temp=var1;\quad temp=var1;

var1=var2;\quad var1=var2;

var2=temp;\quad var2=temp; }

void showResult(int result1, int result2) {

cout≪"二個數輸出結果為:"≪result1≪""≪result2≪endl;\quad cout\ll "二個數輸出結果為:" \ll result1\ll " "\ll result2\ll endl; }

(二) 若 C++ 程式包含下列宣告:

class Automobile {

public:\quad public:

void setPrice(double newPrice);\qquad\quad void\ setPrice(double\ newPrice);

void setProfit(double newProfit);\qquad\quad void\ setProfit(double\ newProfit);

double getPrice();\qquad\quad double\ getPrice();

private:\quad private:

double price;\qquad\quad double\ price;

double profit;\qquad\quad double\ profit;

double getProfit();\qquad\quad double\ getProfit(); };

且主程式(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++ 基礎:

  1. 參照傳遞與值傳遞:參數宣告中的 & 表示參照,函式可直接修改呼叫端變數;未使用 & 時則是值傳遞,函式取得的是副本。
  2. 類別的存取權限:public 成員可由主程式存取;private 成員只能由該類別的成員函式存取。
  3. 多型、多載與覆寫:多型讓相同介面或呼叫形式能依情境呈現不同功能;多載依參數不同區分函式,覆寫則由衍生類別重新定義基底類別的虛擬函式。

(一)輸入兩個正整數後的輸出

解題方法

getNumbers 的參數是參照:

void getNumbers(int& input1, int& input2);

因此輸入的 7、10 會直接存入 main 中的 first、second。接著,function1 也以參照接收兩個變數:

void function1(int& var1, int& var2)

函式將兩個值交換:

  1. temp = var1:暫存 first 的值 77。
  2. var1 = var2:將 second 的值 1010 指派給 first。
  3. var2 = temp:將暫存的 77 指派給 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;合法這是一般區域變數的宣告,與類別存取權限無關。
🔒

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

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

免費註冊

第 四 題15 分

(一) 請說明下列二個 PHP 程式的輸出結果。

<!DOCTYPE html>

<html>

<body>

<?php

$i=1;i=1;

while ($i < 6) {

if(\quad if($i==3) break;i==3)\ break;

echo \quad echo\ $i;i;

\quad $i++;i++;

}

?>

</body>

</html>

<!DOCTYPE html>

<html>

<body>

<?php

$x=5;x=5;

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 標籤與文字仍會輸出。

函式呼叫後,函式外的 `

🔒

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

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

免費註冊

其他考古題