Auch wenn es sich um eines der grundlegendsten Themen handelt, ist dieser Artikel fĂŒr erfahrene Fachleute geschrieben. Ziel ist es, aufzuzeigen, welche MissverstĂ€ndnisse hĂ€ufig bei AnfĂ€ngern im Programmieren auftreten. FĂŒr praktizierende Entwickler sind diese Probleme lĂ€ngst gelöst, vergessen oder werden gar nicht mehr wahrgenommen. Der Artikel kann nĂŒtzlich sein, falls Sie plötzlich jemandem in diesem Thema helfen mĂŒssen. Es werden Parallelen zu Materialien aus verschiedenen BĂŒchern ĂŒber Programmierung der Autoren Schildt, Stroustrup, Okulov gezogen.
Das Thema ĂŒber Schleifen wurde gewĂ€hlt, weil sich dabei viele Menschen beim Erlernen der Programmierung schwer tun.
Diese Methode richtet sich an schwache Studenten. In der Regel bleiben stĂ€rkere an diesem Thema nicht hĂ€ngen, und es ist keine speziellen Methoden fĂŒr sie erforderlich. Ein sekundĂ€res Ziel des Artikels ist es, diese Methode von der Klasse "funktioniert bei allen Studenten, aber nur bei einem Lehrer" in die Klasse "funktioniert fĂŒr alle Studenten, alle Lehrer" zu ĂŒbertragen. Ich beanspruche keine absolute OriginalitĂ€t. Falls Sie bereits eine Ă€hnliche Methode zum Lehren dieses Themas anwenden, lassen Sie mich bitte wissen, wie sich Ihre Variante unterscheidet. Wenn Sie sich entscheiden, sie anzuwenden, berichten Sie bitte nach Abschluss, wie es gelaufen ist. Wenn eine Ă€hnliche Methode in einem Buch beschrieben ist, teilen Sie mir bitte den Titel mit.
Diese Methode habe ich ĂŒber 4 Jahre getestet, indem ich individuell mit Studenten unterschiedlicher Vorbildung gearbeitet habe. Insgesamt etwa fĂŒnfzig Studenten und zweitausend Stunden Unterricht. Anfangs blieben die Studenten bei diesem Thema oft hĂ€ngen und brachen ab. Nach jedem Studenten wurden die Methode und die Materialien angepasst. Im letzten Jahr bleiben die Studenten bei diesem Thema nicht mehr hĂ€ngen, sodass ich beschlossen habe, meine Erfahrungen zu teilen.
Warum so viele Buchstaben? Schleifen sind doch einfach!
Wie ich bereits oben erwĂ€hnt habe, kann die Schwierigkeit des Konzepts der Schleifen von praktizierenden Entwicklern und starken Studenten unterschĂ€tzt werden. Man könnte eine lange Vorlesung halten, nicken sehen und kluge Augen erleben. Doch beim Versuch, ein Problem zu lösen, kommt es zu einem Stillstand und unerklĂ€rlichen Schwierigkeiten. Nach der Vorlesung haben die Studenten sicher nur ein teilweises VerstĂ€ndnis gewonnen. Die Situation wird dadurch verschĂ€rft, dass die Studenten nicht in der Lage sind zu Ă€uĂern, wo genau ihr MissverstĂ€ndnis liegt.
Eines Tages wurde mir klar, dass die Studierenden meine Beispiele wie Hieroglyphen betrachten. Das heiĂt, als unteilbare TextstĂŒcke, in denen man irgendeinen 'magischen' Buchstaben hinzufĂŒgen muss, und es wird funktionieren.
Manchmal bemerkte ich, dass die Studierenden denken, dass fĂŒr die Lösung einer bestimmten Aufgabe irgendeine andere Konstruktion erforderlich sei, die ich einfach noch nicht erklĂ€rt habe. Dabei benötigte man lediglich eine kleine Modifikation des Beispiels.
Deshalb kam ich auf die Idee, dass der Schwerpunkt nicht auf der Syntax der AusdrĂŒcke liegen sollte, sondern auf der Idee des Refactorings wiederkehrenden Codes mit Hilfe von Schleifen. Sobald die SchĂŒler diese Idee verstanden haben, wird jede Syntax durch kleine Ăbungen erlernt.
Wem und warum ich unterrichte
Da es keine AufnahmeprĂŒfungen gibt, können im Unterricht sowohl starke als auch sehr schwache Studierende sein. Mehr ĂŒber meine Studierenden kann man in dem Artikel lesen
Ich strebte danach, dass jeder, der es möchte, Programmieren lernen kann.
Meine Kurse finden individuell statt, und der Student bezahlt sein Geld fĂŒr jede Einheit. Man könnte denken, dass die Studierenden versuchen werden, die Kosten zu optimieren und das Minimum zu fordern. Doch die Menschen besuchen PrĂ€senzkurse bei einem Live-Lehrer nicht nur wegen des Wissens, sondern auch wegen des GefĂŒhls der Gewissheit, dass sie das Material verstanden haben, wegen des GefĂŒhls des Fortschritts und der BestĂ€tigung durch einen Experten (Lehrer). Wenn die Studierenden keinen Fortschritt in ihrem Lernen fĂŒhlen, werden sie aufhören zu kommen. Im Allgemeinen kann man den Unterricht so gestalten, dass die Studierenden ihren Fortschritt im Erlernen bekannter Konstruktionen spĂŒren. Wir lernen zuerst ausfĂŒhrlich die while-Schleife, dann die for-Schleife, dann die do-while-Schleife, und plötzlich haben wir einen Kurs fĂŒr Tausendundeine Nacht, in dem zwei Monate lang nur Schleifen behandelt werden, und am Ende haben wir einen Studenten, der aus dem GedĂ€chtnis die Standardbibliothek niedergeschrieben hat. Um jedoch praktische Probleme zu lösen, benötigt man nicht nur Wissen ĂŒber das Material, sondern auch die EigenstĂ€ndigkeit in der Anwendung und der Suche nach neuen Informationen. Daher halte ich fĂŒr PrĂ€senzkurse den Grundsatz fĂŒr richtig, mindestens zu lehren und eigenstĂ€ndiges Lernen von Feinheiten und verwandten Themen zu fördern. Im Kontext der Schleifen betrachte ich die while-Konstruktion als das Minimum. Auf ihr kann man das Prinzip verstehen. Wenn man das Prinzip kennt, kann man auch selbststĂ€ndig die for- und do-while-Schleifen erlernen.
Um das Material schwacher Studenten zu vermitteln, reicht es nicht aus, die Syntax zu beschreiben. Man muss vielfĂ€ltige, einfache Aufgaben stellen und die Beispiele nĂ€her erlĂ€utern. Letztendlich wird die Geschwindigkeit des Lernens durch die FĂ€higkeit des Studenten, AusdrĂŒcke umzuformen und Muster zu erkennen, begrenzt. FĂŒr schnelle Studenten werden die meisten Aufgaben langweilig sein. Bei der Arbeit mit ihnen kann man darauf verzichten, darauf zu bestehen, dass 100 % der Aufgaben gelöst werden. Mein Material ist auf einsehbar. Zwar sieht das Repository mehr wie ein grimoire eines Schwarzmagiers aus â niemand auĂer mir wird verstehen, wo was zu finden ist, und wenn man die PrĂŒfung nicht besteht, kann man verrĂŒckt werden.
Die Methode ist praxisorientiert.
Die Theorie wird anhand der Lösung einer Aufgabe erklĂ€rt. In den Unterrichtseinheiten zu den Grundlagen der Programmierung, in denen Verzweigungen und Schleifen behandelt werden, lĂ€sst sich einfach keine nĂŒtzliche Vorlesung zu einem Thema fĂŒr eine ganze Stunde halten. 15-20 Minuten reichen aus, um das Konzept zu erklĂ€ren. Die gröĂten Schwierigkeiten treten bei der Bearbeitung praktischer Aufgaben auf.
AnfÀngerlehrer können Operatoren, Verzweigungen, Schleifen und Arrays in einer einzigen Vorlesung behandeln. Doch die Studenten werden dabei Schwierigkeiten haben, diese Informationen zu verarbeiten.
Es reicht schlieĂlich nicht aus, das Material nur zu prĂ€sentieren, man muss auch sicherstellen, dass die Zuhörer es verstanden haben.
Der Grad des VerstÀndnisses des Themas zeigt sich daran, wie der Student selbststÀndig an Aufgaben arbeitet.
Wenn es dem Studenten gelingt, eine Aufgabe zum Thema ohne Hilfe des Lehrers zu lösen, wurde das Thema verstanden. Um eine selbststĂ€ndige ĂberprĂŒfung zu ermöglichen, wird fĂŒr jede Aufgabe eine Tabelle mit Test-Szenarien beschrieben. Die Aufgaben haben eine klar erkennbare Reihenfolge. Es wird nicht empfohlen, Aufgaben auszulassen. Wenn die aktuelle Aufgabe zu schwierig ist, macht es keinen Sinn, zur nĂ€chsten zu wechseln. Diese ist noch schwieriger. Damit der Student die aktuelle schwierige Aufgabe bewĂ€ltigen kann, werden ihm mehrere Methoden anhand der ersten Aufgabe erklĂ€rt. TatsĂ€chlich reduziert sich der gesamte Inhalt des Themas auf Methoden zur Ăberwindung von Schwierigkeiten. Schleifen sind dabei eher ein Nebeneffekt.
Die erste Aufgabe ist immer ein Beispiel. Die zweite unterscheidet sich nur geringfĂŒgig und wird âselbststĂ€ndigâ sofort nach der ersten unter Aufsicht des Lehrers durchgefĂŒhrt. Alle nachfolgenden Aufgaben haben das Ziel, auf verschiedene Kleinigkeiten hinzuweisen, die zu MissverstĂ€ndnissen fĂŒhren können.
Die ErklĂ€rung des Beispiels stellt einen Dialog dar, in dem der Student die RĂŒckpropagation und Kreuzvalidierung aufrufen muss, um sicherzustellen, dass er den Materialteil verstanden hat.
Ich werde banal sein und sagen, dass das erste Beispiel zu dem Thema sehr wichtig ist. Bei Vorhandensein von Material fĂŒr umfangreiche selbstĂ€ndige Arbeiten können VersĂ€umnisse des ersten Beispiels behoben werden. Wenn es auĂer dem Beispiel nichts gibt, wird der Student das Thema wahrscheinlich nicht meistern.
While oder for?
Eine der umstrittenen Fragen ist die Wahl der Konstruktion fĂŒr das Beispiel: while oder for. Eines Tages hat ein bekannter praktizierender Entwickler ohne Lehrerfahrung mich eine Stunde lang davon ĂŒberzeugt, dass die for-Schleife die einfachste zu verstehende ist. Die Argumente beschrĂ€nkten sich auf "darin ist alles klar und gut strukturiert". Das eigentliche Problem fĂŒr echte AnfĂ€nger liegt jedoch in der Idee der Schleife, nicht in ihrer Schreibweise. Wenn ein Mensch diese Idee nicht versteht, wird er Schwierigkeiten mit der Syntax haben. Sobald die Idee begriffen ist, verschwinden die Probleme mit der Codegestaltung von selbst.
In meinen Materialien folgt das Thema Schleifen dem Thema Verzweigungen. Die Ă€uĂere Ăhnlichkeit von if und while erlaubt es, eine direkte Analogie zu ziehen: "Wenn die Bedingung im Header wahr ist, wird der Körper ausgefĂŒhrt". Das Besondere an der Schleife ist nur, dass der Körper mehrmals ausgefĂŒhrt wird.
Mein zweites Argument ist, dass while weniger Gestaltung erfordert als for. Weniger Gestaltung bedeutet weniger dumme Fehler mit fehlenden Kommas und Klammern. Bei AnfÀngern ist die Aufmerksamkeit und Detailgenauigkeit noch nicht so ausgeprÀgt, dass sie automatisch syntaktische Fehler vermeiden.
Das dritte Argument ist, dass in vielen guten BĂŒchern while zuerst erklĂ€rt wird.
Wenn es dem Studenten leicht fĂ€llt, AusdrĂŒcke zu transformieren, kann man nebenbei von for erzĂ€hlen. Der Student wird selbst wĂ€hlen, was ihm besser gefĂ€llt. Wenn die Transformationen jedoch Schwierigkeiten bereiten, ist es besser, die Aufmerksamkeit nicht zu zerstreuen. Lassen Sie den Studenten zuerst alles mit while lösen. Wenn das Thema Schleifen gemeistert ist, kann man die Lösungen umschreiben, um die Transformation von while nach for zu ĂŒben.
Schleifen mit Post-Bedingungen sind ziemlich seltene FĂ€lle. Ich verschwende dafĂŒr ĂŒberhaupt keine Zeit. Wenn der Student die Ideen zur Erkennung von Mustern und zur Transformation von AusdrĂŒcken gemeistert hat, kann er sich ohne meine Hilfe zurechtfinden.
Bei der Demonstration des ersten Beispiels an starken Studierenden weise ich darauf hin, dass es wichtig ist, im ersten Beispiel nicht nur die Lösung, sondern auch die gesamte Kette von Schritten festzuhalten, die zum Ergebnis gefĂŒhrt haben. Faulen Studierenden könnte es verleitet sein, das Schreiben zu vernachlĂ€ssigen und nur den endgĂŒltigen Algorithmus zu ĂŒbernehmen. Sie mĂŒssen davon ĂŒberzeugt werden, dass auch fĂŒr sie eines Tages eine komplexe Aufgabe kommen wird. Um diese zu lösen, wird es notwendig sein, Schritt fĂŒr Schritt wie in diesem Beispiel vorzugehen. Deshalb ist es wichtig, alle Phasen festzuhalten. In den nĂ€chsten Aufgaben kann nur die finale Lösung belassen werden.
Die Grundidee der Automatisierung ist, dass wir dem Computer die Routinearbeit des Menschen ĂŒbertragen. Eine der grundlegenden Techniken ist das Schreiben von Schleifen. Dies wird angewendet, wenn in einem Programm mehrere identische wiederkehrende Aktionen nacheinander ausgefĂŒhrt werden.
Explizit ist besser als implizit
Es mag eine gute Idee erscheinen, in der ersten Aufgabe zu Schleifen einen identischen Satz mehrere Male auszugeben. 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 Variante ist schlecht, da im Output der Wert des ZĂ€hlers nicht sichtbar ist. Das ist ein Problem fĂŒr AnfĂ€nger. Man sollte es nicht unterschĂ€tzen. ZunĂ€chst war diese Aufgabe die erste, und die Aufgabe zum Ausgeben einer Zahlenreihe in aufsteigender Reihenfolge die zweite. Es mussten zusĂ€tzliche Begriffe wie "Schleife N Mal" und "Schleife von A bis B" eingefĂŒhrt werden, die im Grunde das Gleiche sind. Um ĂŒberflĂŒssige EntitĂ€ten zu vermeiden, habe ich mich entschieden, nur das Beispiel mit der Ausgabe einer Zahlenreihe zu zeigen. Nur wenigen gelingt es ohne Vorbereitung, den ZĂ€hler im Kopf zu behalten und das Programmverhalten mental zu simulieren. Einige Studierende begegnen dem âmentalenâ Modellieren zum ersten Mal beim Thema Schleifen.
Nach etwas Ăbung gebe ich die Aufgabe, den identischen Text zu wiederholen, zur eigenstĂ€ndigen Lösung. Wenn man zuerst einen sichtbaren ZĂ€hler und dann einen unsichtbaren gibt, haben die Studierenden weniger Probleme. Manchmal reicht der Hinweis: âSchreibe den ZĂ€hler nicht auf den Bildschirmâ.
Wie wird es bei anderen erklÀrt?
In den meisten Online-Lernmaterialien wird die Syntax von Schleifen im Rahmen einer âVorlesungâ vermittelt. Zum Beispiel auf developer.mozilla.org (aktuell) werden zusammen mit der while-Schleife noch mehrere andere Konstruktionen beschrieben. Dabei werden ausschlieĂlich die Konstruktionen in Form von Vorlagen gegeben. Das Ergebnis ihrer AusfĂŒhrung wird in Worten beschrieben, eine Illustration fehlt. Meiner Meinung nach vermindert eine solche PrĂ€sentation den Nutzen solcher Materialien auf null. Ein SchĂŒler kann den Code abschreiben und selbst ausfĂŒhren, aber dennoch wird ein Referenzpunkt benötigt. Wie kann man verstehen, dass das Beispiel korrekt abgeschrieben wurde, wenn man das Ergebnis mit nichts vergleichen kann?
Wenn nur eine Vorlage gegeben wird, ohne Beispiel, wird es fĂŒr den Studenten noch schwieriger. Wie kann man verstehen, dass die Codefragmente in der Vorlage richtig angeordnet sind? Man kann versuchen, irgendwie, und dann ausfĂŒhren. Aber wenn kein Referenzpunkt fĂŒr den Ergebnisvergleich vorhanden ist, hilft die AusfĂŒhrung auch nicht.
Im C++-Kurs auf Intuite ist die Syntax der Schleife auf der dritten Seite der Vorlesung 4 zum Thema âOperatorenâ vergraben. Bei der ErklĂ€rung der Syntax von Schleifen wird besonderer Wert auf den Begriff âOperatorâ gelegt. Der Begriff wird in Form einer Ansammlung von Fakten prĂ€sentiert wie âSymbol; das ist ein Operatorâ, "{} ist ein zusammengesetzter Operator", âDer Schleifeninhalt muss ein Operator seinâ. Mir gefĂ€llt dieser Ansatz nicht, da er wichtige ZusammenhĂ€nge hinter einem einzigen Begriff zu verstecken scheint. Die Analyse des Quellcodes eines Programms in solche Terme ist auf dieser Ebene fĂŒr Compilerentwickler notwendig, um die Sprachspezifikation umzusetzen, aber ganz und gar nicht fĂŒr Studenten im ersten AnnĂ€herung. Programmierneulinge haben selten die erforderliche Genauigkeit, um die Begriffe so aufmerksam zu behandeln. Nur wenige Menschen merken sich neue Wörter beim ersten Mal und verstehen sie. Praktisch niemand kann einen Begriff korrekt anwenden, den er gerade erst gelernt hat. Daher entstehen bei Studenten viele Fehler wie âich habe while(a<7);{ geschrieben, und das Programm funktioniert nichtâ.
Meiner Meinung nach sollte zu Beginn die Syntax der Konstruktion sofort mit den Klammern gegeben werden. Die Variante ohne Klammern sollte nur erklĂ€rt werden, wenn der SchĂŒler eine spezifische Frage hat: âWarum funktioniert es hier ohne Klammern?â
In dem Buch von Okulov "Grundlagen der Programmierung" aus dem Jahr 2012 beginnt die EinfĂŒhrung in Schleifen mit dem For-Template, gefolgt von Empfehlungen zur Anwendung, und direkt danach folgt der experimentelle Abschnitt des Unterrichts. Ich verstehe, dass das Buch fĂŒr die kleine Gruppe sehr begabter SchĂŒler geschrieben wurde, die selten zu meinen Kursen kommen.
In populĂ€ren BĂŒchern wird immer das Ergebnis von Codefragmenten gezeigt. Zum Beispiel bei Schildts "Java 8. Das umfassende Handbuch" aus dem Jahr 2015. Zuerst wird das Template gegeben, dann ein Beispielprogramm und unmittelbar danach â das Ergebnis der AusfĂŒhrung.
Als Beispiel betrachten wir eine While-Schleife, in der ein Countdown von 10 ausgefĂŒhrt wird und genau 10 Zeilen "Takte" ausgegeben werden:
Nach dem Start gibt dieses Programm zehn "Takte" wie folgt aus://ĐŃĐŸĐŽĐ”ĐŒĐŸĐœŃŃŃĐžŃĐŸĐČаŃŃ ĐżŃĐžĐŒĐ”ĐœĐ”ĐœĐžĐ” ĐŸĐżĐ”ŃаŃĐŸŃа ŃĐžĐșла while class While { public static void main(String args []) { int n = 10; while (n > 0) { System.out.println("ŃаĐșŃ " + n); n--; } } }Der Ansatz mit der Beschreibung des Templates, des Programmbeispiels und des Ergebnisses dieser Programmarbeit wird auch im Buch "JavaScript fĂŒr Kinder" und im js-Kurs auf w3schools.com verwendet. Das Format der Webseite ermöglicht es sogar, dieses Beispiel interaktiv zu gestalten.
Takt 10
Takt 9
Takt 8
Takt 7
Takt 6
Takt 5
Takt 4
Takt 3
Takt 2
Takt 1
In dem Buch von Stroustrup "GrundsĂ€tze und Praxis mit C++" aus dem Jahr 2016 geht der Autor noch weiter. Zuerst wird erklĂ€rt, welches Ergebnis erwartet wird, und erst danach wird der Text des Programms angezeigt. AuĂerdem wird als Beispiel nicht einfach ein zufĂ€lliges Programm genommen, sondern ein historischer Ăberblick gegeben. Das hilft, die Aufmerksamkeit auf das zu lenken: "Sieh mal, das ist nicht einfach nur irgendein nutzloser Text. Siehst du, da ist etwas Bedeutendes."
Als Beispiel fĂŒr Iteration betrachten wir das erste Programm, das auf einer Maschine mit gespeicherter Programmierung (EDSAC) ausgefĂŒhrt wurde. Es wurde von David Wheeler in der Computerlaborschule der UniversitĂ€t Cambridge (Cambridge University, England) am 6. Mai 1949 geschrieben. Dieses Programm berechnet und druckt eine einfache Liste von Quadraten aus.
Hier enthÀlt jede Zeile eine Zahl, gefolgt von einem Tabulatorzeichen ('t') und dem Quadrat dieser Zahl. Die Version dieses Programms in C++ sieht so aus:
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801
Interessanterweise wird das Template-Syntax in diesem Buch nicht beschrieben. Stroustrup legt im Leitfaden fĂŒr Dozenten (//ĐŃŃĐžŃĐ»ŃĐ”ĐŒ Đž ŃаŃпДŃаŃŃĐČĐ°Đ”ĐŒ ŃаблОŃŃ ĐșĐČаЎŃаŃĐŸĐČ ŃĐžŃДл 0-99 int main() { int i = 0; // ĐаŃĐžĐœĐ°Đ”ĐŒ Ń ĐœŃĐ»Ń while(i < 100){ cout << i << 't' << square(i) << 'n'; ++i; } }
) besonderen Wert darauf, dass er den Intellekt seiner Studenten respektiert. Möglicherweise gilt die FÀhigkeit, ein Template in mehreren Beispielen zu erkennen, als Ausdruck dieses Intellekts.Wie ich selbst erklÀre
Wie ich es selbst erklÀre
Der Ansatz von Stroustrup: Zuerst die Beschreibung des Ergebnisses, dann die Lösung des Problems und anschlieĂend die selbststĂ€ndige Analyse durch den Studenten - scheint am durchdachtesten zu sein. Daher habe ich beschlossen, genau diesen Ansatz zu wĂ€hlen, aber mit einem weniger historischen Beispiel - der Aufgabe zur Ausgabe des "Inhaltsverzeichnisses". Dies bildet einen erkennbaren Anker, um spĂ€ter zu sagen: "Erinnere dich an die Aufgabe ĂŒber das Inhaltsverzeichnis" und damit die Studenten genau dieses Beispiel im Kopf haben. In meinem Beispiel habe ich versucht, auch zwei der hĂ€ufigsten MissverstĂ€ndnisse anzusprechen. Weiter unten werde ich genauer darĂŒber schreiben.
In dieser Aufgabe lernen wir Methoden zur Lösung komplexer Probleme kennen. Die erste Lösung sollte einfach und primitiv sein. Danach kann man ĂŒberlegen, wie man diese Lösung verbessern kann.
EinfĂŒhrung
Kapitel 1
Kapitel 2
Kapitel 3
Kapitel 4
Kapitel 5
Kapitel 6
Kapitel 7
Fazit
Nach meinen Beobachtungen fĂŒhrt der Ansatz âVorlage-Beispiel-Ergebnisâ in verschiedenen Kombinationen dennoch dazu, dass die Studenten den Zyklus als hieroglyphisch wahrnehmen. Das zeigte sich darin, dass sie nicht verstanden, warum dort eine Bedingung geschrieben werden muss, wie man zwischen i++ und iâ wĂ€hlt und andere scheinbar offensichtliche Dinge. Um solche MissverstĂ€ndnisse zu vermeiden, sollte der Zugang zur ErklĂ€rung von Zyklen den Sinn der Wiederholung identischer Aktionen betonen und erst danach ihre Formulierung mittels der Konstruktion. Daher muss man das Syntax des Zyklus erst einfĂŒhren, nachdem das Problem âdirektâ gelöst wurde. Eine primitive Lösung der Aufgabe ĂŒber das Inhaltsverzeichnis sieht so aus:
Console.WriteLine("Einleitung");
Console.WriteLine("Kapitel 1");
Console.WriteLine("Kapitel 2");
Console.WriteLine("Kapitel 3");
Console.WriteLine("Kapitel 4");
Console.WriteLine("Kapitel 5");
Console.WriteLine("Kapitel 6");
Console.WriteLine("Kapitel 7");
Console.WriteLine("Schlussfolgerung");
Wie kann man es verbessern?
Eintönige Aktionen durch einen Zyklus ersetzen.
Welche Aktionen wiederholen sich hier hintereinander ohne Ănderungen?
In diesem Fragment gibt es keine. Die Befehle zur Ausgabe des Wortes âKapitelâ mit der Nummer sind sich jedoch sehr Ă€hnlich.
Der nÀchste Schritt ist daher, die Unterschiede zwischen den Fragmenten zu suchen. Nur in dieser Aufgabe ist alles offensichtlich, spÀter werden nicht einzelne Befehle wiederholt, sondern Codeblöcke von 5 Zeilen und mehr. Man muss nicht nur in der Befehlsliste suchen, sondern auch in den Verzweigungs- oder Schleifen-Konstruktionen.
Im Beispiel liegt der Unterschied zwischen den Befehlen in der Zahl nach dem Wort âKapitelâ.
Sobald der Unterschied gefunden ist, muss man das Muster der VerÀnderung verstehen. Ist das abweichende Fragment eine Zahl? Nimmt sie konstant zu oder ab? Wie verÀndert sich der Wert der Zahl zwischen zwei benachbarten Befehlen?
In diesem Beispiel erhöht sich die Zahl nach dem Wort âKapitelâ um 1. Der Unterschied wurde gefunden, das Muster erkannt. Jetzt kann der variierende Teil durch eine Variable ersetzt werden.
Eine solche Variable muss vor dem ersten der sich wiederholenden Teile deklariert werden. Diese Variable wird normalerweise I oder j oder etwas ausfĂŒhrlicher genannt. Ihr Anfangswert sollte dem ersten auf dem Bildschirm angezeigten Wert entsprechen. Im Beispiel ist der erste Wert 1.
Welchen Anfangswert mĂŒssen wir verwenden, um die Zahlenreihe â100, 101, 102, 103, 104, 105â auszugeben?
In dieser Reihe ist die erste Zahl 100.
Nach jedem Ausgabe-Befehl muss der Wert dieser Variable um 1 erhöht werden. Diese Eins ist der Schritt der Ănderung.
Wie groĂ ist der Schritt in der Zahlenreihe â100, 102, 104, 106â?
In dieser Reihe betrÀgt der Schritt 2.
Nach dem Ersetzen des verschiedenen Teils durch eine Variable sieht der Code so aus:
Console.WriteLine("Einleitung");
int i;
i = 0;
Console.WriteLine("Kapitel " + i);
i = i + 1;
Console.WriteLine("Kapitel " + i);
i = i + 1;
Console.WriteLine("Kapitel " + i);
i = i + 1;
Console.WriteLine("Kapitel " + i);
i = i + 1;
Console.WriteLine("Kapitel " + i);
i = i + 1;
Console.WriteLine("Kapitel " + i);
i = i + 1;
Console.WriteLine("Kapitel " + i);
i = i + 1;
Console.WriteLine("Schlussfolgerung");
Nach der Anwendung der Methode âMuster in einer Variable ausdrĂŒckenâ entsteht im Code mehrere Gruppen identischer Aktionen, die nacheinander erfolgen. Jetzt können die wiederholenden Handlungen durch eine Schleife ersetzt werden.
Der Ablauf zur Lösung des Problems, bei dem Schleifen verwendet werden mĂŒssen, besteht aus folgenden Schritten:
- Die Lösung âauf gut GlĂŒckâ mit vielen einzelnen Befehlen
- Das Muster finden
- Das Muster in einer Variable ausdrĂŒcken
- In einer Schleife darstellen
Zudem werden neue Begriffe eingefĂŒhrt, damit der Student nicht in die Situation gerĂ€t: âIch verstehe alles, kann es aber nicht sagenâ:
â ZĂ€hler â immer eine Variable, die benötigt wird, um die Anzahl der Schleifen-Schritte zu verfolgen. Normalerweise eine ganze Zahl, die mit einer Grenze verglichen wird.
â Schritt des ZĂ€hlers â Beschreibung des Musters der VerĂ€nderung des ZĂ€hlers.
â Grenze â Zahl oder Variable, mit der der ZĂ€hler verglichen wird, damit der Algorithmus endlich ist. Der Wert des ZĂ€hlers Ă€ndert sich so, dass er sich der Grenze nĂ€hert.
â Schleifenbody â eine Reihe von Befehlen, die wiederholt werden. Wenn gesagt wird âDer Befehl ist innerhalb der Schleife geschriebenâ, ist genau der Body gemeint.
â Schleifeniteration â einmalige AusfĂŒhrung des Schleifenbodys.
â Die Schleifenbedingung â ein logischer Ausdruck, von dem abhĂ€ngt, ob eine weitere Iteration durchgefĂŒhrt wird. (Hier kann es Verwirrung mit Verzweigungskonstruktionen geben)
Man muss darauf vorbereitet sein, dass die Studenten zunĂ€chst die Begriffe nicht korrekt verwenden werden. Das betrifft sowohl die Starken als auch die Schwachen. Eine gemeinsame Sprache zu finden, ist eine Kunst fĂŒr sich. Ich schreibe es kurz: Man muss die Aufgabe stellen âmarkiere den Codeabschnitt mit â und selbst diese Begriffe im GesprĂ€ch korrekt verwenden.
Nach der Umwandlung mit einer Schleife ergibt sich der folgende Abschnitt:
Console.WriteLine("EinfĂŒhrung");
int i = 0;
while (i < 7) {
Console.WriteLine("Kapitel " + i);
i = i + 1;
}
Console.WriteLine("Schlussfolgerung");Die hÀufigste Fehlannahme
Ein verbreiteter Irrtum bei Studenten ist, dass sie in einer Schleifenkonstruktion solche Aktionen einfĂŒgen, die nur einmal ausgefĂŒhrt werden sollen. Zum Beispiel so:
;
int i = 0;
while (i < 7) {
Console.WriteLine("EinfĂŒhrung")
Console.WriteLine("Kapitel " + i);
i = i + 1;
Console.WriteLine("Schlussfolgerung");
}
SchĂŒler stoĂen stĂ€ndig auf dieses Problem, sowohl am Anfang als auch bei komplexeren Aufgaben.
Der goldene Hinweis in diesem Fall:
Wie oft muss man den Befehl schreiben: einmal oder mehrfach?
Die Ausgaben "EinfĂŒhrung" und "Schlussfolgerung" sowie die Deklaration und Initialisierung der Variable i sind nicht wie andere wiederholte Aktionen. Sie werden nur einmal ausgefĂŒhrt, das heiĂt, sie sollten auĂerhalb des Schleifenkörpers geschrieben werden.
Im Code mĂŒssen alle drei Phasen der Lösung verbleiben, um spĂ€ter Bezug auf sie nehmen zu können, falls Schwierigkeiten auftreten. Die ersten zwei Varianten sollten ausreichend kommentiert werden, damit sie nicht stören.
Die Aufmerksamkeit der Studenten sollte auf folgende Fakten gelenkt werden:
â In der Schleifenbedingung wird normalerweise der ZĂ€hler mit der Grenze verglichen. Der ZĂ€hler kann sich im Schleifenkörper Ă€ndern, die Grenze nicht. Um diese Regel zu brechen, mĂŒssen triftige GrĂŒnde formuliert werden.
â Die Befehle zum Ausgeben der Wörter "EinfĂŒhrung" und "Schlussfolgerung" befinden sich auĂerhalb des Schleifenkörpers. Wir mĂŒssen sie einmal ausfĂŒhren. "EinfĂŒhrung" â vor der Wiederholung der Aktionen, "Schlussfolgerung" â danach.
Im Verlauf der Festigung dieses Themas, des Erlernens der Folgenden sowie der KlĂ€rung von Schwierigkeiten ist es sogar fĂŒr starke Studenten hilfreich, die Frage zu stellen: âUnd wie oft muss diese Aktion durchgefĂŒhrt werden? Einmal oder mehrmals?â.
Entwicklung zusÀtzlicher FÀhigkeiten
Im Verlauf des Studiums von Schleifen entwickeln die Studierenden auch ihre FĂ€higkeiten zur Diagnose und Problemlösung. Um eine Diagnose zu stellen, muss der Student das gewĂŒnschte Ergebnis darstellen und es mit dem tatsĂ€chlichen Ergebnis vergleichen. Die MaĂnahmen zur Korrektur hĂ€ngen von den Differenzen zwischen diesen Ergebnissen ab.
Da die Studierenden in dieser Phase noch kein klares VerstĂ€ndnis des âgewĂŒnschtenâ Ergebnisses haben, können sie sich auf die Testdaten beziehen. In der Regel versteht in diesem Stadium niemand, was schiefgehen kann und wie man damit umgeht. Daher gebe ich eine Beschreibung typischer Probleme und einige Lösungsmöglichkeiten zur Notiz in das Heft. Die Auswahl der am besten geeigneten Lösung ist die Aufgabe des Studenten.
Die Aufzeichnung ist notwendig, um zu fragen: âIst das erreicht worden, was erwartet wurde?â, âWelche dieser Situationen hat sich jetzt ergeben?â, âHat die angewandte Lösung geholfen?â.
- Die Anzahl der Aktionen ist um 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 Grenze um 1. - Die Aktionen in der Schleife werden ohne Unterbrechung unendlich ausgefĂŒhrt. Lösungsmöglichkeiten:
â FĂŒgen Sie einen Befehl zur Ănderung des ZĂ€hlers hinzu, falls dieser fehlt.
â Korrigieren Sie den Befehl zur Ănderung des ZĂ€hlers, damit sein Wert nĂ€her an die Grenze kommt.
â Entfernen Sie den Befehl zur Ănderung der Grenze, falls dieser im Schleifenblock enthalten ist. - Die Anzahl der Aktionen in der Schleife ist um mehr als 1 weniger oder mehr als erwartet. Die Aktion in der Schleife wurde kein einziges Mal ausgefĂŒhrt. ZunĂ€chst mĂŒssen die tatsĂ€chlichen Werte der Variablen direkt vor Beginn der Schleife ermittelt werden. Lösungsmöglichkeiten:
â Ăndern Sie den Anfangswert der Grenze.
â Ăndern Sie den Anfangswert des ZĂ€hlers.
Normalerweise ist Problem 3 mit der Verwendung einer falschen Variablen oder einem unerledigten ZĂ€hler verbunden.
Nach dieser ErklÀrung kann der Student noch verschiedene MissverstÀndnisse hinsichtlich der Funktionsweise von Schleifen haben.
Um die hÀufigsten MissverstÀndnisse auszurÀumen, gebe ich Aufgaben:
- In denen die Grenze, der Anfangswert des ZĂ€hlers oder der Schritt des ZĂ€hlers vom Benutzer eingegeben wird.
- In denen der ZÀhlerwert in einem arithmetischen Ausdruck verwendet werden muss. Ideal wÀre es, den ZÀhler in einem untergeordneten Ausdruck oder im Nenner zu verwenden, damit die Differenz nicht-linear ist.
- In der die ZĂ€hlervalue nicht wĂ€hrend des Arbeitszyklus auf dem Bildschirm angezeigt wird. Zum Beispiel, um die gewĂŒnschte Anzahl identischer Textfragmente auszugeben oder eine Figur mit Schalentortengrafik zu zeichnen.
- In der zuerst einige sich wiederholende Aktionen und dann andere ausgefĂŒhrt werden mĂŒssen.
- In der andere Aktionen vor und nach den sich wiederholenden ausgefĂŒhrt werden mĂŒssen.
FĂŒr jede Aufgabe mĂŒssen Testdaten und das erwartete Ergebnis bereitgestellt werden.
Um zu verstehen, wie schnell man arbeiten kann, sollte man die Bedingungen dieser Aufgaben durchlesen lassen und fragen: âWorin unterscheiden sie sich vom Beispiel?â, âWas muss am Beispiel geĂ€ndert werden, um sie zu lösen?â. Wenn der Student sinnvoll antwortet, kann er mindestens eine im Unterricht lösen und die restlichen zu Hause selbstĂ€ndig erledigen. Wenn die Lösung erfolgreich ist, kann man mit der ErklĂ€rung ĂŒber die Bedingungen innerhalb der Schleifen beginnen.
Wenn es Schwierigkeiten bei der selbstĂ€ndigen Lösung gibt, mĂŒssen alle im Unterricht bearbeitet werden. Damit die Lösung der Aufgabe nicht wie das Zeichnen einer Eule aussieht, empfehle ich, die Aufgabe zunĂ€chst nicht universell zu lösen. Das heiĂt, so zu lösen, dass die Lösung den ersten Test besteht und keine Schleifen-Konstruktion verwendet wird. Erst dann sollten Transformationen angewendet werden, um eine universelle Lösung zu erreichen.
Schleifen und Verzweigungen
Meiner Meinung nach ist es sinnvoll, das Thema âSchleifen innerhalb von Verzweigungenâ separat zu behandeln. So sollte anschlieĂend der Unterschied zwischen mehrfacher BedingungsprĂŒfung und einfacher BedingungsprĂŒfung deutlich werden.
Die Aufgaben zur Festigung werden das Ausgeben von Zahlen von A bis B betreffen, die vom Benutzer eingegeben werden:
â immer in aufsteigender Reihenfolge.
â je nach den Werten von A und B in aufsteigender oder absteigender Reihenfolge.
Zum Thema âVerzweigungen innerhalb von Schleifenâ sollte erst ĂŒbergegangen werden, nachdem der Student die Techniken âErsatz eines Musters durch eine Variableâ und âErsatz sich wiederholender Aktionen durch eine Schleifeâ beherrscht hat.
Der Hauptgrund fĂŒr die Anwendung von Verzweigungen innerhalb von Schleifen sind Anomalien im Muster. In der Mitte wird es je nach Eingangsdaten gestört.
Den Studenten, die in der Lage sind, Lösungen durch Kombination einfacher Techniken zu suchen, reicht es zu sagen: âVerzweigungen können innerhalb von Schleifen geschrieben werdenâ und die Aufgabe âzum Beispielâ vollstĂ€ndig zur selbstĂ€ndigen Lösung zu geben.
Aufgabe zum Beispiel:
Der Benutzer gibt die Zahl X ein. Geben Sie die Zahlen von 0 bis 9 in einer Spalte aus und setzen Sie ein Pluszeichen â+â neben die Zahl, die gleich X ist.
Wenn die 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 fehlt, um mit einer Schleife zu schreiben, dann sollte ein universelles Lösung dieser Aufgabe ohne Schleife angestrebt werden.
Es gibt zwei mögliche 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+");
}
Eine Ă€hnliche Aufgabe gebe ich im Voraus wĂ€hrend des Lernens ĂŒber Verzweigungen.
Wenn der Student eine "mögliche" Lösung erhalten hat, sollte erklĂ€rt werden, dass es fĂŒr die gleiche Aufgabe viele Lösungen geben kann. Sie unterscheiden sich jedoch in ihrer StabilitĂ€t gegenĂŒber Ănderungen der Anforderungen. Stellen Sie die Frage: "Wie viele Stellen im Code mĂŒssen geĂ€ndert werden, wenn eine weitere Zahl hinzugefĂŒgt werden muss?" In der "möglichen" Variante muss eine weitere Verzweigung hinzugefĂŒgt und an 10 anderen Stellen die neue Zahl eingetragen werden. In der "gewĂŒnschten" Variante muss nur eine Verzweigung hinzugefĂŒgt werden.
Formulieren Sie die Aufgabe, die "gewĂŒnschte" Variante zu reproduzieren, finden Sie dann im Code ein Muster, fĂŒhren Sie die Variablenumgebung durch und schreiben Sie eine Schleife.
Wenn Sie eine Idee haben, wie man diese Aufgabe ohne Schleife auf andere Weise lösen kann, schreiben Sie bitte in die Kommentare.
Schleifen innerhalb von Schleifen
In diesem Thema sollte beachtet werden, dass:
â die ZĂ€hler fĂŒr die innere und Ă€uĂere Schleife unterschiedliche Variablen sein sollten.
â der ZĂ€hler fĂŒr die innere Schleife muss mehrere Male zurĂŒckgesetzt werden (also im Körper der Ă€uĂeren Schleife).
In den Aufgaben zur Textausgabe darf man nicht zuerst einen Buchstaben in mehreren Zeilen schreiben und dann den zweiten. Zuerst mĂŒssen alle Buchstaben der ersten Zeile ausgegeben werden, dann alle Buchstaben der zweiten und so weiter.
Es ist am besten, das Thema zu Schleifen innerhalb von Schleifen mit der ErklĂ€rung der Wichtigkeit der RĂŒcksetzung des ZĂ€hlers zu beginnen.
Aufgabe zum Beispiel:
Der Benutzer gibt zwei Zahlen ein: R und T. Geben Sie zwei Zeilen mit den Zeichen "#" aus. In der ersten Zeile sollten es R StĂŒcke von Zeichen sein. In der zweiten Zeile T StĂŒcke. Wenn eine der Zahlen negativ ist, geben Sie eine Fehlermeldung aus.
R=5, T=11#####
###########
R=20, T=3####################
###
R=-1, T=6Der Wert von R muss nicht negativ sein
R=6, T=-2Der Wert von T muss nicht negativ sein
Offensichtlich hat dieses Problem auch mindestens zwei Lösungsmöglichkeiten.
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öglichkeit 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 fĂŒr die Ausgabe der zweiten Zeile eine zweite Variable verwendet wurde. Man muss darauf bestehen, dass die gleiche Variable fĂŒr beide Schleifen verwendet wird. Man kann dieses Limit damit begrĂŒnden, dass die Lösung mit einem ZĂ€hler fĂŒr zwei Schleifen eine Veranschaulichung des Begriffs "RĂŒcksetzung des ZĂ€hlers" sein wird. Das VerstĂ€ndnis dieses Begriffs ist wichtig fĂŒr die Lösung der nĂ€chsten Aufgaben. Als Kompromiss kann man beide Lösungen der Aufgabe beibehalten.
Ein typisches Problem bei der Verwendung einer ZĂ€hler-Variable fĂŒr zwei Schleifen Ă€uĂert sich folgendermaĂen:
R=5, T=11#####
######
Die Anzahl der Zeichen in der zweiten Zeile entspricht nicht dem Wert von T. Wenn Hilfe mit diesem Problem benötigt wird, sollte man "auf die Nase" in den Notizen ĂŒber hĂ€ufige Probleme mit Schleifen zeigen. Das ist Symptom Nr. 3. Es wird diagnostiziert, wenn man den Wert des ZĂ€hlers direkt vor der zweiten Schleife ausgibt. Es wird durch RĂŒcksetzung behoben. Aber das sollte man besser nicht sofort erzĂ€hlen. Der Student sollte versuchen, zumindest eine Hypothese zu formulieren.
Es gibt natĂŒrlich auch diese Lösungsmöglichkeit. Aber ich habe sie bei den Studenten noch nie gesehen. Bei der EinfĂŒhrung in Schleifen wĂŒrde eine ErzĂ€hlung darĂŒber die Aufmerksamkeit zerstreuen. Man kann spĂ€ter darauf zurĂŒckkommen, bei der Behandlung von Funktionen zur Bearbeitung von Zeichenfolgen.
Möglichkeit 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));
Die nÀchste Pflichtaufgabe:
Geben Sie die Ziffern von 0 bis 9 auf dem Bildschirm aus. Jede Ziffer 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 der Student die Technik des Variablenwechsels beherrscht, wird er ziemlich schnell zurechtkommen. Ein mögliches Problem wird wieder das ZurĂŒcksetzen der Variablen sein. Wenn er mit der Umwandlung Schwierigkeiten hat, bedeutet das, dass er sich gehetzt hat und einfachere Aufgaben lösen sollte.
Danke fĂŒr Ihre Aufmerksamkeit. Geben Sie Likes, abonnieren Sie den Kanal.
P.S. Wenn Sie Tippfehler oder Fehler im Text gefunden haben, lassen Sie es mich bitte wissen. Sie können dies tun, indem Sie einen Teil des Textes markieren und auf einem Mac ââ + Enterâ oder auf klassischen Tastaturen âCtrl / Enterâ drĂŒcken, oder ĂŒber persönliche Nachrichten. Wenn diese Optionen nicht verfĂŒgbar sind, schreiben Sie die Fehler in die Kommentare. Vielen Dank!
Nur registrierte Benutzer können an der Umfrage teilnehmen. .
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%Andere0
10 Benutzer haben abgestimmt. 5 Benutzer haben sich enthalten.
Quelle: habr.com
