Wie man lehrt, wie man Schwierigkeiten überwindet und gleichzeitig Zyklen schreibt

Obwohl wir über eines der grundlegenden Themen sprechen, richtet sich dieser Artikel an erfahrene Fachleute. Ziel ist es aufzuzeigen, welche Missverständnisse Anfänger beim Programmieren haben. Für praktizierende Entwickler sind diese Probleme längst gelöst, vergessen oder gar nicht bemerkt. Der Artikel kann nützlich sein, wenn Sie plötzlich jemandem bei diesem Thema helfen müssen. Der Artikel zieht Parallelen zu Material aus verschiedenen Programmierbüchern von Schildt, Stroustrup, Okulov.

Das Thema Zyklen wurde gewählt, weil viele Leute davon ausgeschlossen sind, wenn sie das Programmieren beherrschen.

Diese Technik ist für schwache Schüler konzipiert. In der Regel bleiben starke Menschen bei diesem Thema nicht hängen und es besteht keine Notwendigkeit, sich spezielle Techniken für sie auszudenken. Das sekundäre Ziel des Artikels besteht darin, diese Technik von der Klasse „Funktioniert für alle Schüler, aber nur einen Lehrer“ in die Klasse „Funktioniert für alle Schüler, alle Lehrer“ zu verschieben. Ich erhebe keinen Anspruch auf absolute Originalität. Wenn Sie bereits eine ähnliche Methodik zum Unterrichten dieses Themas verwenden, schreiben Sie bitte, wie sich Ihre Version unterscheidet. Wenn Sie sich für die Nutzung entscheiden, erzählen Sie uns, wie es gelaufen ist. Wenn eine ähnliche Technik in einem Buch beschrieben wird, schreiben Sie bitte den Namen.


Ich habe 4 Jahre lang an dieser Technik gearbeitet und individuell mit Schülern unterschiedlicher Ausbildungsniveaus gelernt. Insgesamt gibt es etwa fünfzig Studenten und zweitausend Unterrichtsstunden. Zuerst blieben die Studierenden immer bei diesem Thema hängen und gingen. Nach jedem Studierenden wurden Methodik und Materialien angepasst. Da sich die Studierenden im vergangenen Jahr nicht mehr mit diesem Thema beschäftigten, beschloss ich, meine Erkenntnisse mitzuteilen.

Warum so viele Briefe? Zyklen sind so elementar!

Wie ich oben geschrieben habe, kann die Komplexität des Schleifenkonzepts für praktizierende Entwickler und starke Studenten unterschätzt werden. Sie können zum Beispiel einen langen Vortrag halten, nickende Köpfe und intelligente Augen sehen. Aber wenn man versucht, ein Problem zu lösen, beginnen Benommenheit und unerklärliche Probleme. Nach der Vorlesung hatten die Studierenden vermutlich nur ein teilweises Verständnis. Die Situation wird dadurch verschärft, dass die Studierenden selbst nicht äußern können, was genau ihre Wahnvorstellungen sind.
Eines Tages wurde mir klar, dass die Schüler meine Beispiele als Hieroglyphen wahrnahmen. Das heißt, es handelt sich um unteilbare Textteile, in die man einen „magischen“ Buchstaben einfügen muss, damit es funktioniert.
Manchmal ist mir aufgefallen, dass Schüler denken, dass man ein bestimmtes Problem lösen muss etwas anderes ein Design, das ich noch nicht behandelt habe. Allerdings erforderte die Lösung nur eine geringfügige Modifikation des Beispiels.

So kam ich auf die Idee, dass der Fokus 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, kann jede Syntax mit wenig Übung verbessert werden.

Wen und warum unterrichte ich?

Da es keine Aufnahmeprüfungen gibt, können sowohl starke als auch sehr schwache Schüler in den Unterricht einbezogen werden. Mehr über meine Studierenden können Sie im Artikel lesen Porträt von Abendkursstudenten
Ich habe mich bemüht sicherzustellen, dass jeder, der Programmieren lernen möchte, es lernen kann.
Meine Kurse finden einzeln statt und der Schüler zahlt für jeden sein eigenes Geld. Es scheint, dass die Studierenden die Kosten optimieren und das Minimum fordern werden. Menschen gehen jedoch nicht wegen des Wissens an sich zum Präsenzunterricht mit einem Live-Lehrer, sondern wegen der Gewissheit über das, was sie gelernt haben, wegen des Gefühls des Fortschritts und wegen der Anerkennung durch den Experten (Lehrer). Wenn die Schüler keine Lernfortschritte verspüren, gehen sie. Im Allgemeinen kann der Unterricht so strukturiert werden, dass die Schüler einen Fortschritt spüren, indem sie die Anzahl vertrauter Strukturen erhöhen. Das heißt, zuerst studieren wir ausführlich, dann studieren wir lange, dann tun wir es, und jetzt haben wir einen Tausendundeine-Nacht-Kurs fertig, in dem wir zwei Monate lang nur Zyklen studieren, und am Ende - einen Studenten, der geschrieben hat eine Standardbibliothek unter Diktat. Um praktische Probleme zu lösen, bedarf es jedoch nicht nur der Kenntnis des Stoffes, sondern auch der Unabhängigkeit bei der Anwendung und der Suche nach neuen Informationen. Daher halte ich es für den richtigen Grundsatz, bei Präsenzkursen das Minimum zu lehren und das eigenständige Studium von Nuancen und verwandten Themen zu fördern. Beim Thema Schleifen halte ich das while-Konstrukt für das Minimum. Daraus kann man das Prinzip verstehen. Wenn Sie das Prinzip kennen, können Sie beides sowohl für sich als auch für sich selbst meistern.

