Wie man lehrt, um Schwierigkeiten zu überwinden und gleichzeitig Zyklen zu schreiben

Trotz der Tatsache, dass wir uns auf eines der Grundthemen konzentrieren werden, ist dieser Artikel für erfahrene Fachleute geschrieben. Ziel ist es zu zeigen, welche Missverständnisse Anfänger in der Programmierung haben. Für praktizierende Entwickler sind diese Probleme seit langem gelöst, vergessen oder gar nicht bemerkt worden. Ein Artikel kann nützlich sein, wenn Sie plötzlich jemandem bei diesem Thema helfen müssen. Der Artikel zieht Parallelen zu Material aus verschiedenen Büchern über Programmierung von Shildt, Straustrup, Okulov.

Das Thema Zyklen wurde gewählt, weil ziemlich viele Leute beim Beherrschen der Programmierung darauf verzichten.

Diese Technik ist für schwache Schüler konzipiert. In der Regel bleiben diejenigen, die in diesem Thema stark sind, nicht hängen und müssen keine speziellen Techniken für sie erfinden. Das sekundäre Ziel des Artikels ist es, diese Methodik von der Klasse "funktioniert für alle Schüler, aber nur für einen Lehrer" auf die Klasse "funktioniert für alle Schüler, alle Lehrer" zu übertragen. Ich gebe nicht vor, absolut originell zu sein. Wenn Sie bereits eine ähnliche Technik anwenden, um dieses Thema zu unterrichten, schreiben Sie bitte, wie sich Ihre Version unterscheidet. Wenn Sie sich für eine Bewerbung entscheiden, teilen Sie uns anhand der Ergebnisse mit, wie alles gelaufen ist. Wenn eine ähnliche Technik in einem Buch beschrieben wird, schreiben Sie bitte den Namen.


Ich habe diese Technik 4 Jahre lang geübt und dabei individuell mit Schülern unterschiedlicher Ausbildungsstufen gelernt. Nur etwa fünfzig Schüler und zweitausend Stunden Unterricht. Anfangs blieben die Schüler bei diesem Thema und gingen für immer. Nach jedem Schüler wurden die Methodik und die Materialien angepasst. Letztes Jahr haben sich die Schüler nicht mehr mit diesem Thema beschäftigt, deshalb habe ich beschlossen, meine Best Practices zu teilen.

Warum so viele Briefe? Zyklen sind elementar!


Wie ich oben geschrieben habe, kann die Komplexität des Zykluskonzepts für praktizierende Entwickler und für starke Studenten unterschätzt werden. Sie können beispielsweise eine lange Vorlesung arrangieren, nickende Köpfe und kluge Augen sehen. Aber wenn Sie versuchen, ein Problem zu lösen, beginnen dumme und unerklärliche Probleme. Nach der Vorlesung entwickelten die Studierenden wahrscheinlich nur ein Teilverständnis. Die Situation wird durch die Tatsache verschärft, dass die Schüler selbst nicht sagen können, was genau ihr Fehler ist.
Einmal wurde mir klar, dass die Schüler meine Beispiele als Hieroglyphen wahrnehmen. Das heißt, als unteilbare Textstücke, in denen Sie eine Art "magischen" Buchstaben hinzufügen müssen, und es wird funktionieren.
Manchmal bemerkte ich, dass die Schüler denken, dass zur Lösung eines bestimmten Problems eine andere Konstruktion erforderlich ist, die ich nur noch nicht erzählt habe. Obwohl die Lösung nur eine kleine Modifikation des Beispiels erforderte.

Daher kam mir die Idee, dass der Schwerpunkt nicht auf der Syntax von Ausdrücken liegen sollte, sondern auf der Idee, sich wiederholenden Code mithilfe von Schleifen umzugestalten. Sobald die Schüler diese Idee beherrschen, wird jede Syntax mit ein wenig Übung verschärft.

Wem und warum unterrichte ich?


Da es keine Aufnahmeprüfungen gibt, kann es im Klassenzimmer sowohl starke als auch sehr schwache Schüler geben. Weitere Details zu meinen Schülern finden Sie im Artikel Porträt von Schülern von Abendkursen.
Ich habe versucht sicherzustellen, dass jeder, der es will, die Programmierung beherrscht.
Meine Kurse finden einzeln statt und der Schüler zahlt sein Geld für jeden. Es scheint, dass die Schüler die Kosten optimieren und ein Minimum benötigen. Menschen besuchen jedoch keine Vollzeitklassen mit einem Live-Lehrer wegen des Wissens selbst, sondern wegen des Vertrauens, das sie gelernt haben, wegen des Fortschrittsgefühls und wegen der Zustimmung eines Experten (Lehrers). Wenn die Studierenden keine Fortschritte in ihrem Studium spüren, werden sie gehen. Im Allgemeinen können Klassen so gestaltet werden, dass die Schüler Fortschritte bei der Erhöhung der Anzahl bekannter Designs spüren. Das heißt, zuerst lernen wir im Detail, dann lernen wir, dann machen wir und jetzt haben wir einen Kurs für tausendundeine Nächte, in dem wir Zyklen nur zwei Monate lang studieren, und am Ende haben wir einen Studenten, der eine diktierte Standardbibliothek geschrieben hat. Um praktische Probleme zu lösen, braucht man jedoch nicht nur Kenntnisse über das Material, sondern auch Unabhängigkeit in seiner Anwendung und bei der Suche nach neuen Informationen. Daher halte ich für Vollzeitkurse das Prinzip für richtig - ein Minimum zu unterrichten und das unabhängige Studium von Nuancen und verwandten Themen zu fördern. Beim Thema Schleifen halte ich das while-Konstrukt für ein Minimum. Darauf können Sie das Prinzip verstehen. Wenn Sie das Prinzip kennen, können Sie es sowohl für sich selbst als auch für sich selbst meistern.

