Programmiervorkurs SS 2013 Schleifen Termin 3 Teile des Programms mehrfach ausführen • Ein Befehl soll mehrfach ausgeführt werden, z.B.: public class MyCounter { public static void main(String[] args) { System.out.println(1); } } Teile des Programms mehrfach ausführen • Ein Befehl soll mehrfach ausgeführt werden, z.B.: public class MyCounter { public static void main(String[] args) { System.out.println(1); System.out.println(2); System.out.println(3); System.out.println(4); System.out.println(5); System.out.println(6); System.out.println(7); System.out.println(8); } Copy & Paste ist eine schlechte } Idee! (Code wird lang und unübersichtlich.) Teile des Programms mehrfach ausführen • while-Schleife public class MyCounter { public static void main(String[] args) { int i = 0; while (i < 10) { // solange i < 10 ... System.out.println(i); // gib i aus i++; // und erhoehe i um 1 } } } Teile des Programms mehrfach ausführen • while-Schleife public class MyCounter { public static void main(String[] args) { int i = 0; while (i < 10) { // solange i < 10 ... System.out.println(i); // gib i aus i++; // und erhoehe i um 1 } } } Abbruch wenn false Teile des Programms mehrfach ausführen • while-Schleife public class MyCounter { public static void main(String[] args) { int i = 0; while (i < 10) { // solange i < 10 ... System.out.println(i); // gib i aus i++; // und erhoehe i um 1 } } } geschweifte Klammern begrenzen die Schleife Teile des Programms mehrfach ausführen • while-Schleife public class MyCounter { public static void main(String[] args) { int i = 0; while (i < 10) { // solange i < 10 ... System.out.println(i); // gib i aus } } } Teile des Programms mehrfach ausführen • while-Schleife public class MyCounter { public static void main(String[] args) { int i = 0; while (i < 10) { // solange i < 10 ... System.out.println(i); // gib i aus } } } Achtung vor Endlosschleife! Bist Du sicher, dass der Ausdruck in () irgendwann false wird? Teile des Programms mehrfach ausführen • for-Schleife (ermöglicht kompaktere Notation) public class MyCounter { public static void main(String[] args) { int i = 0; while (i < 10) { System.out.println(i); i++; } } } // solange i < 10 ... // gib i aus // und erhoehe i um 1 Teile des Programms mehrfach ausführen • for-Schleife public class MyCounter { public static void main(String[] args) { int i = 0; while (i < 10) { System.out.println(i); i++; } } } // solange i < 10 ... // gib i aus // und erhoehe i um 1 Teile des Programms mehrfach ausführen • for-Schleife public class MyCounter { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(i); } } } // solange i < 10 // gib i aus // und erhoehe i um 1 Teile des Programms mehrfach ausführen • for-Schleife public class MyCounter { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(i); } } } Initialisierung Ausdruck Update // solange i < 10 // gib i aus // und erhoehe i um 1 Teile des Programms mehrfach ausführen • for-Schleife public class MyCounter { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(i); } } } Initialisierung Ausdruck (wird vor dem ersten Schleifendurchlauf ausgeführt) Update // solange i < 10 // gib i aus // und erhoehe i um 1 Teile des Programms mehrfach ausführen • for-Schleife public class MyCounter { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(i); // solange i < 10 // gib i aus // und erhoehe i um 1 } } } Initialisierung Ausdruck Update (wird vor jedem Schleifendurchlauf ausgewertet) Teile des Programms mehrfach ausführen • for-Schleife public class MyCounter { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(i); // solange i < 10 // gib i aus // und erhoehe i um 1 } } } Initialisierung Ausdruck Update (wird nach jedem Schleifendurchlauf ausgeführt) Teile des Programms mehrfach ausführen • for-Schleife public class MyCounter { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(i); } } } Nur eine Anweisung in Schleifenblock? → Klammern können entfallen. (auch bei while-Schleife) // solange i < 10 // gib i aus // und erhoehe i um 1 Teile des Programms mehrfach ausführen • for-Schleife public class MyCounter { public static void main(String[] args) { for (int i = 0; i < 10; i++) System.out.println(i); } } Teile des Programms mehrfach ausführen • Beispiel: Berechnung der Fakultät einer Zahl n n! = 1 · 2 · ... · n Teile des Programms mehrfach ausführen • Beispiel: Berechnung der Fakultät einer Zahl n public class Fakultaet { public static void main(String[] args) { //Berechne die Fakultaet f von n: int n = 5; int f = 1; for (int i = 1; i <= n; i++) { f *= i; } System.out.println( "Die Fakultaet von " + n + " ist " + f); } } Teile des Programms mehrfach ausführen • Beispiel: Berechnung der Fakultät einer Zahl n public class Fakultaet { public static void main(String[] args) { //Berechne die Fakultaet f von n: int n = 5; int f = 1; for (int i = 1; i <= n; i++) { f *= i; System.out.println(i + " " + f); //Test } System.out.println( "Die Fakultaet von " + n + " ist " + f); } } Teile des Programms mehrfach ausführen • Beispiel: Berechnung der Fakultät einer Zahl n public class Fakultaet { Ausgabe: public static void main(String[] args) { 1 1 //Berechne die Fakultaet f von n: 2 2 int n = 5; 3 6 int f = 1; 4 24 for (int i = 1; i <= n; i++) { 5 120 f *= i; System.out.println(i + " " + f); //Test } System.out.println( "Die Fakultaet von " + n + " ist " + f); } } Teile des Programms mehrfach ausführen • Beispiel: Berechnung der Fakultät einer Zahl n import java.util.Scanner; public class Fakultaet { public static void main(String[] args) { //Eingabe einer Zahl n: Scanner sc = new Scanner(System.in); int n = sc.nextInt(); //Berechne die Fakultaet f von n: int f = 1; for (int i = 1; i <= n; i++) f *= i; System.out.println( "Die Fakultaet von " + n + " ist " + f); } } Teile des Programms mehrfach ausführen • Beispiel: Berechnung der Fakultät einer Zahl n import java.util.Scanner; public class Fakultaet { public static void main(String[] args) { //Eingabe einer Zahl n: Scanner sc = new Scanner(System.in); int n = sc.nextInt(); //Berechne die Fakultaet f von n: int f = 1; for (int i = 1; i <= n; i++) f *= i; System.out.println( "Die Fakultaet von " + n + " ist " + f); } } Teile des Programms mehrfach ausführen • Beispiel: Berechnung der Fakultät einer Zahl n import java.util.Scanner; public class Fakultaet { public static void main(String[] args) { //Eingabe einer Zahl n: Scanner sc = new Scanner(System.in); int n = sc.nextInt(); //Berechne die Fakultaet f von n: long f = 1; //die Fakultaet waechst schnell! for (int i = 1; i <= n; i++) f *= i; System.out.println( "Die Fakultaet von " + n + " ist " + f); } } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 7·8=? 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 7 · 8 = 56 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins public class Einmaleins { public static void main(String[] args) { for (int zeile = 1; zeile <= 10; zeile++) { for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } } } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins public class Einmaleins { public static void main(String[] args) { //Aeussere Schleife: Iteriere ueber Zeilen for (int zeile = 1; zeile <= 10; zeile++) { for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } } } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins public class Einmaleins { public static void main(String[] args) { for (int zeile = 1; zeile <= 10; zeile++) { //Innere Schleife: Iteriere ueber Spalten for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } } } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins public class Einmaleins { public static void main(String[] args) { //Aeussere Schleife: Iteriere ueber Zeilen for (int zeile = 1; zeile <= 10; zeile++) { //Innere Schleife: Iteriere ueber Spalten for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); //Tabulator } System.out.print("\n"); //Zeilenumbruch } } } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 for (int zeile = 1; zeile <= 10; zeile++) { for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 2 for (int zeile = 1; zeile <= 10; zeile++) { for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 2 3 for (int zeile = 1; zeile <= 10; zeile++) { for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 2 3 4 5 6 7 8 9 for (int zeile = 1; zeile <= 10; zeile++) { for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 2 3 4 5 6 7 8 9 10 for (int zeile = 1; zeile <= 10; zeile++) { for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 2 2 3 4 5 6 7 8 9 10 for (int zeile = 1; zeile <= 10; zeile++) { for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } Teile des Programms mehrfach ausführen • Mehrfachschleifen: Das kleine Einmaleins Gesucht ist ein Programm, das folgende Tabelle ausgibt: 1 2 2 4 3 4 5 6 7 8 9 10 for (int zeile = 1; zeile <= 10; zeile++) { for (int spalte = 1; spalte <= 10; spalte++) { int produkt = zeile * spalte; System.out.print(produkt + "\t"); } System.out.print("\n"); } Aufgabe • Erstellt ein Programm, das die Kreiszahl π nach der Reihenentwicklung von Leibniz berechnet: π 1 1 1 1 1 = − + − + − 4 1 3 5 7 9 • Erstellt ein Programm, das die Kreiszahl π durch das zufällige Streuen von Punkten in ein Quadrat ermittelt. Verwendet als Zufallsgenerator die Methode Math.random(). Aufgabe • Erstellt ein Programm, das (mit Hilfe von for-Schleifen) symmetrische Tannenbäume (variabler Höhe) generiert. Der Stamm hat immer eine Höhe von zwei Zeilen und die Krone mindestens drei. * *** ***** * * Höhe 3 * *** ***** ******* ********* * * Höhe 5 Aufgabe • Ändert Euer Programm so, dass es auch Wälder mit konstanter Baumhöhe generieren kann. * *** ***** * * * * * * *** *** *** *** ***** ***** ***** ***** * * * * * * * * Wald mit Bäumen der Höhe 3.