Um schwachen Schülern die Beherrschung des Stoffes zu ermöglichen, reicht die Beschreibung der Syntax nicht aus. Es ist notwendig, einfachere, aber abwechslungsreichere Aufgaben zu stellen und Beispiele detaillierter zu beschreiben. Letztendlich wird 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 sein. Wenn Sie bei ihnen lernen, müssen Sie nicht darauf bestehen, 100 % der Probleme zu lösen. Mein Material kann unter eingesehen werden mein Github. Es stimmt, das Repository ähnelt eher dem Zauberbuch eines Hexenmeisters – niemand außer mir wird verstehen, was wo ist, und wenn Sie die Prüfung nicht bestehen, können Sie verrückt werden

Die Methodik ist praxisorientiert

Die Theorie wird am Beispiel der Lösung eines Problems erläutert. In einem Kurs über die Grundlagen der Programmierung, in dem Verzweigungen und Schleifen gelehrt werden, ist es einfach nicht möglich, eine ganze Stunde lang einen nützlichen Vortrag zu einem Thema zu halten. 15–20 Minuten reichen aus, um das Konzept zu erklären. Die Hauptschwierigkeiten treten bei der Durchführung praktischer Aufgaben auf.
Anfänger können in einer Lektion Operatoren, Verzweigungen, Schleifen und Arrays erläutern. Ihre Schüler werden jedoch vor dem Problem stehen, diese Informationen zu verarbeiten.
Schließlich geht es nicht nur darum, den Stoff zu erzählen, sondern auch dafür zu sorgen, dass die Zuhörer ihn verstehen.

Die Beherrschung eines Themas hängt davon ab, wie der Studierende das selbstständige Arbeiten bewältigt.
Wenn es einem Schüler gelingt, ein Problem zu einem Thema ohne die Hilfe eines Lehrers zu lösen, dann ist das Thema gemeistert. Um einen Selbsttest zu gewährleisten, wird jede Aufgabe in einer Tabelle mit Testszenarien beschrieben. Die Aufgaben haben eine klare Reihenfolge. Das Überspringen von Aufgaben wird nicht empfohlen. Wenn die aktuelle Aufgabe zu schwierig ist, ist es sinnlos, mit der nächsten fortzufahren. Es ist noch komplizierter. Damit der Schüler die aktuelle komplexe Aufgabe meistern kann, werden ihm am Beispiel der ersten Aufgabe mehrere Techniken erklärt. Tatsächlich dreht sich der gesamte Inhalt des Themas um Techniken zur Überwindung von Schwierigkeiten. Zyklen sind eher eine Nebenwirkung.

Die erste Aufgabe ist immer ein Beispiel. Die zweite Variante unterscheidet sich geringfügig und wird „unabhängig“ direkt im Anschluss an die erste unter Aufsicht eines Lehrers durchgeführt. Alle weiteren Aufgaben zielen darauf ab, auf verschiedene Kleinigkeiten zu achten, die zu Missverständnissen führen können.

Die Erläuterung des Beispiels ist ein Dialog, in dem der Schüler die Weitergabe und Kreuzvalidierung erneut aufrufen muss, um sicherzustellen, dass er einen Teil des Materials beherrscht.

Ich werde banal sein und sagen, dass das erste Beispiel zu diesem Thema sehr wichtig ist. Wenn Sie über das Material für eine umfangreiche eigenständige Arbeit verfügen, können die Auslassungen des ersten Beispiels korrigiert werden. Wenn es außer dem Beispiel nichts anderes gibt, wird der Student das Thema höchstwahrscheinlich nicht beherrschen.

Während oder für?

Eine der umstrittenen Fragen ist die Wahl der Konstruktion für das Beispiel: while oder for. Einmal verbrachte ein praktizierender Entwicklerfreund von mir ohne Unterrichtserfahrung eine Stunde damit, mich davon zu überzeugen, dass die for-Schleife am einfachsten zu verstehen sei. Die Argumente liefen darauf hinaus, dass „alles darin klar und an seinem Platz dargelegt ist“. Die Hauptursache für Schwierigkeiten für echte Anfänger ist jedoch die Idee des Zyklus selbst und nicht sein Schreiben. Wenn jemand diese Idee nicht versteht, wird er Schwierigkeiten mit der Syntax haben. Sobald die Idee verwirklicht ist, verschwinden die Probleme des Codedesigns von selbst.

In meinen Materialien folgt das Thema der Schleifen dem Thema der Verzweigung. Die äußere Ähnlichkeit von if und while ermöglicht es uns, eine direkte Analogie zu ziehen: „Wenn die Bedingung im Header wahr ist, wird der Körper ausgeführt.“ Die einzige Besonderheit des Zyklus besteht darin, dass der Körper viele Male ausgeführt wird.

