2009-03-22 9 views
19

Per quelli di voi con esperienza di sviluppo del curriculum: qual è la migliore strategia per quanto riguarda gli array?Quando si insegna a C, è meglio insegnare gli array prima o dopo i puntatori?

Ho visto alcune scuole che insegnano gli array dopo variabili e strutture di controllo, spesso prima persino delle funzioni di insegnamento. Ciò consente di insegnare alcuni algoritmi rudimentali, ecc. Tuttavia, porta quindi il problema di come passare gli array alle funzioni, quindi è necessario tornare agli array che vengono insegnati ai puntatori e correggere le cose.

Un'altra opzione è quella di passare da variabili e strutture di controllo a funzioni, quindi di insegnare ai puntatori e, una volta definiti i puntatori, insegnare gli array da zero e utilizzarli per ottenere l'allocazione dinamica della memoria.

Per me la seconda opzione ha più senso, perché a differenza delle variabili semplici, con gli array è facile "andare fuori limite", ma gli studenti che non hanno ancora imparato a memoria e puntatori potrebbero non capire cosa esula da questi limiti .

Tuttavia, sono interessato a sapere cosa pensano gli altri.

risposta

34

Penso che l'approccio migliore sia quello di introdurre 1 concetto alla volta. Non è necessario spiegare al 100% gli array nel primo modulo. Puoi districare qualsiasi cosa introducendo 1 concetto alla volta.

Insegnerei loro in questo ordine: matrici, puntatori, matrici + puntatori, OtherStuff [N].


Array:

si può insegnare array semplici prima in modo da comprendere la possibilità di avere più slot di dati accessibili da un unico nome di variabile.

//The following doesn't need an understanding of pointers 
int x[10]; 
x[0] = 5; 

Puntatori:

Poi si può insegnare su puntatori e come funzionano, a partire da alcuni semplici esempi:

int y = 5; 
int *p = &y; 
*p = 6; 
printf("%i\n", y); 

Assicurarsi di dare un accento particolare che un puntatore è come qualsiasi altra variabile. Memorizza un indirizzo di memoria.

Non c'è ancora bisogno di entrare nello stack o nell'heap.


Array + Puntatori:

Come iterare su array con i puntatori:

int x[10]; 
x[0] = 5; 
x[1] = 6; 
int *y = x; 
printf("%i\n", *y);//prints the first element 
y++; 
printf("%i\n", *y);//prints the second element 

Poi si può insegnare le cose più complicate ...

  • Come eseguire l'aritmetica del puntatore.
  • Array + i scorciatoia per array [i]
  • Passing arrays to functions as array pointets vs pointer param + size param
  • come gli array siano blocchi continui di memoria
  • Spiegazione stringhe, tamponi, ...
  • Come sizeof funziona con i puntatori vs tipi array (dimensione del puntatore vs dimensione del buffer)
  • spiegare concetti più complicati come la memoria allocazione, the stack, and the heap
  • più livelli di riferimento indiretto
  • R IFERIMENTI
  • Come array multidimensionali lavorano
  • ...

In tutti gli esempi fanno largo uso di indirizzi sizeof e stampa. Aiuta davvero a capire cosa sta succedendo.

+2

Per argomenti avanzati, gli array multidimensionali possono essere utili. I compromessi sulla rappresentazione di una struttura 2D come "int ** arr" con indicizzazione 2D esplicita o "int * arr" con l'indicizzazione manuale possono essere utili quando gli studenti sono pronti. –

+0

Heh, questo è il modo in cui mi è stato insegnato. Ha funzionato bene. –

+0

@Mr Fooz: Grazie aggiunto –

2

Devono essere insegnati allo stesso tempo.

L'esempio di una matrice monodimensionale a cui si accede come puntatore alla base con offset (tipo * indice) dovrebbe fare un'apparizione.

cioè

a[i] is equivalent to *(a + i) 
+0

Questo è un noop, a meno che la memoria non sia volatile o in attesa di condizioni di gara. =] – strager

+0

@strager: ti interessa spiegare? –

+0

@ Mitch, hai scritto un compito. Forse intendi ==. –

9

