Unterrichten von C ++ für erstmalige Schüler: Wo soll die Grenze gezogen werden?

35

Ich werde ein Team von Highschool-Schülern für den ERSTEN Robotik-Wettbewerb betreuen. Die meisten Teams hier entwickeln [ihre Robotersoftware mit C ++. Für viele Studenten im Team ist dies die erste Einführung in die Programmierung. Ich hätte C ++ nicht gewählt, um Highschoolern das Programmieren beizubringen (zB Python oder Javascript wären meiner Meinung nach einfacher gewesen), aber die Wahl ist gefallen.

Ich möchte ihnen richtiges C ++ beibringen (dh einen gemischten C / C ++ - Dialekt vermeiden, dh C +), aber ich möchte sie auch nicht mit unnötiger Komplexität erschrecken. Für diese Angelegenheit:

  • Soll ich ab dem ersten Tag mit STL anfangen? vectoroder einfach bei Standard-Arrays bleiben? Arrays sind einfacher einzuführen, aber die Zeigerfehler sind möglicherweise schwerer abzufangen.
  • Sollte ich mich bei I / O an coutusw. halten oder denkst du, es printfwäre einfacher zu lernen?
  • Gibt es Online-Ressourcen für C ++, die für solche jungen Lernenden geeignet sind?

Vielen Dank!

EDIT : Danke für so viele hervorragende Antworten. Zusätzlich zu Accelerated C ++ , das von vielen Leuten vorgeschlagen wird, habe ich festgestellt, dass C ++ für jedermann ein ausgezeichneter Text ist.

gegenseitiger Ausschluss
quelle
52
Oh Gott, bitte unterrichte niemanden Javascript als Muttersprache!
SoapBox
26
@ SoapBox: Im Gegensatz zu was? Ich finde Javascript als Muttersprache großartig. Sie können interessante Dinge mit ein paar Codezeilen tun, es gibt keine Compiler und IDEs, die über den Startaufwand gelernt werden müssen usw. Es ist einfach zu testen und zu debuggen und es unterstützt sowohl OO- als auch funktionale Programmierung. Was wäre besser?
Kevin Cline
7
Warum sind Arrays Ihrer Meinung nach einfacher einzuführen? Ich denke, Vektoren sind für Neulinge weitaus intuitiver, da man sich nicht mit Zeigern oder so etwas Komplexem auseinandersetzen muss.
Casey Patton
19
Wenn Sie Highschool-Schülern C ++ beibringen, haben Sie bereits die Grenze überschritten.
tylerl
7
Die Alternative zum Unterrichten von C ++ ist nicht COBOL.
jhocking

Antworten:

40

Ich denke, Sie sollten mit den Datentypen beginnen, die die Sprache wie Arrays und Zeiger eingebaut hat, und wenn Ihre Schüler diese verstehen, fahren Sie mit Klassen und OO fort, dann mit der STL.

Der Grund dafür ist, dass Sie Menschen das Verstehen von Arrays beibringen können, ohne viel anderes als Variablen und die zugrunde liegende Computerarchitektur zu verstehen. Sie können ihnen jedoch nicht das Verstehen beibringen, vectorohne ihnen zuerst Klassen beizubringen . Wenn Sie die STL von Anfang an verwenden, müssen Ihre Schüler damit leben, keine Ahnung zu haben, wie vectorgenau dies funktioniert. Und dann, wenn Sie an diesem Punkt angelangt sind, werden sie Zeiger und Arrays und Dinge, die Sie durch das Schreiben Ihrer eigenen Vektorklasse, das Schreiben Ihrer eigenen Klasse für verknüpfte Listen usw. erhalten, nicht gut genug verstehen seine Funktionen zu schätzen und zu nutzen. Es ärgert mich, wenn Schüler sagen "Was ist das?" und Lehrer sagen: "Ignoriere es einfach, du wirst es später lernen."

Und wie Demian in den Kommentaren ausführte, ist das Entschlüsseln der relativ kryptischen Nachrichten, die Sie aus Vorlagenfehlern erhalten, erheblich schwieriger als das Verstehen der Fehler, die Sie aus Arrays / Nicht-Vorlagenkonstrukten erhalten können.

Ich fühle mich nicht die gleiche Weise über coutund printf. Keiner ist untergeordneter als der andere, außer dass couteine Operatorüberladung verwendet wird.

Das mag blöd erscheinen, aber ich bin absolut fanatisch , wenn es darum geht, die Grundbausteine ​​von allem zu verstehen, bevor ich zu den Abstraktionen übergehe. Sie sollten keine intelligenten Zeiger verwenden, bis Sie mit rohen Zeigern vertraut sind, keine Vektoren vor Arrays, so etwas.

Ich sage das oft, aber ich sage es noch einmal: Es ist besser, den Schülern zuerst die lange Unterteilung beizubringen und sie dann einen Taschenrechner benutzen zu lassen, als sie einen Taschenrechner benutzen zu lassen und sie anschließend die lange Unterteilung lernen zu lassen.

Informationen zu Büchern für Anfänger finden Sie in der Hauptliste der guten C ++ - Bücher .

Seth Carnegie
quelle
4
Eigentlich war ich der gleichen Meinung, aber ich habe mir Strousrup's Teaching C ++ - Buch ( stroustrup.com/Programming ) angesehen und er befürwortet ausdrücklich die Verwendung von vectorOver-Arrays. Ich bin zerrissen.
Reziprivatausschluss
4
@recipriversexclusion: Nur das Offensichtliche, aber Herr Stroustrup ist weit entfernt von einem Gymnasiasten;)
Demian Brecht
14
OH MEIN GOTT. Wie in aller Welt kann man sich vorstellen, dass die manuelle Bearbeitung von dynamisch zugewiesenen Arrays der einfachste Weg zu C ++ ist, wenn es std::stringund gibt std::vector?! Stimmen die 32 C-Programmierer zu? Ich unterrichte C ++ seit einem Jahrzehnt, um Anfänger, Studenten, die ein Jahr Java hatten, und Programmierer zu programmieren. Ich benutze std::stringund std::vectorvom ersten Tag an. Sie sind einfach zu bedienen, egal was ihre Innereien sind. (Sie würden nicht davor zurückschrecken,
VBs
18
Hier ist deine Gegenstimme. Sie müssen nicht lernen, ein Haus zu bauen, um die Vorteile des Wohnens in einem Haus zu genießen. Sie müssen nicht schreiben std::vectorkönnen, um es verwenden zu können. Und Klassen sind ein äußerst grundlegender Bestandteil von C ++. Was nicht grundlegend ist, ist das Debuggen aller Fehler, die sie bekommen, mit nativen Arrays und Zeigern.
DeadMG
6
@DeadMG: Die Hausmetapher funktioniert nicht. In einem Haus muss man nach dem Bau des Fundaments nie wieder darüber nachdenken. Sie bauen einfach alles andere weiter. In C ++, die Instant Sie sehen newStichwort, bist du gleich wieder in die Speicherverwaltung terrirory. Und oft fragen Bibliotheken nach Hinweisen, und Sie müssen sich fragen: "Wird das Eigentum sein? Oder muss ich es noch bereinigen?". Fundament meinen Fuß. Eher wie ein Nagel oder Kitt oder so.
Chris Eberle
38

Das ist meine eigene Erfahrung. Nimm es für alles, was es wert ist.

Im Rückblick auf , als ich begann Programmierung, mag ich wirklich , ich würde über das Gedächtnis gelernt hat zuerst . Nein, es ist nicht aufregend. Es wird dich überglühen lassen. Aber es ist ein lächerlich leicht zu unterrichtendes Konzept. Zeigen Sie einfach eine 1-D-Tabelle und lassen Sie sie ein paar mentale Übungen machen:

Lektion 1:
Dies sind 10 Byte Speicher. Dies ist der Buchstabe "a", der in die Zelle Nummer 3 eingegeben wird. "A" ist der Wert und 3 ist die Adresse. OK? Dies ist die Nummer 3, die in Zelle 5 abgelegt wird. Ihr Wert ist 3 und ihre Adresse ist 5. Was kann nun die Nummer 3 bedeuten? Nun, es könnte nur eine Nummer 3 sein - oder es könnte eine Referenz auf Adresse 3 sein. Genau wie 1 eine Nummer oder ein Ländercode sein könnte. Es ist nur eine Zahl, alles hängt davon ab, wie wir damit umgehen.

Lektion 2:
Lassen Sie uns lernen, binär zu zählen. Zählen wir mit der Binärfingerzählung bis 10. Interessant nein? Sehen Sie, wie das nur 4 Finger benötigt? Wir sagen also, dass nur 4 Bits benötigt werden (1/2 Zelle). Was ist die höchste Zahl, die Sie auf einer Hand zählen können (Antwort ist 31). Wie wäre es mit 2 Händen (Antwort ist 1023). Erklären Sie, wie mehr Bits höhere Zahlenbereiche bedeuten. Erinnern Sie sie daran, dass eine Speicherzelle 8 Bits hat. Fragen Sie, was passiert, wenn eine Zahl mehr als 8 Bits benötigt. Wie würden sie eine Multi-Byte-Zahl (auf logische Weise) speichern? Stellen Sie sie in Zeichen, Shorts, Ganzzahlen und Longs vor.

Lektion 3:
Hier ist ein Programm, das ich in C ++ geschrieben habe. Es werden 32-Bit-Ganzzahlen verwendet. Und das hier ist auch eine Nummer. Dies ist jedoch eine Zahl, die zum Zeigen verwendet wird. Mit diesem kleinen Sternchen versprechen wir, dass die Nummer zum Zeigen verwendet wird. Und so zeigen wir es auf die erste Zahl. Das kleine kaufmännische Und füllt den Wert für uns aus. Ordentlich, was?

und so weiter. Sobald Sie Grundgedächtnis haben, ist alles andere Kuchen. Es sind die armen Studenten, die davon ausgehen, dass der Compiler etwas Magisches tut (oder dass sie nie über Memory Management nachdenken müssen), die am meisten zu kämpfen haben. Und C ++ trübt das Wasser, weil einige Dinge automatisch bereinigt werden (dh ein normaler Vektor), während andere Dinge nicht bereinigt werden (dh ein mit "new" zugewiesener Vektor). Und lassen Sie mich nicht einmal mit Strings anfangen (char * vs. std :: string - versuchen Sie es zu erklären, ohne Zeigerwissen).

Ich weiß nicht, auf welche Plattform Ihre Roboterwettbewerbe abzielen, aber wenn es sich um eine Umgebung mit begrenztem Speicher handelt, sind die Fähigkeiten zur Speicherverwaltung von entscheidender Bedeutung.

BEARBEITEN

Sobald Sie ihnen die Grundlagen beigebracht haben, sage ich, gehen Sie C ++ den ganzen Weg. Technisch gesehen sind sie nur verschiedene Bibliotheken, aber es hat keinen Sinn, sie mit mehr als einem Paradigma zu verwechseln. Geben Sie ihnen C ++ - Tools (einschließlich Zeiger und Arrays).

Chris
quelle
Das ist eine gut formulierte Antwort. Ich denke, das Problem ist, dass man das lehren kann, aber viele Kinder (ich war einer, der sich anfangs wegen mangelnden Interesses mit Zeiger- / Speicherkonzepten abmühte) werden es einfach ausschalten, weil es keinen Spaß macht, obwohl es notwendiges Wissen ist erfolgreich in C ++ programmieren.
Keith Layne
3
Ja, kein Argument hier. Aus dem gleichen Grund schalten Kinder Mathe und Geographie aus. Erst später stellen sie fest, dass sie aufgepasst haben sollten. Ich bin mir ziemlich sicher, dass dieses spezielle Problem immer noch nicht gelöst ist.
Chris Eberle
+1. Ich erinnere mich, wie ich mir ein Bild davon gemacht habe, wie das Gedächtnis eine ganze Weile nach meiner Einführung in C ++ funktioniert hat. Ich glaube jedoch nicht, dass ich es von vornherein hätte verstehen können (nicht in praktischer Hinsicht, wie Werte dargestellt werden).
Cameron
+1, das ist, was ich sagen wollte, aber besser. Wenn Sie Mechaniker ausbilden, müssen sie den Motor verstehen, bevor Sie sie zu Fahrexperten machen.
Seth Carnegie
Ja, ich gehe hin und her und frage mich, ob Anfänger dies verstehen können oder nicht. Es ist so lächerlich einfach (und plötzlich sagt man: "Wow, Computer sind zutiefst dumme Maschinen, nicht wahr?"), Aber es erfordert, dass sie aufpassen und ein Versprechen aufregenderer Dinge einhalten. Das "große Ganze" nicht zu sehen, macht den Gesamtansatz ein wenig betäubend.
Chris Eberle
31

Soll ich ab dem ersten Tag mit STL anfangen? Vektor oder einfach bei Standard-Arrays bleiben? Arrays sind einfacher einzuführen, aber die Zeigerfehler sind möglicherweise schwerer abzufangen.

Verwenden Sie auf jeden Fall Standardbibliothekstypen. a std::stringoder std::vectorist das, was sie häufig verwenden sollten, und (die überwiegende Mehrheit der Implementierungen von) diese Typen bieten eine Form der Fehlererkennung und Fehlerbehandlung, während viele der Komplexitäten von den Schülern abstrahiert werden.

Sie können einen guten Teil der Zeit damit verbringen, den Schülern beizubringen, wie das Gedächtnis strukturiert ist und wie das Gedächtnis verwaltet wird (C-Stil), oder Sie können direkt mit den idiomatischen Arten der Sprache arbeiten und dann bei Bedarf Implementierungsdetails erläutern (und wenn sie eine haben) ein besseres Verständnis dafür, was ein Array ist und wo sie verwendet werden).