Mein zweites Argument ist, dass while weniger Formatierung erfordert als for. Weniger Formatierung bedeutet weniger dumme Fehler mit fehlenden Kommas und Klammern. Anfänger haben noch nicht genügend Aufmerksamkeit und Akribie entwickelt, um Syntaxfehler automatisch zu vermeiden.
Das dritte Argument wird in vielen guten Büchern als erstes Argument erklärt.

Wenn der Schüler Ausdrücke leicht umwandeln kann, können Sie nebenbei darüber sprechen. Der Schüler wählt dann aus, was ihm am besten gefällt. Wenn Transformationen Schwierigkeiten bereiten, ist es besser, Ihre Aufmerksamkeit nicht abzulenken. Lassen Sie den Schüler zunächst alles mithilfe von while lösen. Sobald Sie das Thema Schleifen beherrschen, können Sie die Lösungen umschreiben, um die Konvertierung von while in for zu üben.
Postcondition-Schleifen sind ein ziemlich seltenes Tier. Ich verbringe überhaupt keine Zeit damit. Wenn ein Schüler die Ideen zum Erkennen von Mustern und zum Umwandeln von Ausdrücken beherrscht, kann er es ohne meine Hilfe herausfinden.

Bei der Demonstration des ersten Beispiels vor starken Studierenden mache ich darauf aufmerksam, dass es im ersten Beispiel darauf ankommt, nicht nur die Lösung, sondern die gesamte Handlungskette, die zum Ergebnis geführt hat, festzuhalten. Faule Schüler können das Schreiben vernachlässigen und nur den endgültigen Algorithmus kopieren. Sie müssen davon überzeugt sein, dass eines Tages eine schwierige Aufgabe auf sie zukommen wird. Um das Problem zu lösen, müssen Sie die Schritte wie in diesem Beispiel befolgen. Deshalb ist es wichtig, alle Phasen aufzuzeichnen. Bei den folgenden Problemen kann nur die endgültige Version der Lösung übrig bleiben.

Die Grundidee der Automatisierung besteht darin, dass wir einem Computer die Aufgabe übertragen, Routinearbeiten für eine Person zu erledigen. Eine der Grundtechniken ist das Schreiben von Schleifen. Es wird verwendet, wenn mehrere identische, sich wiederholende Aktionen hintereinander in ein Programm geschrieben werden.

Explizit ist besser als implizit

Es scheint eine gute Idee zu sein, dieselbe Phrase in der ersten Schleifenaufgabe 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 der Zählerwert in der Ausgabe nicht sichtbar ist. Dies ist ein Problem für Anfänger. Unterschätze sie nicht. Zunächst war diese Aufgabe die erste und die Aufgabe, eine Reihe von Zahlen in aufsteigender Reihenfolge abzuleiten, die zweite. Es war notwendig, zusätzliche Begriffe „Zyklus N-mal“ und „Zyklus von A nach B“ einzuführen, die im Wesentlichen dasselbe sind. Um keine unnötigen Entitäten zu erzeugen, habe ich mich entschieden, nur ein Beispiel mit der Ausgabe einer Zahlenreihe zu zeigen. Nur wenige Menschen schaffen es, ohne Vorbereitung zu lernen, einen Zähler im Kopf zu halten und das Verhalten eines Programms im Kopf zu modellieren. Manche Schüler begegnen der mentalen Modellierung erstmals beim Thema Zyklen.
Nach einiger Übung gebe ich die Aufgabe, den gleichen Text zu wiederholen und ihn selbstständig zu lösen. Wenn Sie zuerst einen sichtbaren und dann einen unsichtbaren Zähler vergeben, werden die Schüler weniger Probleme haben. Manchmal reicht der Hinweis „Zähler nicht auf den Bildschirm schreiben“ aus.

Wie erklären es andere?

In den meisten Lehrmaterialien im Internet wird die Syntax des Zyklus im Rahmen einer „Vorlesung“ gegeben. Beispielsweise werden auf Developer.mozilla.org (derzeit) mehrere andere Konstrukte zusammen mit der while-Schleife beschrieben. In diesem Fall werden nur die Designs selbst in Form von Vorlagen bereitgestellt. Das Ergebnis ihres Starts wird in Worten beschrieben, es gibt jedoch keine Illustration. Meiner Meinung nach multipliziert eine solche Darstellung des Themas den Nutzen solcher Materialien mit Null. Der Student kann den Code umschreiben und selbst ausführen, benötigt aber dennoch einen Standard zum Vergleich. Wie können Sie erkennen, dass ein Beispiel korrekt umgeschrieben wurde, wenn es keinen Vergleich zum Ergebnis gibt?
Wenn nur eine Vorlage ohne Beispiel gegeben wird, wird es für den Schüler noch schwieriger. Wie kann man verstehen, dass die Codefragmente korrekt in der Vorlage platziert sind? Sie können versuchen zu schreiben irgendwie, und dann ausführen. Aber wenn es keinen Standard gibt, um das Ergebnis zu vergleichen, hilft auch das Starten nicht.

