Übungen: 6 Schleifen Objektorientierte Programmierung OOP Programmieren mit Java 1. do-schleife 2. while-schleife 3. a) c) Verschiedene for-schleifen 6 Schleifen Übungen 4. for-schleife: halber Tannenbaum 5. break-anweisung 6. continue-anweisung Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 2 Aufgabe 1: do-schleife Wie sieht der Output des folgenden Programms DoSchleife aus? Lösung 1: do-schleife Der Output sieht folgendermaßen aus: Erst überlegen, dann programmieren. public class DoSchleife public static void main (String[] args) int Anzahl = 10; int Zaehler = 1; do System.out.println(Zaehler++ + " Dies ist die 1. Schleife"); while (Zaehler > Anzahl); do System.out.println(Zaehler++ + " Dies ist die 2. Schleife"); while (Anzahl >= Zaehler); Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 3 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 4
Aufgabe 2: while-schleife Schreiben Sie das Programm DoSchleife so zum Programm WhileSchleife um, dass die bestehenden Anweisungen nun in einer while-schleife ausgeführt werden. Die Schleifenbedingungen sollen nicht verändert werden. Wie sieht der Output jetzt aus? Warum entsteht ein Unterschied zu DoSchleife? public class WhileSchleife public static void main (String[] args) Lösung 2: while-schleife Der Output sieht folgendermaßen aus: int Anzahl = 10; int Zaehler = 1; while (Zaehler > Anzahl) System.out.println(Zaehler++ + " Dies ist die 1. Schleife"); while (Anzahl >= Zaehler) System.out.println(Zaehler++ + " Dies ist die 2. Schleife"); Der Unterschied liegt darin, dass der 1. Schleifendurchgang bei einer do-schleife auf jeden Fall einmal ausgeführt wird und bei einer while-schleife nicht, wenn die Bedingung schon zu Anfang nicht erfüllt ist. Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 5 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 6 Aufgabe 3a: Verschiedene for-schleifen Schreiben Sie nachfolgende Programme mit ausschließlich for-schleifen, die zu entsprechenden Ausgaben führen: Programm For1, das von 8 bis 18 hoch zählt. Programm For2, das von 18 bis 8 herunter zählt. Programme For3a und For3b, die von 8 bis 18 in Zweierschritten hoch zählen. In For3a wird dazu i um 2 pro Schleifendurchlauf erhöht. In For3b wird dazu i nur um 1 pro Schleifendurchlauf erhöht, aber der doppelte Wert ausgegeben. Lösung 3a: Verschiedene for-schleifen public class For1 public static void main (String[] args) // zählt von 8 bis 18 for (int i = 8; i <= 18; i++) a) For1 b) For2 c) For3a und For3b public class For2 public static void main (String[] args) // zählt von 18 bis 8 for (int i = 18; i >= 8; i--) Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 7 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 8
Lösung 3a: Verschiedene for-schleifen public class For3a public static void main (String[] args) // zählt von 8 bis 18 in Zweierschritten for (int i = 8; i <= 18; i=i+2) Aufgabe 3b: Verschiedene for-schleifen Schreiben Sie nachfolgende Programme mit ausschliesslich for- Schleifen, die zu entsprechenden Ausgaben führen: Programm For4, das ein Dreieck aus lauter 8 erzeugt. Programm For5, das ein Dreieck mit entsprechenden Zahlen erzeugt. Programm For6, das ein Dreieck mit entsprechenden Zahlen erzeugt. public class For3b public static void main (String[] args) // zählt von 4 bis 9 for (int i = 4; i <= 9; i++) // gibt den Wert 2*i aus, also 8 bis 18 System.out.println(2*i); d) For4 e) For5 f) For6 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 9 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 10 Lösung 3b: Verschiedene for-schleifen public class For4 public static void main (String[] args) // schreibt i-mal das Zeichen '8' pro Zeile System.out.print('8'); Lösung 3b: Verschiedene for-schleifen public class For5 public static void main (String[] args) Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 11 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 12
Lösung 3b: Verschiedene for-schleifen Aufgabe 3c: Verschiedene for-schleifen public class For6 public static void main (String[] args) for (int i = imax; i >= 1; i--) Schreiben Sie nachfolgende Programme mit ausschliesslich for- Schleifen, die zu entsprechenden Ausgaben führen: Programm For7, das ein Dreieck mit entsprechenden Zahlen erzeugt. Programm For8, das ein Dreieck mit entsprechenden Zahlen erzeugt. Programm For9, das ein Dreieck mit entsprechenden Zahlen erzeugt. g) For7 h) For8 i) For9 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 13 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 14 Lösung 3c: Verschiedene for-schleifen public class For7 public static void main (String[] args) // schreibt (imax-i)-mal ein Leerzeichen pro Zeile for (int j = 1; j <= (imax-i); j++) System.out.print(' '); Lösung 3c: Verschiedene for-schleifen public class For8 public static void main (String[] args) for (int i = imax; i >= 1; i--) // schreibt (imax-i)-mal ein Leerzeichen pro Zeile for (int j = 1; j <= (imax-i); j++) System.out.print(' '); Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 15 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 16
Lösung 3c: Verschiedene for-schleifen public class For9 public static void main (String[] args) // schreibt (i-1)-mal ein Leerzeichen pro Zeile for (int j = 1; j <= (i-1); j++) System.out.print(' '); // schreibt (imax-i+1)-mal die Zahl i pro Zeile for (int j = 1; j <= (imax-i+1); j++) Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 17 Aufgabe 4: for-schleife: Halber Tannenbaum Schreiben Sie ein Programm, das mittels for-schleifen folgenden Output generiert: Überlegen Sie dazu, wie viele for-schleifen ineinander geschachtelt sein müssen. Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 18 Lösung 4: for-schleife: Halber Tannenbaum Diese Schleife ist für das Erzeugen der 5 Blöcke zuständig. public class ForSchleife public static void main (String[] args) for (int i = 1; i <= 5; i++) for (int j = 1; j <= 3; j++) for (int k = 1; k < j+i; k++) System.out.print("*"); Aufgabe 5: break-anweisung Setzen sie im Programm BreakTest die break-anweisung (evtl. mit Label) so, damit die folgenden Darstellungen herausgegeben werden: public class BreakTest public static void main (String[] args) Erzeugt in jedem Block 3 Zeilen. Erzeugt die entsprechende Anzahl * pro Zeile. Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 19 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 20
Lösung 5: break-anweisung public class BreakTest1 public static void main (String[] args) Label1: break Label1; public class BreakTest2 public static void main (String[] args) Label2: break Label2; Lösung 5: break-anweisung public class BreakTest3 public static void main (String[] args) break; Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 21 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 22 Aufgabe 6: continue-anweisung Schreiben Sie das Programm Primzahlberechnung so zum Programm Primzahlberechnung2 um, dass keine continue-anweisung mehr vorkommt. Ändern Sie dabei so wenig wie möglich! Warum ist die continue-anweisung in diesem Fall eine elegante Lösung? public class Primzahlberechnung public static void main (String[] args) long Untergrenze = 2L; long Obergrenze = 100L; Label1: //Label, zu dem die continue-anweisung springt //zum Label gehörige for-schleife for (long i = Untergrenze; i <= Obergrenze; i++) for (long j = 2; j <= i/2; j++) if ((i%j) == 0) //springt zum Label und setzt for-schleife mit i+1 fort continue Label1; Lösung 6: continue-anweisung Die continue-anweisung erspart das vollständige Durchlaufen der for- Schleifen, sobald feststeht, dass die Zahl i keine Primzahl ist. (Zeitersparnis beim Ausführen des Programms!) public class Primzahlberechnung2 public static void main (String[] args) long Untergrenze = 2L; long Obergrenze = 100L; boolean IstPrimzahl; for (long i = Untergrenze; i <= Obergrenze; i++) IstPrimzahl = true; // Zahl vielleicht Primzahl for (long j = 2; j <= i/2; j++) if ((i%j) == 0) IstPrimzahl = false; // Zahl doch keine Primzahl if (IstPrimzahl) // Zahl nur ausgeben, wenn Primzahl Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 23 Prof. Dr. Rolf Dornberger OOP: 6 Schleifen 22.09.2010 24