it-swarm.dev

Erstmalige Schüler in C ++ unterrichten: Wo soll die Grenze gezogen werden?

Ich werde ein Team von Schülern für den ERSTEN Robotikwettbewerb 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 Programmieren beizubringen (z. B. Python oder Javascript wäre meiner Meinung nach einfacher gewesen), aber die Wahl ist festgelegt.

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

  • Sollte ich vom ersten Tag an mit STL beginnen, insb. vector oder einfach bei Standard-Arrays bleiben? Arrays sind einfacher einzuführen, aber die Zeigerfehler sind möglicherweise schwerer zu erkennen.
  • Sollte ich mich bei E/A an cout usw. halten oder ist printf Ihrer Meinung nach leichter 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 alle ein ausgezeichneter Text ist.

35

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 den Leuten beibringen können, Arrays zu verstehen, ohne neben Variablen und der zugrunde liegenden Computerarchitektur noch viel anderes zu verstehen, aber Sie können ihnen nicht beibringen, vector zu verstehen, ohne ihnen zuerst Klassen beizubringen. Wenn Sie die STL von Anfang an verwenden, müssen Ihre Schüler nur damit leben, dass sie keine Ahnung haben, wie vector genau funktioniert. Und wenn Sie an diesem Punkt angelangt sind, haben sie nicht genügend Verständnis für Zeiger und Arrays und Dinge, die Sie erhalten, wenn Sie Dinge wie das Schreiben Ihrer eigenen Vektorklasse, das Schreiben Ihrer eigenen verknüpften Listenklasse usw. tun, die erforderlich sind seine Funktionen zu schätzen und zu nutzen. Es ärgert mich, wenn Schüler sagen "Was ist das?" und die Lehrer sagen: "Ignoriere es einfach, du wirst es später lernen."

Und wie Demian in den Kommentaren hervorhob, ist das Entschlüsseln der relativ kryptischen Nachrichten, die Sie von Vorlagenfehlern erhalten, erheblich schwieriger als das Verstehen der Fehler, die Sie möglicherweise von Arrays/erhalten. Nicht-Template-Konstrukte.

Bei cout und printf sehe ich das nicht so. Keiner ist niedriger als der andere, außer dass cout Operatorüberladung verwendet.

Das mag dumm erscheinen, aber ich bin absolut fanatisch , wenn es darum geht, dass die Leute die grundlegenden Bausteine ​​von alles verstehen, bevor sie umziehen weiter zu den Abstraktionen. 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 Teilung beizubringen und sie dann einen Taschenrechner benutzen zu lassen, als sie einen Taschenrechner benutzen zu lassen und ihnen danach die lange Teilung beizubringen.

Informationen zu Büchern für Anfänger finden Sie in der Master-Liste guter C++ - Bücher .

40
Seth Carnegie

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

Wenn ich zurückblicke, als ich mit dem Programmieren anfing, wünschte ich mir wirklich, ich hätte etwas über das Gedächtnis gelernt zuerst. Nein, es ist nicht aufregend. Es wird dich glasieren lassen. Aber es ist ein lächerlich einfaches Konzept zu unterrichten. 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 Zelle 3 eingefügt wird. "A" ist der Wert und 3 ist die Adresse. IN ORDNUNG? Dies ist die Nummer 3, die in Zelle 5 eingegeben 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 ein Verweis auf die Adresse sein 3. Genau wie 1 eine Nummer oder ein Land sein könnte Code. Es ist nur eine Zahl, alles hängt davon ab, wie wir damit umgehen.

Lektion 2:
Lass uns lernen, binär zu zählen. Zählen wir mit binärer Fingerzählung bis 10. Interessant nein? Sehen Sie, wie das nur 4 Finger brauchte? Wir sagen also, dass nur 4 Bits benötigt werden (1/2 Zelle). Was ist der höchste Wert, auf den Sie 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 Bit hat. Fragen Sie, was passiert, wenn eine Zahl mehr als 8 Bit benötigt. Wie würden sie eine Multi-Byte-Nummer (auf logische Weise) speichern? Führen Sie sie in Zeichen, Shorts, Ganzzahlen und Longs ein.

Lektion 3:
Hier ist ein Programm, das ich in C++ geschrieben habe. Es werden 32-Bit-Ganzzahlen verwendet. Und das hier ist auch eine Zahl. 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, oder?