Es reicht nicht aus, die Syntax zu beschreiben, um das Material von schwachen Schülern zu beherrschen. Sie müssen einfachere, aber vielfältigere Aufgaben geben und Beispiele detaillierter malen. Letztendlich ist die Entwicklungsgeschwindigkeit durch die Fähigkeit des Schülers begrenzt, Ausdrücke zu transformieren und nach Mustern zu suchen. Für kluge Schüler werden die meisten Aufgaben langweilig. Wenn Sie mit ihnen üben, können Sie nicht darauf bestehen, 100% der Aufgaben zu lösen. Mein Material kann auf meinem Github angesehen werden . Das Repository ist zwar eher wie ein Zauberbuch eines Hexenmeisters - niemand außer mir wird verstehen, was sich befindet , und wenn Sie die Prüfung nicht bestehen, können Sie verrückt werden

Praxisorientiertes Üben


Die Theorie wird am Beispiel der Problemlösung erklärt. In den Kursen zu den Grundlagen der Programmierung, in denen Verzweigungen und Schleifen studiert werden, können Sie eine ganze Stunde lang keinen nützlichen Vortrag zu einem Thema halten. 15-20 Minuten reichen aus, um das Konzept zu erklären. Die Hauptschwierigkeiten treten bei der Ausführung praktischer Aufgaben auf.
Anfänger können Anweisungen, Zweige, Schleifen und Arrays in einer Vorlesung speichern. Hier sind nur die Schüler, denen das Problem der Assimilation dieser Informationen begegnen wird.
Sie müssen nicht nur das Material erzählen, sondern auch sicherstellen, dass das Publikum es verstanden hat.

Die Tatsache, dass das Thema beherrscht wird, hängt davon ab, wie der Schüler mit selbständiger Arbeit umgeht.
Wenn es einem Schüler gelungen ist, ein Problem zu einem Thema ohne die Hilfe eines Lehrers zu lösen, wurde das Thema gelernt. Zur Selbstverifizierung wird jeder Aufgabe eine Tabelle mit Testskripten beschrieben. Aufgaben haben eine ausgeprägte Reihenfolge. Das Überspringen von Aufgaben wird nicht empfohlen. Wenn die aktuelle Aufgabe zu kompliziert ist, ist es sinnlos, mit der nächsten fortzufahren. Sie ist noch schwerer. Damit der Schüler die aktuell schwierige Aufgabe meistern kann, werden ihm am Beispiel der ersten Aufgabe mehrere Tricks erklärt. Tatsächlich reduziert sich der gesamte Inhalt des Themas auf Methoden zur Überwindung von Schwierigkeiten. Zyklen sind eher eine Nebenwirkung.

Die erste Aufgabe ist immer ein Beispiel. Die zweite unterscheidet sich geringfügig und wird „unabhängig“ unmittelbar nach der ersten unter Aufsicht eines Lehrers durchgeführt. Alle nachfolgenden Aufgaben zielen darauf ab, die Aufmerksamkeit auf verschiedene kleine Dinge zu lenken, die Verwirrung stiften können.

Die Erklärung des Beispiels ist ein Dialog, in dem der Schüler die Weitergabe und Kreuzvalidierung zurückrufen muss, um sicherzustellen, dass er einen Teil des Materials assimiliert.

Ich werde banal sein und erklären, dass das erste Beispiel zu diesem Thema sehr wichtig ist. Wenn Material für umfangreiche unabhängige Arbeiten vorhanden ist, können die Auslassungen des ersten Beispiels korrigiert werden. Wenn außer dem Beispiel nichts mehr vorhanden ist, wird der Schüler das Thema höchstwahrscheinlich nicht beherrschen.

Während oder für?


Eines der kontroversen Themen ist die Wahl des Konstrukts für ein Beispiel: while oder for. Einmal überzeugte mich ein Freund, ein praktizierender Entwickler ohne Unterrichtserfahrung, eine Stunde lang, dass die for-Schleife am einfachsten zu verstehen sei. Die Argumente lauteten: "Alles ist darin klar und stellenweise angeordnet." Die Hauptursache für die Schwierigkeiten echter Anfänger liegt jedoch in der Idee des Zyklus und nicht in seiner Schrift. Wenn eine Person diese Idee nicht versteht, hat sie Schwierigkeiten mit der Syntax. Sobald die Idee verwirklicht ist, verschwinden die Probleme des Code-Designs von selbst.

In meinen Materialien folgt das Thema Zyklen dem Thema Verzweigung. Die äußerliche Ähnlichkeit von if und while erlaubt es uns, eine direkte Analogie zu ziehen: "Wenn die Bedingung in der Kopfzeile wahr ist, ist der Körper erfüllt." Die Besonderheit des Zyklus ist, dass der Körper viele Male ausgeführt wird.

Mein zweites Argument ist, dass es zwar weniger Dekoration erfordert als für. Weniger Styling - weniger dumme Fehler mit fehlenden Kommas und Klammern. Anfänger sind noch nicht so aufmerksam und akribisch, dass sie Syntaxfehler automatisch vermeiden.
Das dritte Argument ist, dass viele gute Bücher zuerst erklärt werden.

