scripting:tutorials:level1:loops
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Nächste Überarbeitung | Vorherige Überarbeitung | ||
scripting:tutorials:level1:loops [2023/05/27 10:45] – angelegt fritz_98 | scripting:tutorials:level1:loops [2024/05/13 13:21] (aktuell) – fritz_98 | ||
---|---|---|---|
Zeile 37: | Zeile 37: | ||
Die Bedingung, ob der Inhalt der Schleife ausgeführt werden soll, wird **immer im Voraus** geprüft. Das heißt, wenn im Beispiel oben '' | Die Bedingung, ob der Inhalt der Schleife ausgeführt werden soll, wird **immer im Voraus** geprüft. Das heißt, wenn im Beispiel oben '' | ||
+ | |||
+ | ---- | ||
+ | |||
+ | **Hinweis**: | ||
+ | |||
+ | [[ https:// | ||
+ | |||
+ | Um dabei bei der Ausgabe ein Ergebnis zu sehen, kann man die Fnuktion '' | ||
+ | <code lua> | ||
+ | print(MyNumber) | ||
+ | </ | ||
+ | schreiben. Wenn die Variable einen anderen Namen hat, muss man diesen dementsprechend austauschen. | ||
+ | |||
+ | ---- | ||
Um die Möglichkeiten der **while**-Schleife besser zeigen zu können, wollen wir den Rest einer ganzzahligen Division berechnen. Diese Operation wird auch //Modulo// genannt. Ziel ist also für zwei Zahlen A und B herauszufinden, | Um die Möglichkeiten der **while**-Schleife besser zeigen zu können, wollen wir den Rest einer ganzzahligen Division berechnen. Diese Operation wird auch //Modulo// genannt. Ziel ist also für zwei Zahlen A und B herauszufinden, | ||
Zeile 68: | Zeile 82: | ||
Wer Lust hat, kann sich auf der verlinkten Wikipediaseite anschauen, warum dieser Algorithmus funktioniert. | Wer Lust hat, kann sich auf der verlinkten Wikipediaseite anschauen, warum dieser Algorithmus funktioniert. | ||
+ | |||
+ | **Achtung**: | ||
+ | |||
+ | <code lua> | ||
+ | MyNumber = 1 | ||
+ | |||
+ | while MyNumber < 42 do | ||
+ | MyNumber = MyNumber - 1 | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | Jetzt wird '' | ||
---- | ---- | ||
Zeile 73: | Zeile 99: | ||
===== for-Schleife ===== | ===== for-Schleife ===== | ||
- | Die **for**-Schleife wird dazu benutzt, den eingesetzten Code-Block für eine feste Anzahl an Wiederholungen auszuführen. | + | Die **for**-Schleife wird dazu benutzt, den eingesetzten Code-Block für eine feste Anzahl an Wiederholungen auszuführen. Die Anzahl der Wiederholungen (**Iterationen**) wird durch eine Zähler angegeben, der einen Startwert, einen Zielwert und eine Schrittweite hat. Beim Startwert beginnend, geht der Zähler gemäß der Schrittweite auf den Zielwert zu. Bei jedem Schritt wird der Block in der Schleife ausgeführt. |
+ | |||
+ | Eingeleitet wird die **for**-Schleife mit dem Schlüsselwort '' | ||
+ | <code lua> | ||
+ | -- Dieser Code addiert alle ungeraden Zahlen von 1 bis 10 | ||
+ | Sum = 0 | ||
+ | |||
+ | -- Counter ist der Name der Zählvariable | ||
+ | -- Die erste Zahl nach dem = ist der Startwert | ||
+ | -- Die zweite Zahl ist der Zielwert, getrennt durch ein Komma | ||
+ | -- Die dritte Zahl ist die Schrittweite, | ||
+ | for Counter = 1, 10, 2 do | ||
+ | -- In jeder Iteration wird der aktuelle Wert der Zählvariable addiert | ||
+ | Sum = Sum + Counter | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | Wenn die Schrittweite der Zählvarable 1 sein soll, kann man sie einfach weglassen: | ||
+ | <code lua> | ||
+ | -- Dieser Code erstellt einen String aller Zahlen von 1 bis 10 | ||
+ | NumberString = "" | ||
+ | |||
+ | -- Die Schrittweite soll hier 1 sein, also brauchen wir sie nicht extra aufzuschreiben | ||
+ | for Counter = 1, 10 do | ||
+ | NumberString = NumberString..Counter | ||
+ | -- In allen außer der letzten Iteration wollen wir ein Komma, um die Zahlen zu trennen | ||
+ | if Counter < 10 then | ||
+ | NumberString = NumberString..", | ||
+ | end | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | Der Variablenname '' | ||
+ | Wir geben noch ein Beispiel, um zu zeigen, dass **for**-Schleifen selbstverständlich auch rückwärts zählen können, wenn die Schrittweite negativ ist: | ||
+ | |||
+ | <code lua> | ||
+ | PerfectlyBalanced = 0 | ||
+ | |||
+ | -- Hier werden wieder alle Zahlen in der Zählschleife addiert | ||
+ | -- Da die gleichen positiven und negativen Zahlen addiert werden, | ||
+ | -- wird das Ergebnis 0 sein | ||
+ | for i = 10, -10, -1 do | ||
+ | PerfectlyBalanced = PerfectlyBalanced + i | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | Es können auch mehrere Schleifen ineinander geschachtelt werden. Dabei ist es **wichtig**, | ||
+ | <code lua> | ||
+ | -- Dieser Code addiert alle Zahlen a und b, wenn a und b zwischen 1 und 10 liegen | ||
+ | -- Die Summen werden als String angezeigt | ||
+ | |||
+ | for a = 1, 10 do | ||
+ | -- Jede " | ||
+ | NumberString = "" | ||
+ | for b = 1, 10 do | ||
+ | -- Die einzelnen Zahlen werden mit einem Leerzeichen getrennt | ||
+ | NumberString = NumberString..(a + b).." " | ||
+ | end | ||
+ | print(NumberString) | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | **Hinweis**: | ||
+ | <code lua> | ||
+ | for i = 1, 10 do | ||
+ | i = i + 1 | ||
+ | end | ||
+ | </ | ||
+ | Es ist zwar prinzipiell möglich, das zu tun, führt aber meistens nur zu Problemen. Besser ist es, einfach eine andere Schrittweite zu setzen. Falls die Schrittweite sich verändern soll, bietet sich eine **while**-Schleife an, die eine maßgeschneiderte Zählvariable führt. | ||
---- | ---- | ||
===== repeat-until-Schleife ===== | ===== repeat-until-Schleife ===== | ||
+ | |||
+ | Die **repeat-until**-Schleife ist im Prinzip nur eine " | ||
+ | |||
+ | Der Schleifenblock wird mit '' | ||
+ | <code lua> | ||
+ | MyNumber = 1 | ||
+ | |||
+ | repeat | ||
+ | MyNumber = MyNumber + 1 | ||
+ | until MyNumber >= 42 | ||
+ | </ | ||
+ | |||
+ | Wir sehen, dass diese Art der Schleife auf zwei verschiedene Arten die **while**-Schleife umkehrt: | ||
+ | |||
+ | - Die angegebene Bedingung in der **repeat-until** Schleife gibt nicht an, unter welcher Bedingung die Schleife fortgesetzt wird, sondern unter welcher Bedingung sie beendet wird. Will man eine **while**-Schleife in eine **repeat-until**-Schleife umbauen, muss man die Bedingung also genau umkehren | ||
+ | - Der Schleifenblock wird **immer mindestens 1 mal** ausgeführt. Diese Eigenschaft wird in der Syntax dadurch ausgedrückt, | ||
+ | |||
+ | Der letzte Punkt kann zu subtilen Unterschieden im Codeverhalten führen. Vergleiche: | ||
+ | <code lua> | ||
+ | MyNumber = 42 | ||
+ | |||
+ | while MyNumber < 42 do | ||
+ | MyNumber = MyNumber + 1 | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | und | ||
+ | |||
+ | <code lua> | ||
+ | MyNumber = 42 | ||
+ | |||
+ | repeat | ||
+ | MyNumber = MyNumber + 1 | ||
+ | until MyNumber >= 42 | ||
+ | </ | ||
+ | |||
+ | In der ersten Variante hat '' | ||
+ | |||
+ | Es gibt einige Fälle, in denen eine **repeat-until**-Schleife sinnvoll ist. In den meisten Fällen kannst du aber davon ausgehen, dass eine **while**-Schleife ausreicht. | ||
+ | |||
+ | Auch mit **repeat-until** sind Endlosschleifen möglch. Stelle deshalb sicher, dass die Schleifenbedingung immer **true** werden kann! | ||
---- | ---- | ||
===== Abgrenzung zu Funktionen ===== | ===== Abgrenzung zu Funktionen ===== | ||
+ | |||
+ | Im Artikel zu [[ scripting: | ||
+ | |||
+ | Funktionen dienen primär dazu, Teilen von Code einen **Namen** zu geben. Dadurch erhält der Code Struktur und wird besser lesbar. Funktionen können außerdem mit Parametern arbeiten und ein Ergebnis zurückgeben ('' | ||
+ | Schleifen hingegen ersparen dem Programmierer Schreibarbeit, | ||
+ | |||
+ | Tatsächlich haben Schleifen und Funktionen aber einen gemeinsamen historischen Ursprung. Wer möchte, kann sich dazu den [[ https:// | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Mit sogenannten //Tables// (= Tabellen) werden im nächsten Kapitel eine mächtige und flexible Datenstruktur vorgestellt. | ||
+ | |||
+ | [[ scripting: | ||
+ | [[ scripting: | ||
+ | [[ scripting: |
scripting/tutorials/level1/loops.1685184310.txt.gz · Zuletzt geändert: 2023/05/27 10:45 von fritz_98