und so weiter. Sobald Sie das Grundgedächtnis aufgebraucht haben, ist alles andere Kuchen. Es sind die armen Schüler, die davon ausgehen, dass der Compiler etwas Magisches tut (oder dass sie nie über Speicherverwaltung nachdenken müssen), die am meisten zu kämpfen haben. Und C++ trübt das Wasser, weil einige Dinge automatisch bereinigt werden (d. H. Ein normaler Vektor), während andere Dinge nicht bereinigt werden (d. H. Ein Vektor, der mit "neu" zugewiesen wurde). Und lass mich nicht einmal mit Strings anfangen (char * vs. std :: string - versuche das ohne Zeigerwissen zu erklären).

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

EDIT

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

38
Chris Eberle

Sollte ich vom ersten Tag an mit STL beginnen, insb. Vektor oder einfach bei Standard-Arrays bleiben? Arrays sind einfacher einzuführen, aber die Zeigerfehler sind möglicherweise schwerer zu erkennen.

verwenden Sie auf jeden Fall Standardbibliothekstypen. ein std::string oder std::vector ist 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 viel 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 Sprachtypen arbeiten und bei Bedarf die Implementierungsdetails erläutern (und wenn sie eine haben) besseres Verständnis, was ein Array ist und wo sie verwendet werden).

die Syntax von std::vector (erstellen/lesen/schreiben) ist nicht viel komplizierter als das 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 lernen, zu lehren und zu verwenden.

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

cout. Ich persönlich denke, cout ist leichter zu lernen. Vielleicht noch wichtiger ist, dass Sie cout wählen, da es sicherer und vielseitiger ist und Sie definieren können, wie ein Objekt gedruckt wird. Dies bedeutet, dass Sie bereits über Funktionen und Typensicherheit verfügen, die einige Standardbibliothekstypen verwenden. Schließlich erhalten Sie nur gemischte Programme, wenn Sie feststellen, dass diese möglicherweise zusätzlich zu cout auch printf lernen müssen.

tatsächlich denke ich, Sie sollten Accelerated C++, von Koenig und Moo lesen und es möglicherweise als Anweisung verwenden (Frage 3 indirekt beantworten). in dem Buch stellen sie std::cout kurz vor return (Seite 3), und speichern Sie 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. (Hinweis: Ich empfehle Ihnen, es zu lesen, um C++ zu unterrichten.).

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 einige Hintergrundinformationen zur Programmierung im Allgemeinen voraussetzt), möchten Sie vielleicht Eckels Denken in C++ . Ich habe es nicht gelesen, aber es ist ein frei verteilter C++ - Intro-Text.

31
justin

Eine zu berücksichtigende Sache ist, dass in typischen FIRST-Code-Datenstrukturen jeglicher Form (Strukturen, Klassen, Arrays, Vektoren, Listen) eine sehr kleine Rolle spielen. Sie verarbeiten normalerweise eine sehr kleine Menge von Sensordaten und verwenden sie, um eine sehr kleine Menge von Aktuatorbewegungen zu bestimmen.

Aber was tut eine große Rolle spielt und sehr schwer zu verstehen sein kann, sind all die verschiedenen Formen von Kontrolle, die weitergehen.

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

... aber dann wird es schwieriger. Jeder Robotercode mittlerer Größe erreicht 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. Wenn Sie darüber nachdenken, wie sich ein Programm durch Code wie diesen bewegt, ist dies verwirrend. Sie werden es jetzt vielleicht nicht bemerken, aber es ist es. Es wird Ihren Schülern viel mehr Probleme bereiten als die Sprache selbst.

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

11
Owen
  • Sollte ich vom ersten Tag an mit STL beginnen, insb. vector oder einfach bei Standard-Arrays bleiben? Arrays sind einfacher einzuführen, aber die Zeigerfehler sind möglicherweise schwerer zu erkennen.

Das Problem bei Arrays ist, dass alles außer einfachen Lehrbuchbeispielen Arrays mit dynamischer Größe erfordert. In dem Moment, in dem Sie Arrays mit dynamischer Größe benötigen, ist std::vector So viel einfacher. Die einzige Möglichkeit, Arrays mit dynamischer Größe sicher zu handhaben, besteht darin, sie in Ihre eigene Klasse einzubinden. Dies wäre eine schlechte Abzocke std::vector.
Entgegen der unerklärlichen landläufigen Meinung können Schüler verwenden Funktionen, bei denen komplexe Mechaniken implementiert werden müssen, ohne zu wissen, wie implementiert werden solche Bestien selbst. Wie ich in einem Kommentar gesagt habe: Sie würden nicht einmal daran denken, Strings nicht in anderen Sprachen zu unterrichten, nur weil ihre Implementierung komplex ist, oder?

  • Sollte ich mich bei E/A an cout usw. halten oder ist printf Ihrer Meinung nach leichter zu lernen?