Im C++-Kurs zu Intuitive ist 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 eine Anweisung“, „{} ist eine zusammengesetzte Anweisung“, „Der Schleifenkörper muss eine Anweisung sein“. Ich mag diesen Ansatz nicht, weil er scheinbar wichtige Zusammenhänge hinter einem Begriff verbirgt. Das Parsen des Quellcodes eines Programms in Begriffe auf dieser Ebene ist für Compiler-Entwickler erforderlich, um die Sprachspezifikation zu implementieren, für Studenten jedoch nicht als erste Annäherung. Programmierneulinge sind selten akribisch genug, um den Begriffen so viel Aufmerksamkeit zu schenken. Es ist eine seltene Person, die sich neue Wörter gleich beim ersten Mal merkt und sie versteht. Fast niemand kann einen gerade gelernten Begriff richtig anwenden. Daher erhalten Studierende viele Fehlermeldungen wie „Ich habe while(a<7);{ geschrieben, aber das Programm funktioniert nicht.“
Meiner Meinung nach ist es am Anfang besser, die Syntax der Konstruktion gleich mit Klammern anzugeben. Die Option ohne Klammern sollte nur erklärt werden, wenn der Schüler eine konkrete Frage hat: „Warum gibt es keine Klammern und es funktioniert?“

In Okulovs Buch „Fundamentals of Programming“ aus dem Jahr 2012 beginnt eine Einführung in Schleifen mit dem for-Muster, gibt dann Empfehlungen für dessen Verwendung und geht dann sofort zum experimentellen Teil der Lektion über. Ich verstehe, dass das Buch für die Minderheit sehr fähiger Schüler geschrieben wurde, die selten zu meinen Kursen kommen.

In populären Büchern wird immer das Ergebnis von Codefragmenten geschrieben. Zum Beispiel Shildts „Java 8. The Complete Guide“, Ausgabe 2015. Zuerst wird eine Vorlage angegeben, dann ein Beispielprogramm und direkt danach das Ergebnis der Ausführung.

Betrachten Sie als Beispiel eine while-Schleife, die das Gegenteil bewirkt
Der Countdown beginnt bei 10 und es werden genau 10 Zeilen mit „Maßnahmen“ angezeigt:

//Продемонстрировать применение оператора цикла while
class While {
    public static void main(String args []) {
        int n = 10;
        while (n > 0) {
            System.out.println("такт " + n);
            n--;
        }
    }
}

Nach der Ausführung gibt dieses Programm zehn „Zyklen“ wie folgt aus:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Der Ansatz, ein Template, ein Beispielprogramm und das Ergebnis des Programms zu beschreiben, wird auch im Buch „Javascript for Kids“ und im js-Kurs auf w3schools.com verwendet. Das Webseitenformat ermöglicht sogar, dass dieses Beispiel interaktiv ist.

Stroustrups Buch Principles and Practice Using C++ aus dem Jahr 2016 ging sogar noch weiter. Der erste Schritt besteht darin, zu erklären, welches Ergebnis erzielt werden soll. Anschließend wird der Text des Programms angezeigt. Darüber hinaus nehmen sie nicht nur ein beliebiges Programm als Beispiel, sondern geben einen Ausflug in die Geschichte. Dies hilft, die Aufmerksamkeit darauf zu lenken: „Sehen Sie, das ist nicht nur irgendein nutzloser Text. Du siehst etwas Sinnvolles.“

Betrachten Sie als Beispiel einer Iteration das erste Programm, das auf einer gespeicherten Programmmaschine (EDSAC) ausgeführt wird. Es wurde am 6. Mai 1949 von David Wheeler am Computerlabor der Universität Cambridge, 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 einem Tabulatorzeichen („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;
    }
}

Interessanterweise wird das Syntaxmuster in diesem Buch nicht beschrieben. Stroustrup im Ausbilderhandbuch (Übersetzung) betont, dass sie die Intelligenz ihrer Studierenden respektiert. Vielleicht wird die Fähigkeit, ein Muster in mehreren Beispielen zu erkennen, als Ausdruck einer solchen Intelligenz angesehen.

Wie ich es selbst erkläre

Stroustrups Ansatz: das Ergebnis beschreiben, dann das Problem lösen und dann eine unabhängige Analyse durch den Schüler durchführen – scheint am durchdachtesten zu sein. Deshalb habe ich beschlossen, es als Grundlage zu nehmen, es aber anhand eines weniger historischen Beispiels zu erzählen – der Aufgabe, ein „Inhaltsverzeichnis“ abzuleiten. Es bildet einen erkennbaren Anker, so dass man dann sagen kann „Merkt euch die Aufgabe zum Inhaltsverzeichnis“ und damit sich die Schüler genau das merken. In meinem Beispiel habe ich versucht, zwei weitere der häufigsten Missverständnisse zu verhindern. Als nächstes werde ich ausführlicher darüber schreiben.