Wenn es einem Schüler gelingt, Ausdrücke leicht zu transformieren, können Sie im Vorbeigehen darüber sprechen. Der Schüler wählt aus, was ihm am besten gefällt. Wenn die Transformationen Schwierigkeiten verursachen, ist es besser, die Aufmerksamkeit nicht zu zerstreuen. Lassen Sie den Schüler alles mit Hilfe von while lösen. Sobald Sie das Thema Schleifen beherrschen, können Sie Lösungen neu schreiben, um die Konvertierung von while in for zu erarbeiten.
Nachkonditionierungszyklen sind ein seltenes Tier. Ich verbringe überhaupt keine Zeit damit. Wenn ein Schüler die Idee beherrscht, Muster zu enthüllen und Ausdrücke zu transformieren, kann er dies ohne meine Hilfe herausfinden.

Wenn ich starken Schülern das erste Beispiel vorstelle, mache ich darauf aufmerksam, dass es im ersten Beispiel wichtig ist, nicht nur die Lösung, sondern auch die gesamte Kette von Maßnahmen festzulegen, die zum Ergebnis geführt haben. Faule Schüler können die Schriften vernachlässigen und nur den endlichen Algorithmus auf sich selbst übertragen. Sie müssen überzeugt sein, dass sie eines Tages auf eine schwierige Aufgabe stoßen werden. Um dies zu lösen, müssen Sie die Schritte wie in diesem Beispiel ausführen. Deshalb ist es wichtig, alle Phasen zu reparieren. In den folgenden Aufgaben kann nur die endgültige Lösung belassen werden.

Die Hauptidee der Automatisierung besteht darin, dass wir den Computer anweisen, Routinearbeiten pro Person auszuführen. Einer der grundlegenden Tricks ist das Schreiben von Zyklen. Es wird verwendet, wenn mehrere identische sich wiederholende Aktionen in einem Programm hintereinander geschrieben werden.

Explizit ist besser als implizit


In der ersten Aufgabe in Zyklen scheint es eine gute Idee zu sein, eine identische Phrase mehrmals anzuzeigen. Zum Beispiel:
Hurra, es funktioniert!
Hurra, es funktioniert!
Hurra, es funktioniert!
Hurra, es funktioniert!
Hurra, es funktioniert!
Hurra, es funktioniert!
Hurra, es funktioniert!
Hurra, es funktioniert!

Diese Option ist schlecht, da die Ausgabe den Zählerwert nicht anzeigt. Dies ist ein Problem für Anfänger. Unterschätze es nicht. Anfangs war diese Aufgabe die erste, und die Aufgabe, eine Reihe von Zahlen in aufsteigender Reihenfolge auszugeben, war die zweite. Ich musste zusätzliche Begriffe "Zyklus N-mal" und "Zyklus von A nach B" einführen, die im Wesentlichen gleich sind. Um keine unnötigen Entitäten zu erzeugen, habe ich beschlossen, nur ein Beispiel mit einer Reihe von Zahlen zu zeigen. Nur wenige lernen, wie man einen Zähler im Kopf hält und das Verhalten eines Programms ohne Vorbereitung im Kopf simuliert. Zum ersten Mal werden einige Schüler mit der Modellierung „im Kopf“ zum Thema Zyklen konfrontiert.
Nach einigem Üben gebe ich die Aufgabe, denselben Text einer unabhängigen Lösung zu wiederholen. Wenn Sie zuerst einen sichtbaren und dann unsichtbaren Zähler angeben, haben die Schüler weniger Probleme. Manchmal reichen die Eingabeaufforderungen „Schreiben Sie den Zähler nicht auf den Bildschirm“ aus.

Wie erklären es andere?


In den meisten Lehrmaterialien im Internet wird die Schleifensyntax als Teil einer „Vorlesung“ angegeben. Beispielsweise werden auf developer.mozilla.org (derzeit) mehrere weitere Konstrukte zusammen mit der while-Schleife beschrieben. In diesem Fall werden nur die Konstruktionen selbst in Form von Vorlagen angegeben. Das Ergebnis ihres Starts wird in Worten beschrieben, aber die Abbildung fehlt. Meiner Meinung nach multipliziert eine solche Darstellung des Themas die Nützlichkeit solcher Materialien mit Null. Der Schüler kann den Code neu schreiben und selbst ausführen, der Vergleichsmaßstab wird jedoch weiterhin benötigt. Wie kann man verstehen, dass das Beispiel korrekt umgeschrieben wurde, wenn es nichts gibt, mit dem man das Ergebnis vergleichen kann?
Wenn nur eine Vorlage ohne Beispiel angegeben wird, wird es für einen Schüler noch schwieriger. Wie kann man verstehen, dass Codefragmente korrekt in der Vorlage platziert sind? Sie können versuchen, irgendwie zu schreiben und dann laufen. Wenn es jedoch keinen Standard für den Vergleich des Ergebnisses gibt, hilft auch der Start nicht.

In einem intuitiven C ++ - Kurs wird die Schleifensyntax auf der dritten Seite von Vorlesung 4 zum Thema „Operatoren“ vergraben. Bei der Erläuterung der Syntax von Schleifen wird besonderer Wert auf den Begriff „Operator“ gelegt. Der Begriff wird als eine Reihe von Fakten wie „Symbol; Dies ist ein Operator “,„ {} Dies ist ein zusammengesetzter Operator “,„ Der Körper der Schleife muss ein Operator sein “. Ich mag diesen Ansatz nicht, weil er wichtige Beziehungen in einem einzigen Begriff zu verbergen scheint. Die Analyse des Programmquellcodes in Begriffe auf einer solchen Ebene ist erforderlich, damit Compilerentwickler die Sprachspezifikation implementieren können, nicht jedoch für Schüler in erster Näherung. Programmieranfänger haben selten die Sorgfalt, auf die Begriffe so aufmerksam zu sein. Eine seltene Person erinnert sich beim ersten Mal an neue Wörter und versteht sie. Praktisch niemand kann den Begriff, den er gerade gelernt hat, richtig anwenden. Daher haben die Schüler eine Reihe von Fehlern wie "geschrieben während (a <7); {, aber das Programm funktioniert nicht".
Meiner Meinung nach ist es am Anfang besser, die Syntax der Konstruktion sofort in Klammern anzugeben. Die Option ohne Klammern wird nur erklärt, wenn der Schüler eine spezielle Frage hat: „Warum funktioniert sie ohne Klammern?“.

