Schleifen
Schleifen
Schleifen
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
6 <strong>Schleifen</strong><br />
Objektorientierte Programmierung OOP<br />
Programmieren mit Java<br />
6 <strong>Schleifen</strong><br />
6 <strong>Schleifen</strong><br />
–6.1 <strong>Schleifen</strong><br />
–6.1.1 do-Schleife<br />
–6.1.2 while-Schleife<br />
–6.1.3 for-Schleife<br />
–6.1.4 Varianten von for-<strong>Schleifen</strong><br />
–6.1.5 Geschachtelte <strong>Schleifen</strong><br />
–6.2 Sprunganweisungen<br />
–6.2.1 break-Anweisung<br />
–6.2.2 continue-Anweisung<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 2<br />
6.1 <strong>Schleifen</strong><br />
6 <strong>Schleifen</strong><br />
–6.1 <strong>Schleifen</strong><br />
–6.1.1 do-Schleife<br />
–6.1.2 while-Schleife<br />
–6.1.3 for-Schleife<br />
–6.1.4 Varianten von for-<strong>Schleifen</strong><br />
–6.1.5 Geschachtelte <strong>Schleifen</strong><br />
–6.2 Sprunganweisungen<br />
6.1 <strong>Schleifen</strong><br />
In Computerprogrammen<br />
werden<br />
Wiederholungen mit<br />
<strong>Schleifen</strong> bewirkt.<br />
<strong>Schleifen</strong> können mit<br />
einer fest vorgegebenen<br />
Anzahl an Durchläufen<br />
erfolgen oder solange,<br />
bis eine bestimmte<br />
Bedingung erfüllt ist.<br />
Durchlaufen Sie nebenstehende<br />
Schleife<br />
solange, bis Sie<br />
insgesamt 50000 Sfr.<br />
besitzen.<br />
Sie gewinnen<br />
3000 Sfr.<br />
Jemand<br />
überweist Ihnen<br />
2000 Sfr.<br />
Sie<br />
kaufen<br />
ein neues<br />
Auto für<br />
20000<br />
Franken.<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 3<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 4
6.1 <strong>Schleifen</strong><br />
Dies lässt sich z.B. auch<br />
mit einem z.B.<br />
Struktogramm oder<br />
Flussdiagramm<br />
verdeutlichen.<br />
Anweisung 0<br />
Schleife<br />
Anweisung 1<br />
Anweisung 2<br />
Anweisung 3<br />
Anweisung 4<br />
Anweisung 5<br />
Anweisung 6<br />
Durchlaufen Sie nebenstehende<br />
Schleife<br />
solange, bis Sie<br />
insgesamt 50000 Sfr.<br />
besitzen.<br />
Sie gewinnen<br />
3000 Sfr.<br />
Jemand<br />
überweist Ihnen<br />
2000 Sfr.<br />
Sie<br />
kaufen<br />
ein neues<br />
Auto für<br />
20000<br />
Franken.<br />
6.1.1 do-Schleife<br />
Syntax<br />
do<br />
Anweisung;<br />
while (Ausdruck);<br />
Die do-Schleife (auch do-while-Schleife genannt) führt zunächst einmal die Anweisung<br />
Anweisung aus und prüft dann den Booleschen Ausdruck Ausdruck. Solange dieser<br />
Ausdruck true ist, wird die Anweisung Anweisung immer wieder ausgeführt.<br />
Bei der Anweisung kann es sich um eine Ausdrucksanweisung oder einen Block handeln.<br />
Wird der Ausdruck false, wird die Schleife beendet und mit der ersten Anweisung nach der<br />
Schleife fortgefahren.<br />
Ist der Ausdruck schon zu Beginn false, wird die Anweisung Anweisung dennoch einmal<br />
ausgeführt.<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 5<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 6<br />
6.1.1 do-Schleife<br />
Beispiel:<br />
–Zuerst wird die Variable Zaehler innerhalb der do-Schleife ausgegeben<br />
und dann um 1 erhöht.<br />
–Dann wird die do-Schleife solange wiederholt durchlaufen, bis Zaehler<br />
größer als Anzahl ist (also nicht mehr gilt: Zaehler
6.1.2 while-Schleife<br />
Beispiel:<br />
– Die while-Schleife wird solange durchlaufen, bis alle Parameter args[]<br />
ausgegeben sind.<br />
– Ist die Anzahl der Parameter Anzahl kleiner als 1, wird die while-Schleife nicht<br />
durchlaufen.<br />
– (Zur Erinnerung: Da die Nummerierung von Array-Elementen mit 0 beginnt, muss<br />
mit Zaehler-1 auf die Elemente in args[] zugegriffen werden.)<br />
public class Schleife2 {<br />
public static void main (String[] args) {<br />
int Anzahl, Zaehler = 1;<br />
Anzahl = args.length;<br />
while (Zaehler
6.1.3 for-Schleife<br />
6.1.3 for-Schleife<br />
Update<br />
–Der Ausdruck Update dient dazu, den <strong>Schleifen</strong>zähler der for-Schleife zu<br />
verändern.<br />
–Der Ausdruck Update wird nach jedem Durchlauf der for-Schleife<br />
ausgewertet, aber bevor der Testausdruck das nächste Mal ausgewertet<br />
wird, z.B. i++;<br />
–Wie der Ausdruck Initialisierung darf auch Update aus mehreren<br />
Ausdrücken bestehen, z.B.: i++, j++;<br />
–Fehlt der Ausdruck Update, so wird keine automatische Modifikation des<br />
<strong>Schleifen</strong>zählers durchgeführt.<br />
–<br />
Beispiel:<br />
– In Anlehnung an Programm Schleife2 mit einer while-Schleife wird dieselbe<br />
Funktionalität mit auch mit einer for-Schleife im Programm Schleife3 erreicht.<br />
– int Zaehler = 1 ist der Initialisierung-Ausdruck, der die Zählvariable<br />
Zaehler initialisiert.<br />
– Zaehler
6.1.4 Varianten von for-<strong>Schleifen</strong><br />
6.1.4 Varianten von for-<strong>Schleifen</strong><br />
Syntax<br />
for (Parameter : Ausdruck)<br />
Anweisung;<br />
Seit JDK 1.5 (Java 5, J2SE 5.0) erlaubt Java auch eine for-Schleife, die<br />
über die einzelnen Einträge eines Feldes bzw. ein Aufzählungsobjekt<br />
(Collections; wird später erklärt) läuft.<br />
Diese for-Schleife wird auch als foreach-Schleife bezeichnet (da sie in<br />
anderen Programmiersprachen als „foreach“ geschrieben wird).<br />
Beispiel<br />
– Programm SchleifeFeld1 zeigt dies anhand des Feldes feld, das mit int-<br />
Werten gefüllt ist.<br />
– Die erste for-Schleife gibt die Werte von feld durch direkte Indizierung der<br />
einzelnen Feldeinträge aus.<br />
– Die zweite for-Schleife gibt die Werte von feld über eine foreach-Schleife aus.<br />
– Der Unterschied scheint minimal zu sein, kann aber sehr bedeutend werden, wenn<br />
nicht über Arrays sondern über Aufzählungsobjekte (so genannte Collections)<br />
iteriert wird.<br />
public class SchleifeFeld1 {<br />
public static void main(String[] args) {<br />
int[] feld = {1,2,3,4,5,6};<br />
for (int i = 0; i < feld.length; ++i) {<br />
System.out.println(feld[i]);<br />
}<br />
for (int eintrag : feld) {<br />
System.out.println(eintrag);<br />
}<br />
}<br />
}<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 17<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 18<br />
6.1.5 Geschachtelte <strong>Schleifen</strong><br />
Im Prinzip können in Java beliebig viele <strong>Schleifen</strong> ineinander geschachtelt<br />
werden.<br />
– Programm Schleife4 zeigt dies anhand von zwei for-<strong>Schleifen</strong>.<br />
– Die erste for-Schleife zählt i von 9 bis 1 in Einerschritten herunter.<br />
– Die zweite for-Schleife zählt j von 1 bis zum aktuellen Wert von i in<br />
Einerschritten hoch und schreibt jeweils den Wert von i heraus.<br />
– Es wird also pro Zeile i-mal der Wert von i ausgegeben, beginnend mit<br />
9 bis herunter zu 1.<br />
6.2 Sprunganweisungen<br />
6 <strong>Schleifen</strong><br />
–6.1 <strong>Schleifen</strong><br />
–6.2 Sprunganweisungen<br />
–6.2.1 break-Anweisung<br />
–6.2.2 continue-Anweisung<br />
public class Schleife4 {<br />
public static void main (String[] args) {<br />
for (int i = 9; i >= 1; i--)<br />
{<br />
for (int j = 1; j
6.2 Sprunganweisungen break und continue<br />
In Java gibt es zwei Sprunganweisungen für <strong>Schleifen</strong>, die es erlauben, die<br />
Auswertungsreihenfolge einer laufenden Schleife zu verändern:<br />
–break-Anweisung<br />
–continue-Anweisung<br />
Befinden sich eine break- oder eine continue-Anweisung innerhalb<br />
mehrfach geschachtelter <strong>Schleifen</strong>, so kann im Programmcode angegeben<br />
werden, auf welche Schleife bzw. <strong>Schleifen</strong> diese Anweisungen eine<br />
Auswirkung haben.<br />
6.2.1 break-Anweisung<br />
Syntax<br />
break; oder break Label;<br />
Taucht innerhalb einer Schleife die break-Anweisung auf, wird die Schleife<br />
unmittelbar beendet und das Programm mit der ersten Anweisung nach der<br />
Schleife fortgesetzt.<br />
Neben dieser einfachen Form von break gibt es in Java noch die mit einem Label<br />
versehene Form break Label, welche meist dazu verwendet wird, zwei oder<br />
mehr ineinander geschachtelte <strong>Schleifen</strong> zu beenden. Wird nämlich break<br />
Label aufgerufen, springt das Programm an das Ende der Schleife, die am<br />
Anfang mit dem Label Label: markiert ist.<br />
(Die break-Anweisung findet außerdem auch in der switch-Bedingung Anwendung,<br />
um nur diejenigen Anweisungen auszuführen, die vor der entsprechenden break-<br />
Anweisung stehen.)<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 21<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 22<br />
6.2.1 break-Anweisung<br />
Beispiel Schleife5:<br />
– Zwei geschachtelte for-<strong>Schleifen</strong> lassen pro Zeile i-mal die Zahl i ausdrucken<br />
und davon die Quersumme Summe berechnen.<br />
– Sobald Summe größer bzw. gleich dem Grenzwert ist, werden alle <strong>Schleifen</strong><br />
abgebrochen, indem mit break zum Label1: außerhalb der äußersten for-<br />
Schleife gesprungen wird.<br />
public class Schleife5 {<br />
public static void main (String[] args) {<br />
6.2.2 continue-Anweisung<br />
Syntax<br />
continue; oder continue Label;<br />
int Summe, Grenzwert = 40;<br />
//Label, zu dem die break-Anweisung springt<br />
Label1:<br />
for (int i = 1; i
6.2.2 continue-Anweisung<br />
Beispiel Primzahlberechnung:<br />
–Es werden der Reihe nach Zahlen<br />
untersucht, ob sie eine Primzahl sind<br />
oder nicht.<br />
–Ist eine Zahl eine Primzahl, wird sie<br />
ausgegeben.<br />
6.2.2 continue-Anweisung<br />
Algorithmus der Primzahlberechnung:<br />
– i ist immer eine nächst größere Zahl, die untersucht wird, ob sie eine Primzahl ist.<br />
Dafür wird i von Untergrenze bis Obergrenze hoch gezählt.<br />
– j ist der Teiler, durch den i geteilt wird. Dazu wird j von 2 bis i/2 hoch gezählt.<br />
(i/2 reicht, da damit alle in Frage kommenden Zahlen abgedeckt sind.)<br />
– Modulo i%j testet nun, ob i ganzzahlig, also ohne Rest, durch j teilbar ist.<br />
– Sobald das auftritt, ist i nämlich keine Primzahl und der aktuelle <strong>Schleifen</strong>durchlauf<br />
der i-Schleife wird mit continue abgebrochen.<br />
– Nun wird dasselbe Verfahren für die nächste größere Zahl i durchgeführt.<br />
Für die Primzahlen zwischen 2 und 100<br />
ergibt sich damit folgendes:<br />
i = ... 13 14 15 ...<br />
j = 2,3,4,5,6 2 2,3<br />
Primzahl? ja nein nein<br />
Wie sieht aber der Algorithmus dazu aus?<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 25<br />
– (Eigentlich würde es im Algorithmus reichen, ab der Zahl 3 nur ungerade i und j<br />
zuzulassen, was hier aber der Übersichtlichkeit wegen entfällt.)<br />
© Prof. Dr. Rolf Dornberger OOP: 6 <strong>Schleifen</strong> 22.09.2010 26<br />
long unten=2<br />
long oben=100<br />
6.2.2 continue-Anweisung<br />
Beispiel Primzahlberechnung:<br />
public class Primzahlberechnung {<br />
public static void main (String[] args) {<br />
long Untergrenze = 2L;<br />
long Obergrenze = 100L;<br />
Label1:<br />
for (i=unten;<br />
i