Die Syntax von std::vector(Erstellen / Lesen / Schreiben) ist nicht viel komplizierter als die eines C-Arrays. Im Vergleich dazu sind die manuelle Speicherverwaltung und alle häufigen Fehler, die neue Lernende mit C-Arrays machen, weitaus schwieriger zu erlernen, zu lehren und zu verwenden.

Soll ich mich bei I / O an Cout usw. halten, oder ist PrintF Ihrer Meinung nach leichter zu erlernen?

cout. Ich persönlich denke cout, es ist einfacher zu lernen. Vielleicht ist es noch wichtiger, dass Sie wählen, coutweil es sicherer und vielseitiger ist und Sie definieren können, wie ein Objekt gedruckt wird. Dies bedeutet, dass Sie bereits über integrierte Funktionen und eine integrierte Typensicherheit verfügen, die einige Standardbibliothekstypen verwenden. Schließlich werden Sie nur mit gemischten Programmen am Ende , wenn Sie merken , dass sie auch lernen müssen , können coutzusätzlich zu printf.

Tatsächlich denke ich, Sie sollten Accelerated C ++ von Koenig und Moo lesen und es möglicherweise für Anweisungen verwenden (indem Sie Frage 3 indirekt beantworten). In dem Buch führen sie std::coutkurz vor return(Seite 3) ein und speichern Zeiger und Arrays bis Kapitel 10. Wenn ich das Vorwort dieses Buches als Antwort auf Ihre Frage kopieren und einfügen könnte, würde ich. (Anmerkung: Ich empfehle, dass Sie es für die Perspektive des Lehrens von c ++ lesen).