In Okulovs Buch "Fundamentals of Programming" aus dem Jahr 2012 beginnt die Bekanntschaft mit den Zyklen mit der Vorlage for, dann werden Empfehlungen für ihre Verwendung gegeben, und dann folgt unmittelbar der experimentelle Abschnitt der Lektion. Ich verstehe, dass das Buch für diese Minderheit sehr fähiger Schüler geschrieben wurde, die selten zu meinen Klassen kommen.

In populären Büchern wird immer das Ergebnis von Codefragmenten geschrieben. Zum Beispiel Schildts Ausgabe 2015 „Java 8. Complete Guide“. Zuerst wird eine Vorlage angegeben, dann ein Beispielprogramm und unmittelbar danach das Ergebnis der Ausführung.
Betrachten Sie als Beispiel eine while-Schleife, in der das Gegenteil der Fall ist
Der Countdown ab 10 und genau 10 Zeilen mit „Maßnahmen“ werden ausgegeben:
//    while class While { public static void main(String args []) { int n = 10; while (n > 0) { System.out.println(" " + n); n--; } } } 

Nach dem Start dieses Programms werden zehn "Takte" wie folgt angezeigt:
10
9
8
7
6
5
4
3
2
1

Der Ansatz mit der Beschreibung der Vorlage, des Beispielprogramms und des Ergebnisses dieses Programms wird auch im Buch „Javascript für Kinder“ und im js-Kurs auf w3schools.com verwendet. Mit dem Webseitenformat können Sie dieses Beispiel sogar interaktiv gestalten.

In Straustrups 2016 erschienenem Buch „Prinzipien und Praktiken mit C ++“ ging der Autor noch weiter. Der erste Schritt erklärt, wie das Ergebnis aussehen soll, und zeigt anschließend den Text des Programms. Darüber hinaus nehmen sie als Beispiel nicht nur ein zufälliges Programm, sondern geben einen Ausflug in die Geschichte. Es hilft, die Aufmerksamkeit darauf zu lenken. “Schauen Sie, dies ist nicht nur ein nutzloser Text. Sie sehen etwas Bedeutendes. "
Betrachten Sie als Beispiel für die Iteration das erste Programm, das auf einem Computer mit einem gespeicherten Programm (EDSAC) ausgeführt wird. Es wurde von David Wheeler am 6. Mai 1949 im Computerraum der Universität Cambridge in England geschrieben. Dieses Programm berechnet und druckt eine einfache Liste von Quadraten.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Hier enthält jede Zeile eine Zahl, gefolgt von einer Registerkarte ('\ t') und dem Quadrat dieser Zahl. Die C ++ - Version dieses Programms sieht folgendermaßen aus:
 //      0-99 int main() { int i = 0; //    while(i < 100){ cout << i << '\t' << square(i) << '\n'; ++i; } } 

Seltsamerweise wird die Syntaxvorlage in diesem Buch nicht beschrieben. Stroustrup im Handbuch des Lehrers ( Übersetzung ) betont, dass er die Intelligenz seiner Schüler respektiert. Vielleicht wird die Fähigkeit, das Muster in mehreren Beispielen zu identifizieren, als Manifestation einer solchen Intelligenz angesehen.

Wie ich mich erkläre


Straustrups Ansatz: Eine Beschreibung des Ergebnisses, dann eine Lösung des Problems und dann eine unabhängige Analyse durch den Schüler - sieht am nachdenklichsten aus. Deshalb habe ich mich entschlossen, es als Grundlage zu nehmen, es aber an einem weniger historischen Beispiel zu erzählen - der Aufgabe, ein „Inhaltsverzeichnis“ abzuleiten. Es bildet einen erkennbaren Anker, so dass später "Erinnere dich an die Aufgabe des Inhaltsverzeichnisses" steht und die Schüler sich daran erinnern. In meinem Beispiel habe ich versucht, zwei weitere der häufigsten Missverständnisse zu warnen. Als nächstes werde ich mehr darüber schreiben.
Bei dieser Aufgabe lernen wir die Methoden zur Lösung komplexer Probleme kennen. Die anfängliche Entscheidung muss primitiv und einfach getroffen werden. Dann können Sie überlegen, wie Sie diese Lösung verbessern können.

1
2
3
4
5
6
7

Nach meinen Beobachtungen führt der Ansatz „Vorlagen-Beispiel-Ergebnis“ in verschiedenen Kombinationen immer noch dazu, dass die Schüler den Zyklus als Hieroglyphe wahrnehmen. Dies manifestierte sich in der Tatsache, dass sie nicht verstanden, warum sie eine Bedingung schreiben sollten, wie sie zwischen i ++ und i-- und anderen scheinbar offensichtlichen Dingen wählen sollten. Um diese Missverständnisse zu vermeiden, sollte die Herangehensweise an die Geschichte über die Zyklen die Bedeutung der Wiederholung derselben Aktionen hervorheben und sie erst dann mit dem Design entwerfen. Bevor Sie die Syntax der Schleife angeben, müssen Sie daher das Problem "Stirn" lösen. Eine primitive Lösung für das Inhaltsverzeichnisproblem sieht folgendermaßen aus:
 Console.WriteLine(""); Console.WriteLine(" 1"); Console.WriteLine(" 2"); Console.WriteLine(" 3"); Console.WriteLine(" 4"); Console.WriteLine(" 5"); Console.WriteLine(" 6"); Console.WriteLine(" 7"); Console.WriteLine(""); 