vorrei insegnare puntatori prima. Possono essere spiegati senza matrici di insegnamento. Mentre insegnavo agli array, potevo fare riferimento ai puntatori quando spiegavo l'espressione a[i] e quando spiegavo come passarli alle funzioni.

8

Non pensare troppo alle cose.

Insegnare questi concetti nel modo più chiaro e accattivante possibile, è molto più importante di quello che ordine li fa in.

Vorrei suggerire toccando sulle basi di array primi, e facendo puntatori e rivisitando gli array (più pienamente questo tempo intorno) più tardi.

0

Dipende da ciò che sanno. Stai insegnando C, o programmazione-e-C?

Ho visto molto poco successo con quest'ultimo. C non è semplicemente una lingua molto intuitiva o tollerante. Non ho visto gli studenti ringraziare per aver iniziato, anche se ho visto gli studenti frustrati dalla programmazione per questo.

Quelli che si apprestano a programmare usciranno e impareranno C nel loro tempo libero, comunque. Non c'è bisogno di spingerlo su di loro prima.

Se si sta solo insegnando C, e sanno già i puntatori e gli array, quindi insegnare come funzionano i puntatori e gli array in C può essere fatto in una lezione.

8

Si dovrebbe insegnare prima gli array, perché esistono in quasi tutte le altre lingue e sono più facili da capire. I puntatori o alcuni aspetti dei puntatori si basano su quanto appreso sugli array. Questo è l'ordine organico, imho, e come ho imparato quando.

2

Suppongo che tu stia insegnando C a studenti che già sanno programmare in un'altra lingua come Java (o ai miei tempi, Pascal). Non penso che C sia un buon linguaggio da usare per insegnare la programmazione per completare i novizi.

Vorrei insegnare prima i puntatori. Questa è una delle nuove idee importanti che verranno apprese in C. Conosceranno già il concetto di array da altre lingue, quindi non è urgente insegnare questo prima. Quindi, quando si coprono gli array in C, si può parlare di come sono essenzialmente zucchero sintattico per l'aritmetica dei puntatori, un concetto con cui ora hanno familiarità.

+0

Sembra che tu stia insinuando che Pascal non ha puntatori. Non ho lavorato con Pascal per molti anni, ma ai miei tempi Pascal aveva dei suggerimenti. L'ho saputo prima lì, dato che non sono arrivato a C per un altro paio d'anni. – GreenMatt

2

Io insegno i puntatori prima che mi preoccupi degli array. Tuttavia, in genere, gli studenti che vedo sono già stati esposti agli array nella loro prima classe CS in un'altra lingua. Tuttavia, anche io stavo insegnando C nella prima classe CS, farei puntatori prima degli array e descrivo gli array in termini di puntatori. Proprio perché è di moda pensare che "nessuno avrà mai bisogno o voglia sapere come funzionano realmente i computer" non significa che sia vero.

1

Come detto sopra, non penso che l'ordine sia importante, ma questo è l'ordine che avrei voluto che qualcuno mi avesse mostrato le cose.

  1. Array
  2. Puntatori
  3. Come vettori e puntatori sono gli stessi
  4. Perché vettori e puntatori NON sono la stessa

Per maggiori informazioni sul punto 4 Consiglio vivamente il capitolo 4 "La verità scioccante: i mazzi C e i puntatori non sono la stessa cosa!" in "Esperto C, profondi segreti di C".

/Johan


Aggiornamento:

Alcuni link al libro, e c'è anche l'anteprima del libro. http://books.google.se - Expert C, deep C secrets

E i commenti degli utenti di questo libro è vero: http://www.amazon.co.uk/Expert-Programming-Peter-van-Linden/dp/0131774298

+0

Non ho familiarità con quel libro. Quali sono le principali differenze che evidenzia? (Ho un tempo molto limitato per investire su questo, ma mi piacerebbe dimostrare un argomento convincente) – Uri

+0

Non c'è magia in questo libro, ma è stato un libro che mi ha regalato uno di quei momenti di "apertura degli occhi". Il libro passa attraverso array e puntatori in un altro modo. – Johan

0

Volete insegnare puntatori prima di stringhe?

Probabilmente no. E la maggior parte degli stessi argomenti si applica.

