2013-03-24 28 views
8

在我的編程課上,我們有基於代碼示例的測試和測驗,我們必須經過並確定最終輸出。通常他們是棘手的代碼片段,當我意識到時,我被困在一些隨機函數中,不知道我在做什麼。在紙上走過C++代碼,你會怎麼做?

如何正確運行紙上的代碼?跟蹤循環,變量,函數,一切,這讓我感到困惑。

例如,下面是過去測驗,我們有,我就得到了100%,但我花了永遠,是非常混亂:

#include <iostream> 
#include <cstring> 
using namespace std; 

class foo { 
    char word[20]; 
    int qty; 

public: 
    foo() { set(3, 5); } 

    foo(int m, const char * s) { set(m, m+1); 
            strcpy(word, s);  } 

    foo( const foo& a) { cout << "... hahaha.1" << endl; 
       qty = 3 + a.qty; 
       strcpy(word, a.word); 
       strcat(word, ".5.6.7"); 
       cout << "... hahah.2" << endl; } 

    ~foo() { cout << qty << "," << word << "!!!" << endl; } 

    void set(int a, int b){ qty = a + b; 
          strcpy(word, "summer"); } 
    void wow(); 

    void output(){ cout << word << "," << qty << endl; } 
}; 

void hello(foo&); 
void greet(foo); 

int main() { 

    foo x, y(100, "QUIZ"); 

    greet(y); 
    cout << "a.b.c.d.e." << endl; 

    hello(x); 
    x.output(); 
    y.output(); 

    cout << "...the end" << endl; 
    return 0; 
} 

void foo::wow() { strcat(word,".1.2.3"); 
        qty += 4;  } 

void greet(foo g) { cout << "...HI.1\n"; 
         g.wow(); 
         g.output(); 
         cout << "...HI.2\n"; } 


void hello(foo & h) { cout << "...hello.1" << endl; 
       foo e; 

       e = h; 
       h.wow(); 
       h.output(); 
       e.output(); 
       cout << "...hello.2\n"; } 
+8

很難知道該說什麼超越「讀它,理解它。」 – 2013-03-24 23:20:21

+5

練習,練習,練習... – jalf 2013-03-24 23:20:30

+1

做筆記,直接對部分代碼進行註釋,將代碼拆分成小塊,繪製調用樹/圖,繪製狀態機,展開/摺疊調用樹/圖的細節級別,以便您可以看到相關,不能看到什麼不是。跟蹤你的進度,這樣你就不會陷入無止境的循環,自己一遍又一遍地重複同樣的工作。 :)是的,練習,練習和練習。 – 2013-03-24 23:24:37

回答

0

實踐是理解的代碼的最佳方式。當我試圖做這樣的運動時,我並不想在開始時理解所有的功能。我從主線開始,像debbuger一樣逐線觀看所有變量。如果某事讓你感到困惑,只需將所有變量寫在紙上,並標出它們的每一個變化。但是,沒有辦法比培訓更好,更快地學習閱讀和理解代碼。

0

「想像一臺電腦」

你有一個程序和程序正在使用的數據。

你需要知道程序中你在哪裏。這真的需要一個堆棧,因爲當你調用一個方法時,你必須知道該方法何時結束。

您需要跟蹤每個變量 - 當然,變量可以是方法調用的本地方法,所以這些也是一個堆棧,這就是您必須非常小心以確保您正在更改權限的地方局部變量的實例。 全局變量非常簡單,因爲只有一個副本,所以您可以將它們放入堆棧中,但只放在底部。

要在紙上工作,最簡單的方法是將堆棧底部放在頁面頂部,然後向下堆疊堆棧。請記住,當方法返回時,它的局部變量不再存在,因此將它們擦掉或以某種方式標記棧頂。

事情變得更有趣,如果你做任何多線程...