Wie kann es verbessert werden?
Ersetzen Sie sich wiederholende Aktionen durch eine Schleife.
Welche Aktionen werden ohne Änderungen hintereinander wiederholt?
Es gibt keine in diesem Fragment. Der Befehl zum Ausgeben des Wortes "Kapitel" mit der Nummer ist jedoch sehr ähnlich.
Daher ist der nächste Schritt die Suche nach dem Unterschied zwischen den Fragmenten. Nur bei dieser Aufgabe ist alles offensichtlich, dann werden nicht einzelne Befehle wiederholt, sondern Codeblöcke mit 5 oder mehr Zeilen. Sie müssen nicht nur in der Befehlsliste suchen, sondern auch in Verzweigungs- oder Schleifenkonstruktionen.
Im Beispiel der Unterschied zwischen den Teams in der Nummer nach dem Wort "Kapitel".
Sobald der Unterschied festgestellt wurde, müssen Sie das Änderungsmuster verstehen. Ein anderes Fragment ist diese Nummer? Steigt oder sinkt es ständig? Wie ändert sich der Wert einer Zahl zwischen zwei Teams nebeneinander?
Im Beispiel erhöht sich die Zahl nach dem Wort „Kapitel“ mit Schritt 1. Der Unterschied wird gefunden, das Muster wird aufgedeckt. Jetzt können Sie das unterschiedliche Fragment durch eine Variable ersetzen.
Eine solche Variable muss vor dem ersten der sich wiederholenden Fragmente deklariert werden. Eine solche Variable heißt normalerweise I oder j oder ist irgendwie erweiterter. Der Anfangswert sollte dem ersten auf dem Bildschirm angezeigten Wert entsprechen. Im Beispiel ist der erste Wert 1.
Welcher Anfangswert sollte verwendet werden, um eine Reihe von Zahlen "100, 101, 102, 103, 104, 105" auszugeben?
In dieser Zeile ist die erste Zahl 100.
Nach jedem Ausgabebefehl müssen Sie den Wert dieser Variablen um 1 erhöhen. Diese Einheit ist ein Änderungsschritt.
Welcher Schritt wird in der Zahlenreihe "100, 102, 104, 106" sein?
In dieser Zeile Schritt 2.
Nach dem Ersetzen des anderen Fragments durch eine Variable sieht der Code folgendermaßen aus:
 Console.WriteLine(""); int i; i = 0; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(""); 

Nach Anwendung der Technik „Das Gesetz der Variablen ausdrücken“ liefert der Code mehrere Gruppen identischer Aktionen, die hintereinander ausgeführt werden. Jetzt können sich wiederholende Aktionen durch eine Schleife ersetzt werden.

Die Reihenfolge der Lösung des Problems, in dem Sie Zyklen verwenden müssen, besteht aus den folgenden Schritten:
  1. Löse "Stirn" mit vielen verschiedenen Teams
  2. Finde ein Muster
  3. Drücken Sie die Regelmäßigkeit einer Variablen aus
  4. Design als Schleife


Als nächstes werden neue Begriffe eingeführt, damit sich der Schüler nicht in der Situation befindet, "Ich verstehe alles, aber ich kann nicht sagen":
- Ein Zähler ist immer eine Variable, die benötigt wird, um die Anzahl der Schritte in einem Zyklus zu verfolgen. Normalerweise eine Ganzzahl, die mit einer Einschränkung verglichen wird.
- Zählerschritt - eine Beschreibung des Änderungsmusters im Zähler.
- Einschränkung - eine Zahl oder Variable, mit der der Zähler verglichen wird, so dass der Algorithmus endlich ist. Der Zählerwert ändert sich, um sich dem Grenzwert zu nähern.
- Cycle Body - Eine Reihe von Befehlen, die wiederholt werden. Wenn es heißt "der Befehl wird innerhalb des Zyklus geschrieben", bedeutet dies den Körper.
- Schleifeniteration - eine einzelne Ausführung des Schleifenkörpers.
- Eine Schleifenbedingung ist ein logischer Ausdruck, der bestimmt, ob eine weitere Iteration durchgeführt wird. (Es kann zu Verwechslungen mit Zweigdesigns kommen.)
Sie müssen darauf vorbereitet sein, dass die Schüler die Begriffe zunächst für andere Zwecke verwenden. Dies gilt sowohl für starke als auch für schwache. Eine gemeinsame Sprache aufzubauen ist eine ganze Kunst. Ich schreibe jetzt kurz: Sie müssen die Aufgabe "Codefragment mit <Term> auswählen" festlegen und diese Begriffe in einer Konversation korrekt verwenden.
Nach der Umwandlung mit einer Schleife wird ein Fragment erhalten:
 Console.WriteLine(""); int i = 0; while (i < 7) { Console.WriteLine(" " + i); i = i + 1; } Console.WriteLine(""); 


Hauptmissverständnis


Ein weit verbreitetes Missverständnis der Schüler ist, dass sie solche Aktionen, die nur einmal ausgeführt werden müssen, in die Schleifenstruktur einfügen. Zum Beispiel so:
 ; int i = 0; while (i < 7) { Console.WriteLine("") Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(""); } 

Die Schüler stolpern ständig über dieses Problem, sowohl am Anfang als auch bei komplexeren Aufgaben.
Kronenhinweis in diesem Fall:
Wie oft müssen Sie den Befehl wiederholen: einmal oder mehrmals?