(Ma in generale sono d'accordo con @legion — non overthink esso.)

1

se sono stati esposti a Assembler anticipo, insegnare puntatori prima.

Se sono stati esposti a linguaggi di livello superiore (vale a dire qualsiasi cosa), insegnano prima gli array.

Nella mia esperienza, le persone che vengono in C senza alcuna esposizione alla programmazione a livello di assembly (registri, indirizzi, "fondamentali del computer") stanno per entrare in un mondo di dolore. IMHO in effetti stai meglio insegnando la codifica a livello di assieme, quindi introducendo C come un assemblatore migliore.

+0

Sì, questo sta dicendo in modo più sintetico cosa stavo pensando. –

0

Penso che sarebbe meglio iniziare con gli array, perché il concetto di array è semplice e intuitivo, ma in C sarebbe importante rivisitare gli array dopo aver insegnato ai ponters, come suggerito in precedenza da "Legion".

0

Questa domanda può essere posta per qualsiasi linguaggio orientato agli oggetti.

Quando mi è stato insegnato Java, per prima cosa sono stati mostrati gli array e gli indicatori, come l'ultima parte degli array, per dimostrare la differenza tra una copia profonda e una copia poco profonda.

1

Interessante domanda - Spero che non sia troppo tardi per rispondere.

Quando insegnavo programmazione al Boston College nei primi anni '80, i miei colleghi e io abbiamo lottato con questi problemi ogni anno, e abbiamo continuato a modificare il nostro approccio. Allora C era una nuova lingua, quindi il nostro progresso passò da Basic a Pascal. Ricordo che al tempo pensavo quanto sarebbe stato difficile insegnare a C solo perché era più sciolto, c'erano più modi per gli studenti di rovinare e più davvero confondere le cose come la distinzione tra array e puntatori che dovevi insegnare .

Quello che ho trovato più utile era cercare di essere concreti, non astratti. Ad esempio, nel corso di programmazione intro ho usato un interprete per un semplice computer decimale che avresti programmato nel suo decimale "linguaggio macchina". Aveva indirizzi che vanno da 0 a 999 e opcode come 1234, con "1" che significa "aggiungi all'accumulatore" e "234" è l'indirizzo di dove trovare il numero da aggiungere. Gli studenti scriverebbero programmi davvero semplici, come aggiungere una lista di numeri, e farebbero un passo singolo, osservando cosa succede ad ogni passaggio.

Vorrei farli giocare con questo per circa 3 settimane, e quindi iniziare in BASIC. Nel secondo corso, sarebbero entrati in Pascal. Ciò che quel piccolo "computer" decimale compiuto è stato quello di trasmettere alcuni concetti concreti che fanno i "astrazioni" in lingue "reali" molto più facile da capire, come ad esempio:

  • Che memoria è, e ciò che gli indirizzi sono, e in che modo sia i dati che i programmi sono solo numeri agli indirizzi in memoria. Ciò rende il concetto di "variabile" e "matrice" e "puntatore" molto più semplice da spiegare in seguito.
  • Come il modello di base del calcolo è che i passaggi molto semplici sono eseguiti in sequenza, e prima che ogni passaggio possa iniziare, quello precedente deve finire. So che la gente obietterà che i computer sono altamente parallelizzati e pipeline al giorno d'oggi, ma devo spiegare che è necessario iniziare in modo molto semplice, perché quando i principianti vedono un programma girare, cerca tutto il mondo come fa tutto in una volta e legge la tua mente nel processo.
  • Come, combinando un vocabolario molto piccolo di istruzioni, inclusi salti e salti condizionati, è possibile far sì che il computer esegua quasi tutto ciò che si desidera.

Ora, per quanto riguarda C, l'ho sentito denigrato come un semplice taglio sopra il linguaggio assembly, ma penso che sia una buona cosa. Mi ha sempre colpito come lingua da esperti per esperti. Penso che le idee di matrici e indicatori e strutture siano molto facili da spiegare se puoi semplicemente fare riferimento alla macchina sottostante. Allo stesso modo per C++ e programmazione orientata agli oggetti.

Quindi, per riassumere, se gli studenti comprendono il concetto di base su come funzionano i computer, anche se si tratta di un computer veramente artificiale, spiegare i concetti della struttura dei dati di livello superiore è molto più semplice.

Problemi correlati