In dieser Aufgabe lernen wir Techniken zur Lösung komplexer Probleme kennen. Die anfängliche Entscheidung muss primitiv und einfach getroffen werden. Dann können Sie darüber nachdenken, wie Sie diese Lösung verbessern können.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Nach meinen Beobachtungen führt der „Vorlage-Beispiel-Ergebnis“-Ansatz in verschiedenen Kombinationen immer noch dazu, dass Studierende den Zyklus als Hieroglyphe wahrnehmen. Dies äußerte sich darin, dass sie nicht verstanden, warum es dort eine Bedingung zum Schreiben gab, wie man zwischen i++ und i wählen sollte – und anderen scheinbar offensichtlichen Dingen. Um diese Missverständnisse zu vermeiden, sollte bei der Betrachtung von Zyklen die Bedeutung der Wiederholung identischer Aktionen und deren anschließende Formalisierung durch eine Struktur betont werden. Daher müssen Sie das Problem direkt lösen, bevor Sie die Schleifensyntax angeben. Eine einfache 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 monotone Handlungen durch einen Zyklus.
Welche Aktionen werden ohne Änderungen hintereinander wiederholt?
In diesem Fragment gibt es keine. Allerdings sind die Befehle zum Anzeigen des Wortes „Kapitel“ mit einer Nummer einander sehr ähnlich.
Daher besteht der nächste Schritt darin, den Unterschied zwischen den Fragmenten zu finden. Nur bei dieser Aufgabe ist alles klar, dann werden nicht einzelne Befehle wiederholt, sondern Codeblöcke von 5 Zeilen oder mehr. Sie müssen nicht nur in der Liste der Befehle suchen, sondern auch in Verzweigungen oder Schleifenkonstruktionen.
Im Beispiel liegt der Unterschied zwischen den Befehlen in der Nummer nach dem Wort „Kapitel“.
Sobald der Unterschied gefunden ist, müssen Sie das Muster der Veränderung verstehen. Das unterschiedliche Fragment ist die Zahl? Nimmt es ständig zu oder ab? Wie verändert sich der Wert einer Zahl zwischen zwei Teams nebeneinander?
Im Beispiel erhöht sich die Zahl nach dem Wort „Kapitel“ in Schritten von 1. Der Unterschied wird gefunden, das Muster wird sichtbar. Jetzt können Sie das abweichende Fragment durch eine Variable ersetzen.
Sie müssen eine solche Variable vor dem ersten der sich wiederholenden Fragmente deklarieren. Eine solche Variable wird normalerweise I oder j oder eine detailliertere Bezeichnung genannt. Sein Anfangswert muss dem ersten auf dem Bildschirm angezeigten Wert entsprechen. Im Beispiel ist der erste Wert 1.
Welchen Anfangswert sollte man nehmen, um die Zahlenreihe „100, 101, 102, 103, 104, 105“ anzuzeigen?
Die erste Zahl in dieser Reihe ist 100.
Nach jedem Ausgabebefehl müssen Sie den Wert dieser Variablen um 1 erhöhen. Diese Einheit ist der Änderungsschritt.
Welcher Schritt wird in der Zahlenreihe „100, 102, 104, 106“ sein?
Schritt 2 in dieser Reihe.
Nachdem Sie das abweichende Fragment durch eine Variable ersetzt haben, 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("Заключение");

Nachdem Sie die Technik „Das Muster einer Variablen ausdrücken“ im Code angewendet haben, erhalten Sie mehrere Gruppen identischer Aktionen, die hintereinander ausgeführt werden. Jetzt können sich wiederholende Aktionen durch eine Schleife ersetzt werden.

Der Ablauf zur Lösung eines Problems, bei dem Sie Schleifen verwenden müssen, besteht aus den folgenden Schritten:

  1. Lösen Sie „frontal“ mit vielen separaten Befehlen
  2. Finden Sie ein Muster
  3. Drücken Sie das Muster einer Variablen aus
  4. Design als Kreislauf

Anschließend werden neue Begriffe eingeführt, damit sich der Schüler nicht in der Situation „Ich verstehe alles, kann es aber nicht sagen“ befindet:
— Ein Zähler ist immer eine Variable, die benötigt wird, um die Anzahl der Schritte in einer Schleife zu verfolgen. Typischerweise eine Ganzzahl, die mit der Einschränkung verglichen wird.
– Gegenschritt – Beschreibung des Musters der Gegenänderungen.
- Einschränkung – eine Zahl oder Variable, mit der der Zähler verglichen wird, damit der Algorithmus endgültig ist. Der Zählerwert ändert sich, um sich dem Grenzwert zu nähern.
– Schleifenkörper – eine Reihe von Befehlen, die wiederholt werden. Wenn sie sagen „Der Befehl wird in eine Schleife geschrieben“, meinen sie den Textkörper.
– Schleifeniteration – einmalige Ausführung des Schleifenkörpers.
– Schleifenbedingung – ein logischer Ausdruck, der bestimmt, ob eine weitere Iteration ausgeführt wird. (Hier kann es zu Verwechslungen mit verzweigten Strukturen kommen)
Sie müssen darauf vorbereitet sein, dass Studierende Begriffe zunächst für andere Zwecke verwenden. Dies gilt sowohl für die Starken als auch für die Schwachen. Eine gemeinsame Sprache zu etablieren ist eine Kunst. Jetzt schreibe ich kurz: Sie müssen die Aufgabe „Markieren Sie das Codefragment mit <term>“ stellen und diese Begriffe selbst im Gespräch richtig verwenden.
Nach der Transformation mit einer Schleife erhält man das Fragment:

