給完全不知道什麼是程式的同學

程式

程式是由一連串指令所構成, 可以用來控制電腦做某些運算、 或是某些動作。 這些指令必須遵循某種格式, 或是在某一有限集合中取用詞彙, 這些格式詞彙、 及它們所代表的動作就是所謂的程式語言

注意:

大家平常可以聽到許多程式語言的名稱,例如:

組合語言(Assembly) push ebp mov ebp, esp sub esp, 8 mov DWORD PTR _this$[ebp], ecx
QuickBASIC DIM intlist(99) result = 0 sum = 0 INPUT listlen IF listlen > 0 AND listlen < 100 THEN FOR counter = 1 TO listlen INPUT intlist(counter) sum = sum + intlist(counter) NEXT counter average = sum / listlen FOR counter = 1 TO listlen IF intlist(counter) > average THEN result = result + 1 NEXT counter PRINT "The number of values that are > average is:"; result ELSE PRINT "Error-input list length is not legal" ENDIF END
FORTRAN    FUNF(T) = SQRTF(ABSF(T)) + 5.0 * T**3    DIMENSION A(11) 1   FORMAT(6F12.4)    READ 1,A    DO 10 J=1,11    I = 11-J    Y = FUNF(A(I+1))    IF (400.0-Y) 4,8,8 4   PRINT 5,I 5   FORMAT(I10,10H TOO LARGE)    GOTO 10 8   PRINT 9, I, Y 9   FORMAT(I10, F12.7) 10  CONTINUE    STOP
C #include <stdio.h> void main() { int i, sum=0; for (i=0; i<10; i++) sum += i; printf("sum is %d\n",sum); }
PASCAL procedure settabs(var tabstops: tabtype); const TABSPACE = 4; var i: integer; begin for i := 1 to MAXLINE do tabstops[i] := (i mode TABSPACE = 1) end;
LISP (times (plus 8 3) (plus 4 (times 9 2)))
PROLOG append([], X, X). append([A|B], C, [A|D]) :- append(B,C,D). printstring([]). printstring([H|T]) :- put(H), printstring(T).

學習方法

學習程式語言和學習語言有一些基本共通的地方

  1. 當你學到一句英文 "How is it going?" 時你會問兩個層次的問題

    1. 這代表什麼意思?

    2. 為什麼這樣子用? 可不可以用 "How it is going?" 或是 "How are you?" 或是 ...?

    理想上若是所有第一層的問題都得到解答而且你能熟記的話, 你已經可以使用這個語言了, 但是實際上因為語彙可以有數不盡的組合, 要一一熟記所有可能的用法太過困難, 因此你會藉由第二層問題的解答---"語法" 來輔助你正確地記憶和使用這個語言。 但是你千萬不要雞蛋裡挑骨頭問第三類的問題: 像是為什麼在英文裡 dog 指狗? 為什麼不是 cat 或是 odg ... 為什麼 head 不是腳或是手呢? 英文裡為什麼不說 Bonjure 來問好呢? 這些也許都有答案, 但是和你學習如何使用英文這個語言沒有直接的關係。

  2. 在你學習寫程式時最重要的就是第一層的問題, 也就是你寫的語言例如:"x = 10;" 到底讓電腦幫你做了什麼事, 其次是第二層的問題, 例如: "x = 5;" "y = 100;" "z = 10 + 15;" "r = s + 100;" 通通都用了一樣的 "=" 的語法, 等號的左邊用一個變數、 右邊用一個計算式, 如果你倒過來就一定不對了, 例如:"20 = x + 10;", 至於第三層的問題, 例如:在 C 語言中為什麼用 printf 在螢幕上輸出文字訊息而不像 PASCAL 一樣用 write? 這種問題在開始學習程式設計的時候就省下別問了。

  3. 在自然語言中第三層的問題常常是無解的, 也許只是約定俗成而已, 在電腦語言中則通常是定義了一組有限的語彙以及語法, 僅由此組語彙及語法中取用便足以操作此電腦了, 因此便使用此組語彙及語法。 至於為什麼要遵循某一種特定的語法呢? 你可以想成是限制這組語彙排列的方式, 因為假設我們有十個語彙可用, 那麼使用這些語彙可以構成 3 的 10 次方種長度為 3 的語句, 4 的 10 次方種長度為 4 的語句... 這些數字的大小都很可怕, 我們要操作的電腦沒有那麼複雜, 不需要用那麼多種的命令來控制它。

  4. 學寫程式時你必須要不斷地做邏輯性的思考、判斷、與驗證, 不能夠完全靠直覺, 比方說你今天去逛街, 有一點點的迷路, 你也許會 "覺得" 向左轉比較像是正確的路, 你就隨便猜看看, 走走看, 繼續走下去也許對也許不對, 在這個過程裡我們需要注意幾點, 你才能夠慢慢地累積經驗: 一、每當你 "覺得" 怎樣時, 你必須有明確的原因, 比方說你可能覺得左轉後有一家你看到過的商店, 二、做任何嘗試後你需要去驗證, 比方說你左轉後可以盡快找個人問一下路, 確定一下, 任何時間你不能允許有很多的不確定性同時存在, 否則你要順利完成一個程式所需要的功夫就會比人家大, 三、雖然你在很多地方都會做判斷、下決定, 也可能驗證出來你所作的決定是對的, 你還是需要稍微想一下其它的選擇, 例如你也許稍微想一下如果你右轉的話你會走到什麼地方去? 有了這樣的心態和學習精神, 相信你會很快學會撰寫程式的。

    你可以用一種假設和驗證的心態來學習寫程式, 假設你寫一個/一段程式敘述, 例如: y = 14; x = sqrt(y+5*7);, 你應該要去假設說變數 y 的內容在 CPU 執行完上面的敘述後應該要是 14, 敘述 5 * 7 應該比 y + 要先做完, 得到 35 再加上 y 的內容, 得到 49, 然後做 sqrt(49) 的動作會得到 7, 最後在變數 x 內會是 7, 這一串的動作你也可以去設計一些程式去驗證, 例如:可以加上 print("y=%d", y); 去印出變數 y 的內容, 可以加上 print("y+5*7=%d", y+5*7); 來看看是不是 49, 一件一件事情慢慢地驗證清楚以後你就會有本領去組合各種的敘述。

學習目標

由上面討論大家要知道你學習時 第一重要的是暸解每一敘述讓電腦替你做了什麼事, 如此你才能夠自由地組合這些命令, 讓電腦乖乖地完成你要它做的事。

程式設計課程 首頁
by Pei-yih Ting
E-mail: pyting@cs.ntou.edu.tw