2013-03-24 7 views
8

Nella mia classe di programmazione, abbiamo test e quiz basati su esempi di codice che dobbiamo esaminare e determinare l'output finale. Di solito sono ingannevoli pezzi di codice e quando realizzo, sono bloccato in qualche funzione casuale e non ho idea di cosa sto facendo.Camminando attraverso il codice C++ su carta, come faresti?

Come si esegue correttamente il codice su carta? Tenere traccia di loop, variabili, funzioni, tutto, mi confonde.

Per esempio, ecco un quiz passato abbiamo avuto, che ho ottenuto al 100% su, ma mi ci sono voluti per sempre ed era molto disordinato:

#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

E 'difficile sapere cosa dire al di là di "leggerlo e capirlo." –

+5

Pratica, pratica, pratica ... – jalf

+1

Prendere appunti, annotare parti di codice direttamente, dividere il codice in parti più piccole, disegnare alberi di chiamata/grafici, disegnare macchine a stati, espandere/comprimere i livelli di alberi di chiamata/livello di grafici in modo da poter vedere cosa rilevante e non può vedere cosa non lo è. Tieni traccia dei tuoi progressi in modo da non cadere in un ciclo infinito te stesso ripetendo lo stesso lavoro più e più volte. :) E sì, pratica, pratica e pratica. –

risposta

0

La pratica è il modo migliore per capire il codice. Quando sto provando a fare esercizi come questo, non sto cercando di capire tutte le funzioni all'inizio. Sto iniziando dal main e mi limito ad andare come debbuger riga per riga guardando tutte le variabili. Se sth ti sta confondendo, scrivi semplicemente tutte le variabili su carta e segna ogni loro cambiamento. Tuttavia non c'è modo di imparare a leggere e capire il codice meglio e più velocemente della formazione.

0

"pensare come un computer"

Si dispone di un programma e di dati il ​​programma sta usando.

Hai bisogno di sapere dove si trova il programma che stai facendo. Questo ha davvero bisogno di essere uno stack poiché quando chiami un metodo devi sapere dove tornare quando termina il metodo.

È necessario tenere traccia di ogni variabile, ovviamente le variabili possono essere locali a una chiamata di metodo, quindi anche queste sono davvero una pila, ed è qui che devi essere veramente attento a fare in modo che tu stia cambiando il giusto istanza di una variabile locale. Le variabili globali sono facili poiché c'è una sola copia, quindi puoi metterle nello stack, ma solo in basso.

Per lavorare su carta, è più semplice posizionare il fondo della pila nella parte superiore della pagina e far crescere lo stack verso il basso. Ricorda che quando un metodo ritorna, le sue variabili locali non esistono più, quindi eliminale o segna la cima dello stack in qualche modo.

Le cose si fanno ancora più divertente se si sta facendo ogni Multi threading ...

Problemi correlati