Console.WriteLine("Введение");
int i = 0;
while (i < 7) {
    Console.WriteLine("Глава " + i);
    i = i + 1;
}
Console.WriteLine("Заключение");

Das größte Missverständnis

Ein weit verbreitetes Missverständnis unter Schülern besteht darin, dass sie Aktionen in einer Schleife platzieren, die nur einmal ausgeführt werden müssen. Zum Beispiel so:

;
int i = 0;
while (i < 7) {
    Console.WriteLine("Введение")
    Console.WriteLine("Глава " + i);
    i = i + 1;
    Console.WriteLine("Заключение");
}

Studierende stoßen immer wieder auf dieses Problem, sowohl am Anfang als auch bei komplexeren Problemen.
Wichtiger Hinweis in diesem Fall:

Wie oft sollten Sie den Befehl wiederholen: einmal oder mehrmals?

Die Befehle zum Drucken der Wörter „Einleitung“ und „Schlussfolgerung“ sowie zum Deklarieren und Initialisieren der Variablen i ähneln anderen sich wiederholenden Aktionen. Sie werden nur einmal ausgeführt, was bedeutet, dass sie außerhalb des Schleifenkörpers geschrieben werden müssen.

Alle drei Lösungsschritte sollten im Code verbleiben, damit Sie später bei Schwierigkeiten darauf zurückgreifen können. Es reicht aus, die ersten beiden Optionen auszukommentieren, damit sie nicht stören.
Der Studierende sollte auf folgende Tatsachen aufmerksam gemacht werden:
— In einer Schleifenbedingung werden normalerweise ein Zähler und ein Grenzwert verglichen. Der Zähler kann sich im Schleifenkörper ändern, der Grenzwert jedoch nicht. Um gegen diese Regel zu verstoßen, müssen Sie zwingende Gründe formulieren.
— Befehle zum Anzeigen der Wörter „Einleitung“ und „Schlussfolgerung“ befinden sich außerhalb des Schleifenkörpers. Wir müssen sie einmal durchführen. „Einleitung“ – vor der Wiederholung der Aktionen, „Schlussfolgerung“ – danach.
Im Prozess der Festigung dieses Themas, der Beherrschung der nächsten sowie der Bewältigung von Schwierigkeiten ist es selbst für starke Schüler sinnvoll, die Frage zu stellen: „Wie oft muss diese Aktion ausgeführt werden?“ Einer oder mehrere?

Entwicklung zusätzlicher Fähigkeiten

Im Verlauf der Studienzyklen entwickeln die Studierenden auch die Fähigkeit, Probleme zu diagnostizieren und zu lösen. Zur Durchführung der Diagnostik muss der Student das gewünschte Ergebnis präsentieren und es mit dem tatsächlichen Ergebnis vergleichen. Korrekturmaßnahmen hängen vom Unterschied zwischen ihnen ab.
Da die Studierenden zu diesem Zeitpunkt noch keine Vorstellung vom „gewünschten“ Ergebnis haben, können sie sich auf Testdaten konzentrieren. In der Regel versteht zu diesem Zeitpunkt noch niemand, was schief gehen kann und wie man damit umgeht. Deshalb schreibe ich in ein Notizbuch eine Beschreibung typischer Probleme und verschiedene Lösungsmöglichkeiten. Die Auswahl des am besten geeigneten ist die Aufgabe des Studierenden selbst.
Es ist eine Aufzeichnung erforderlich, um zu fragen: „Ist das Erwartete eingetreten?“, „Welche dieser Situationen ist jetzt eingetreten?“, „Hat die angewandte Lösung geholfen?“

  1. Die Anzahl der Aktionen ist 1 weniger oder mehr als erwartet. Lösungen:
    — Erhöhen Sie den Anfangswert des Zählers um 1.
    – Ersetzen Sie den strengen Vergleichsoperator (< oder >) durch einen nicht strengen (<= oder >=).
    — Ändern Sie den Grenzwert auf 1.
  2. Aktionen in einer Schleife werden ohne Unterbrechung und auf unbestimmte Zeit ausgeführt. Lösungen:
    — Fügen Sie einen Befehl zum Ändern des Zählers hinzu, falls dieser fehlt.
    — Korrigieren Sie den Befehl zum Ändern des Zählers, sodass sein Wert näher an den Grenzwert herankommt.
    – Entfernen Sie den Befehl zum Ändern der Einschränkung, wenn er sich im Hauptteil der Schleife befindet.
  3. Die Anzahl der Aktionen in einer Schleife ist um mehr als 1 kleiner oder größer als erwartet. Die Aktion in der Schleife wurde kein einziges Mal ausgeführt. Zunächst müssen Sie kurz vor Beginn der Schleife die tatsächlichen Werte der Variablen ermitteln. Lösungen:
    — Ändern Sie den Anfangswert der Einschränkung
    — Ändern Sie den Anfangswert des Zählers

