資訊處理 98 年程式語言考古題
題目為考試當年公告版本,實務標準請以現行規範為準。
請回答下列的問題: ㈠解釋什麼是強勢型態程式語言(strongly-typed programming language)和弱勢 型態程式語言(weakly-typed programming language)。(10 分) ㈡列舉三個理由並舉例說明為何C 程式語言不是一個強勢型態程式語言。(10 分)
假設一個整數佔用四個位元組(4 bytes),考慮一個C 程式語言的整數陣列(integer array)int A[4][8][16],此陣列的起始位址(starting address)為0X22F760,以十六 進位(hexadecimal)寫出下列四個printf 敘述句(statements)的輸出值(請寫出計 算過程):(每小題5 分共20 分) ㈠printf("%X\n", &A[0][1][2]); ㈡printf("%X\n", &A[0][1][2]+1); ㈢printf("%X\n", &A[0][1]+2); ㈣printf("%X\n", &A[0]+3);
下圖是一個執行時堆疊(run-time stack)中之啟動紀錄(activation record)的示意圖: Returned value Local variables Function parameters Dynamic link Static link Return address ㈠說明如何使用啟動紀錄中的function parameters 實作下列兩種副程式的參數傳遞 (parameter passing)方法:call-by-value(或稱pass-by-value)和call-by-address (或稱pass-by-address, call-by-reference)。(10 分) ㈡考慮下列的C 程式語言的程式片段,說明當主程式main 呼叫副程式foo 之後, 副程式foo 的啟動紀錄之function parameters 內容為何?並寫出主程式main 的輸 出值。(10 分) int c=5; void foo(int x, int* y) { int a=1, b=2; *y = a + b * x ; c = a + b + c; } int main (void) { int a=10, b=20; foo(b, &a); printf("%d, %d, %d\n", a, b, c); } 98 年公務人員高等考試三級考試試題 類 科: 資訊處理
考慮下列的BNF 法則: 〈conditional statement〉 ::= if 〈condition〉 then 〈statement〉 | if 〈condition〉 then 〈statement〉 else 〈statement〉 〈statement〉 ::= 〈assignment statement〉 | 〈conditional statement〉 ㈠假設C1 和C2 是由〈condition〉展開的程式碼,S1 和S2 是由〈statement〉展開 的程式碼,畫出〈conditional statement〉: if C1 then if C2 then S1 else S2 的語法樹(或稱剖析樹,parse tree),並解釋何謂「搖擺else 問題」(dangling else problem)。(10 分) ㈡舉出兩個方法,解釋程式語言如何在設計、實作、或使用時解決「搖擺else 問 題」。(10 分)
考慮C 程式語言的位元運算(bitwise operation),變數m 和陣列(array)n 的宣告 如下: unsigned int m; unsigned char n[4]; 假設m 的二進位值(binary value)為: b32b31b30b29b28b27b26b25b24b23b22b21b20b19b18b17b16b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1 寫一個C 語言的程式將陣列n 的元素(element)設定為: n[0]: b31b32b29b30b27b28b25b26 n[1]: b23b24b21b22b19b20b17b18 n[2]: b15b16b13b14b11b12b9b10 n[3]: b7b8b5b6b3b4b1b2 即是將m 的二進位值,以每兩個位元一組,作位元調換(bit swap),再切割成四個 位元組。除了迴圈控制變數(loop control variable)外,程式中不可使用+, -, *, /, %的 算術運算(arithmetic operations)(可以宣告和使用其他變數)。(20 分)