24.11.2013 Aufrufe

Schleifen

Schleifen

Schleifen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!