2013-03-24 25 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

“想像一台电脑”

你有一个程序和程序正在使用的数据。

你需要知道程序中你在哪里。这真的需要一个堆栈,因为当你调用一个方法时,你必须知道该方法何时结束。

您需要跟踪每个变量 - 当然,变量可以是方法调用的本地方法,所以这些也是一个堆栈,这就是您必须非常小心以确保您正在更改权限的地方局部变量的实例。 全局变量非常简单,因为只有一个副本,所以您可以将它们放入堆栈中,但只放在底部。

要在纸上工作,最简单的方法是将堆栈底部放在页面顶部,然后向下堆叠堆栈。请记住,当方法返回时,它的局部变量不再存在,因此将它们擦掉或以某种方式标记栈顶。

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