Insegnare il C ++ agli studenti delle scuole superiori per la prima volta: dove tracciare la linea?


35

Farò da mentore a un team di studenti delle scuole superiori per il PRIMO concorso di robotica, la maggior parte dei team qui sviluppa [il loro software robotico usando il C ++. Per molti degli studenti del team questa sarà la loro prima introduzione alla programmazione. Non avrei scelto il C ++ per insegnare la programmazione ai liceali (es. Python o Javascript sarebbe stato più facile credo), ma la scelta è impostata.

Voglio insegnare loro il C ++ corretto (cioè evitare un dialetto C / C ++ misto, cioè C +) ma non voglio spaventarli nemmeno con inutili complessità. Per questo motivo:

  • Dovrei iniziare a utilizzare STL dal primo giorno, esp. vectoro semplicemente attenersi alle matrici standard? Le matrici sono più facili da introdurre ma gli errori del puntatore potrebbero essere più difficili da rilevare.
  • Per l'I / O, dovrei attenermi a cout, ecc. O pensi che printfsarebbe più facile da imparare?
  • Ci sono risorse online per C ++ che sono adatte da usare per questi giovani studenti?

Grazie!

EDIT : Grazie per tante risposte eccellenti. Oltre a C ++ accelerato , suggerito da molte persone, ho scoperto che C ++ per tutti è un testo eccellente.


52
Oh dio, per favore, non insegnare a nessuno javascript come prima lingua!
SoapBox,

26
@SoapBox: al contrario di cosa? Penso che Javascript sia eccezionale come prima lingua. Puoi fare cose interessanti con poche righe di codice, non ci sono compilatori di apprendimento, IDE ecc. All'avvio, è facile da testare ed eseguire il debug e supporta sia la programmazione OO che quella funzionale. Cosa potrebbe esserci di meglio?
Kevin Cline,

7
Perché dici che le matrici sono più facili da introdurre? Penso che i vettori siano molto più intuitivi per i nuovi arrivati ​​poiché non devi pensare a puntatori o a qualcosa di complesso come quello.
Casey Patton,

19
Se stai insegnando C ++ agli studenti delle scuole superiori, allora hai già superato il limite.
Tylerl,

7
L'alternativa all'insegnamento del C ++ non è COBOL.
jhocking

Risposte:


40

Penso che dovresti iniziare con i tipi di dati che la lingua ha incorporato come matrici e puntatori e quando i tuoi studenti li comprendono, passano alle classi e alle OO, quindi alla STL.

Il motivo è che puoi insegnare alle persone a capire le matrici senza capire molto altro oltre alle variabili e all'architettura del computer sottostante, ma non puoi insegnare loro a capire vectorsenza insegnare loro prima le lezioni. Se usi la STL sin dall'inizio, i tuoi studenti dovranno semplicemente vivere senza avere la minima idea di come vectorfunzioni esattamente. E poi quando arriverai a quel punto, non avranno una buona comprensione di puntatori, matrici e cose che ottieni facendo cose come scrivere la tua classe vettoriale, scrivere la tua classe di lista collegata, ecc. Che saranno necessari per apprezzare e sfruttare le sue caratteristiche. Mi dà fastidio quando gli studenti dicono "che cos'è?" e gli insegnanti dicono "ignoralo, lo imparerai più tardi".

E come Demian ha sottolineato nei commenti, decifrare i messaggi relativamente criptici che ricevi dagli errori dei template è significativamente più difficile della comprensione degli errori che potresti ottenere da array / costrutti non template.

Non mi sento allo stesso modo per coute printf. Nessuno dei due è di livello inferiore rispetto all'altro, tranne per il fatto che coututilizza un sovraccarico dell'operatore.

Questo può sembrare stupido, ma sono assolutamente fanatico del fatto che la gente capisca i mattoni fondamentali di tutto prima di passare alle astrazioni. Non dovresti usare i puntatori intelligenti finché non sei abile con i puntatori grezzi, senza vettori prima delle matrici, quel genere di cose.

Lo dico spesso, ma lo dirò di nuovo: è meglio insegnare agli studenti prima una lunga divisione e poi lasciarli usare una calcolatrice piuttosto che lasciarli usare una calcolatrice, quindi insegnare loro dopo una lunga divisione.

Per quanto riguarda i libri per insegnare ai principianti, vedi l' elenco principale dei buoni libri C ++ .


4
In realtà ero dello stesso parere, ma ho guardato il libro Insegnamento C ++ di Strousrup ( stroustrup.com/Programming ) e sostiene esplicitamente l'uso di vectorarray over. Sono a pezzi.
recipriversesclusione

4
@recipriversexclusion: Sto solo affermando l'ovvio, ma il signor Stroustrup è tutt'altro che uno studente delle superiori;)
Demian Brecht,