Bearbeiten Hier ist das Vorwort

Gibt es Online-Ressourcen für C ++, die für solche jungen Lernenden geeignet sind?

Wenn Sie Accelerated C ++ nicht verwenden möchten (was im Allgemeinen einige Hintergrundinformationen zur Programmierung voraussetzt), möchten Sie vielleicht Eckels Denken in C ++ . Ich habe es nicht gelesen, aber es ist ein frei verbreiteter C ++ - Intro-Text.

Justin
quelle
1
1 ... und ich LOL'd hart „sie einführen std :: cout kurz vor Rückkehr (Seite 3)“ Gotta Blick in diese ein :)
Felix Dombek
1
@Felix und direkt vor std::coutder Einführung werden geschweifte Klammern eingeführt =) (es ist eine einfache Zerlegung des allgegenwärtigen "Hallo, Welt")
justin
1
Ich stimme der Empfehlung von Koenig und Moos Buch von ganzem Herzen zu. Es zielt darauf ab, sowohl C ++ als auch Programmierung zu lehren. Bruce Eckles Thinking in C ++ zielt in erster Linie darauf ab, Personen mit Vorkenntnissen in einer prozeduralen Sprache (wie C oder Basic) C ++ beizubringen.
Stephen C. Steel
11

Eine zu berücksichtigende Sache ist, dass in typischen FIRST-Codes Datenstrukturen jeglicher Form (Strukturen, Klassen, Arrays, Vektoren, Listen) eine sehr geringe Rolle spielen. In der Regel verarbeiten Sie eine sehr kleine Menge von Sensordaten und entscheiden anhand dieser Daten über eine sehr kleine Menge von Aktuatorbewegungen.