Problem 3 besteht normalerweise darin, dass die falsche Variable verwendet wird oder der Zähler nicht auf Null zurückgesetzt wird.

Nach dieser Erklärung hat der Schüler möglicherweise immer noch verschiedene Missverständnisse darüber, wie Schleifen funktionieren.
Um die häufigsten auszuräumen, gebe ich Ihnen folgende Aufgaben:

  1. Dabei wird der Grenzwert, der anfängliche Zählerwert oder der Zählerschritt vom Benutzer eingegeben.
  2. Dabei muss der Zählerwert in einem arithmetischen Ausdruck verwendet werden. Es empfiehlt sich, im Wurzelausdruck oder im Nenner einen Zähler zu verwenden, damit die Differenz nichtlinear ist.
  3. Bei dem der Zählerwert während der Ausführung der Schleife nicht auf dem Bildschirm angezeigt wird. Zum Beispiel das Anzeigen der benötigten Anzahl identischer Textfragmente oder das Zeichnen einer Figur mit Schildkrötengrafiken.
  4. Dabei müssen Sie zuerst einige sich wiederholende Aktionen und dann andere ausführen.
  5. Dabei müssen Sie vor und nach der Wiederholung weitere Aktionen ausführen

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

Um zu verstehen, wie schnell Sie vorankommen können, müssen Sie die Bedingungen dieser Probleme lesen und fragen: „Wie unterscheiden sie sich vom Beispiel?“ „Was muss am Beispiel geändert werden, um sie zu lösen?“ Wenn der Schüler sinnvoll antwortet, lassen Sie ihn mindestens eine davon im Unterricht lösen und den Rest zu Hause alleine. Wenn die Lösung erfolgreich ist, können wir mit der Erklärung der Bedingungen innerhalb der Schleifen beginnen.
Wenn Sie Schwierigkeiten haben, Probleme alleine zu lösen, müssen Sie alles im Unterricht durcharbeiten. Um zu vermeiden, dass die Lösung des Problems an das Zeichnen einer Eule erinnert, empfehle ich, das Problem zunächst auf nicht-universelle Weise zu lösen. Das heißt, dass die Lösung den ersten Test besteht und nicht die Schleifenkonstruktion verwendet. Dann wenden Sie Transformationen an, um eine Universalität der Lösung zu erreichen.

Schleifen und Verzweigungen

Meiner Meinung nach ist es sinnvoll, das Thema „Zyklen innerhalb von Zweigen“ gesondert zu behandeln. Damit Sie später den Unterschied zwischen der mehrmaligen und der einmaligen Prüfung einer Bedingung erkennen können.
Bei den Aufgaben zur Konsolidierung geht es um die Ausgabe von Zahlen von A nach B, die vom Benutzer eingegeben werden:
- immer in aufsteigender Reihenfolge.
- aufsteigend oder absteigend, abhängig von den Werten von A und B.

Das Thema „Verzweigung innerhalb von Schleifen“ sollte erst dann fortgesetzt werden, wenn der Schüler die Techniken „Ersetzen eines Musters durch eine Variable“ und „Ersetzen sich wiederholender Aktionen durch einen Zyklus“ beherrscht.
Der Hauptgrund für die Verwendung von Zweigen innerhalb von Schleifen sind Anomalien im Muster. In der Mitte bricht es je nach Ausgangsdaten ab.
Für diejenigen Schüler, die in der Lage sind, durch die Kombination einfacher Techniken nach einer Lösung zu suchen, reicht es zu sagen „Verzweigungen können in Schleifen geschrieben werden“ und das Problem „zum Beispiel“ vollständig anzugeben, damit es unabhängig gelöst werden kann.
Beispielaufgabe:

Der Benutzer gibt die Zahl X ein. Zeigen Sie die Zahlen von 0 bis 9 in einer Spalte an und setzen Sie ein „+“-Zeichen gegenüber der Zahl, die X entspricht.

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

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

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

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

Wenn eine kurze Erklärung zum Schreiben mit einer Schleife nicht ausreicht, müssen Sie eine universelle Lösung für dasselbe Problem ohne Schleife finden.
Sie erhalten eine von zwei Optionen:
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+n1n2n3n4n5n6n7n8n9");
}
if (x==1) {
    Console.WriteLine("0n1+n2n3n4n5n6n7n8n9");
}
if (x==2) {
    Console.WriteLine("0n1n2+n3n4n5n6n7n8n9");
}
if (x==3) {
    Console.WriteLine("0n1n2n3+n4n5n6n7n8n9");
}
if (x==4) {
    Console.WriteLine("0n1n2n3n4+n5n6n7n8n9");
}
if (x==5) {
    Console.WriteLine("0n1n2n3n4n5+n6n7n8n9");
}
if (x==6) {
    Console.WriteLine("0n1n2n3n4n5n6+n7n8n9");
}
if (x==7) {
    Console.WriteLine("0n1n2n3n4n5n6n7+n8n9");
}
if (x==8) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8+n9");
}
if (x==9) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8n9+");
}

