創作內容

5 GP

(程式語言)基礎理論-2_獨立單元:程式追蹤

作者:藍貓│2013-06-22 22:58:23│巴幣:10│人氣:890
前言

        很多人對程式語言的唯一感想就是,該死!看不懂。

        以前我也是這樣的,當我看到一段程式,看不懂,我唯一的方法就是直接把它背下來,但是這也是很多人學程式一直有障礙的原因,基本上你程式如果用背的,很難有過目不忘的可能,通常時間一久,一定全部忘光光,因為這世上有上百上千種程式,你背不完。

        誠心拜託各位,程式不要背,你要理解

        若是你想要徹底理解程式的邏輯,不要背答案,就像老師教你數學,一定不會是先教你答案而不先教你計算過程。一樣的道理,程式語言說真的也是設計一套可以用的計算過程,只是這個計算過程是電腦幫你運作的計算過程,可是奇怪的是,教程式的人都不喜歡帶學生訓練邏輯,就叫學生背一大堆理論,那個真的沒有用啦,那樣子學,你的程式能力進步會很有限。

        以下這段話是我提醒朋友的一段話……

       程式語言就像數學一樣,想搞懂邏輯怎麼跑,必需理論搭配實作,你沒有實作,我理論講在多,你都還是在背

       程式這種東西不要背,你要去理解

       常常有學生會去問老師這段程式怎麼背,我會在背這個字上打個大叉叉


        程式追蹤,是學程式的人必需先學會的重要技法,我必需這麼說:培養理解程式的直覺,從追蹤開始,可以知道這一章對初學者有多重要。

        千萬記住,所謂的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)寫出每一個區塊執行完的結果。



後記

        程式追蹤是一個非常重要的基礎技巧,後續我們提到迴圈的時後,會提到迴圈的運作原理,若是熟悉程式追蹤的話,會很容易理解迴圈的邏輯。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2055995
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 4 篇留言

煙餘
看不懂。

06-22 22:59

藍貓
其實照理說,我應該直接弄個動畫比較能理解,不過考量到自己沒辦法擺心力在這,只好用圖解了= =06-22 23:22
叛逆曹長 il capitano
辛苦囉

06-22 23:08

藍貓
我只是希望看我文的人能真有所成長,每篇文,都是用這樣的心態去面對的,真的沒什麼事是比這種事值得辛苦的XD06-23 01:19
尼太
真的 我程式整個不行[e13]

06-22 23:15

藍貓
其實照理說,我應該直接弄個動畫比較能理解,不過考量到自己沒辦法擺心力在這,只好用圖解了= =06-22 23:22
黎明卿
我剛開始學C++

結果你這串我還是看不太懂,我要多去充實自己[e16]

06-23 11:04

藍貓
C++中的貫用語法和指令少數地方和C語言不同,但是基本的邏輯規則大致上是一樣的,所以學C++最多就是注意語法和指令的不同,原理都大同小異。06-23 21:22
我要留言提醒:您尚未登入,請先登入再留言

5喜歡★ertyk122 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:歷史的淚痕,三強爭霸1... 後一篇:<橫血英雄>...

追蹤私訊切換新版閱覽

作品資料夾

小說連載 (0)
英雄聯盟小說(英雄聯盟系列) (19)
[外傳]昏黃歲月(英雄聯盟系列) (1)
阿宅與美女代打(英雄聯盟系列) (0)
[寫實小說]_糾心恥笑園 (0)
[寫實小說]_倒數末日 (0)
[寫實小說]_憂鬱天堂 (2)
[寫實小說]_網路殺人魔 (0)
[寫實小說]_錢魔 (0)
[神幻小說]_犬族的命運 (58)
[神幻小說]_捨不得你。妄想 (0)
國中生小說 (3)

漫畫連載 (0)
[搞笑四格]_場外舉人 (0)
[少年漫畫]_台北大地震 (0)
[少年漫畫]_就是愛運動 (0)
[少年漫畫]_餵愛一口香 (0)
[寫實漫畫]_白狼 (0)
[寫實漫畫]_天刑三二三 (0)
[寫實漫畫]_橫血英雄 (0)
[寫實漫畫]_恐龍妹 (0)
[神幻漫畫]_剩水童子 (0)
[神幻漫畫]_永遠的父女 (0)
[神幻漫畫]_勇者我家人 (0)
[其它]_音魂 (1)

劇本創作 (0)
[寫實劇本]_白狼 (1)
[寫實劇本]_天刑三二三 (0)
[神幻劇本]_繪魔 (0)
[神幻劇本]_魔曲 (0)

電腦理論 (6)
程式設計相關理論 (14)
高階程式語言理論 (6)
實作程式 (15)
程序之相關問題 (0)
硬體管理與計算機結構 (3)

創作理論 (3)
文學理論 (3)
文學實作要領 (0)
繪畫理論 (1)

生活日記 (241)
自我提醒 (5)

文創作品 (2)
散文與詩 (25)
故事大綱 (1)
繪圖 (57)
processing文創應用 (0)
勇造創作 (3)

數學領域相關證明 (0)

英雄聯盟豪洨文 (3)

辯論大會 (0)

未分類 (22)

xch53172大家
仙劍和軒轅劍要被大宇賣掉了🥲看更多我要大聲說昨天19:22


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】