Was jedoch eine große Rolle spielt und sehr schwer zu verstehen ist, sind die verschiedenen Formen der Kontrolle , die stattfinden.

Deshalb habe ich viel Wert auf Kontrolle gelegt. Beginnen Sie mit den Grundlagen: if, for, while. Lassen Sie sie viel üben. Lass sie diese gut kennenlernen ...

... aber dann wird es schwieriger. Jeder Robotercode von mittlerer Größe bekommt schließlich einige schwierigere Kontrollmuster:

  • Große "Haupt" -Schleife, die alles aufruft

  • Zustandsautomaten (diese tauchen häufig auf)

  • Speichern vorheriger Werte / laufender Zähler (wie bei PID)

Diese sind für Anfänger schwer zu verstehen. Der Gedanke daran, wie sich ein Programm durch Code wie diesen bewegt, ist verwirrend, aber Sie werden es vielleicht nicht bemerken. Es wird Ihren Schülern viel mehr Probleme bereiten als die Sprache selbst.

Auch viel Glück! Hoffe die Saison läuft gut.

Owen
quelle
2
+1; Dies ist keine normale Desktop-Umgebung, sondern echter eingebetteter Code. Zustandsautomaten sind weitaus wichtiger als std :: vector vs arrays.
MSalters
8
  • Soll ich ab dem ersten Tag mit STL anfangen? vectoroder einfach bei Standard-Arrays bleiben? Arrays sind einfacher einzuführen, aber die Zeigerfehler sind möglicherweise schwerer abzufangen.

Das Problem bei Arrays ist, dass alles außer einfachen Lehrbuchbeispielen Arrays mit dynamischer Größe erfordern und der Moment, in dem Sie Arrays mit dynamischer Größe benötigen, std::vectorviel einfacher ist. Die einzige Möglichkeit, mit Arrays mit dynamischer Größe sicher umzugehen, besteht darin, sie in Ihrer eigenen Klasse zu verpacken, was eine schlechte std::vectorAbzocke wäre.
Im Gegensatz zu dem aus unerklärlichen Gründen landläufigen Meinung können die Schüler nutzen Funktionen , die komplexe Mechanik erfordern , ohne zu wissen umgesetzt werden , wie man implementieren sich solche Tiere. Wie ich in einem Kommentar gesagt habe: Sie würden nicht einmal daran denken, Strings in anderen Sprachen nicht zu unterrichten, nur weil ihre Implementierung komplex ist, oder?

  • Sollte ich mich bei I / O an coutusw. halten oder denkst du, es printfwäre einfacher zu lernen?

Warum sollte ein Satz von Zeichenfolgenkonventionen im archaischen Format, die Ihr Programm in dem Moment in die Luft jagen lassen, in dem Sie etwas falsch machen (was passiert, wenn Sie eine typedefscheinbar nicht verwandte Überschrift ändern ), der Typensicherheit von std::coutvorgezogen werden?

  • Gibt es Online-Ressourcen für C ++, die für solche jungen Lernenden geeignet sind?

Die meisten C ++ - Ressourcen, online oder nicht, sind schlecht. Und ich spreche nicht von schwer lesbaren Schriften oder schwer lesbarer Sprache. Ich spreche auffällig offensichtliche sachliche Fehler. Es gibt nur sehr wenige gute C ++ - Ressourcen, meist ein oder zwei Dutzend Bücher . Das einzige, von dem ich weiß, dass es online ist, ist Bruce Eckels Denken in C ++ .


Seit einem Jahrzehnt unterrichte ich C ++ Schülern mit sehr unterschiedlichem Hintergrund auf der Grundlage von Accelerated C ++ von Koenig / Moo . Mein Kurs hat sich in diesem Jahrzehnt sehr verändert, ist nun weit entfernt von dem Buch, abgesehen von dem zugrundeliegenden Prinzip: Verwenden Sie die modernen, korrekten und sicheren Redewendungen von Anfang an. Bringen Sie Ihren Schülern nicht bei, wie man das Gedächtnis manuell manipuliert, nur um sie später dazu zu bringen, dies zugunsten sichererer Redewendungen zu verlernen. Wie Sie an einigen der hier gegebenen Antworten sehen können, funktioniert dies nicht: Wer einmal die manuellen Methoden erlernt hat, wird selten den Vorteil der Verwendung moderner, sicherer Redewendungen verstehen.

sbi
quelle
7

Wenn Sie C ++ unterrichten möchten, würde ich direkt mit C ++ - Konstrukten als Vektor und Cout beginnen, anstelle der C-Teilmenge wie printf.

K-Ballo
quelle
7

Soll ich ab dem ersten Tag mit STL anfangen ...?

Ja. Die Verwendung nativer Arrays in C ++ ist fehleranfällig und in 99% der Fälle eine schlechte Praxis.

Soll ich mich bei I / O an Cout usw. halten?

Ja.

Gibt es Online-Ressourcen für C ++, die für solche jungen Lernenden geeignet sind?

Sie sind nicht so jung. Programmieren zu lernen erfordert keine Weisheit, nur Motivation und Offenheit. Ich kann mir nichts vorstellen, was in den letzten zwei Schuljahren unterrichtet wurde, um einen Schüler besser auf das Programmieren vorzubereiten. Haben Sie sich Bruce Eckels Denken in C ++ angesehen ? Es steht zum kostenlosen Download zur Verfügung und ist sehr gut bewertet. Bitte vermeiden Sie das beliebte, aber schreckliche C ++: How to Program und all die Sam's Teach Yourself C ++ ... Bücher.

