Anleitungsserie
Dies ist Teil 4 einer 5-teiligen Serie zur Einführung in die Programmierung
- Einführung in die Programmierung:Erste Schritte
- Einführung in die Programmierung:Ihr erstes Programm
- Einführung in die Programmierung:Variablen, Typen und Datenbearbeitung
- Einführung in die Programmierung:Flusskontrolle
- Einführung in die Programmierung:Objektorientierte Programmierung
Willkommen zurück, aufstrebende Programmierer!
In diesem Artikel untersuchen wir den Kontrollfluss und wie Sie Bedingungen, Verzweigungen, Schleifen und andere Mechanismen verwenden können, um zu bestimmen, was in Ihrem Programm passiert.
Wenn Sie die vorherigen Artikel dieser Serie noch nicht gelesen haben, empfehle ich Ihnen dringend, dies zu tun. Wir bauen in all diesen Artikeln auf Vorkenntnissen auf, daher ist es für Ihr Verständnis wichtig, dass Sie wissen, was wir bereits behandelt haben.
Wir haben in diesem Artikel eine Menge zu behandeln, also lass uns ohne weitere Umstände zur Sache kommen.
.
Behandlung von Ausnahmen
Als wir unser Programm das letzte Mal verließen, hatten wir drei Codezeilen und ein Problem. Der Code sieht folgendermaßen aus:
Console.WriteLine("Guess a number between 1 and 10:"); string text = Console.ReadLine(); int input = int.Parse(text);
Wenn wir dieses Programm jedoch ausführen und bei Aufforderung etwas anderes als eine Zahl eingeben, stürzt das Programm ab, weil der Compiler nicht weiß, wie er nicht-numerischen Text in eine Ganzzahl umwandeln soll.
Wenn Sie sich an das letzte Mal erinnern, bekommen wir eine sogenannte Ausnahme , und es ist eine der Möglichkeiten, wie wir den Ablauf eines Programms in einer ganz bestimmten Situation steuern können, nämlich wenn eine Ausnahmesituation eintritt.
Ich wollte mit der Ausnahmebehandlung beginnen, da dies das komplexeste und möglicherweise verwirrendste Thema in der Flusskontrolle ist. Wenn Sie also verstehen, was wir hier tun, werden Sie die verbleibenden Konzepte wahrscheinlich viel leichter verständlich finden.
Für die Ausnahmebehandlung bei der Programmierung haben wir zwei wichtige Ideen, die Sie verstehen müssen. Die erste Idee ist, dass Sie Ihr Programm bitten können, etwas auszuprobieren. Die zweite Idee ist, dass Sie das Problem erkennen und beheben können, wenn der Computer bei dem, was er versucht, fehlschlägt.
Diese beiden Ideen zusammen funktionieren ein bisschen wie ein Seiltänzer mit Sicherheitsnetz. Ein Seiltänzer (Ihr Programm) kann sich in den meisten Fällen ganz normal auf dem Seil bewegen. Aber wenn etwas Außergewöhnliches passiert, wie z. B. ein Fehltritt vom Drahtseil (eine Ausnahme), sollte es ein Sicherheitsnetz geben, um zu verhindern, dass der Darsteller zu Boden stürzt (ein Fang, um die Ausnahme zu handhaben). P>
Mit einem Verständnis der Ausnahmebehandlung können wir jetzt beginnen, eine Lösung für unser Problem zu sehen. Wir können den Computer bitten, zu versuchen, den Text in eine Ganzzahl zu zerlegen, und wenn dies fehlschlägt – anstatt das Programm abstürzen zu lassen – können wir den Fehler abfangen, dem Benutzer mitteilen und ihn bitten, es erneut zu versuchen.
Mal sehen, wie das in unserem Code aussehen könnte.
Console.WriteLine("Guess a number between 1 and 10:"); string text = Console.ReadLine(); int input = 0; try { input = int.Parse(text); } catch { Console.WriteLine("Whoops, you didn't enter a number"); }
Unsere erste Änderung besteht darin, dass wir anfänglich den int
setzen input auf Null, bevor wir versuchen, es auf das Ergebnis der Analyse der Texteingabe des Benutzers zu setzen. Es gibt einen bestimmten Grund, warum ich den Wert zuerst auf Null setze und ihn dann später auf etwas anderes setze.
Beachten Sie, dass nach dem try
Zeile ist der Code, den wir ausprobieren möchten, von geschweiften Klammern wie diesen umgeben:
{ }
In C# und vielen ähnlichen Sprachen verwenden wir geschweifte Klammern, um den Umfang bestimmter Aktionen, Vorgänge oder sogar variabler Lebenszyklen einzuschließen oder einzuschränken. Im Allgemeinen überleben Variablen nur innerhalb dieser Klammern. Wenn unsere Codeausführung eine Reihe dieser Klammern verlässt, verschwinden alle darin enthaltenen Variablen (manchmal als „außerhalb des Gültigkeitsbereichs gehen“ bezeichnet).
Sie sehen die gleichen geschweiften Klammern nach dem catch
line, was eine Anweisung ist, dass alles, was in den geschweiften Klammern steht, nur ausgeführt werden soll, wenn wir einen Fehler oder eine Ausnahme abfangen. Code in geschweiften Klammern wird oft als Codeblock bezeichnet .
Das bedeutet, wenn wir den int
erstellt hätten Eingabe innerhalb des try
Codeblock, dann würde die Variable einfach verschwinden, sobald wir den try
bestanden hätten Codeblock, und wir konnten nicht mehr darauf zugreifen, um zu prüfen, ob er mit unserem geheimen Wert übereinstimmt. Ich werde ein Beispiel aus unserem Code aufarbeiten, um Ihnen zu zeigen, was ich meine. Beachten Sie in Abbildung 1 unten, wie ich int
nicht definiere Eingabe bis wir uns innerhalb der geschweiften Klammern unseres try
befinden Aussage.
Abbildung 1:Geltungsbereich der Variable
Oh, und beachten Sie, dass ich eine Zeile habe, die mit //
beginnt . In C# zeigen die doppelten Schrägstriche an, dass alles, was danach und bis zum Ende der Zeile kommt, ein Kommentar ist, der nicht Teil des Programms ist. Der Compiler wird solche Zeilen einfach ignorieren.
.
Um unser Programm auszuprobieren, können wir einen Haltepunkt innerhalb des catch
setzen Klammern auf der Console.WriteLine
Zeile und führen Sie dann unser Programm aus. Geben Sie eine nicht-numerische Eingabe ein, um zu überprüfen, ob das Programm jetzt nicht abstürzt, sondern in den catch
springt Code-Block und zeigt dem Benutzer schließlich die Fehlermeldung an, wie Sie in Abbildung 2 sehen können.
Abbildung 2:Ausnahme abgefangen!
.
Bedingungen
Nun, dieser Code ist ziemlich nutzlos, wie er derzeit geschrieben ist, weil wir einen Wert einlesen, aber – außer um dem Benutzer zu sagen, wenn er einen Fehler macht – wir den Wert für nichts verwenden. Sie können dies versuchen und feststellen, dass der Haltepunkt nicht erreicht wird, wenn Sie eine Zahl eingeben, z. B. 7.
Um unseren Code als Ratespiel nutzbar zu machen, müssen wir testen, ob wir die richtige Zahl erraten haben. Hier müssen wir ein neues Flusssteuerungskonzept namens Bedingung einführen .
Eine Bedingung ist ein Codeblock, der nur ausgeführt wird, wenn eine bestimmte Regel oder ein Satz von Regeln erfüllt ist. Wir beginnen solche Bedingungen mit dem Wort if
und folgen Sie ihm in Klammern mit der Regel oder dem Satz von Regeln, die wir prüfen, gefolgt von dem Codeblock, den wir ausführen möchten.
if (condition is met) { // execute this code block }
Es gibt natürlich sehr strenge Syntaxregeln dafür, wie wir diese Bedingungen formatieren können, und sie sind nicht unbedingt so intuitiv, wie sie sein könnten. Um beispielsweise Werte zu vergleichen, müssen Sie in C# zwei Gleichheitszeichen und manchmal drei in JavaScript verwenden. (Denken Sie daran, dass Sie mit einem Gleichheitszeichen zuordnen ein Wert.)
if (value == other_value) // example value comparison
Sie können eine Vielzahl von Vergleichsoperatoren verwenden und der Rest ist etwas intuitiver. Beispielsweise können Sie wie in der normalen Mathematik größer als (>) und kleiner als (<) verwenden und diese mit Gleichheitszeichen kombinieren, um eine Größer-gleich- (>=) oder Kleiner-gleich-Bedingung (<=) zu erstellen.
Sie können auch negative Bedingungen erstellen. In vielen Programmiersprachen kennzeichnest du einen negativen Operator mit dem Ausrufezeichen (!), das oft auch als „Bang“ bezeichnet wird. Wenn Sie beispielsweise eine Bedingung erstellen möchten, die ausgeführt wird, wenn zwei Werte nicht gleich sind, können Sie schreiben:
if (value != other_value)
Sie können auch mehrere Bedingungen erstellen, indem Sie die verschiedenen Bedingungen entweder mit &&
trennen (doppeltes kaufmännisches Und) für „UND“-Bedingungen oder ||
(Doppelpipes) für „ODER“-Bedingungen.
if (value1 == other_value && value2 == other_value) … //means both value1 and value2 must be equal to other_value if (value1 == other_value || value2 == other_value) … //means either value1 or value2 must be equal to other_value
Anhand einer Bedingung können wir nun einen Test erstellen, ob der Spieler die richtige Zahl erraten hat. Fügen Sie die folgenden Zeilen nach der letzten geschweiften Klammer des catch
hinzu Codeblock:
if (input == 3) { Console.WriteLine("Congratulations! You guessed correctly!"); }
Diese Bedingung testet, ob Eingabe (der vom Benutzer eingegebene Wert) ist gleich 3. Wenn diese Bedingung erfüllt ist, zeigt das Spiel eine Glückwunschnotiz an, wie in Abbildung 3 gezeigt.
Abbildung 3:Bedingung erfüllt, Glückwünsche vergeben
Wenn der Benutzer die Zahl 3 nicht errät, zeigt unser Programm nichts mehr an und die Anwendung wird beendet.
Denken Sie daran, dass Sie überall in Ihrem Code Haltepunkte setzen können, um die Ausführung zu stoppen und die Ergebnisse Ihrer Aktion anzuzeigen. Wir werden genau das tun, um die Ergebnisse der Änderungen zu sehen, die wir von nun an an unserem Code vornehmen werden.
.
Es wäre jedoch schön, wenn wir eine weitere Meldung anzeigen könnten, wenn der Benutzer die richtige Nummer nicht erraten hat. Glücklicherweise erlauben Bedingungen dieses Verhalten auch durch else
Schlüsselwort.
Das else
Schlüsselwort muss direkt nach einem if
kommen Codeblock und gibt an, was passieren soll, wenn die Bedingung in Klammern von einem if
steht Aussage nicht erfüllt. Um dies auszuprobieren, fügen Sie die folgenden Zeilen nach dem if
hinzu blockieren:
else { Console.WriteLine("No, sorry, that wasn't it. Better luck next time!"); }
Ihre gesamten bedingten Codeblöcke sollten jetzt wie in Abbildung 4 unten aussehen.
Abbildung 4:Programmcode des Spiels mit bedingten Codeblöcken erraten
Wenn Sie Ihr Programm ausführen, erhalten Sie, je nachdem, ob Sie 3 erraten, entweder eine Gratulation oder eine Ermutigung, es noch einmal zu versuchen. Wir nennen diese Art der Flusskontrolle bedingte Verzweigung weil das Programm je nach den von Ihnen gestellten Bedingungen in den einen oder anderen Zweig übergeht.
Lassen Sie uns die Quoten etwas erhöhen für alle, die nicht wissen, dass die magische Zahl immer 3 ist. Wir erlauben mehrere Versuche zu raten, wenn der Spieler nicht richtig rät.
.
Auf eine Schleife gehen
Um diese neue Funktionalität zu erreichen, müssen wir eine sogenannte Schleife implementieren . Bei der Programmierung ist eine Schleife ein Codeblock, der wiederholt ausgeführt wird. Zwei sehr verbreitete Schleifentypen sind for Schleifen und while Schleifen.
Die beste Verwendung für for
Schleifen sind, wenn Sie eine bestimmte Anzahl von Malen haben, die Sie möchten, dass etwas passiert. Lassen Sie uns damit in unserem Code beginnen und sehen, wohin uns das führt.
In einem for
Schleife benötigen Sie das Schlüsselwort for
gefolgt von einem Block in Klammern, der drei Informationen enthält.
Zuerst definieren wir die Startumgebung für unsere Schleife, die Variablen enthält, die wir verwenden möchten, um zu verfolgen, wie oft unser Codeblock ausgeführt wurde. Zweitens wollen wir eine Bedingung, die bestimmt, ob wir die Schleife fortsetzen sollen. Schließlich haben wir die Änderungen, die wir bei jeder Ausführung der Schleife an den Schleifenbedingungen vornehmen möchten. Sehen wir uns ein Beispiel an.
for (int i = 0; i < 3; i++) { // This code block will execute three times. }
Das Wichtige hier ist die erste Zeile. Beachten Sie die Semikolons, die die drei erwähnten Teile trennen. So gliedern sich die einzelnen Teile:
int i=0; // Initialization: Creates an integer variable called "i" and sets it to 0. i<3; // Condition: Continue executing as long as "i" is less than 3. i++ // Change happening during each loop: "i" increases by one each time the loop runs.
Das i++
Notation ist eine Abkürzung für das Schreiben von i=i+1
, die i setzt auf den Wert von i plus eins – mit anderen Worten, es erhöht i einzeln. Sie hätten auch i=i+1
schreiben können auch, aber dieses spezielle Muster ist beim Programmieren sehr, sehr verbreitet, also zeige ich es als nützliches Beispiel.
Was auch immer Sie in den Block einfügen, der auf for
folgt Die Loop-Deklaration wird so lange ausgeführt, wie die Bedingung erfüllt ist – in diesem Fall dreimal. Beispielsweise können Sie ein Console.WriteLine()
hinzufügen innerhalb des Codeblocks, und es wird dreimal wiederholt, wie in Abbildung 5 unten.
for (int i = 0; i < 3; i++) { Console.WriteLine("I am in a loop!"); }
Abbildung 5:„Ich bin in einer Schleife!“
Wir möchten diese Art von Schleife verwenden, damit der Benutzer mehrere Versuche hat, die richtige Zahl zu erraten. Wir können also das gesamte Programm, das wir bereits geschrieben haben, in einen for
packen Schleife wie oben beschrieben. Der Code sollte jetzt wie in Abbildung 6 unten aussehen.
Abbildung 6:Schätzschleife
Wenn Sie die richtige Zahl erraten, bevor Sie drei Versuche erreicht haben, macht es natürlich keinen Sinn, weiter zu raten. Als solches sind wir dabei, etwas sehr Schlimmes zu tun ….
Denken Sie daran, dass die Bedingung für die weitere Ausführung ist, dass i bleibt unter 3. Wenn wir also die Schleife stoppen wollen, können wir einfach i erhöhen auf 3 oder mehr, um die Schleife zu stoppen. Wenn Sie i = 3
hinzufügen Innerhalb des Blocks, der ausgeführt wird, wenn der Benutzer richtig rät, wie in Abbildung 7 unten gezeigt, wird das Spiel beendet, sobald der Benutzer 3 errät.
Abbildung 7:Kurzschließen der For-Schleife
Sie verstehen vielleicht nicht, warum das eine schlechte Idee ist, und eigentlich ist es eher ein philosophisches Argument als ein technisches. Es ist jedoch ein wichtiges Argument, also machen wir es.
Ein for
Die Schleife ist so konzipiert, dass sie eine bestimmte Anzahl von Malen ausgeführt wird. Wenn Sie im Voraus nicht wissen, wie oft Sie die Schleife ausführen werden, dann ein for
Schleife ist eine schlechte Wahl. Es gibt andere Schleifenformen, die für diese Aufgabe besser geeignet sind, also die Verwendung eines for
loop wählt das falsche Werkzeug für den Job.
Dieses Argument mag unbedeutend und pedantisch erscheinen. Das Programm funktioniert so gut wie es ist und macht genau das, was Sie erwarten.
Der Verstand des Programmierers sollte jedoch nach Klarheit streben, und dieses Beispiel ist sicherlich nicht klar. Wenn Sie sich die erste Zeile unseres aktuellen Codes ansehen, denken Sie, dass dies eine Schleife ist, die dreimal ausgeführt wird, aber dann „betrügen“ wir die Schleife in der Mitte, sodass die Schleife irgendwo zwischen einem und drei Mal ausgeführt werden kann; es gibt keine Möglichkeit für uns, es zu wissen. Wir haben die Klarheit darüber zerstört, was passieren wird, und das ist eine schlechte Sache.
Auch wenn es Ihnen egal ist, dass jemand Ihren Code liest, denken Sie daran, dass wir als Programmierer mit Maschinen arbeiten, die nicht in der Lage sind, Absichten zu verstehen. Es versteht genau nur das, was wir sagen. Wenn wir unklar sind, steigt die Wahrscheinlichkeit, dass wir unerwartete Ergebnisse erhalten. Wir riskieren, uns später selbst Probleme zu bereiten, wenn Programme komplexer werden.
Daher müssen wir einen besseren Ansatz finden, und dieser bessere Ansatz ist ein while
Schleife.
.
Eine While-Schleife
Ein while
Schleife wird ausgeführt, solange eine Bedingung wahr ist. Egal wie oft das ist:Solange die Bedingung wahr ist, wird die Schleife fortgesetzt.
Ein while
Schleife ist einfacher in der Deklaration als ein for
Schleife und besteht aus dem Schlüsselwort while
gefolgt von einer öffnenden Klammer, den Bedingungen und einer schließenden Klammer.
while (condition) { // Code to execute }
Diese Ausführung kann sehr gefährlich sein, wenn Sie keine klaren Bedingungen haben. Wenn Sie einen Fehler machen oder nicht alle Bedingungen und Ereignisse richtig berücksichtigen, kann Ihr Programm Amok laufen und Ihre Maschine zum Stillstand bringen.
Die Gefahr liegt darin, sicherzustellen, dass Sie die Bedingung innerhalb des Codeblocks ungültig machen, wenn Sie die Ausführung stoppen möchten. Andernfalls läuft die Schleife für immer.
Lassen Sie uns unseren for
ändern Schleife zu einem while
Schleife und lasse es laufen, solange der Benutzer nicht dreimal geraten hat. Wir können diese Bedingung erstellen, indem wir ein int i=0;
deklarieren bevor die Schleife beginnt und dann den Wert von i setzt innerhalb der Schleife. Aktualisieren Sie Ihren Code wie folgt:
static void Main(string[] args) { int i=0; while(i < 3) { Console.WriteLine("Guess a number between 1 and 10:"); string text = Console.ReadLine(); int input = 0; try { input = int.Parse(text); } catch { Console.WriteLine("Whoops, you didn't enter a number"); } if (input == 3) { Console.WriteLine("Congratulations! You guessed correctly!"); i = 3; } else { Console.WriteLine("No, sorry, that wasn't it. Better luck next time!"); } } }
Beachten Sie, dass dieser Code einen Fehler enthält, der zeigt, wie einfach es ist, Endlosschleifen zu erstellen. Wir erhöhen i nicht es sei denn, wir raten richtig! Mit anderen Worten, der Spieler hat unendlich viele Versuche, aber es gibt keine Möglichkeit, mit dem Raten aufzuhören, wenn er nicht richtig rät!
Wenn Sie dieses Programm starten, wissen Sie glücklicherweise, dass die Antwort auf 3 festgelegt ist, sodass Sie das erraten können, aber wenn Sie das nicht tun, könnten Sie ein großes Problem auf Ihrer Hand haben.
Ich sage das, um Sie nicht davon abzuhalten, while
zu verwenden Schleifen, sondern um ein Gefühl des Respekts für ihre Macht zu vermitteln. While
Schleifen sind sehr mächtig und nützlich, können aber auch gefährlich sein, wenn Sie nicht aufpassen.
Um Ihr Problem zu beheben, fügen Sie i++;
hinzu als erste Zeile innerhalb des Codeblocks while, unmittelbar vor Console.WriteLine("Guess a number between 1 and 10:")
. Ihr Code sollte jetzt wie erwartet funktionieren, sehr klar sein und Ihnen ein sehr einfaches, aber langweiliges Ratespiel bieten.
.
Eine Vorschau der Objektorientierung
Was können wir also tun, um dieses Spiel auch nur annähernd interessant zu machen? Ich weiß, lass uns die Geheimzahl zufällig machen!
Ich habe mich damit zurückgehalten, weil wir einige neue Ideen einführen müssen, um Zufallszahlen zu erzeugen. Diese Ideen werden im nächsten Artikel deutlich, der sich mit Objektorientierung befasst. Lassen Sie mich Ihnen vorerst nur den Code geben und ich werde im letzten Artikel dieser Serie ausführlich erklären, was er bewirkt.
static void Main(string[] args) { Random random = new Random(); // Object orientation stuff int answer = random.Next(10)+1; // Give me a random number less than 10 and add one int i = 0; while (i < 3) { i++; Console.WriteLine("Guess a number between 1 and 10:"); string text = Console.ReadLine(); int input = 0; try { input = int.Parse(text); } catch { Console.WriteLine("Whoops, you didn't enter a number"); } if (input == answer) { Console.WriteLine("Congratulations! You guessed correctly!"); i = 3; } else { Console.WriteLine("No, sorry, that wasn't it. Better luck next time!"); } } }
Es gibt jetzt zwei neue Linien und eine geänderte Linie. Die neuen Zeilen erzeugen eine zufällige Ganzzahl answer
zwischen 1 und 10, und in der geänderten Zeile vergleichen wir, was der Benutzer mit dieser zufälligen Antwort errät.
Mach dir vorerst keine Gedanken über die zufällige Generierung, das erkläre ich im nächsten Artikel. Aber jetzt, herzlichen Glückwunsch, Sie sind hiermit offiziell ein Spieleentwickler zusätzlich zu Ihrer Tätigkeit als Programmierer! Fühlen Sie sich frei, das Spiel jetzt zu spielen und zu sehen, wie es Ihnen geht. Sie sollten das Spiel im Durchschnitt 3 von 10 Mal durchspielen.
Als zusätzliche Übung für sich selbst, warum fügen Sie nach Spielende nicht eine Nachricht hinzu, die dem Spieler mitteilt, was die Geheimzahl war? Aber lassen Sie uns fürs Erste abschließen und noch einmal durchgehen, was wir behandelt haben.
.
Zusammenfassung
In diesem Artikel haben Sie den Programmablauf kennengelernt und erfahren, wie Sie den Ablauf Ihres Programms steuern können. Sie haben Ausnahmen zur Behandlung von Fehlern kennengelernt. Sie haben Codeblöcke und bedingte Verzweigungen mit if
kennengelernt und else
. Sie haben auch etwas über Schleifen mit for
gelernt und while
.
Im nächsten Artikel werden wir ein wenig Zeit damit verbringen, das Spiel aufzupolieren, und wir werden uns auch ausführlicher mit der Objektorientierung befassen.
Anleitungsserie
Dies ist Teil 4 einer 5-teiligen Serie zur Einführung in die Programmierung
- Einführung in die Programmierung:Erste Schritte
- Einführung in die Programmierung:Ihr erstes Programm
- Einführung in die Programmierung:Variablen, Typen und Datenbearbeitung
- Einführung in die Programmierung:Flusskontrolle
- Einführung in die Programmierung:Objektorientierte Programmierung