Kapitel 7 - Schleifen
while Schleife
Um mehrere Anweisungen hintereinander auszuführen, verwendet man die Schleifen. Die wichtigste Regel zu den Schleifen ist eigentlich nur, dafür zu sorgen, dass diese sich wieder beenden. Der
Syntax der while-Schleife ...
while(BEDINGUNG==WAHR)
{
ANWEISUNG
}
Die Anweisung in einer
while -Schleife wird solange und sooft ausgeführt, bis die Bedingung in den Klammern der while-Schleife unwahr ist. Ist diese Bedingung unwahr, so wird das Programm hinter dem Anweisungsblock fortgeführt. Hierzu ein kurzes Beispiel ...
#!/usr/bin/perl -w
$counter=1;
while($counter <= 5)
{
print "Der Wert der Variable " . q% $counter% . " beträgt nach dem " .
$counter . ".Durchlauf " . $counter*$counter . "\n";
$counter++;
}
In diesem Fall bekommen Sie nach jedem Schleifedurchlauf das Quadrat zu dem Wert von $counter. Die print-Anweisung wird 5mal auf dem Bildschirm ausgegeben denn dann ist die Bedingung ...
while($counter <=5) #counter=6
... unwahr und das Programm wird hinter dem Anweisungsblock ( {} ) weitergeführt. In unserem Beispiel ist das Programm zu Ende.
do while Schleife
Die
do while Schleife ist optimal, wenn der
Anweisungsblock mindestens einmal ausgeführt werden soll. Beispielsweise bei einem Auswahlmenü. Hier der
Syntax für die do while Schleife ...
do {
ANWEISUNG
}while(BEDINGUNG==WAHR);
Bei einer do while-Schleife wird der Anweisungsblock so oft ausgeführt bis die Bedingung von while unwahr ist. Die Anweisung in dem Anweisungsblock wird mindestens einmal ausgeführt. Wichtig ist auch, dass Sie die do while-Schleife mit einem Semikolon nach while abschließen. Hierzu nun ein Beispiel ...
#!/usr/bin/perl -w
$wert=1;
do {
print "Quadratflächenberrechung ... Gehen Sie die Seitenlänge ein : ";
chomp($wert=<STDIN>);
print "Quadratfläche = " . $wert*$wert . "\n";
print "\nBeenden können Sie mit der Zahl 0\n\n";
}while($wert!=0);
print "Programmende!\n";
Das Programm wird so lange ausgeführt bis Sie den Wert 0 eingeben. Ist die Bedingung in while wahr, wird immer wieder zum Schleifenanfang von do gesprungen. Ist der Inhalt von while unwahr (0) wird das Programm nach while fortgesetzt. In diesem Fall wird Programmende ausgegeben.
do until Schleife
Die
do until Schleife ist ähnlich wie die do while Schleife, nur das durch das Schlüsselwort
until der Anweisungsblock so lange ausgeführt wird, bis die Bedingung in until unwahr ist. Hier der Syntax ...
do {
ANWEISUNG
}until(BEDINGUNG==UNWAHR);
Auch hier gilt schon wie bei der do while Schleife, until mit einem Semikolon zu beenden. Hier unser Programmbeispiel von zuvor mit until ...
#!/usr/bin/perl -w
$wert=1;
do {
print "Quadratflächenberrechung.......Gehen Sie die Seitenlänge ein : ";
chomp($wert=<STDIN>);
print "Quadratfläche = " . $wert*$wert . "\n";
print "\nBeenden können Sie mit der Zahl 0\n\n";
}until($wert==0);
print "Programmende!\n";
Im Gegensatz zum do while-Skript, wurde nur das while durch until und $wert!=0 durch $wert==0 ersetzt. Gesprochen heißt dies, dass unser Programm so lange ausgeführt wird, bis der Inhalt von until wahr ist (bei while musste der Inhalt unwahr sein). Ist der Inhalt von until wahr wird das Programm nach until fortgesetzt. Im Prinzip ist das Schlüsselwort until überflüssig.
for Schleife
Mit der
for -Schleife können wir drei Anweisungen zwischen die Klammern stellen. Und zwar die Initialisierung, die Bedingung und den Schleifenzähler. Hier der
Syntax der for-Schleife ...
for(INITIALISIERUNG, BEDINGUNG==WAHR, INKREMENT)
{
ANWEISUNG
}
Die Initialisierung findet nur einmal bei Eintritt in die Schleife statt. Die Schleifenbedingung wird nach jedem Schleifendurchlauf überprüft ob diese wahr ist. Wenn diese wahr ist wird der Anweisungsblock ausgeführt. Im Prinzip stellt die for-Schleife nichts anderes da, als eine verkappte while-Schleife. Folgende Programme erfüllen den selben Zweck ...
#!/usr/bin/perl -w
$wert=1;
while($wert <= 5)
{
print $wert . ".Schleifendurchlauf\n";
$wert++;
}
Hier wird der Anweisungsblock 5x ausgeführt. Das ganze jetzt mit der for-Schleife ...
#!/usr/bin/perl -w
for($wert=1; $wert<=5; $wert++)
{
print $wert . ".Schleifendurchlauf\n";
}
Unterscheiden tun sich also die beiden Schleifen nicht. Nur gilt die for-Schleife als etwas
komfortabler und vielseitiger als andere Schleifen. Aber es führen viele Wege nach Rom ...
foreach Schleife
Die
foreach -Schleife ist für viele Programmiererfahrene wieder Neuland. Aber im Prinzip ist diese Schleife eine Abart der for-Schleife. Hierzu erst der Syntax ...
foreach $var LISTE
{
ANWEISUNG
}
Mit foreach werden nacheinander alle Elemente der Liste durchlaufen. Wozu? Nun nehmen wir mal an Sie wollen von 1-10 mit ungeraden Zahlen rechnen. Dies würden Sie nach dem jetzigen Wissensstand so machen ...
#!/usr/bin/perl -w
for($wert=1; $wert<=10; $wert++)
{
if($wert % 2) #gerade Zahl = 0, ungerade Zahl = 1
{
print $wert*$wert . "\n";
}
}
Hier berechnen Sie die Quadratfläche zu allen ungeraden Zahlen von 1-10. Mit foreach könnten das jetzt so aussehen ...
#!/usr/bin/perl -w
foreach $wert (1..10)
{
if($wert % 2) #gerade Zahl = 0, ungerade Zahl = 1
{
print $wert*$wert . "\n";
}
}
Auch in diesem Beispiel wird der Wert 1-10 durchlaufen. Die Initialisierung von $wert übernimmt in diesem Fall die Schleife für uns. Einen echten Vorteil haben wir aber jetzt davon nicht. Die Schleife wird dennoch 10 mal Durchlaufen, dabei 5 mal Umsonst da die Zahl gerade ist. Man kann die foreach-Schleife ja auch anderes verwenden ...
#!/usr/bin/perl -w
foreach $wert (1, 3, 5, 7, 9)
{
print $wert*$wert . "\n";
}
Jetzt wir die Schleife tatsächlich nur 5 mal ausgeführt. Natürlich sind mit foreach auch noch eine Menge anderer Schreibweisen möglich ...
foreach $farbe ('rot', 'blau', 'gruen')
#Es wird das ganze Alphabet in Kleinbuchstaben durchlaufen
foreach $alpha ('a'..'z')
Manch einem der bereits Erfahrung in C/C++ hat, wird dabei eine Ähnlichkeit mit den
Arrays sehen. Und er hat Recht, es lässt sich sehr gut dafür Verwenden. Dazu kommen wir noch.
Schleifen abbrechen
Manchesmal wird es nicht ausreichen eine Schleife zu beenden, wenn die Schleifenbedingung nicht mehr Erfüllt wird. Dafür gibt es Abbruchbefehle.
Die Schleifenabbruchbedingung
redo, wobei es eher eine Erneut-in-die-Schleife-springen Befehl ist, kann man in C/C++ mit
continue vergleichen. Bei Ausführung von redo in der Schleife, wird wieder an den Anfang der Schleife zurückgesprungen ...
#!/usr/bin/perl -w
$wert=1;
while(1)
{
print "Bitte geben Sie eine Zahl ein : ";
chomp($wert=<STDIN>);
if($wert < 10)
{
print "Bitte eine Zahl grösser als 10 eingeben!!!\n";
redo; #wieder zu while hochspringen
}
print "Korrekte Eingabe\n";
last;
}
Mit while(1) haben Sie hier eine Endlosschleife erschaffen. In unserem Beispiel wird die Schleife mit last abgebrochen. Wenn Sie eine Zahl eingegeben haben die kleiner als 10 war, wird der Anweisungsblock der if-Anweisung ausgeführt. Mit redo wird veranlasst, dass wieder zum Anfang der Schleife gesprungen wird. Haben Sie eine Korrekte Zahl eingeben, wird die Schleife mit
last abgebrochen. Das heißt, das Programm wird nach dem Anweisungsblock der Schleife weitergeführt. In unserem Fall wird das Programm beendet.
Eine weiter Möglichkeit in einer Schleife einzugreifen stellt das Schlüsselwort
next da. Mit Hilfe der next-Anweisung wird ein Schleifendurchlauf übersprungen und der nächste Durchlauf wird gleich Ausgeführt. Hierzu ein einfaches Beispiel ...
#!/usr/bin/perl -w
for($wert=1; $wert <= 20; $wert++)
{
if($wert % 2)
{
next; #Die Zahl ist ungerade und interessiert uns nicht
}
print $wert . "\n";
}
In diesem Beispiel geben Sie alle Geraden Zahlen auf dem Bildschirm aus. Bei einer Ungeraden Zahl wird die nächste Anweisung übersprungen und es wird mit dem nächsten Schleifendurchlauf fortgefahren.
Zurück zu Kapitel 6 |
Zur Übersicht |
Weiter zu Kapitel 8
--
EnricoEhrhardt - 18 Aug 2008