Kevin Cline
quelle
5

Ich war C ++ in der High School als ersten Programmiersprache gelehrt, obwohl es war eher wie „C +“, jetzt, wo du es erwähnst; Wir haben coutzum Schreiben von Text auf die Konsole und Dateien verwendet, aber auch einige C-Funktionen ( getch()war mein Favorit).

Ich denke, die effektivste (und möglicherweise unterhaltsamste) Art, die Grundlagen zu vermitteln, ist die Verwendung eines zielgerichteten Lehrplans: Beginnen Sie mit der Veranschaulichung der Ausgabe, der Tastatureingabe, der einfachen Datei-E / A usw. basiertes Spiel (oder das Äquivalent zur Robotik). Wenn sie dann fragen: "Wie mache ich X?", Können Sie X anhand von Beispielen aufschlüsseln, die sie bereits gesehen haben, z. B. "Zuerst müssen Sie die Eingaben vom Benutzer erhalten, wie wir es in Z getan haben, dann ... "(Offensichtlich ist es in der Praxis nicht so einfach, da X wahrscheinlich etwas ist, wofür sie zusätzliche Kenntnisse benötigen, z. B." 3D-Grafiken ", aber Sie könnten trotzdem erklären, wie es auf hohem Niveau funktionieren würde Weg).

Die Beispiele, die Sie zeigen, beginnen als Black-Box-Magie, deren Rätsel gelöst werden, wenn Teile des Programmierpuzzles langsam herausgefunden werden. Zum Beispiel werden Ihre Schüler die Grundlagen von ifs ziemlich schnell erlernen , aber sie werden wahrscheinlich nicht erkennen, dass ein boolescher Ausdruck nicht ausschließlich auf die Verwendung innerhalb einer ifBedingung beschränkt ist (was zu klassischem if (blah) return true; else return false;Code führt).

Die Feinheiten, ob Sie ein Array oder einen Vektor als Container auswählen, erscheinen den Schülern zunächst irrelevant. Ein Vektor / Array ist einfach eine Möglichkeit, viele Variablen als eine Variable zu haben, auf die über einen Index zugegriffen werden kann. Bleib bei einem, wo du kannst. Hinweise werden auch erst später verstanden. Das heißt nicht, dass man Dinge nicht erklären sollte; nur dass du nicht alles auf einmal erklären kannst und das, was du erklärst, nicht vollständig absorbiert wird. Der Mensch lernt organisch, nicht linear. Ich hatte coutein paar Jahre lang verwendet, bevor ich richtig verstand, was Operatorüberladung war!

Oh, und hab keine Angst vor Wiederholungen. "Das ist wie das Hello World-Programm, das wir gemacht haben - erinnern Sie sich, wie wir Text in die Konsole geschrieben haben?" (nein ...) "Lass es uns noch einmal durchgehen, nur um sicherzugehen." ... und Fragen stellen! Beschäftigen Sie die Schüler mit lustigen Beispielen und viel Interaktion.

C ++ ist eine komplexe Sprache, und unabhängig davon, was Sie tun, geht Ihren Schülern ein erheblicher Teil dieser Komplexität (und der Komplexität des Programmierhandwerks im Allgemeinen) verloren. Alles, was Sie ihnen zeigen, wird ihnen neu sein. Das meiste davon wird nicht auf einer tiefen Ebene des Verständnisses versinken (zumindest nicht sofort). Wie Speicher funktioniert, wie die Komponenten eines PCs interagieren, was Stack und Heap sind, Zeiger, Klassen, sogar Schleifen und If-else-Ketten werden von der Mehrheit nicht richtig verstanden . Das ist in Ordnung! Sie müssen nicht verstanden werden, um verwendet zu werden - eine erstaunliche Menge cooler Programme kann mit superhässlichen 1000-Zeilen-Funktionen mit fünffach verschachtelten redundanten ifs und 43 Variablen geschrieben werden, die so genannte Dinge x_2r. Wichtig ist, dass die Schüler ständig lernen und sich verbessern. Black Boxes sind in Ordnung, solange sie langfristig transparent (oder zumindest durchscheinend grau) werden. Am Ende des Kurses können, sie wissen nicht , was Design prasselt sind, aber sie sollen sie schrieben in den ersten Wochen und bei den Programmen der Lage, zurück zu blicken erschaudern bei ihrem Code. Sie sollten sehr genau verstehen, wie das erste Programm, das sie geschrieben haben, tatsächlich funktioniert (während sie beim Schreiben keine Ahnung hatten). Aber sie werden nicht alles wissen - noch .

Cameron
quelle
5

Ich habe eine Reihe von Programmierkursen in meinem Leben von der High School bis zum College absolviert. Ich kann sagen, dass ich in meiner ersten C ++ - Klasse nicht viel anderes gelernt habe, als Dinge in einen Stream zu drucken.

Als junger Student, der erst in den letzten Jahren als Entwickler gearbeitet hat, rate ich mir, die Dinge nicht zu beschönigen. Sagen Sie ihnen, was sie tun und wie es auf Betriebssystemebene funktioniert (Sie müssen sich nicht mit comp eng IMO befassen).

Ich denke, es ist besser, ihnen C beizubringen (es wird, wie Sie wissen, immer noch als C ++ kompiliert). Lehre sie, was das Terminal wirklich ist, wie ihr Programm damit interagiert, dass ein String ein Array von Zeichen ist, das mit \ 0 im Speicher endet, was malloc ist und wie C ++ es abstrahiert, wie ein char und ein int im Speicher gespeichert sind , ect ... Diese Dinge lassen jemanden tatsächlich wissen, wie er ein Problem lösen kann, wenn er in der Entwicklung darauf stößt.