Die Ausgabebefehle für die Wörter "Einführung" und "Schlussfolgerung" sowie die Deklaration und Initialisierung der Variablen i sind nicht mit anderen sich wiederholenden Aktionen vergleichbar. Sie werden nur einmal ausgeführt, was bedeutet, dass sie außerhalb des Zykluskörpers geschrieben werden müssen.

Alle drei Stufen der Lösung sollten im Code verbleiben, um im Falle von Schwierigkeiten auf sie zu verweisen. Die ersten beiden Optionen reichen aus, um sie zu kommentieren, damit sie nicht stören.
Der Schüler sollte auf folgende Fakten achten:
- In einer Schleifenbedingung werden normalerweise der Zähler und der Grenzwert verglichen. Der Zähler kann sich im Körper der Schleife ändern, der Grenzwert jedoch nicht. Um diese Regel zu brechen, müssen Sie gute Gründe formulieren.
- Befehle zur Anzeige der Wörter "Einführung" und "Schlussfolgerung" befinden sich außerhalb des Zyklus. Wir müssen sie 1 Mal ausführen. "Einführung" - vor dem Wiederholen von Aktionen, "Schlussfolgerung" - nach.
Bei der Behebung dieses Themas, der Beherrschung des Folgenden sowie bei schwierigen Verfahren ist es auch für starke Schüler hilfreich, die Frage zu stellen: „Aber wie oft muss diese Aktion ausgeführt werden? Einer oder viele? "

Entwicklung zusätzlicher Fähigkeiten


Während des Studiums der Zyklen haben die Schüler immer noch die Fähigkeit, Probleme zu diagnostizieren und zu lösen. Um die Diagnose durchzuführen, muss der Schüler das gewünschte Ergebnis präsentieren und mit dem tatsächlichen Ergebnis vergleichen. Die Korrekturmaßnahmen hängen von der Differenz zwischen ihnen ab.
Da die Schüler zu diesem Zeitpunkt noch eine schlechte Vorstellung vom „gewünschten“ Ergebnis haben, können sie sich auf Testdaten konzentrieren. In der Regel versteht derzeit noch niemand, was schief gehen kann und wie man damit umgeht. Daher beschreibe ich typische Probleme und verschiedene Möglichkeiten, sie zu lösen, unter einem Eintrag in einem Notizbuch. Die Wahl des am besten geeigneten von ihnen ist die Aufgabe des Schülers selbst.
Die Aufzeichnung wird benötigt, um zu fragen: "Was ist passiert, wurde erwartet?", "Welche dieser Situationen ist jetzt passiert?", "Hat die Lösung geholfen?".
  1. Die Anzahl der Aktionen beträgt 1 weniger oder mehr als erwartet. Lösungsmöglichkeiten:
    - Erhöhen Sie den Anfangswert des Zählers um 1.
    - Ersetzen Sie den strengen Vergleichsoperator (<oder>) durch einen nicht strengen (<= oder> =).
    - Ändern Sie den Wert der Einschränkung auf 1.
  2. Aktionen in der Schleife werden endlos ohne Unterbrechung ausgeführt. Lösungsmöglichkeiten:
    - Fügen Sie einen Zähleränderungsbefehl hinzu, wenn dieser nicht vorhanden ist.
    - Korrigieren Sie den Zähleränderungsbefehl so, dass sein Wert näher am Grenzwert liegt.
    - Entfernen Sie den Befehl zum Ändern der Einschränkung, wenn er sich im Hauptteil des Zyklus befindet.
  3. Die Anzahl der Aktionen in der Schleife ist mehr als 1 weniger oder mehr als erwartet. Die Aktion in der Schleife wurde nie ausgeführt. Zuerst müssen Sie die tatsächlichen Werte der Variablen kurz vor Beginn des Zyklus herausfinden. Lösungsmöglichkeiten:
    - Ändern Sie den Anfangswert der Einschränkung
    - Ändern Sie den Anfangswert des Zählers

Normalerweise hängt Problem 3 damit zusammen, dass die falsche Variable verwendet wird oder der Zähler nicht auf Null gesetzt wird.

Nach dieser Erklärung kann der Schüler immer noch verschiedene Missverständnisse über die Funktionsweise der Zyklen haben.
Um die häufigsten zu zerstreuen, gebe ich Aufgaben:
  1. In dem die Einschränkung, der Anfangswert des Zählers oder der Schritt des Zählers vom Benutzer eingegeben wird.
  2. In dem der Zählerwert in einem arithmetischen Ausdruck verwendet werden muss. Es ist ratsam, mit dem Zähler im radikalen Ausdruck oder im Nenner zu arbeiten, damit die Differenz nicht linear ist.
  3. In dem der Zählerwert während des Zyklus nicht angezeigt wird. Zum Beispiel die Ausgabe der erforderlichen Anzahl identischer Textfragmente oder das Zeichnen einer Figur mit Schildkrötengrafiken.
  4. In dem Sie zuerst einige sich wiederholende Aktionen und dann andere ausführen müssen.
  5. In dem Sie vor und nach dem Wiederholen andere Aktionen ausführen müssen

Für jede Aufgabe müssen Sie Testdaten und das erwartete Ergebnis angeben.

