高考申論題
111年
[資訊處理] 程式設計
第 一 題
📖 題組:
請問以下三小題 C 程式執行的結果為何?請注意須說明答案是如何產生的,否則不給分。
請問以下三小題 C 程式執行的結果為何?請注意須說明答案是如何產生的,否則不給分。
📝 此題為申論題,共 3 小題
小題 (一)
(5 分)
#include
#include
int main(void) {
int x;
float y;
for (x=0, y=50; x<25; x+=5, y/=2)
printf("x=%d, y=%4.2f\n", x, y);
return 0;
}
思路引導 VIP
看到本題,首先要辨識出這是 C 語言中基本的 for 迴圈與變數追蹤題。接著應該按部就班地列出每一次迴圈迭代時 x 與 y 的初始值、條件判斷以及更新後的值。同時,要注意 printf 中 %4.2f 的格式化輸出意義(浮點數,包含小數點總寬度至少 4,小數點後保留 2 位並四捨五入)。將每次印出的結果精確記錄下來即可。
小題 (二)
(5 分)
#include
#include
int a=10, fun(int);
int main(void) {
int b=6;
printf("a=%d, b=%d, fun(a)=%d\n", a, b, fun(a));
return 0;
}
int fun(int b) {
a-=5; b/=2;
return(a+b);
}
思路引導 VIP
看到本題,首先要辨識出關鍵考點有二:一是「全域變數與區域變數的覆蓋及作用域」,二是「C 語言中函式引數(Arguments)的求值順序(Evaluation Order)」。多數考卷與 C 編譯器實作(cdecl 呼叫慣例)中,printf 的參數是由右至左求值並推入堆疊的。因此,要先執行最右邊的 fun(a),這會改變全域變數 a 的值,接著才會依序提取 b 與 a 的值。必須向閱卷委員說明這個求值順序的概念。
小題 (三)
(10 分)
#include
#include
#define SIZE 10
void fun(int *, int);
int main(void) {
int x[SIZE] = {1,2,3,4,5,6,7,8,9,10};
fun(x, SIZE);
printf("\n");
return 0;
}
void fun(int *a, int size) {
if (size > 0) {
fun(a+3, size-3);
printf("*(a+%d)=%d\n", SIZE-size, *a);
}
}
思路引導 VIP
看到本題,首先辨識出考點為「遞迴函式(Recursion)」與「指標算術(Pointer Arithmetic)」。解題關鍵是畫出遞迴的呼叫堆疊(Call Stack)。要注意 fun 函式中,遞迴呼叫 fun(a+3, size-3) 是發生在 printf 之前,這意味著最深層的呼叫會最先執行印出動作(Head Recursion)。按步驟推演每次傳入的指標位置與 size,即可得出反向印出的結果。