Ich kann nicht betonen, wie wichtig es ist, das Kinderprogramm zuzulassen und hauptsächlich dort zu sein, um Fragen zu beantworten. Nach meiner Erfahrung lernst du eine Sprache, indem du sie verwendest. Bücher und Lektionen können hilfreich sein und sind notwendig, um zu beginnen, aber am Ende sage ich, gib ihnen eine C / C ++ - Datei und sage: Dies ist ein Beispiel für X, ich möchte, dass Sie Y tun (was getan werden kann durch Hacken von X). Zeigen Sie ihnen, wie man Manpages benutzt (wenn sie * NIX benutzen), oder zeigen Sie ihnen cplusplus.com und lassen Sie sie die Standardbibliotheken erkunden, um die Dinge selbst herauszufinden.

TL; DR Lassen Sie die Kinder sich selbst unterrichten. Seien Sie dabei, um Struktur zu schaffen und Fragen zu beantworten.

Auch: Verknüpfte Listen sind die Wahrheit!

Bobak Hashemi
quelle
4

Sie bringen ihnen nicht generell das Programmieren bei, Sie bringen ihnen eine Art eingebettetes Programmieren mit Robotern und dergleichen bei. Wenn ich es richtig verstanden habe

Zunächst sollten Sie prüfen, welche Bibliotheken Sie verwenden möchten und welche Sie benötigen.

Wenn Sie zufällig eine C-Bibliothek zur Verwendung haben oder eine C-ähnliche Bibliothek mit vielen Zeigern und C-Arrays, dann brauchen Sie wahrscheinlich eine Möglichkeit, ihnen die Verwendung beizubringen oder warum Sie sie verwenden.

Sie können ihnen jedoch einige einfache Codes zeigen, um sie mit Zeichenfolgen und Vektoren vertraut zu machen. So funktioniert C ++. Das bedeutet nicht, dass Sie ihnen keine Zeiger beibringen können.

Vielleicht sollten Sie die Unterschiede zwischen C ++ auf niedriger Ebene (was C ähnelt) und C ++ auf hoher Ebene mit der STL deutlich machen. Eine der schwierigsten Aufgaben in C ++ für Anfänger ist es, herauszufinden, was C ist, was C ++ ist und welche unterschiedlichen System-APIs es gibt.

Da das Ziel hier nicht das Erlernen der allgemeinen Programmierung ist, sondern die Teilnahme an einem Roboterwettbewerb, habe ich den Unterricht so ausgerichtet.

Nikko
quelle
2

Ich habe Ende letzten Jahres angefangen C ++ zu unterrichten und diesen Sommer auch für unser FIRST Robotics Team.

Wir verwenden die Programmierung von Stroustrup - Prinzipien und Praxis unter Verwendung von C ++ . Ich fand das Buch zugänglich, lesbar und gut organisiert. Wir haben ungefähr 6 Studenten die Kapitel alleine durchlesen lassen. Ich bin da, um ihnen bei Terminologie und Fragen zu helfen. Sie machen alle Übungen im Buch.

Ich ließ die Schüler Kapitel 14 durcharbeiten. Überspringen der Kapitel in Streams (nicht nützlich für die FRC-Programmierung). Durch Kapitel 14 ist nützlich, weil sie eine Einführung in Unterklassen bekommen. Sie müssen jedoch wahrscheinlich weiter in dem Buch gehen, um Konstruktoren und Destruktoren, die sich auf Unterklassen beziehen, besser zu verstehen.

Unterschätzen Sie Ihre Schüler nicht. Die Schüler freuen sich, das Buch zu haben, es zu lesen, zu lernen und die Übungen zu machen. und das war im sommer auf eigene zeit! Es gibt viele Studenten, die das nicht verstehen. Sie sollten zu etwas anderem übergehen; nicht jeder versteht programmierung.

Die größte Barriere ist nicht die Sprache oder das Buch; Es ist die Entwicklungsumgebung. Visual Studio Express kann für Erstanwender entmutigend sein. Sie können den Schülern dabei helfen, sich auf die Programmierung und nicht auf die Umgebung zu konzentrieren. Das Erlernen der Umgebung ist jedoch wertvoll, da Programmierer viel Zeit damit verbringen, sich an neue Entwicklungssysteme anzupassen.

Viel Glück.

Bill Door
quelle
+1: Mit Abstand beste Antwort. Hervorragende Auswahl an Lehrbüchern. Herzlichen Glückwunsch zu Ihrem Erfolg.
Kevin Cline
1

Sie möchten ihnen C ++ beibringen, aber keine C-Konstrukte beibringen, aber die meisten Programmierkonstrukte, die sie zuerst kennen müssen, sind allen Sprachen gemeinsam, und die C ++ - Versionen sind in C verwurzelt:

  1. So erstellen Sie ein Programm [int main (..) {return 0; }]. Geben Sie einen grundlegenden Überblick über die Programmierumgebung, die Sie auch ausprobieren möchten. Sie müssen wissen, wie man ein Projekt erstellt und es tatsächlich kompiliert / ausführt.

  2. Dies ist eine Variable. Variablen können Daten speichern (int, char, float usw.).

  3. Strings (C ++ - Strings sind mit cin einfacher zu verwenden).

  4. So lesen und schreiben Sie Daten (cin, cout). "Hallo,% s!"

  5. Bedingungen (Computer müssen Entscheidungen treffen).

  6. Schleifen (Computer können immer wieder das Gleiche tun). Show while und for Schleifen.