Um zu verstehen, wie schnell Sie sich bewegen können, müssen Sie die Bedingungen dieser Aufgaben lesen und fragen: „Wie unterscheiden sie sich vom Beispiel?“, „Was muss im Beispiel geändert werden, um sie zu lösen?“. Wenn der Schüler sinnvoll antwortet, lassen Sie ihn mindestens eine in der Lektion und den Rest entscheiden - zu Hause allein. Wenn die Lösung erfolgreich ist, können Sie die Bedingungen in den Schleifen erläutern.
Wenn Sie eine unabhängige Lösung für Schwierigkeiten haben, müssen Sie alles in der Lektion ausarbeiten. Damit die Lösung des Problems nicht dem Zeichnen einer Eule ähnelt, empfehle ich, dass Sie das Problem zunächst nicht universell lösen. Das heißt, dass die Lösung den ersten Test besteht und das Schleifenkonstrukt nicht verwendet. Wenden Sie dann die Transformationen an, um die Universalität der Lösung zu erreichen.

Schleifen und Zweige


Meiner Meinung nach ist es nützlich, das Thema „Schleifen innerhalb von Zweigen“ separat anzugeben. Damit Sie später den Unterschied zwischen einer mehrfachen und einer einzigen Zustandsprüfung erkennen können.
Die Aufgaben zum Fixieren betreffen die Ausgabe von Zahlen von A nach B, die vom Benutzer eingegeben werden:
- immer aufsteigend.
- aufsteigend oder absteigend in Abhängigkeit von den Werten von A und B.

Das Thema „Verzweigen innerhalb von Zyklen“ sollte erst weitergegeben werden, nachdem der Schüler die Tricks beherrscht hat: „Ersetzen von Mustern durch eine Variable“ und „Ersetzen sich wiederholender Aktionen durch eine Schleife“.
Der Hauptgrund für die Verwendung der Verzweigung innerhalb von Schleifen sind Anomalien in Mustern. In der Mitte ist es je nach Quelldaten kaputt.
Für diejenigen Schüler, die in der Lage sind, nach einer Lösung zu suchen, indem sie einfache Techniken kombinieren, reicht es zu sagen, dass „Verzweigungen in Schleifen geschrieben werden können“ und die Aufgabe „zum Beispiel“ vollständig einer unabhängigen Lösung zu geben.
Aufgabe zum Beispiel:
Der Benutzer gibt die Zahl X ein. Zeigen Sie in den Spaltennummern 0 bis 9 an und setzen Sie das Zeichen '+' gegenüber der Zahl, die X entspricht.

Wenn 0 eingegeben wurde
0+
1
2
3
4
5
6
7
8
9

Wenn 6 eingegeben wurde
0
1
2
3
4
5
6+
7
8
9

Wenn 9 eingegeben wurde
0
1
2
3
4
5
6
7
8
9+

Wenn 777 eingegeben wurde
0
1
2
3
4
5
6
7
8
9

Wenn eine kurze Erklärung nicht ausreicht, um mit einer Schleife zu schreiben, müssen Sie eine universelle Lösung für dasselbe Problem ohne Schleife erzielen.
Sie erhalten eine von zwei Möglichkeiten:
Gewünscht
 string temp; temp = Console.ReadLine(); int x; x = int.Parse(temp); if (x==0) { Console.WriteLine(0 + "+"); } else { Console.WriteLine(0); } if (x==1) { Console.WriteLine(1 + "+"); } else { Console.WriteLine(1); } if (x==2) { Console.WriteLine(2 + "+"); } else { Console.WriteLine(2); } if (x==3) { Console.WriteLine(3 + "+"); } else { Console.WriteLine(3); } if (x==4) { Console.WriteLine(4 + "+"); } else { Console.WriteLine(4); } if (x==5) { Console.WriteLine(5 + "+"); } else { Console.WriteLine(5); } if (x==6) { Console.WriteLine(6 + "+"); } else { Console.WriteLine(6); } if (x==7) { Console.WriteLine(7 + "+"); } else { Console.WriteLine(7); } if (x==8) { Console.WriteLine(8 + "+"); } else { Console.WriteLine(8); } if (x==9) { Console.WriteLine(9 + "+"); } else { Console.WriteLine(9); } 


Möglich
 string temp; temp = Console.ReadLine(); int x; x = int.Parse(temp); if (x==0) { Console.WriteLine("0+\n1\n2\n3\n4\n5\n6\n7\n8\n9"); } if (x==1) { Console.WriteLine("0\n1+\n2\n3\n4\n5\n6\n7\n8\n9"); } if (x==2) { Console.WriteLine("0\n1\n2+\n3\n4\n5\n6\n7\n8\n9"); } if (x==3) { Console.WriteLine("0\n1\n2\n3+\n4\n5\n6\n7\n8\n9"); } if (x==4) { Console.WriteLine("0\n1\n2\n3\n4+\n5\n6\n7\n8\n9"); } if (x==5) { Console.WriteLine("0\n1\n2\n3\n4\n5+\n6\n7\n8\n9"); } if (x==6) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6+\n7\n8\n9"); } if (x==7) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6\n7+\n8\n9"); } if (x==8) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6\n7\n8+\n9"); } if (x==9) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6\n7\n8\n9+"); } 


Ich gebe im Voraus ein ähnliches Problem, während ich das Thema Verzweigung studiere.
Wenn der Schüler eine „mögliche“ Option hat, müssen Sie angeben, dass es viele Lösungen für dasselbe Problem geben kann. Sie unterscheiden sich jedoch in ihrer Beständigkeit gegen sich ändernde Anforderungen. Stellen Sie die Frage: "Wie viele Stellen im Code müssen korrigiert werden, wenn Sie eine weitere Nummer hinzufügen müssen?" In der "möglichen" Version müssen Sie einen weiteren Zweig hinzufügen und an 10 anderen Stellen eine neue Nummer hinzufügen. Im "gewünschten" reicht es aus, nur einen Zweig hinzuzufügen.
Stellen Sie die Aufgabe so ein, dass die gewünschte Option reproduziert wird, suchen Sie dann ein Muster im Code, führen Sie eine Variablenersetzung durch und schreiben Sie eine Schleife.
Wenn Sie eine Idee haben, wie Sie dieses Problem ohne Schleife auf andere Weise lösen können, schreiben Sie bitte in die Kommentare.