Warum sollte eine Reihe von Zeichenfolgenkonventionen im archaischen Format, die Ihr Programm in dem Moment in die Luft jagen, in dem Sie etwas falsch machen (was passiert, wenn Sie ein typedef in einem scheinbar nicht verwandten Header ändern), der Typensicherheit vorzuziehen sein? von std::cout?

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

Die meisten C++ - Ressourcen, ob online oder nicht, sind schlecht. Und ich spreche nicht über die Verwendung schwer lesbarer Schriftarten oder Sprachen. Ich spreche von offensichtlich offensichtlichen sachlichen Fehlern. Es gibt nur sehr wenige gute C++ - Ressourcen, meistens ein oder zwei Dutzend Bücher . Der einzige, den ich kenne, der online ist, ist Bruce Eckels Denken in C++.


Seit einem Jahrzehnt unterrichte ich Schüler mit sehr unterschiedlichem Hintergrund in C++ mit Koenig/Moos Accelerated C++ als Basis. Mein Kurs hat sich in diesem Jahrzehnt sehr verändert und ist jetzt nicht mehr in der Nähe des Buches, abgesehen von dem zugrunde liegenden Prinzip: Verwenden Sie von Anfang an die modernen, korrekten und sicheren Redewendungen. Bringen Sie Ihren Schülern nicht bei, wie man das Gedächtnis manuell manipuliert, nur damit sie das später zugunsten sicherer Redewendungen verlernen. Wie Sie an einigen der hier gegebenen Antworten sehen können, funktioniert dies nicht: Diejenigen, die einmal die manuellen Methoden zuerst gelernt haben, werden den Vorteil der Verwendung moderner, sicherer Redewendungen selten verstehen.

8
sbi

Soll ich STL vom ersten Tag an verwenden ...?

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

Soll ich mich bei E/A 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 gelehrt 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 die beliebten, aber schrecklichen C++: How to Program und alle Sam's Teach Yourself C++ ... Bücher.

7
kevin cline

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

7
K-ballo

Ich habe in meinem Leben eine Reihe von Programmierkursen von der High School bis zum College besucht. Ich kann sagen, dass ich von meiner ersten C++ - Klasse wirklich nicht zu viel gelernt habe, außer wie man Dinge in einem Stream druckt.

Mein Rat als junger Student, der erst in den letzten Jahren als Entwickler wirklich gearbeitet hat, ist, die Dinge nicht dumm zu machen. Sagen Sie ihnen, was sie tun und wie es bis auf Betriebssystemebene funktioniert (Sie müssen nicht in comp eng IMO einsteigen).

Ich denke, ihnen C beizubringen ist ein besserer Weg, dies zu tun (es wird immer noch fast immer als C++ kompiliert, wie Sie wissen). Unterrichten Sie sie, was das Terminal wirklich ist, wie ihr Programm damit interagiert, dass eine Zeichenfolge ein Array von Zeichen ist, die mit einer\0 im Speicher enden, was malloc ist und wie C++ es abstrahiert, wie ein Zeichen und ein int im Speicher gespeichert werden , ect ... Diese Dinge lassen jemanden tatsächlich wissen, wie man ein Problem löst, wenn er in der Entwicklung darauf stößt.

Ich kann nicht betonen, wie wichtig es ist, dass die Kinder programmieren und hauptsächlich da sind, um Fragen zu beantworten. Nach meiner Erfahrung lernen Sie eine Sprache, indem Sie sie verwenden. Bücher und Lektionen können hilfreich sein und sind notwendig, um loszulegen, aber am Ende sage ich, gib ihnen eine C/C++ - Datei und sage: Dies ist ein Beispiel für X, ich möchte, dass du Y machst (was gemacht werden kann) durch Hacken von X). Zeigen Sie ihnen, wie man Manpages verwendet (wenn sie * NIX verwenden) 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 da, um Struktur zu schaffen und Fragen zu beantworten.

