8

在我的编程课上,我们有基于代码示例的测试和测验,我们必须通过这些示例并确定最终输出。通常它们是一些棘手的代码,当我意识到时,我被困在一些随机函数中,不知道我在做什么。

你如何正确地运行纸上的代码?跟踪循环、变量、函数,一切都让我感到困惑。

例如,这是我们过去的一个测验,我得到了 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"; }
4

2 回答 2

0

实践是理解代码的最佳方式。当我尝试进行这样的锻炼时,我并不是一开始就试图了解所有功能。我从 main 开始,就像调试器一样逐行观察所有变量。如果某事让您感到困惑,只需将所有变量写在纸上并标记它们的每一个变化。但是,没有任何方法可以比培训更好更快地学习阅读和理解代码。

于 2013-03-24T23:25:50.170 回答
0

“像电脑一样思考”

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

你需要知道你在程序中的位置。这确实需要一个堆栈,因为当您调用方法时,您必须知道方法结束时返回到哪里。

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

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

如果您正在执行任何多线程,事情会变得更加有趣......

于 2013-03-24T23:31:54.783 回答