Schleifen in Schleifen


In diesem Thread müssen Sie darauf achten, dass:
- Die Zähler für die innere und äußere Schleife müssen unterschiedliche Variablen sein.
- Der Zähler für die innere Schleife muss viele Male zurückgesetzt werden (dh im Körper der äußeren Schleife).
- Bei Textausgabeaufgaben können Sie nicht zuerst einen Buchstaben in mehrere Zeilen und dann den zweiten schreiben. Zuerst müssen Sie alle Buchstaben der ersten Zeile drucken, dann alle Buchstaben der zweiten und so weiter.

Eine Erläuterung des Themas zu Schleifen in Schleifen beginnt am besten mit der Erläuterung der Wichtigkeit des Zurücksetzens des Zählers.
Aufgabe zum Beispiel:
Der Benutzer gibt zwei Zahlen ein: R und T. Drucken Sie zwei Zeichenzeilen "#". Die erste Zeile sollte R Zeichen enthalten. Die zweite Zeile ist T-Stücke. Wenn eine Zahl negativ ist, wird eine Fehlermeldung angezeigt.

R = 5, T = 11
#####
#############

R = 20, T = 3
########################
###

R = -1, T = 6
Der Wert von R darf nicht negativ sein

R = 6, T = -2
Der Wert von T darf nicht negativ sein

Offensichtlich hat dieses Problem auch mindestens zwei Lösungen.
Gewünscht
 string temp; int R; int T; temp = Console.ReadLine(); R = int.Parse(temp); temp = Console.ReadLine(); T = int.Parse(temp); int i = 0; while (i < R) { Console.Write("#"); i = i + 1; } Console.WriteLine(); i = 0; while (i < T) { Console.Write("#"); i = i + 1; } 


Mögliche Nr. 1
 string temp; int R; int T; temp = Console.ReadLine(); R = int.Parse(temp); temp = Console.ReadLine(); T = int.Parse(temp); int i = 0; while (i < R) { Console.Write("#"); i = i + 1; } Console.WriteLine(); int j = 0; j = 0; while (j < T) { Console.Write("#"); j = j + 1; } 


Der Unterschied besteht darin, dass in der „möglichen“ Lösung die zweite Variable verwendet wurde, um die zweite Zeile anzuzeigen. Sie müssen darauf bestehen, für beide Zyklen dieselbe Variable zu verwenden. Man kann für eine solche Einschränkung insofern argumentieren, als eine Lösung mit einem Zähler für zwei Zyklen ein Beispiel für den Begriff "Nullstellen des Zählers" ist. Das Verständnis dieses Begriffs ist erforderlich, um die folgenden Probleme zu lösen. Als Kompromiss können Sie beide Lösungen für das Problem speichern.

Ein typisches Problem bei der Verwendung einer einzelnen Zählervariablen für zwei Zyklen tritt wie folgt auf:
R = 5, T = 11
#####
######

Die Anzahl der Zeichen in der zweiten Zeile stimmt nicht mit dem Wert von T überein. Wenn bei diesem Problem Hilfe benötigt wird, müssen Sie Ihre Nase in die Übersicht über typische Probleme mit Schleifen stecken. Dies ist Symptom Nummer 3. Es wird diagnostiziert, wenn Sie die Ausgabe des Zählerwerts unmittelbar vor dem zweiten Zyklus hinzufügen. Durch Nullstellen korrigiert. Aber es ist besser, es nicht sofort zu sagen. Der Student sollte versuchen, mindestens eine Hypothese zu formulieren.

Natürlich gibt es immer noch eine solche Lösung. Aber ich habe ihn noch nie unter Studenten gesehen. Während des Studiums der Zyklen wird die Geschichte über ihn die Aufmerksamkeit zerstreuen. Sie können später darauf zurückkommen, wenn Sie die Funktionen der Arbeit mit Zeichenfolgen studieren.
Mögliche Nummer 2
 string temp; int R; int T; temp = Console.ReadLine(); R = int.Parse(temp); temp = Console.ReadLine(); T = int.Parse(temp); Console.WriteLine(new String('#', R)); Console.WriteLine(new String('#', T)); 



Die nächste erforderliche Aufgabe:
Zeigen Sie die Zahlen von 0 bis 9 an. Jede Ziffer sollte in einer eigenen Zeile stehen. Die Anzahl der Ziffern pro Zeile (W) wird über die Tastatur eingegeben.

W = 1
0
1
2
3
4
5
6
7
8
9

W = 10
0000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999


Wenn ein Schüler die Technik des Ersetzens einer Variablen beherrscht, wird er ziemlich schnell damit fertig. Ein mögliches Problem besteht erneut darin, die Variable auf Null zu setzen. Wenn Sie mit der Konvertierung nicht fertig werden, haben Sie es eilig und müssen einfachere Probleme lösen.

Vielen Dank für Ihre Aufmerksamkeit. Abonnieren Sie den Kanal.

PS Wenn Sie Tippfehler oder Fehler im Text finden, lassen Sie es mich bitte wissen.Dies kann durch Hervorheben eines Teils des Textes und Drücken von „⌘ + Eingabetaste“ auf dem Mac und auf den klassischen Tastaturen „Strg / Eingabetaste“ oder durch private Nachrichten erfolgen. Wenn diese Optionen nicht verfügbar sind, schreiben Sie über Fehler in die Kommentare. Vielen Dank!

Source: https://habr.com/ru/post/de456500/


All Articles