Auch: Verknüpfte Listen sind die Wahrheit!

5
Bobak Hashemi

In der High School wurde mir C++ als erste Programmiersprache beigebracht, obwohl es war eher wie "C +" war, jetzt wo Sie es erwähnen; Wir haben cout verwendet, um Text in die Konsole und in die Dateien zu schreiben, 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 zielorientierten Lehrplans: Beginnen Sie damit, zu zeigen, wie Dinge ausgegeben werden, dann Tastatureingaben, dann einfache Datei-E/A usw. Fahren Sie mit einem einfachen Text fort. basiertes Spiel (oder das Robotik-Äquivalent). Wenn sie dann fragen: "Wie mache ich X?", Können Sie X anhand von Beispielen aufschlüsseln, die sie bereits gesehen haben, z. "Zuerst müssen Sie die Eingabe vom Benutzer erhalten, wie wir es in Z getan haben, dann ..." (offensichtlich ist dies in der Praxis nicht so einfach, da X wahrscheinlich etwas ist, für das sie zusätzliches Wissen benötigen. zB "3D-Grafik", aber Sie könnten trotzdem erklären, wie es würde auf hoher Ebene funktionieren).

Beispiele, die Sie ihnen zeigen, beginnen als durch Blackbox kopierte 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 lernen, aber sie werden wahrscheinlich nicht erkennen, dass ein boolescher Ausdruck nicht ausschließlich auf die Verwendung innerhalb der Bedingung eines if beschränkt ist (was zu einer klassischen if (blah) return true; else return false; führt) Code).

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 Sie die Dinge nicht erklären sollten; Nur, dass Sie nicht alles auf einmal erklären können und das, was Sie erklären, nicht vollständig absorbiert wird. Menschen lernen organisch, nicht linear. Ich habe cout für ein paar Jahre verwendet, bevor ich richtig verstanden habe, was Operatorüberladung ist!

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

C++ ist eine komplexe Sprache, und unabhängig davon, was Sie tun, geht Ihren Schülern ein erheblicher Teil dieser Komplexität (und der des Programmierhandwerks im Allgemeinen) verloren. Alles, was Sie ihnen zeigen, wird für sie 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 der Stapel und der Heap sind, Zeiger, Klassen, sogar Schleifen und If-else-Ketten wird nicht richtig verstanden von der Mehrheit. 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 mit dem Namen x_2r. Das Wichtigste ist, dass die Schüler ständig lernen und sich verbessern. Black Boxes sind in Ordnung, solange sie auf lange Sicht transparent (oder zumindest durchscheinend grau) werden. Am Ende des Kurses wissen sie möglicherweise nicht, was Designmuster sind, aber sie sollten in der Lage sein, auf die Programme zurückzublicken, die sie in den ersten Wochen geschrieben haben, und zusammenzucken auf ihren Code. Sie sollten genau wissen, 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.

5
Cameron

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

Zunächst sollten Sie überprüfen, welche Bibliotheken Sie verwenden und was Sie benötigen.

Wenn Sie zufällig eine C-Bibliothek oder C-ähnliche mit vielen Zeigern und C-Arrays haben, dann brauchen Sie wahrscheinlich eine Möglichkeit, ihnen beizubringen, wie man sie benutzt oder warum Sie sie benutzen.

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

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

Da das Ziel hier nicht darin besteht, allgemeine Programmierung zu lernen, sondern an einem Roboterwettbewerb teilzunehmen, habe ich den Unterricht so ausgerichtet.

4
Nikko

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

Wir verwenden Stroustrups Programmierung - Prinzipien und Praxis mit C++ . Ich habe festgestellt, dass das Buch zugänglich, lesbar und gut organisiert ist. Wir haben ungefähr 6 Schüler die Kapitel selbst durchlesen lassen. Ich bin da, um ihnen mit 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 erhalten. Sie müssen jedoch wahrscheinlich weiter im Buch gehen, um Konstruktoren und Destruktoren in Bezug auf Unterklassen besser zu verstehen.

Unterschätzen Sie Ihre Schüler nicht. Die Schüler sind froh, das Buch zu haben, zu lesen, zu lernen und die Übungen zu machen; und das war im Sommer in ihrer Freizeit! Es gibt viele Studenten, die nicht verstehen. Sie sollten zu etwas anderem übergehen; Nicht jeder versteht die Programmierung.