Ich gebe eine ähnliche Aufgabe im Voraus, während ich mich mit dem Thema Verzweigung befasse.
Wenn der Schüler eine „mögliche“ Option vorschlägt, müssen Sie ihm sagen, dass es für dasselbe Problem viele Lösungen geben kann. Sie unterscheiden sich jedoch in ihrer Widerstandsfähigkeit gegenüber veränderten Anforderungen. Stellen Sie die Frage: „Wie viele Stellen im Code müssten korrigiert werden, wenn ich eine weitere Zahl hinzufügen müsste?“ In der „möglichen“ Version müssen Sie einen weiteren Zweig hinzufügen und an 10 weiteren Stellen eine neue Nummer hinzufügen. Bei „gewünscht“ reicht es aus, nur einen Zweig hinzuzufügen.
Legen Sie die Aufgabe fest, um die „gewünschte“ Option zu reproduzieren, 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 Thema müssen Sie auf Folgendes achten:
— 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 (d. h. im Hauptteil der äußeren Schleife).
— Bei Textausgabeaufgaben können Sie nicht zuerst einen Buchstaben in mehreren Zeilen und dann den zweiten schreiben. Sie müssen zuerst alle Buchstaben der ersten Zeile drucken, dann alle Buchstaben der zweiten und so weiter.

Am besten beginnen Sie mit der Erläuterung des Themas Schleifen innerhalb von Schleifen, indem Sie erläutern, wie wichtig es ist, den Zähler auf Null zurückzusetzen.
Beispielaufgabe:

Der Benutzer gibt zwei Zahlen ein: R und T. Drucken Sie zwei Zeilen mit „#“-Zeichen. Die erste Zeile sollte R-Zeichen enthalten. Die zweite Zeile enthält T-Stücke. Wenn eine Zahl negativ ist, wird eine Fehlermeldung angezeigt.

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

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

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

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

Offensichtlich gibt es auch für dieses Problem 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 bei der „möglichen“ Lösung eine zweite Variable zur Ausgabe der zweiten Zeile verwendet wurde. Sie sollten darauf bestehen, für beide Schleifen dieselbe Variable zu verwenden. Diese Einschränkung kann damit begründet werden, dass eine Lösung mit einem Zähler für zwei Zyklen ein Beispiel für den Begriff „Zähler-Reset“ darstellt. Das Verständnis dieses Begriffs ist für die Lösung der folgenden Probleme erforderlich. Als Kompromiss können Sie sich beide Lösungen des Problems sparen.

Ein typisches Problem bei der Verwendung einer Zählervariablen für zwei Schleifen sieht folgendermaßen aus:
R=5, T=11#####
######

Die Anzahl der Zeichen in der zweiten Zeile entspricht nicht dem Wert von T. Wenn Sie Hilfe bei diesem Problem benötigen, sollten Sie sich die Hinweise zu typischen Problemen mit Schleifen ansehen. Das ist Symptom Nr. 3. Es wird diagnostiziert, wenn Sie unmittelbar vor dem zweiten Zyklus einen Zählerwertausgang hinzufügen. Durch Zurücksetzen korrigiert. Aber es ist besser, das nicht gleich zu sagen. Der Student muss versuchen, mindestens eine Hypothese zu formulieren.

Es gibt natürlich noch eine andere Lösung. Aber ich habe es bei Studenten noch nie gesehen. In der Phase des Studiums der Zyklen wird die Geschichte darüber die Aufmerksamkeit ablenken. Sie können später darauf zurückkommen, wenn Sie etwas über String-Funktionen lernen.
Mögliche Nr. 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));

Nächste erforderliche Aufgabe:

Zeigen Sie die Zahlen von 0 bis 9 an. Jede Zahl sollte in einer eigenen Zeile stehen. Die Anzahl der Ziffern in einer Zeile (W) wird über die Tastatur eingegeben.

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

W = 100000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999

Wenn ein Schüler die Technik des Ersetzens einer Variablen beherrscht, wird er recht schnell damit zurechtkommen. Ein mögliches Problem wird wiederum das Zurücksetzen der Variablen sein. Wenn Sie mit der Transformation nicht zurechtkommen, bedeutet das, dass Sie es eilig hatten und einfachere Probleme lösen müssen.

Vielen Dank für Ihre Aufmerksamkeit. Like und abonniere den Kanal.

PS Wenn Sie Tippfehler oder Fehler im Text finden, teilen Sie mir dies bitte mit. Dies kann durch Auswahl eines Teils des Textes und Drücken von „⌘ + Enter“ auf dem Mac und „Strg/Enter“ auf klassischen Tastaturen oder über private Nachrichten erfolgen. Wenn diese Optionen nicht verfügbar sind, schreiben Sie in den Kommentaren über Fehler. Danke!

An der Umfrage können nur registrierte Benutzer teilnehmen. Einloggenbitte.

Umfrage für Leser ohne Karma

  • 20,0%Ich unterrichte professionell, +12

  • 10,0%Ich unterrichte professionell, -11

  • 70,0%Ich unterrichte nicht, +17

  • 0,0%Ich unterrichte nicht, -10

  • 0,0%Anderes (0

10 Benutzer haben abgestimmt. 5 Benutzer enthielten sich der Stimme.

Source: habr.com

Kommentar hinzufügen