Das sollte ungefähr zwei Stunden dauern. Stellen Sie sicher, dass Sie eine kurze Liste von Notizen erstellen, auf die in der praktischen Komponente verwiesen wird. Sie versuchen nicht, sie zu brillanten Programmierern zu machen. Geben Sie Beispiele dafür, wie Sie von der Konsole aus lesen, Strukturen erstellen und alles, was sie sonst noch tun müssten. Verwenden Sie nur sprachunterstützte Funktionen, keine benutzerdefinierten Dienstprogrammbibliotheken. Sie werden sie nur mehr verwirren.

Gehen Sie von Anfang an mit gutem Beispiel voran und zeigen Sie ihnen Beispiele für übersichtlichen Code. Die Einrückungen sollten korrekt sein und in Klammern stehen, die dem Stil entsprechen, mit dem Sie sich am wohlsten fühlen. Variablennamen sollten aussagekräftig sein. Wenn Sie Slop als Beispiel zeigen, werden sie feststellen, dass Slop akzeptabel ist. Es ist ein schlechter Ausgangspunkt. Betonen Sie, wie wichtig es ist, dass Einrückungen korrekt sind. Als das, was ich unterrichtete, ihren Code konsistent einrückte, konnten sie leichter erkennen, wo sie falsch liefen. Dies lag daran, dass die meisten ihrer Fehler einen falschen Bereich für Operationen darstellten (das Einfügen von Operationen in Schleifen / Bedingungen, die nicht vorgesehen waren, oder umgekehrt).

Dann machen Sie mit der praktischen Arbeit weiter. Der beste Weg, etwas zu lernen, ist es, es zu brechen und herauszufinden, warum. Sie sollten sicherstellen, dass sie eine benutzerfreundliche Umgebung haben, um ihren Code zu kompilieren. Dokumentieren Sie es mit Screenshots in Ihren Handouts.

Ein gutes Beispiel, das mir geholfen hat, einige der Konzepte zu entwickeln, war der Bau einer Cola-Maschine:

  • Ausgabe eines Menüs mit Artikeln und Preisen (Speichern des Menüs war ein Array einer benutzerdefinierten Struktur. Könnte eine Klasse in C ++ sein). Die Ausgabe erforderte eine Schleife.
  • Lesen Sie die Auswahl des Benutzers ein.
  • Bitten Sie den Benutzer um Geld. Sie könnten einfach den Münzwert in Cent eingeben (1, 5, 10, 20, 50, 100, 200 in Aus). Ignoriere unbekannte Konfessionen. Wenn der Benutzer nicht genug Geld eingezahlt hat, fragen Sie weiter (Schleifen).
  • Berechnen Sie die erforderliche Änderung (Modulo-Division) und geben Sie die geringste Anzahl von Münzen an. Drucken Sie die Ausgabe auf dem Bildschirm.
  • Warten Sie auf den nächsten Benutzer.

Danach können Sie zu C ++ - Konstrukten wechseln. Sie möchten nicht zu weit eintauchen, bevor sie zumindest ein Basisprogramm erstellen können.

Und vor allem haben Sie viel Zeit und Geduld, um sich Fragen zu widmen. Es wird viele geben, und die meisten werden dich erschrecken, weil sie so trivial sind, dass die Antwort für dich offensichtlich ist.

Adam Hawes
quelle
1

Ich denke, Sie sollten Dinge nicht aus C ++ - Sicht lehren ("C ++ Hallo Welt"), sondern aus der Sicht des Problems - in diesem Fall der Robotik -. Ihre Hallo-Welt würde also eine LED blinken lassen oder einen Motor antreiben.

Natürlich könnten / sollten Sie jede winzige Robotikaufgabe in eine Untergruppe von konzeptionell aussagekräftigen C ++ - Aktionen zerlegen, die Typen, Funktionen und E / A-Operationen umfassen.

Ich selbst bin kein professioneller Programmierer und habe versucht, Java, C ++ und Python zu lernen. Ich habe wirklich angefangen, etwas (Python) zu erreichen, als ich echte (einfache) Probleme zu lösen hatte. Das hat mich auf den Punkt gebracht, ohne übermäßige Aufmerksamkeit auf zufällige Implementierungsdetails der Sprache selbst zu richten.

Daher würde ich raten: Lies nicht das Handbuch einer Sprache, sondern lerne, Dinge mit der Sprache deiner Wahl zu tun. Das ist es, was die Leute motiviert, denke ich.

Heltonbiker
quelle
0

Ich würde strenges C ++ unterrichten. Weißt du, wie etwas Seltsames passiert, wenn du printf schreibst und es kleinen Params oder dem falschen Typ gibst? und wenn Sie ungültige Zeiger verwenden, können schlimme Dinge auftreten? LERNEN SIE DAS NICHT

Vom ersten Tag an unterrichtete ich, wie man Referenzen benutzt, STL und sagte, dass man MARKS verliert, wenn man Zeiger benutzt. Lehren Sie auch keine intelligenten Zeiger. Das einzige Mal, dass ich bemerke, dass ich Zeiger verwende, ist, wenn ich GUI und Objekte (wie ein Bildfeld) existiere und ein gültiges Bild oder null sein muss. Für die Konsolenprogrammierung verwende ich seit langem keine Zeiger (smart oder raw) mehr.

Also lehre sie kurz gesagt nichts, was ihnen Schwierigkeiten bereiten könnte. Unterrichten Sie Iostreams und Strukturen, und teilen Sie ihnen mit, dass sie auch beim Typografieren Spuren hinterlassen. Versuchen Sie nicht, Design zu unterrichten. Sie wollen nicht, dass jemand ein erfahrener Profi wird

