112 關務特考四等 資訊處理 程式設計概要 考古題詳解
第 一 題20 分
試回答下列有關程式設計領域的問題。(每小題 5 分,共 20 分)
(一) 撰寫程式時皆要取變數名稱(variable name)與其資料型態(data type),試問這兩項的用意為何?
(二) 程式敘述有時會以陣列(array)或串列(list)來表示,試問其功用為何?
(三) 物件導向程式設計中的多型(polymorphism)的功用為何?
(四) 何謂多載函式(overloading function)?
登入後即可作答並保存紀錄。
核心觀念
本題考查程式設計的基本概念:變數名稱與資料型態、陣列與串列、多型,以及函式多載。作答時,應說明各概念如何協助程式表達資料與操作,而不只列出名詞定義。
解題方法與作答要點
(一)變數名稱與資料型態的用意
變數名稱用來識別資料在程式中的位置或意義,使程式可以透過名稱存取、修改資料,也讓程式碼較容易閱讀與維護。例如,score 比單純的 x 更能表達資料代表分數。
資料型態用來界定資料的種類、可表示的範圍,以及可執行的運算。例如果數值型態適合計算,字串型態適合儲存文字;型態資訊也能讓語言或編譯器進行記憶體配置、運算處理及型態檢查,降低不適當運算造成錯誤的機會。
(二)陣列或串列的功用
陣列(array)或串列(list)可將多筆相關資料集合在一個資料結構中,並以索引或位置存取其中的元素。程式可用迴圈逐筆處理資料,避免為每筆資料各自宣告一個變數,並使資料的儲存、查找與處理更有組織。
例如,若要記錄多位考生的分數,可將分數放在同一個陣列或串列,再逐項計算總分或平均分數。陣列通常具有固定長度;串列則常可依語言提供的功能增刪元素,具體特性依程式語言而異。
(三)多型的功用
多型(polymorphism)使不同類別的物件可以透過共同的介面或操作方式使用,而各物件依其實際類別執行相應的行為。如此可將共通操作寫成一致的呼叫方式,降低程式對個別類別的依賴,並提升程式的擴充性與維護性。
第 二 題24 分
下列是 C 程式語言所撰寫的兩數對調程式,它使用傳址呼叫來完成,試修正下列程式錯誤的地方。程式在 main() 函式中先輸入兩個整數,並印出對調前的兩數,再呼叫 swap() 對調函式,最後印出對調後的兩數。輸出結果如下:
Enter two numbers:100 200
a = 100, b = 200
a = 200, b = 100
兩數對調程式:
#include <stdio.h>
void swap(int , int);
int main() { int a, b;
printf("enter two numbers:");
scanf("%d %d", a, b);
printf("a = %d, b = %d\n", a, b);
swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
void swap(int x, int y) { int temp;
temp = x;
x = y;
y = temp;
}
登入後即可作答並保存紀錄。
核心觀念
本題考查 C 語言的指標、位址運算子與函式參數傳遞。
C 語言的函式呼叫採用傳值:呼叫函式時,會把引數的值複製給形參。若要讓函式修改呼叫端的變數,必須把變數的位址傳入,並以指標參數接收。函式內透過指標取值運算子 *,即可讀取或修改該位址所指向的變數。
此外,scanf 要把輸入值存入變數,也必須傳入變數位址,因此整數變數前要加上位址運算子 &。
解題方法
原程式有兩個錯誤:
scanf("%d %d", a, b);傳入的是a、b的值,應改為scanf("%d %d", &a, &b);。swap(int x, int y)的參數是一般整數,函式只會交換區域副本,無法改變main中的a、b。應將參數改為指標,並傳入a、b的位址。
修正後的程式如下:
第 三 題30 分
下列是以 Python 程式語言撰寫的片段程式,試回答每一小題的輸出結果。每一小題是獨立運作的。注意,若迴圈無法停止,則以無窮迴圈作答。(每小題 3 分,共 30 分)
(一) total = 0 for i in range(1, 100): total += i print('total =', total)
(二) total = 0 i = 1 while i <= 100: total += i i += 1 print('total =', total)
(三) total = 0 i = 1 while i <= 100: i += 1 total += i print('total =', total)
(四) total = 0 for i in range(2, 100, 2): total += i print('total =', total)
(五) total = 0 i = 1 while i <= 100: total += 1 i += 1 print('total =', total)
(六) total = 0 i = 1 while i <= 100: total += i i += 2 print('total =', total)
(七) total = 0 for i in range(100, 1, -1): total += i print('total =', total)
(八) total = 0 i = 100 while i > 0: total += i i -= 1 print('total =', total)
(九) 下列的程式,若依序輸入的數值是 1、2、3、4、5、6:
total = 0 i = 1 while i <= 5: num = eval(input('Enter a number: ')) if num % 5 == 0: break else: total += num i += 1 print('total =', total)
(十) 下列的程式,若依序輸入的數值是 1、2、3、4、5、6:
total = 0 i = 1 while i <= 5: num = eval(input('Enter a number: ')) if num % 5 == 0: continue else: total += num i += 1 print('total =', total)
登入後即可作答並保存紀錄。
核心觀念
本題考查 Python 的 range 範圍、while 迴圈條件與更新順序,以及 break、continue 對迴圈流程的影響。
range(起點, 終點, 間距)包含起點、不包含終點;省略間距時為 。while每次先判斷條件,條件成立才執行迴圈本體。break立即結束整個迴圈;continue立即跳到下一輪,略過本輪剩餘程式。- 迴圈變數若沒有在迴圈本體中更新,且條件持續成立,迴圈就不會停止。
解題方法
依程式執行順序追蹤每輪的迴圈變數與 total。遇到連續整數或偶數加總,可用等差級數公式驗算:
(一)
range(1, 100) 依序產生 到 ,不包含 。
輸出:total = 4950
(二)
每輪先將 加入 total,再令 加 。因此累加的是 到 :
輸出:total = 5050
(三)
每輪先執行 i += 1,再把更新後的 加入 total。條件在每輪開始時檢查,因此被加總的是 到 :
輸出:total = 5150
(四)
range(2, 100, 2) 產生 ,不包含 ,共有 個偶數。
輸出:total = 2450
(五)
每輪只執行 total += 1,共執行 輪,所以 total 等於 。
輸出:total = 100
(六)
第 四 題26 分
利用 Python、C、C++、Java、C# 五種程式語言的任何一種程式語言,撰寫一程式用以模擬大樂透的電腦選號(6 個介於 1 到 49 之間不同的號碼)。輸出時要由小至大排列。
登入後即可作答並保存紀錄。
核心觀念
本題考查亂數產生、集合去重與排序。大樂透選號須從 至 中選出 個互不相同的整數,並依由小至大輸出。題目沒有指定亂數種子或特定程式語言,因此以下以 Python 示範。
解題方法
使用 Python 標準函式庫 random 的 sample 函式,從整數範圍中不重複抽取 6 個號碼,再以 sort 排序:
import random
numbers = random.sample(range(1, 50), 6)
numbers.sort
print(*numbers)
range(1, 50) 會產生 至 的整數,因為 Python 的範圍上界不包含在內。