Die größte Barriere ist nicht die Sprache oder das Buch; Es ist die Entwicklungsumgebung. Visual Studio Express kann für Erstbenutzer entmutigend sein. Sie können den Schülern dabei helfen, sich eher auf die Programmierung als 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.

2
Bill Door

Sie sagen, Sie möchten ihnen C++ beibringen, aber ihnen 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 sollen. 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++ 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). Zeigen Sie während und für Schleifen.

Das sollte ungefähr zwei Stunden pro Stunde dauern. Stellen Sie sicher, dass Sie einen kurzen Satz von Notizen vorbereiten, auf die in der praktischen Komponente verwiesen werden kann. Sie versuchen nicht, sie zu brillanten Programmierern zu machen. Geben Sie also Beispiele für das Lesen von der Konsole, das Erstellen von Strukturen und alles andere, was sie tun müssten. Verwenden Sie nur sprachunterstützte Funktionen, keine benutzerdefinierten Dienstprogrammbibliotheken. Sie werden sie nur noch 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, die Klammern und Klammern sollten dem Stil entsprechen, mit dem Sie sich am wohlsten fühlen. Variablennamen sollten aussagekräftig sein. Wenn Sie Slop als Beispiel zeigen, werden sie lernen, dass Slop akzeptabel ist. Es ist ein schlechter Ausgangspunkt. Betonen Sie, wie wichtig es ist, die Einrückung korrekt zu machen. Ich stellte fest, dass sie, wenn die Menge, die ich unterrichtete, ihren Code konsistent einrückte, leichter erkennen konnten, wo sie falsch liefen. Dies lag daran, dass die meisten ihrer Fehler einen falschen Bereich für Operationen darstellten (Operationen in Schleifen/Bedingungen einfügen, die nicht beabsichtigt waren, oder umgekehrt).

Dann gehen Sie zur praktischen Arbeit über. Der beste Weg, etwas zu lernen, besteht darin, es zu zerbrechen und herauszufinden, warum. Sie sollten sicherstellen, dass sie eine benutzerfreundliche Umgebung zum Kompilieren ihres Codes haben. Dokumentieren Sie es mit Screenshots in Ihren Handouts.

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

  • Geben Sie ein Menü mit Artikeln und Preisen aus (das Speichern des Menüs war ein Array einer benutzerdefinierten Struktur. Könnte eine Klasse in C++ sein). Für die Ausgabe war eine Schleife erforderlich.
  • 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). Ignorieren Sie unbekannte Stückelungen. Während der Benutzer nicht genug Geld investiert hat, fragen Sie weiter (Schleifen).
  • Berechnen Sie die erforderliche Änderung (Modulo-Division) unter Angabe der geringsten Anzahl von Münzen. 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 Freizeit und Geduld, um sich Fragen zu widmen. Es wird viele geben, und die meisten von ihnen werden dich zusammenzucken lassen, weil sie so trivial sind, dass die Antwort für dich offensichtlich ist.

1
Adam Hawes

Ich denke, Sie sollten die Dinge nicht aus C++ - Sicht ("C++ Hallo Welt") unterrichten, sondern aus Sicht der Problemdomäne - in diesem Fall der Robotik. Ihre Hallo-Welt würde also eine LED blinken lassen oder einen Motor fahren.

Natürlich könnten/sollten Sie jede winzige Robotikaufgabe in eine Teilmenge zunehmender konzeptionell bedeutsamer C++ - Aktionen zerlegen, die Typen, Funktionen und IO Operationen) umfassen.

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

Ich würde also raten: Lesen Sie nicht das Handbuch einer Sprache, sondern lernen Sie, Dinge mit der Sprache Ihrer Wahl zu tun. Das ist es, was die Leute motiviert, denke ich.

1
heltonbiker

Ich würde striktes C++ unterrichten. Sie wissen, wie etwas Seltsames passiert, wenn Sie printf schreiben und es kleinen Parametern oder dem falschen Typ geben? und wenn Sie ungültige Zeiger verwenden, können schlimme Dinge auftreten? UNTERRICHTEN SIE DAS NICHT

