很多人對程式語言的唯一感想就是,該死!看不懂。
以前我也是這樣的,當我看到一段程式,看不懂,我唯一的方法就是直接把它背下來,但是這也是很多人學程式一直有障礙的原因,基本上你程式如果用背的,很難有過目不忘的可能,通常時間一久,一定全部忘光光,因為這世上有上百上千種程式,你背不完。
誠心拜託各位,程式不要背,你要「理解」。
若是你想要徹底理解程式的邏輯,不要背答案,就像老師教你數學,一定不會是先教你答案而不先教你計算過程。一樣的道理,程式語言說真的也是設計一套可以用的計算過程,只是這個計算過程是電腦幫你運作的計算過程,可是奇怪的是,教程式的人都不喜歡帶學生訓練邏輯,就叫學生背一大堆理論,那個真的沒有用啦,那樣子學,你的程式能力進步會很有限。
以下這段話是我提醒朋友的一段話……
程式語言就像數學一樣,想搞懂邏輯怎麼跑,必需理論搭配實作,你沒有實作,我理論講在多,你都還是在背
程式這種東西不要背,你要去理解
常常有學生會去問老師這段程式怎麼背,我會在背這個字上打個大叉叉
程式追蹤,是學程式的人必需先學會的重要技法,我必需這麼說:培養理解程式的直覺,從追蹤開始,可以知道這一章對初學者有多重要。
千萬記住,所謂的TRACE,就是希望你先用紙筆跑程式邏輯,不要依賴電腦執行,紙筆訓練的好處是,看的到完整的過程,而且自己運作過這個過程,會比較能理解和吸收進去。
學習是一個滾雪球的東西,當你有了基礎,怕是你哪天突然開竅,成為高手,也是有可能的,了解這樣一層概念之後,我們就來開始學習這個重要的基礎吧。
程式追蹤的方式
程式追蹤其實並沒有固定的方式,嚴格講起來,你能用哪種方式去表示都可以,只要你能明確找出程式的邏輯運作便可,以追蹤者自己喜歡的方法去挑選適合的追蹤方式。
追蹤方式一
每一行、每一個輪迴都列,每一個變數跟條件式都要列出來,好處就是相當明確,壞處就是龐雜又麻煩。
int a,b,c,t;
scanf( a,b,c );
if( a<b )
{t = a;a = b;b = t;}
if( a<c )
{t = a;a = c;c = t;}
if( b<c )
{t = b;b = c;c = t;}
比方說上面這段程式段,輸入a,b,c三數,由大到小排列,看完程式,在未知其演算法的情況,我們來跑一下程式,方式一去追蹤會得出怎樣的結果呢?(熟練程式的人可以直接跳方式三)
步驟
(1)、將分號當成行的結尾,為了方便閱讀,也將結構: ”{“ 和 ”}” 單獨看成一行,並替程式標上行號,轉變為以下形式,每碰到一個決策點,空一行,隔出一個區塊。
1 int a,b,c,t;
2 scanf( a,b,c );
3 if ( a<b )
4 {
5 t = a;
6 a = b;
7 b = t;
8 }
9 if ( a<c )
10 {
11 t = a;
12 a = c;
13 c = t;
14 }
15 if ( b<c )
16 {
17 t = b;
18 b = c;
19 c = t;
20 }
(2)、製作一張表格,並在首列提列出所有變數跟條件式,把所有變數或條件式不可能執行的行忽略掉(忽略用”-“,空一行的部份可以用”=============分隔”,以區別執行區塊)。
(3)、寫出每一個區塊執行完的結果。
追蹤方式二
每一行、每一個輪迴都列,但是條件式的執行結果不列,由於少了條件式的羅列,閱讀上不會太繁瑣,但要小心判斷決策的時後出錯,執行到不該被執行的區塊。
步驟
(1)、將分號當成行的結尾,為了方便閱讀,也將結構: ”{“ 和 ”}” 單獨看成一行,並替程式標上行號,轉變為以下形式,每碰到一個決策點,空一行,隔出一個區塊。
1 int a,b,c,t;
2 scanf( a,b,c );
3 if ( a<b )
4 {
5 t = a;
6 a = b;
7 b = t;
8 }
9 if ( a<c )
10 {
11 t = a;
12 a = c;
13 c = t;
14 }
15 if ( b<c )
16 {
17 t = b;
18 b = c;
19 c = t;
20 }
(2)、製作一張表格,並在首列提列出所有變數,把所有變數不可能執行的行忽略掉(忽略用”-“,空一行的部份可以用”=============分隔”,以區別執行區塊)。
(3)、寫出每一個區塊執行完的結果。
追蹤方式三
每一個輪迴要列,但是只要列出最後一行顯示執行完一輪的結果即可,閱讀上最容易,但要小心判斷決策的時後出錯,執行到不該被執行的區塊,也要小心變數更動順序上可能會混亂。
步驟
(1)、將分號當成行的結尾,為了方便閱讀,也將結構: ”{“ 和 ”}” 單獨看成一行,並替程式標上行號,轉變為以下形式,每碰到一個決策點,空一行,隔出一個區塊。
1 int a,b,c,t;
2 scanf( a,b,c );
3 if ( a<b )
4 {
5 t = a;
6 a = b;
7 b = t;
8 }
9 if ( a<c )
10 {
11 t = a;
12 a = c;
13 c = t;
14 }
15 if ( b<c )
16 {
17 t = b;
18 b = c;
19 c = t;
20 }
(2)、製作一張表格,並在首列提列出所有變數,把所有變數不可能執行的某一輪忽略掉(忽略用”-“,空一行的部份可以用”=============分隔”,以區別執行區塊)。
(3)、寫出每一個區塊執行完的結果。
後記
程式追蹤是一個非常重要的基礎技巧,後續我們提到迴圈的時後,會提到迴圈的運作原理,若是熟悉程式追蹤的話,會很容易理解迴圈的邏輯。