user2528
quelle
0

Es ist keine C ++ - Vorlesungsreihe, aber Richard Bucklands COMP1917 ist eine hervorragend durchgeführte Vorlesungsreihe zum Programmieren in C (gefolgt von COMP1927 , Datenstrukturen).

Meiner Meinung nach ist C ++ für neue Studenten zu komplex, aber C ist um Welten einfacher und bietet eine gute Grundlage für die Systemprogrammierung, die neuen C ++ - Programmierern allzu oft fehlt.

greyfade
quelle
0

Ich würde mit einer großen Anzahl von Code-Bausteinen beginnen, ihnen dabei helfen, bei der Programmierung sofort etwas Gutes zu tun, und ihr Verständnis für die Funktionsweise der Dinge im Laufe der Zeit verfeinern. Sie müssen nicht alle Feinheiten von C ++ kennen oder verstehen, damit eine LED blinkt. Sie müssen nur wissen, "wenn Sie diesen Code dort ablegen, wird die LED blinken." Und dann: "Hey, lass uns darüber reden, was eine Schleife jetzt ist. Wenn du eine Schleife schreibst, kannst du die LED 50-mal blinken lassen, ohne 50 Codezeilen schreiben zu müssen. Ist das nicht cool?" Lassen Sie uns nun über die Bedingungen sprechen. Wenn der Benutzer die Taste A auf der Steuerbox drückt, möchten wir die Pneumatik aktivieren, um eine Flagge zu hissen. Hier ist, wie wir Code hinzufügen, um dies zu tun. Oder wenn der Schalter 2 an unserer Steuerbox eingeschaltet ist, lassen wir den Bohrmotor in umgekehrter Richtung statt in Vorwärtsrichtung laufen.

Wenn Sie sich darauf konzentrieren, sie "gerade genug" zu unterrichten, um die Probleme zu lösen, an denen sie interessiert sind, werden die Dinge viel weniger überwältigend und zugänglicher. Wenn sie wirklich interessiert sind und die Feinheiten verstehen wollen, werden sie wahrscheinlich zurückgehen und ein umfassendes Buch über Programmierung lesen oder einen Sommerschulkurs bei der örtlichen JC besuchen.

Machen Sie eine Liste der "Dinge, die sie steuern können" auf ihrem Roboter und machen Sie aus jedem eine Lektion ... was müssen sie mindestens wissen, um ...?

  • Etwas "cool aussehendes" machen, wenn sich ein Schalter in einer bestimmten Einstellung befindet?
  • ein pneumatisches Ventil anweisen, sich zu öffnen oder zu schließen (z. B. ein Greiferaufsatz)?
  • Bohrmotoren ein- und ausschalten (für den Antriebsstrang)?
  • den Roboter die Richtung ändern lassen, wenn ein Hinderniserkennungssensor aktiviert ist?
  • den Roboter zwischen dem 2-Rad- und dem 4-Rad-Modus wechseln lassen?
  • Empfindlichkeit des Joysticks einstellen?
  • etc.

Ich würde mich daran halten, die Konstrukte zu lehren, die am besten für Kinder geeignet sind, wie ich Cout über Printf lehren würde, da Formatspezifizierer sehr einfach zu verwechseln sind und ein falscher Spezifizierer oft ein automatisches Rezept ist, um Ihr Programm zum Absturz zu bringen. Ebenso verschleiert der Vektor einige der Speicherverwaltungskomplexitäten. Machen Sie sich keine Gedanken darüber, wie die Dinge funktionieren oder wie die STL-Bibliothek aussieht. Sie müssen nur das Mindeste wissen, um X zu erreichen (was zum Beispiel die Verwendung einer STL-Bibliotheksdatenstruktur erfordern könnte).

Jessica Brown
quelle
0

Verwenden Sie, wie C ++ von Deitel und Deitel programmiert wird. AUSGEZEICHNETES Lehrbuch meiner Meinung nach.

Klingt so, als würden Sie Anfängern beibringen, wie man programmiert, und sie gleichzeitig auf fortgeschrittenem Niveau programmieren lassen. Wenn Sie hoffen, ihnen einen Affen zu geben, dann tun Affen Codierungsschnipsel, ohne zu verstehen, dass Sie zum Scheitern verurteilt sind.

Halten Sie sich für einen Anfängerkurs von STL fern.

Wenn Sie bereits eine Codierungslösung für Ihren Roboter haben - oder eine SEHR GUTE IDEE, wie sie aussehen wird -, können Sie die Lektionen im Lehrbuch möglicherweise den Codierungsaufgaben für den Roboter zuordnen. Aber lassen Sie das Lehrbuch das Lernen vorantreiben.

Wenn Sie die Codierung erzwingen, den Schülern sehr enge Lektionen erteilen und der Sprache ausgesetzt sind, wird der Ozean an Code, den Sie schreiben, meiner Meinung nach immer größer. Es ist, als hätten Sie gerade das Hundepaddeln gelernt, und Sie ertrinken, weil Sie WIRKLICH schwimmen ist erforderlich.

Es ist nicht eine Frage von "sollten sie cout oder printf lernen?" Es geht darum, genug zu lernen, um zu verstehen, wie man Code für bestimmte Roboterprogrammierungsaufgaben schreibt, die gelöst werden müssen.

Wenn dies eine Leseaufgabe wäre, was wären die Ergebnisse, wenn alles, was sie wüssten, einfache Subjekt-Verb-Sätze wären und nur die Hälfte des Vokabulars, das Sie WISSEN , benötigt wird.

Radarbob
quelle