程式推導題

程式語言是計算機概論必備的章節,內容主要會討論到程式語言的發展演進與執行的方式等等。同時,也會談論到關於程式基本的邏輯,例如變數型態、條件判斷、迴圈或是函式等等的語法,不過通常不會談論到太特定的程式語言。一般來說,學校同時間也會開 C/C++ 程式語言或是程式語言實習課,這個才是比較扎實的程式課程。所以單純只看計概課本當中的程式語言章節的話,基本上只有比較概念性的部分。但是以考試來說的話,常常會衍伸出程式推導的這種考法,所謂程式推導指的是給你一段程式碼問你輸出的結果是什麼。

程式推導題型算是計概考試中的大魔王考題之一,很多同學都會在這裡卡關。這類型題目的難度在於,必須對程式運行有高度的掌握,通常需要具備一定的邏輯推理能力及程式實作能力。對於沒有真正寫過程式的同學,其實是蠻抽象的挑戰。不過對於有實作能力的同學,也是另外一種挑戰。通常在程式實作課程當中,很多同學也會採取 try-and-error 手法邊寫邊改,慢慢調整寫法。但是這種考題除了需要會寫程式之外,也考驗在沒有執行環境下的思考能力。

關於程式推導題,近年來有幾個常見而且困難的重點:

  1. 迴圈的執行順序與次數
  2. 函式的作用域與變數傳遞、遞迴
  3. 指標
  4. 物件導向
  5. 位元運算

1. 迴圈的執行順序與次數 ★★★✩✩

第一種考法就是基本的程式邏輯考法,把迴圈跟條件放在一起的應用,常常會跟陣列搭配出題。比較複雜的考法像是多層的 For Loop 或是要留意 While Loop 的終止條件。

台聯大 107

台綜大 106

2. 函式的作用域與變數傳遞、遞迴 ★★★★✩

函式的話要知道定義跟呼叫的執行過程,以及當中的變數轉換。會因為函式內外的執行環境而形成不同則作用域,變數彼此間是有差異的。變數轉換可以分成以下幾種類型:

  • call-by-value
  • call-by-reference
  • call-by-address
  • call-by-value/result
  • call-by-name

台聯大 107

師大 104

3. 指標 ★★★★★

指標應該是整個計概考試中最難的部分之一,只要稍微變化就可以考倒一堆人。首先,要知道基本的定義方式如下:

1
2
3
4
5
int a = 10;

int *ptr;
ptr = &a;
// 也可以直接這樣寫: int *ptr = &a;

當中要熟悉 * 跟 & 兩個運算:

  • * 依址取值運算子,表示後面的變數要存的是一個位置(address)。
  • & 取址運算子,用來取出後面變數的位置。

比較複雜的考法會跟陣列字串一起考、call-by-address,或是多層指標的方式。

台綜大 105

台綜大 107

4. 物件導向 ★★✩✩✩

物件導向也是程式章節常考的題目,不過如果出在程式推導題的話一般比較是考語法(難度普通)。比較難的考法會放在理論或是很細節的語法實作上,例如常見的物件考像特性有什麼以及相關的延伸。

5. 位元運算 ★★★★★

另外一種我覺得很難的考法是位元運算的題目,不過近年比較少看到。位元運算實作上的很重要的技巧,如果學得好的話,可以把程式寫得很漂亮,例如我們常見的變數交換通常會這樣寫:

1
2
3
temp = a
a = b
b = a

但如果你會位元運算的話,你可以這樣寫:

1
2
3
a = a ^ b
b = a ^ b
a = a ^ b

更多的練習題

如果你對於程式推導題有興趣的話,覺得很想拿分的話,這邊有一份 練習題 可以提供練習。不過我自己建議初期還是要先把前面的有讀有分的章節先把握,程式推導如果基本的話基本上大家都會,但是難起來也是沒有盡頭的。

以上都是個人觀點啦,希望可以幫助到不知道怎麼準備的學弟妹們。最後,如果你在計概考試上遇到任何問題,都歡迎在下方留言:)


License


本著作由Chang Wei-Yaun (v123582)製作,
創用CC 姓名標示-相同方式分享 3.0 Unported授權條款釋出。