Vom ersten Tag an würde ich lehren, wie man Referenzen verwendet, STL und sagen, dass Sie MARKS für die Verwendung von Zeigern verlieren. Lehren Sie auch keine intelligenten Zeiger. Das einzige Mal, dass ich bemerke, dass ich Zeiger verwende, ist, wenn ich eine GUI mache und Objekte (wie ein Bildfeld) existieren und ein gültiges Bild oder null sein müssen. Für die Konsolenprogrammierung habe ich lange Zeit keine Zeiger (intelligent oder roh) mehr verwendet.

Kurz gesagt, bringen Sie ihnen nichts bei, was ihnen Probleme bereiten kann. Unterrichten Sie iostreams, Strukturen, sagen Sie ihnen, dass sie auch beim Typecast Markierungen verlieren, und versuchen Sie nicht, Design zu unterrichten. Sie wollen nicht, dass jemand ein erfahrener Profi wird

0
user2528

Ich würde mit bedeutenden Teilen des Boilerplate-Codes beginnen, ihnen helfen, sofort etwas Cooles mit der Programmierung zu tun, und ihr Verständnis dafür verfeinern, wie die Dinge im Laufe der Zeit funktionieren. Sie müssen nicht alle Feinheiten von C++ verstehen oder verstehen, damit eine LED blinkt. Sie müssen nur wissen, "wenn Sie diesen Code dort einfügen, blinkt die LED." Und dann "Hey, lass uns darüber sprechen, 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 Bedingungen sprechen. Wenn der Benutzer die Taste A am Steuerkasten drückt, möchten wir die Pneumatik aktivieren, um eine Flagge zu hissen. Hier erfahren Sie, wie Sie dazu Code hinzufügen. Oder wenn der Schalter 2 an unserer Steuerbox auf Ein gestellt ist, lassen wir den Bohrmotor rückwärts statt vorwärts laufen. So sieht eine bedingte Aussage aus und wie wir dem Bohrmotor mitteilen, in welche Richtung er laufen soll ....

Wenn Sie die Dinge darauf konzentrieren, sie "gerade genug" zu lehren, 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 oder einen Sommerschulkurs bei der örtlichen JC lesen.

Machen Sie eine Liste der "Dinge, die sie steuern wollen" auf ihrem Roboter und verwandeln Sie jede in eine Lektion ... was müssen sie am wenigsten wissen ...?

  • etwas "cool aussehendes" tun, 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 2-Rad- und 4-Rad-Antrieb umschalten lassen?
  • empfindlichkeit des Joysticks einstellen?
  • usw.

Ich würde mich daran halten, die Konstruktionen zu unterrichten, die am kinderleichtesten sind, wie ich Cout über printf unterrichten würde, da Formatspezifizierer sehr einfach zu verwechseln sind und ein falscher Spezifizierer oft ein automatisches Rezept zum Absturz Ihres Programms ist. Ebenso verschleiert der Vektor einige der Komplexitäten der Speicherverwaltung. Sorgen Sie sich nicht um jedes Detail, wie die Dinge funktionieren oder was die STL-Bibliothek ist, sondern um das Mindeste, was sie wissen müssen, um X zu erreichen (was beispielsweise die Verwendung einer STL-Bibliotheksdatenstruktur erfordern könnte).

0
Jessica Brown

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

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

0
greyfade

Verwenden Sie Programmieren von C++ von Deitel und Deitel. AUSGEZEICHNETES Lehrbuch meiner Meinung nach.

Klingt so, als würden Sie Anfängern das Programmieren beibringen und sie gleichzeitig auf einem fortgeschrittenen Niveau programmieren lassen. Wenn Sie hoffen, ihnen einen Affen zu geben, sehen Sie, wie der Affe Snippets codiert, ohne zu verstehen, dass Sie zum Scheitern verurteilt sind.

Halten Sie sich für eine Anfängerklasse von STL fern.

Wenn Sie bereits eine Codierungslösung für Ihren Roboter haben - oder eine SEHR GUTE IDEA, 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 das Codieren zwangsernähren, den Schülern sehr enge Lektionen erteilen und die Sprache kennenlernen, wird der Ozean des Codes, den Sie schreiben, immer größer. Es wird so sein, als hätten Sie gerade gelernt, Paddel zu verfolgen, und Sie werden ertrinken, weil WIRKLICH schwimmen ist erforderlich.

Es geht nicht um "sollten sie Cout oder Printf lernen?" Es geht darum, genug zu lernen, um einen Einblick in das Schreiben von Code für bestimmte zu lösende Roboterprogrammieraufgaben zu erhalten.

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 würde.

0
radarbob