14
OH MIO DIO. In che modo chiunque può pensare che la manipolazione manuale di array allocati dinamicamente possa essere la strada "più semplice per prima" verso il C ++, quando c'è std::stringe std::vector?! Sono 32 i programmatori C che effettuano l'upgrade? Insegno C ++ da un decennio, ai principianti della programmazione, agli studenti che hanno avuto un anno di Java e ai professionisti della programmazione. Uso std::stringe std::vectorfin dal primo giorno. Sono facili da usare, indipendentemente dalle loro viscere. (Non ti vergognerai di insegnare la corda di VB perché è troppo complessa all'interno?)
sbi,

18
Ecco il tuo downvote. Non devi imparare a costruire una casa per goderti i benefici della vita in una casa. Non devi essere in grado di scrivere std::vectorper poterlo usare. E le classi sono una parte estremamente semplice di C ++. Ciò che non è di base è il debug di tutti quegli errori che otterranno usando matrici e puntatori nativi.
DeadMG

6
@DeadMG: la metafora della casa non funziona. In una casa, una volta costruite le fondamenta, non dovrai più pensarci. Continua a costruire tutto il resto. In C ++, nell'istante in cui vedi la newparola chiave, torni subito al terrirorio della gestione della memoria. E spesso le biblioteche chiedono suggerimenti e bisogna chiedersi: "sta per diventare proprietario? O devo ancora ripulirlo?". Fondazione il mio piede. Più come un chiodo o calafataggio o qualcosa del genere.
Chris Eberle,

38

Questa è la mia esperienza. Prendilo per quello che vale.

Ripensando a quando ho iniziato a programmare, avrei davvero desiderato conoscere prima la memoria . No, non è eccitante. Ti farà glassare. Ma è un concetto ridicolmente facile da insegnare. Mostra solo un tavolo 1-D e falli passare attraverso alcuni esercizi mentali:

Lezione 1: si
tratta di 10 byte di memoria. Questa è la lettera "a" che viene inserita nella cella numero 3. "a" è il valore e 3 è l'indirizzo. ok? Questo è il numero 3 che viene inserito nella cella 5. Il suo valore è 3 e il suo indirizzo è 5. Ora, cosa può significare il numero 3? Beh, potrebbe essere solo un numero 3 - oppure potrebbe essere un riferimento all'indirizzo 3. Proprio come 1 potrebbe essere un numero o potrebbe essere un prefisso internazionale. È solo un numero, tutto dipende da come lo trattiamo.

Lezione 2:
Impariamo a contare in binario. Contiamo fino a 10 usando il conteggio binario delle dita. Interessante no? Vedi come sono necessarie solo 4 dita? Quindi diciamo che sono necessari solo 4 bit (1/2 cella). Qual è il massimo che puoi contare da un lato (la risposta è 31). Che ne dici di 2 mani (la risposta è 1023). Spiega come più bit significano intervalli di numeri più alti. Ricorda loro che una cella di memoria ha 8 bit. Chiedi cosa succede quando un numero richiede più di 8 bit. Come metterebbero un numero multibyte in memoria (in modo logico)? Presentali a caratteri, shorts, numeri interi e long.

Lezione 3:
Ecco un programma che ho scritto in C ++. Utilizza numeri interi a 32 bit. E questo qui è anche un numero. Ma questo è un numero usato per indicare. Usando questo piccolo asterisco facciamo una promessa che il numero verrà usato per indicare. Ed ecco come lo puntiamo al primo numero. La piccola e commerciale riempie il valore per noi. Pulito eh?

eccetera. Una volta esaurita la memoria di base, tutto il resto è una torta. Sono i poveri studenti che presumono che il compilatore stia facendo qualcosa di magico (o che non debbano mai pensare alla gestione della memoria) che tendono a lottare di più. E il C ++ confonde le acque perché alcune cose vengono ripulite automaticamente (cioè un vettore normale) mentre altre no (ovvero un vettore allocato usando "nuovo"). E non farmi nemmeno iniziare con le stringhe (char * vs. std :: string - prova a spiegarlo senza la conoscenza del puntatore).

Non so quale piattaforma sarà indirizzata dalla concorrenza dei robot, ma se si tratta di un ambiente a memoria limitata, le capacità di gestione della memoria sono cruciali.

MODIFICARE

Una volta che hai insegnato loro i fondamenti, allora sì dico di andare C ++ fino in fondo. Tecnicamente sono solo librerie diverse, ma sì, non ha senso confonderle con più di un paradigma. Fornisci loro strumenti C ++ (che includono puntatori e matrici).


Questa è una risposta ben formulata. Il problema che penso è che puoi insegnare che, ma molti bambini (ero uno che all'inizio ha lottato con i concetti di puntatore / memoria a causa della mancanza di interesse) lo elimineranno, perché non è divertente, anche se è necessaria la conoscenza per programmare con successo in C ++.
Keith Layne,

3
Sì, nessuna discussione qui. Per lo stesso motivo, i bambini mettono a punto matematica e geografia. Solo più tardi si rendono conto che avrebbero dovuto prestare attenzione. Abbastanza sicuro che quel particolare problema non sia ancora stato risolto.
Chris Eberle,

+1. Ricordo di aver messo insieme la mia comprensione di come funzionava la memoria per un po 'di tempo dopo essere stato introdotto al C ++. Non penso che avrei potuto capirlo in anticipo, comunque (non in senso pratico, come il modo in cui i valori sono rappresentati).
Cameron,

+1, questo è quello che stavo cercando di dire, ma meglio. Quando addestrano i meccanici, devono capire il motore prima di renderli esperti di guida.
Seth Carnegie,

Sì, vado avanti e indietro sull'opportunità o meno dei principianti di afferrarlo. È così ridicolmente facile (e all'improvviso ti ritrovi a dire "wow, i computer sono macchine profondamente stupide, vero?"), Tuttavia richiede loro di prestare attenzione e mantenere la promessa di cose più interessanti a venire. Non vedere il "quadro generale" rende l'approccio globale un po 'insensibile.
Chris Eberle,

31

Dovrei iniziare a utilizzare STL dal primo giorno, esp. vettore o semplicemente attenersi alle matrici standard? Le matrici sono più facili da introdurre ma gli errori del puntatore potrebbero essere più difficili da rilevare.

sicuramente andare subito nell'uso di tipi di libreria standard. a std::stringo std::vectorè ciò che dovrebbero spesso usare e (la stragrande maggioranza delle implementazioni di) questi tipi offrono una qualche forma di rilevamento e gestione degli errori, mentre astraggono molte delle complessità dagli studenti.

puoi passare un bel po 'di tempo a insegnare agli studenti come è strutturata la memoria e come gestirla (stile C), oppure puoi iniziare subito a lavorare usando i tipi idiomatici del linguaggio, quindi spiegare i dettagli di implementazione se necessario (e quando hanno un una migliore comprensione di cosa sia un array e dove vengano utilizzati).

la sintassi di std::vector(create / read / write) non è molto più complicata di quella di un array C. in confronto, la gestione manuale della memoria e tutti gli errori comuni che i nuovi studenti fanno con le matrici C sono molto più difficili da imparare, insegnare e usare.

Per l'I / O, dovrei attenermi a cout, ecc. O pensi che printf sarebbe più facile da imparare?

cout. personalmente, penso che sia coutpiù facile da imparare. forse ancora più importante, dovresti scegliere coutperché è più sicuro, versatile e ti consente di definire la modalità di stampa di un oggetto, il che significa che hai già funzionalità integrate e sicurezza dei caratteri utilizzando alcuni tipi di libreria standard. infine, finirai con programmi misti quando ti rendi conto che potrebbero anche aver bisogno di imparare coutin aggiunta a printf.

in effetti, penso che dovresti leggere Accelerated C ++, di Koenig e Moo e possibilmente usarlo per le istruzioni (rispondendo indirettamente alla domanda 3). nel libro, introducono std::coutpoco prima return(pagina 3) e salvano puntatori e matrici fino al capitolo 10. Se potessi copiare e incollare la prefazione di quel libro come risposta alla tua domanda, lo farei. (nota: ti consiglio di leggerlo per la prospettiva di insegnare c ++).

Modifica Ecco la prefazione

Ci sono risorse online per C ++ che sono adatte da usare per questi giovani studenti?

se non vuoi usare il C ++ accelerato (che presuppone un po 'di background con la programmazione in generale), forse ti piacerebbe pensare a Eckel in C ++ . Non l'ho letto, ma è un testo introduttivo C ++ distribuito gratuitamente.


1
+1 ... e ho fatto un duro lavoro con "hanno introdotto std :: cout appena prima del ritorno (pagina 3)" devo dare un'occhiata a quello :)
Felix Dombek,

1
@Felix e direttamente prima std::coutdell'introduzione, vengono introdotte le parentesi graffe =) (è una semplice dissezione dell'onnipresente "Hello, World")
appena il

1
Seguo di cuore la raccomandazione del libro di Koenig e Moo. Ha come obiettivo l'insegnamento sia del C ++ che della programmazione. Il pensiero di Bruce Eckle in C ++ mira principalmente a insegnare il C ++ a coloro che hanno precedenti esperienze con un linguaggio procedurale (come C o Basic).
Stephen C. Steel,

11

Una cosa da considerare è che nel tipico PRIMO codice le strutture di dati di qualsiasi forma (strutture, classi, array, vettori, elenchi) svolgono un ruolo molto piccolo. In genere si tratta di una quantità molto piccola di dati del sensore e la si utilizza per decidere una quantità molto piccola di movimenti dell'attuatore.

Ma ciò che gioca un ruolo enorme e può essere molto difficile da capire sono tutte le diverse forme di controllo che continuano.

Quindi avrei messo molta enfasi sul controllo. Inizia con basi: if, for, while. Falli allenare molto. Fagli conoscere bene quelli ...

... ma poi diventa più difficile. Qualsiasi codice robot di dimensioni moderate alla fine arriva ad alcuni schemi di controllo più complicati:

  • Grande loop "principale", che chiama tutto

  • Macchine a stati (queste si presentano molto)

  • Salvataggio di valori precedenti / esecuzione del contatore (come per PID)

Questi sono difficili da capire per i principianti. Pensare a come un programma si muove attraverso codice come questo è confuso, potresti non rendertene conto ora, ma lo è. Darà ai tuoi studenti molti più problemi della lingua stessa.

Inoltre, buona fortuna! Spero che la stagione vada bene.


2
+1; questo non è un normale ambiente desktop, ma un vero codice incorporato. Le macchine a stati sono molto più importanti delle matrici std :: vector vs.
Salterio,

8
  • Dovrei iniziare a utilizzare STL dal primo giorno, esp. vectoro semplicemente attenersi alle matrici standard? Le matrici sono più facili da introdurre ma gli errori del puntatore potrebbero essere più difficili da rilevare.

Il problema con le matrici è che qualsiasi cosa, tranne i semplici esempi di libri di testo, richiederà matrici di dimensioni dinamiche e nel momento in cui sono necessarie matrici di dimensioni dinamiche, std::vectorè molto più semplice. Inoltre, l'unico modo per gestire in modo sicuro array di dimensioni dinamiche è di avvolgerli nella propria classe, il che sarebbe una std::vectorfregatura scadente .
Contrariamente alla credenza inspiegabilmente popolare, gli studenti possono usare caratteristiche che richiedono l'implementazione di meccanismi complessi senza sapere come implementare tali animali da soli. Come ho detto in un commento: non penseresti nemmeno di considerare di non insegnare le stringhe in altre lingue, solo perché la loro implementazione è complessa, vero?

  • Per l'I / O, dovrei attenermi a cout, ecc. O pensi che printfsarebbe più facile da imparare?

Perché una serie di convenzioni di stringhe in formato arcaico che fanno esplodere il tuo programma sul tetto nel momento in cui sbagli qualcosa (cosa che accade nel momento in cui cambi typedefun'intestazione apparentemente non correlata) sarebbe preferibile al tipo di sicurezza di std::cout?

  • Ci sono risorse online per C ++ che sono adatte da usare per questi giovani studenti?

La maggior parte delle risorse C ++, online o meno, sono cattive. E non sto parlando di usare caratteri o linguaggio difficili da leggere. Sto parlando di errori di fatto palesemente evidenti. Ci sono pochissime buone risorse C ++, principalmente una o due dozzine di libri . L'unico che conosco online è il pensiero di Bruce Eckel in C ++ .


Per un decennio, ho insegnato C ++ a studenti con background molto diversi usando come base il C ++ accelerato di Koenig / Moo . Il mio corso è cambiato molto in quel decennio, ora non è affatto vicino al libro, tranne per il principio di base: usa i modi di dire moderni, corretti e sicuri fin dall'inizio. Non insegnare ai tuoi studenti come manipolare manualmente la memoria, solo per farli successivamente disimparare a favore di idiomi più sicuri. Come puoi vedere in alcune delle risposte fornite qui, questo non funziona: quelli che una volta hanno insegnato i modi manuali prima raramente capiranno mai il vantaggio di usare modi di dire moderni e sicuri.


7

Se vuoi insegnare C ++, inizierei direttamente con i costrutti C ++ come vettore e cout, invece del sottoinsieme C come printf.


7

Dovrei iniziare a utilizzare STL dal primo giorno ...?

Sì. L'uso di matrici native in C ++ è soggetto a errori e semplicemente una cattiva pratica il 99% delle volte.

Per l'I / O, devo attenermi a cout, ecc ...?

Sì.

Ci sono risorse online per C ++ che sono adatte da usare per questi giovani studenti?

Non sono così giovani. Imparare a programmare non richiede saggezza, solo motivazione e mente aperta. Non riesco a pensare a nulla di insegnato negli ultimi due anni del liceo che preparerebbe meglio uno studente ad imparare a programmare. Hai visto il pensiero di Bruce Eckel in C ++ ? È disponibile per il download gratuito e molto ben recensito. Per favore, evita il popolare ma orribile C ++: How to Program e tutti i libri di Sam's Teach Yourself C ++ ...


5

Mi è stato insegnato C ++ al liceo come primo linguaggio di programmazione, sebbene fosse più simile a "C +", ora che me lo dici; abbiamo usato coutper scrivere testo sulla console e sui file, ma anche alcune funzioni C ( getch()era la mia preferita).

Penso che il modo più efficace (e forse divertente) di insegnare le basi sia usare un curriculum orientato agli obiettivi: iniziare mostrando come produrre materiale, quindi input da tastiera, quindi I / O di file semplici, ecc. Passare a un semplice testo- gioco basato (o equivalente di robotica). Quindi quando chiedono "Come faccio a fare X?", Puoi scomporre X in termini di esempi che hanno già visto, ad es. "Per prima cosa devi ottenere l'input dall'utente come abbiamo fatto in Z, poi ..."(ovviamente non è così facile, in pratica, dal momento che X sarà probabilmente qualcosa di cui hanno bisogno ulteriori conoscenze per fare, ad esempio, 'grafica 3D', ma si poteva ancora spiegare come sarebbe lavorare in una di alto livello modo).

Gli esempi che mostri inizieranno come magie incastonate nella scatola nera, i cui misteri vengono svelati quando i pezzi del puzzle di programmazione vengono lentamente risolti. Ad esempio, i tuoi studenti impareranno le basi di ifs abbastanza rapidamente, ma probabilmente non si renderanno conto che un'espressione booleana non è limitata esclusivamente all'uso all'interno di una ifcondizione (che porta al if (blah) return true; else return false;codice classico ).

Le sottigliezze del fatto che tu scelga un array o un vettore come contenitore sembreranno inizialmente irrilevanti per gli studenti. Un vettore / array sarà semplicemente un modo per avere molte variabili come una variabile, accessibile tramite un indice. Attenersi a uno dove è possibile. I puntatori non saranno compresi neanche dopo. Questo non vuol dire che non dovresti spiegare le cose; solo che non puoi spiegare tutto in una volta, e le cose che spieghi non saranno completamente assorbite. Gli umani imparano organicamente, non in modo lineare. Lo usavo coutda un paio d' anni prima di capire bene quale fosse il sovraccarico dell'operatore!

Oh, e non aver paura della ripetizione. "Questo è come il programma Hello World che abbiamo fatto - ricordi come abbiamo scritto il testo sulla console?" (no ...) "Riproviamolo solo per essere sicuri." ... E fai domande! Mantieni gli studenti impegnati con esempi divertenti e molta interazione.

Il C ++ è un linguaggio complesso e, indipendentemente da ciò che fai, una parte significativa di quella complessità (e quella del mestiere della programmazione in generale) andranno persi sui tuoi studenti. Tutto ciò che mostri sarà nuovo per loro; la maggior parte non affonderà a un livello profondo di comprensione (almeno, non subito). Come funziona la memoria, come interagiscono i componenti di un PC, cosa sono lo stack e l'heap, i puntatori, le classi, persino i loop e le catene if-else non saranno adeguatamente compresi dalla maggioranza. Questo va bene! Non devono essere compresi per essere utilizzati - una quantità incredibile di programmi interessanti può essere scritta con funzioni di 1000 righe super brutte con ridondanti nidificati per quintuple ife 43 variabili con nomi simili x_2r. L'importante è che gli studenti imparino e migliorino costantemente. Le scatole nere vanno bene fintanto che diventano trasparenti (o almeno grigio traslucido) nel lungo periodo. Entro la fine del corso, potrebbero non sapere che cosa gli schemi di progettazione sono, ma dovrebbero essere in grado di guardare indietro ai programmi che hanno scritto nel primo paio di settimane e rabbrividire al loro codice. Dovrebbero capire a un livello significativo di dettaglio come funziona effettivamente il primo programma che hanno scritto (mentre quando lo hanno scritto non ne avevano idea). Ma non sapranno ancora tutto .


5

Ho preso un sacco di lezioni di programmazione nella mia vita dal liceo al college. Posso dire che non ho imparato molto dalla mia prima classe c ++ oltre a come stampare cose su uno stream.

Il mio consiglio, da giovane studente, che solo negli ultimi anni ha avuto un vero lavoro come sviluppatore, è di non stupire. Spiega loro cosa stanno facendo e come funziona fino al livello del sistema operativo (non è necessario entrare in contatto con l'IMO).

Penso che insegnare loro il C sia un modo migliore per farlo (compilerà quasi sempre come C ++ come sapete). Insegnando loro che cos'è veramente il terminale, come il loro programma interagisce con esso, che una stringa è un array di caratteri che termina con un \ 0 in memoria, che cos'è malloc e come lo estrae C ++, come vengono memorizzati in memoria un carattere e un int , ect ... Queste cose sono ciò che fa davvero sapere a qualcuno come risolvere un problema quando lo incontrano durante lo sviluppo.

Non posso sottolineare l'importanza di lasciare che il programma per bambini e di essere lì principalmente per rispondere alle domande. Nella mia esperienza, impari una lingua utilizzandola. Libri e lezioni possono essere utili e sono necessari per iniziare, ma alla fine dico di dare loro un file C / C ++ e dico: questo è un esempio di X, mi piacerebbe che tu facessi Y (cosa che può essere fatta hackerando X). Mostra loro come usare le pagine man (se usano * NIX) o mostrale cplusplus.com e lascia che esplorino le librerie standard per capire le cose da sole.

TL; DR Lascia che i bambini si insegnino da soli. Essere lì per fornire struttura e rispondere alle domande.

Inoltre: le liste collegate sono la verità!


4

Non stai insegnando loro la programmazione in modo generale, stai insegnando loro una sorta di programmazione integrata usando robot e simili. Se ho capito bene.

Innanzitutto, penso che dovresti controllare quali librerie utilizzerai e di cosa hai bisogno.

Se ti capita di avere una libreria C da usare o C-like con molti puntatori e array C, allora credo che avresti bisogno di un modo per insegnare loro come usarlo o perché lo usi.

Ma puoi mostrare loro alcuni semplici codici per iniziare con stringhe e vettori, è così che funziona C ++. Ciò non significa che non puoi insegnare loro i puntatori.

Forse dovresti chiarire le differenze tra C ++ di basso livello (che assomiglia a C) e C ++ di alto livello con STL. Una delle cose più difficili in C ++ per i principianti è vedere cos'è C, cos'è C ++ e quali sono le diverse API di sistema.

Dato che l'obiettivo qui non è imparare la programmazione generale ma partecipare a una competizione Robot, ho orientato l'insegnamento in questo modo.


2

Ho iniziato a insegnare agli studenti C ++ alla fine dell'anno scorso e quest'estate anche per il nostro PRIMO team di robotica.

Stiamo usando la programmazione di Stroustrup - Principi e pratica usando il C ++ . Ho trovato il libro accessibile, leggibile e ben organizzato. Abbiamo avuto circa 6 studenti che hanno letto i capitoli da soli. Sono lì per aiutarli con la terminologia e le domande. Fanno tutti gli esercizi nel libro.

Ho fatto lavorare gli studenti attraverso il capitolo 14. Saltare i capitoli sui flussi (non utile per la programmazione FRC). Attraverso il capitolo 14 è utile perché ottengono un'introduzione alle sottoclassi. Tuttavia, probabilmente devono andare più avanti nel libro per comprendere meglio costruttori e distruttori legati alle sottoclassi.

Non sottovalutare i tuoi studenti. Gli studenti sono felici di avere il libro, leggere, imparare e fare gli esercizi; e questo era durante l'estate nel loro tempo libero! Ci sono molti studenti che non capiranno. Dovrebbero passare a qualcos'altro; non tutti comprendono la programmazione.

La più grande barriera non è la lingua o il libro; è l'ambiente di sviluppo. Visual Studio Express può essere scoraggiante per gli utenti alle prime armi. Puoi essere prezioso nell'aiutare gli studenti a concentrarsi sulla programmazione piuttosto che sull'ambiente. Tuttavia, imparare l'ambiente è prezioso poiché i programmatori impiegano molto tempo ad adattarsi ai nuovi sistemi di sviluppo.

In bocca al lupo.


+1: la migliore risposta di gran lunga. Ottima scelta del libro di testo. Congratulazioni per il tuo successo.
Kevin Cline,

1

Dici che vuoi insegnare loro C ++ ma non insegnare loro alcun costrutto C, ma la maggior parte dei costrutti di programmazione che dovranno sapere prima sono comuni a tutti i linguaggi e le versioni C ++ sono radicate in C:

  1. Ecco come si crea un programma [int main (..) {return 0; }]. Dai una panoramica di base dell'ambiente di programmazione che vuoi provare anche loro. Dovranno sapere come realizzare un progetto e come compilarlo / eseguirlo.

  2. Questa è una variabile Le variabili possono archiviare dati (int, char, float, ecc.).

  3. Stringhe (quelle C ++ sono più facili da usare con cin).

  4. Ecco come leggere e scrivere i dati (cin, cout). "Ciao,% s!"

  5. Condizionati (i computer devono prendere decisioni).

  6. Loop (i computer sono bravi a fare sempre la stessa cosa). Mostra mentre e per i loop.

Ciò dovrebbe richiedere circa due lezioni di un'ora ciascuna. Assicurati di preparare una serie concisa di note a cui possano fare riferimento nel componente pratico. Non stai cercando di renderli programmatori brillanti, quindi fai degli esempi su come leggere dalla console, creare strutture e tutto ciò che dovrebbero fare. Utilizzare solo funzionalità supportate dalla lingua, non librerie di utilità personalizzate. Li confonderai solo di più.

Fin dall'inizio, dai l'esempio e mostra loro esempi di codice ben strutturato. I rientri devono essere corretti, le parentesi graffe e le parentesi coerenti nello stile con cui ti senti più a tuo agio. I nomi delle variabili dovrebbero essere significativi. Se mostri slop come esempio, impareranno che lo slop è accettabile. È un brutto punto di partenza. Sottolinea l'importanza di ottenere il rientro corretto - ho scoperto che quando il lotto a cui ho insegnato rientrava il loro codice in modo coerente, erano più facilmente in grado di vedere dove stavano andando male. Ciò è dovuto al fatto che la maggior parte dei loro errori era un ambito errato per le operazioni (inserendo operazioni in loop / condizionali che non erano pensati per essere o al contrario).

Quindi passa al lavoro pratico. Il modo migliore per imparare qualcosa è romperlo e capire perché. Ti consigliamo di assicurarti che abbiano un ambiente facile da usare per compilare il loro codice. Documentalo con le schermate a portata di mano.

Un buon esempio che mi ha aiutato a cogliere alcuni dei concetti è stato quello di costruire una macchina Coke:

  • Output di un menu di articoli e prezzi (la memorizzazione del menu era una matrice di una struttura definita dall'utente. Potrebbe essere una classe in C ++). L'output ha richiesto un loop.
  • Leggi nella selezione dell'utente.
  • Chiedi denaro all'utente. Potrebbero semplicemente inserire la denominazione della moneta in centesimi (1, 5, 10, 20, 50, 100, 200 in Aus). Ignora denominazioni sconosciute. Mentre l'utente non ha investito abbastanza, continua a chiedere (loop).
  • Calcola la modifica richiesta (divisione modulo), fornendo il minor numero di monete. Stampa l'output sullo schermo.
  • Attendi il prossimo utente.

Successivamente puoi passare ai costrutti C ++; non vuoi immergerti troppo prima che possano almeno fare un programma di base.

E soprattutto, ho un sacco di tempo libero e pazienza da dedicare alle domande. Ce ne saranno molti e molti di loro ti faranno rabbrividire perché sono così banali che la risposta è ovvia per te.


1

Penso che non dovresti insegnare le cose dal punto di vista del C ++ ("c ++ world ciao"), ma dal dominio problematico - in questo caso, la robotica - dal punto di vista. Quindi, il tuo ciao mondo sarebbe battere le palpebre o guidare un motore.

Ovviamente potresti / dovresti scomporre ogni piccola attività di robotica in un sottoinsieme di azioni C ++ concettualmente significative, che coinvolgono tipi, funzioni e operazioni di I / O.

Per quanto mi riguarda, non sono un programmatore professionista e ho cercato di imparare Java, C ++ e Python. Ho davvero iniziato a realizzare qualcosa (Python) quando avevo problemi reali (semplici) da risolvere. Ciò mi ha portato al punto, evitando un'eccessiva attenzione ai dettagli di implementazione accidentale del linguaggio stesso.

Quindi consiglierei: non leggere il manuale di una lingua, ma impara invece a fare le cose con la tua lingua preferita. Questo è ciò che mantiene le persone motivate, credo.


0

Insegnerei rigorosamente C ++. Sai come quando scrivi printf e lo dai a piccoli parametri o al tipo sbagliato succede qualcosa di strano? e se usi puntatori non validi possono accadere cose brutte? NON INSEGNARLO

Dal primo giorno insegnerei come usare i riferimenti, STL e direi PERDERE MARCHI per usare i puntatori. Non insegnare neanche i puntatori intelligenti. L'unica volta che noto che uso i puntatori è quando eseguo la GUI e gli oggetti (come una scatola di immagini) devono esistere ed essere un'immagine valida o nulla. Per la programmazione da console non uso puntatori (smart o raw) da molto tempo.

Quindi in breve non insegnare loro tutto ciò che può dar loro problemi. Insegnare iostreams, le strutture, dire loro che perdono i segni anche sul typecast e non cercare di insegnare il design. Non vuoi che nessuno diventi un professionista esperto


0

Non è una serie di lezioni in C ++, ma COMP1917 di Richard Buckland è una serie di lezioni di eccellenza sulla programmazione in C (seguita da COMP1927 , strutture di dati).

A mio avviso, il C ++ è troppa complessità per i nuovi studenti, ma C è il mondo più semplice e fornisce una buona base nella programmazione dei sistemi di cui troppo spesso mancano i nuovi programmatori C ++.


0

Vorrei iniziare con blocchi significativi di codice del boilerplate, aiutandoli a "fare qualcosa di interessante" con la programmazione immediatamente e perfezionando la loro comprensione di come funzionano le cose nel tempo. Non è necessario apprezzare o comprendere tutte le complessità del C ++ per far lampeggiare un LED. Devono solo sapere "se metti questo codice lì, farà lampeggiare il LED". E poi "hey, parliamo di cosa sia un loop ora, se scrivi un loop, puoi far lampeggiare il LED 50 volte senza dover scrivere 50 righe di codice, non è fantastico?" Ora parliamo di condizionali, quando l'utente preme il pulsante A sulla scatola di controllo, vogliamo attivare la pneumatica per alzare un flag, ecco come aggiungeremo il codice per farlo. Oppure, se l'interruttore 2 sulla nostra scatola di controllo è acceso, facciamo funzionare il motore del trapano al contrario anziché in avanti.

Se mantieni le cose concentrate sull'insegnare loro "quanto basta" per risolvere i problemi a cui sono interessati, renderà le cose molto meno schiaccianti e più accessibili. Se sono veramente interessati e vogliono capire le complessità, probabilmente torneranno indietro e leggeranno un libro completo sulla programmazione o frequentando un corso estivo presso il JC locale.

Fai un elenco delle "cose ​​che vogliono essere in grado di controllare" sul loro robot e trasforma ognuna in una lezione ... qual è il minimo che devono sapere per ...?

  • fare qualcosa di "bello" se un interruttore si trova in una particolare impostazione?
  • dire ad una valvola pneumatica di aprirsi o chiudersi (ad es. un accessorio per afferrare)?
  • accendere e spegnere i motori del trapano (per la trasmissione)?
  • far cambiare direzione al robot se è attivato un sensore di rilevamento ostacoli?
  • far passare il robot tra le modalità 2 ruote e 4 ruote motrici?
  • regolare la sensibilità del joystick?
  • eccetera.

Continuerei a insegnare i contrasti più infallibili, come insegnerei cout su printf, perché gli identificatori di formato sono molto facili da confondere e un identificatore errato è spesso una ricetta automatica per interrompere il programma. Allo stesso modo, il vettore offusca alcune delle complessità di gestione della memoria. Non preoccuparti di ogni dettaglio su come funzionano le cose o su cosa sia la libreria STL, solo il minimo che devono sapere per realizzare X (che potrebbe richiedere l'utilizzo di una struttura di dati della libreria STL, per esempio)


0

Utilizzare Come programmare C ++ da Deitel e Deitel. OTTIMO libro di testo secondo me.

Sembra che tu stia cercando di insegnare ai principianti come programmare e poi farli programmare a un livello avanzato allo stesso tempo. Se speri di dare loro qualche scimmia, vedi la scimmia fare frammenti di codice senza capire che sei destinato al fallimento.

Stai lontano da STL per una lezione di principiante.

Se hai già una soluzione di codifica per il tuo robot - o una IDEA MOLTO BUONA di come sarà, allora forse puoi "mappare" le lezioni nel libro di testo con le attività di codifica del robot. Ma lascia che il libro di testo favorisca l'apprendimento.

Se alimentate forzatamente la codifica, dando agli studenti lezioni molto ristrette ed esposizione alla lingua, penso che man mano che l'oceano di codice che scrivete diventa sempre più grande, sarà come aver appena imparato a remare con il cane e annegherete perché VERO nuoto è obbligatorio.

Non si tratta di "dovrebbero imparare cout o printf?" È una questione di apprendimento sufficiente per avere informazioni su come scrivere il codice per determinate attività di programmazione del robot da risolvere.

Se questo fosse un compito di lettura, quali sarebbero i risultati se tutto ciò che sapessero fossero semplici frasi soggetto-verbo e sarà richiesta solo metà del vocabolario che SAPETE .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.