地特四等申論題
107年
[資訊處理] 程式設計概要
第 一 題
📖 題組:
下列程式皆以C語言語法呈現,請依據所給程式片段回答問題。
下列程式皆以C語言語法呈現,請依據所給程式片段回答問題。
📝 此題為申論題,共 4 小題
小題 (一)
請說明下列程式片段執行結果為何。(5分)
for (i=0; i<=10; i++) { i = i+2; }
printf ("%d\n", i);
思路引導 VIP
遇到程式追蹤題,務必注意迴圈主體內是否修改了計數變數。建議採用「變數追蹤表(Trace table)」,逐次記錄條件判斷、主體執行與遞增階段的數值變化,避免心算錯誤。
小題 (二)
給定下列函式,請說明 fun(123456)執行結果為何。(5分)
int fun (int x) {
if (x > 0) return (x % 10) + fun (x / 10);
else return 0;
}
思路引導 VIP
看到遞迴函式,應先找出「終止條件」(x <= 0 時回傳 0)與「遞迴關係式」(利用 % 10 取出個位數,並加上 / 10 剩餘位數的遞迴結果)。接著以手動追蹤法(Trace)將傳入值 123456 逐層代入,即可發現此函式的目的是計算整數所有位數的總和。
小題 (三)
若 int 變數是以4位元(bytes)來儲存,請問最大及最小整數分別為何?(5分)
思路引導 VIP
看到此題,應先將位元組(bytes)換算成位元(bits),即 4 bytes = 32 bits。接著回想C語言中 int 預設為有號整數(signed integer),採用二補數(Two's complement)表示法,套用 n bits 有號整數的範圍公式 -2^(n-1) ~ 2^(n-1)-1 即可得出答案。
小題 (四)
若下列程式片段目的是要判斷x 是否能被2,3,4,5整除,若可被整除就輸出可被整除之訊息。請問程式有何錯誤?請說明該如何修正方能符合預期目的。(10分)
if (x/2 == 0) printf ("%d被2整除\n",x);
else if (x/3 == 0) printf (“%d被3整除\n”, x);
else if (x/4 == 0) printf(“%d被4整除\n”, x);
else if (x/5 == 0) printf(“%d被5整除\n”, x);
思路引導 VIP
解答本題應從「運算邏輯」與「控制流程」兩個層面切入。首先,回想C語言中『整除』的數學定義應為『餘數為零』,故需檢查使用的運算子是否正確;其次,思考題目情境『判斷能否被2,3,4,5整除』是否為互斥事件,若一個數字可能同時被多個數字整除,則不應使用會中斷判斷的 else if 結構。