Objektorientierte Programmierung OOP Programmieren mit Java 7.1.1 Anweisungen 7.1.2 Verzweigungen aufgrund von Bedingungen 7.1.3 Wiederholungen mit Schleifen 7.1.4 Blöcke, Funktionen, Objekte 7.2 Wiederholung der Grundelemente und Syntax in Java 7.2.1 Grundkonzept von Java 7.2.2 Sprachelemente, Datentypen und Variablen 7.2.3 Operatoren 7.2.4 Datenfelder 7.2.5 Zeichenketten 7.2.6 main-methode und Parameterübergabe 7.2.7 Bedingungen und Schleifen 7.4.1 Sechsstellige Zufallszahl 7.4.2 Quadratwurzel nach Heron Prof. Dr. Rolf Dornberger OOP: 22.09.2010 2 7.1 Wiederholung der grundlegenden Programmstrukturen 7.1.1 Anweisungen 7.1.2 Verzweigungen aufgrund von Bedingungen 7.1.3 Wiederholungen mit Schleifen 7.1.4 Blöcke, Funktionen, Objekte 7.2 Wiederholung der Grundelemente und Syntax in Java 7.1 Wiederholung der grundlegenden Programmstrukturen Setzt man Algorithmen in eine computerverständliche Form um, so tauchen drei (bzw. vier) grundlegende Programmstrukturen unabhängig von einer Programmiersprache immer wieder auf. Dies sind: Anweisungen Verzweigungen bzw. Alternativen aufgrund von Bedingungen Wiederholungen mit Schleifen (Aufruf anderer Algorithmen bzw. Blöcke mit Programmstrukturen) Fasst man mehrere einzelne solche Programmstrukturen zusammen, so ergibt sich eine weitere grundlegende Programmstruktur, die je nach Programmiersprache respektive Programmiertyp umschrieben wird als: Block (Modul, Funktion, Unterroutine, Klasse, Objekt oder wie auch immer) Prof. Dr. Rolf Dornberger OOP: 22.09.2010 3 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 4
7.1.1 Anweisungen 7.1.1 Anweisungen In Computerprogrammen werden im Allgemeinen schrittweise die Anweisungen im Quelltext abgearbeitet. Vielleicht lässt sich dies am besten mit einem Brettspiel vergleichen. Allerdings würfelt der Computer nicht, sondern geht Feld für Feld vor. gewinnen im Lotto und kassieren 10000 Franken haben sich das Bein verstaucht, einmal aussetzen kaufen ein neues Auto für 20000 Franken. Das Software-Engineering kennt dafür verschiedene Darstellungsmöglichkeiten: z.b. Struktogramm oder Flussdiagramm gewinnen im Lotto und kassieren 10000 Franken haben sich das Bein verstaucht, einmal aussetzen kaufen ein neues Auto für 20000 Franken. schliessen eine Feuerversicherung für 1000 Franken ab. schliessen eine Feuerversicherung für 1000 Franken ab. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 5 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 6 wahr Bedingung falsch wahr Bedingung falsch 7.1.2 Verzweigungen aufgrund von Bedingungen 7.1.2 Verzweigungen aufgrund von Bedingungen In Computerprogrammen werden Verzweigungen bzw. Alternativen mit Bedingungen bzw. Entscheidungen bewirkt. An Verzweigungen können zwei oder mehrere Alternativen weitergehen. schliessen eine Feuerversicherung für 1000 Franken ab. stehen an einer Weggabelung. Würfeln 1, 3 oder 5, geht es nach links, ansonsten nach rechts weiter. kaufen einen Fernseher für 500 Sfr. überweisen 2000 Sfr. von Konto A auf Konto B. wahr Dies lässt sich z.b. auch mit einem z.b. Struktogramm oder Flussdiagramm verdeutlichen. Bedingung Entscheidung Anweisung 5 falsch true Bedingung Entscheidung Anweisung 5 false schliessen eine Feuerversicherung für 1000 Franken ab. stehen an einer Weggabelung. Würfeln 1, 3 oder 5, geht es nach links, ansonsten nach rechts weiter. kaufen einen Fernseher für 500 Sfr. überweisen 2000 Sfr. von Konto A auf Konto B. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 7 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 8
Schleife Schleife 7.1.3 Wiederholungen mit Schleifen In Computerprogrammen werden Wiederholungen mit Schleifen bewirkt. Schleifen können mit einer fest vorgegebenen Anzahl an Durchläufen erfolgen oder solange, bis eine bestimmte Bedingung erfüllt ist. Durchlaufen nebenstehende Schleife solange, bis insgesamt 50000 Sfr. besitzen. gewinnen 3000 Sfr. Jemand Anweisung 5 überweist Anweisung Ihnen 6 2000 Sfr. kaufen ein neues Auto für 20000 Franken. 7.1.3 Wiederholungen mit Schleifen Dies lässt sich z.b. auch mit einem z.b. Struktogramm oder Flussdiagramm verdeutlichen. Schleife Durchlaufen nebenstehende Schleife solange, bis insgesamt 50000 Sfr. besitzen. gewinnen 3000 Sfr. Jemand Anweisung 5 überweist Anweisung Ihnen 6 2000 Sfr. kaufen ein neues Auto für 20000 Franken. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 9 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 10 7.1.4 Blöcke, Funktionen, Objekte 7.1.4 Blöcke, Funktionen, Objekte In Computerprogrammen werden gewisse Programmteile, die immer wieder vorkommen, in Blöcke (Module, Funktionen, Unterroutinen, Klassen, Objekte oder wie auch immer genannt) gepackt. In Computerprogrammen werden gewisse Programmteile, die immer wieder vorkommen, in Blöcke (Module, Funktionen, Unterroutinen, Klassen, Objekte oder wie auch immer genannt) gepackt. Diese Blöcke stehen nur über spezielle Schnittstellen mit der Umgebung in Kontakt. Aufruf des Blocks XY Prof. Dr. Rolf Dornberger OOP: 22.09.2010 11 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 12
7.2 Wiederholung der Grundelemente und Syntax in Java 7.2 Wiederholung der Grundelemente und Syntax in Java 7.2.1 Grundkonzept von Java 7.2.2 Sprachelemente, Datentypen und Variablen 7.2.3 Operatoren 7.2.4 Datenfelder 7.2.5 Zeichenketten 7.2.6 main-methode und Parameterübergabe 7.2.7 Bedingungen und Schleifen Prof. Dr. Rolf Dornberger OOP: 22.09.2010 13 7.2.1 Grundkonzept von Java Java läuft plattformunabhängig und architekturneutral auf verschiedensten Systemen und über verteilte Systeme hinweg. Java ist vollständig objektorientiert, sicher sowie stabil und unterstützt Multithreading. Java wird von Sun ständig weiterentwickelt und in verschiedenen Versionen als JDK bzw. SDK (Java bzw. Software Development Kit) als Freeware (unter Umständen auch als Open-Source) gratis zur Verfügung gestellt (für Linux, Windows, Solaris...). Der Java-Quelltext (gespeichert als Javafile.java) wird mittels des Java- Compilers javac in Java-Bytecode übersetzt. Der Bytecode wird auf jedem Computer, auf dem eine Java Virtual Machine läuft, mittels des Java-Interpreters java zur Laufzeit interpretiert. Weitere Java-Entwicklungswerkzeuge (javadoc, jdb,...) und IDEs (Integrated Development Environment) und CASE-Tools (Computer-aided Software Engineering) unterstützen die Entwicklung von Java-Programmen. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 14 7.2.2 Sprachelemente, Datentypen und Variablen Java verwendet den Unicode-Zeichensatz und kann somit Umlaute und zusätzliche Buchstaben anderer Alphabete darstellen und verwenden (solange vom Editor unterstützt). Außerdem unterscheidet Java Groß- und Kleinschreibung. Java ist keine zeilengebundene Programmiersprache, d.h. es darf eine beliebige Zeilenformatierung im Programmtext stehen (solange Zeilenumbrüche und Leerzeichen zulässig platziert sind). Java kennt die Kommentare /* und */, das Zeilenkommentar // und das javadoc-kommentar /** und */. Java kennt die primitiven Datentypen byte, short, int, long, float, double, boolean und char. Zeichen (char) werden in einfachen Anführungszeichen geschrieben '', Zeichenketten (Referenztyp String) in den Anführungszeichen "". Jede Variable muss definiert und einem Typ zugewiesen werden: Typname Variablenname; Zusätzlich kann der Variablen dabei auch ein Wert zugewiesen werden: Typname Variablenname = Wert; Prof. Dr. Rolf Dornberger OOP: 22.09.2010 15 7.2.3 Operatoren Es existieren die arithmetischen Operatoren: +, -, *, /, %, ++, -- Es existieren die arithmetischen Zuweisungsoperatoren: =, +=, -=, *=, /=, %= Es existieren die Vergleichsoperatoren: ==,!=, <, <=, >, >= Es existieren die logischen Vergleichsoperatoren:!, &&,, &,, ^ Es existieren die bitweise Operatoren: ~, &,, ^, >>, >>>, <<, &=, =, ^=, >>=, >>>=, <<= Explizite Konvertierung von einem primitiven Datentyp in einen anderen erfolgen mittels des Type- Cast-Operators: (byte), (short), (int), (long), (float), (double) und (char) Für die bedingte Zuweisung gibt es in Java den Fragezeichen-Operator? : also Wert = BoolescherAusdruck? Wert1 : Wert2; Prof. Dr. Rolf Dornberger OOP: 22.09.2010 16
7.2.4 Datenfelder Datenfelder sind ein- oder mehrdimensionale Arrays und werden wie folgt definiert: int[][] Matrix; Matrix = new int[intzeile][intspalte]; oder zusammengefasst in einem Ausdruck: int[][] Matrix = new int[intzeile][intspalte]; oder beispielsweise mit direkt vorbelegten Werten: int[][] Matrix = {{1, 2, {3, 4, {5, 6; Der Zugriff auf Array-Elemente erfolgt mittels direkter Indizierung, z.b.: Matrix[2][1] Die Nummerierung der Datenfelder beginnt immer mit 0, also z.b.: Matrix[0][0] Matrix[0][1] Matrix[1][0]... Die Anzahl der Array-Elemente wird mit.length abgefragt: Anzahl Zeilen: Matrix.length Anzahl Spalten in der 1.Zeile: Matrix[0].length Anzahl Spalten in der 2.Zeile: Matrix[1].length... Prof. Dr. Rolf Dornberger OOP: 22.09.2010 17 7.2.5 Zeichenketten Zeichenketten werden wie folgt definiert: String a = new String("Hello World"); oder in der Kurzform: String a = "Hello World"; Die Länge einer Zeichenkette wird mit.length() abgefragt: a.length() Zeichenketten werden mit dem Operator + verknüpft, z.b: a = "Hello " + "World"; Prof. Dr. Rolf Dornberger OOP: 22.09.2010 18 7.2.6 main-methode und Parameterübergabe Das Grundgerüst eines Java-Programms mit der main-methode als Haupteinstiegspunkt in das Java-Programm sieht wie folgt aus: public class JavaProgramm { public static void main(string[] args) { // hier Programmcode Parameterübergabe beim Aufruf des Java-Programms erfolgt mittels: java JavaProgramm Parameter1 Parameter2... Zugriff auf die einzelnen Parameter (die als Array von String vorliegen) erfolgt mittels: args[0] args[1]... Das File, in dem das Java-Programm gespeichert wird, muss (bzw. sollte) so heißen wie die Klasse und muss auf.java enden: JavaProgramm.java 7.2.7 Bedingungen und Schleifen Verzweigungen bzw. Alternativen werden durch Bedingungen bzw. Entscheidungen verursacht. Dafür gibt es in Java die if-, if-else- und switch-anweisung. Wiederholungen werden mit Schleifen bewirkt. Die do-schleife (auch do-while-schleife genannt) führt zunächst einmal die dazugehörige Anweisung aus und prüft dann den dazugehörigen Booleschen Ausdruck. Solange dieser Ausdruck true ist, wird die Anweisung erneut ausgeführt. Die while-schleife prüft zunächst den dazugehörigen Booleschen Ausdruck. Solange dieser Ausdruck true ist, wird die dazugehörige Anweisung ausgeführt. Die for-schleife dient in der Regel dazu, die dazugehörige Anweisung mit einer bestimmten Anzahl an Durchläufen auszuführen. Die for-schleife kann dabei explizit über Zählvariablen oder als foreach-schleife über Datenfelder und Aufzählungsobjekte laufen. In Java gibt es zwei Sprunganweisungen, die es erlauben, die Auswertungsreihenfolge einer laufenden Schleife zu verändern. Die break-anweisung beendet eine Schleife, die continue- Anweisung springt zum nächsten Schleifendurchgang. Durch Angabe eines Labels LabelX: springen die break- und die continue-anweisung direkt zu diesem Label. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 19 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 20
7.3 Methoden 7.2 Wiederholung der Grundelemente und Syntax in Java 7.3 Methoden Methoden können in Java als eine Art von Funktionen verwendet werden. Mit einem oder mehreren Eingabewerten wird ein Resultat erzeugt und zurück- oder ausgegeben. Mit Methoden (als Teil der Objekte und Klassen) kann in Java in etwa die grundlegende Programmstruktur eines Blocks realisiert werden. Methoden, die bisher auftauchten, sind: (wobei die letzten beiden streng genommen nur Operatoren sind) main(string[] args) System.out.println(Zeichenkette) System.out.print(Zeichenkette) Zeichenkette.length() Datenfeld.length Datenfeld[0].length (Methoden werden später im Zusammenhang mit der Objektorientiertheit von Java noch viel genauer erklärt. Daher hier nur eine kleine Einführung.) Prof. Dr. Rolf Dornberger OOP: 22.09.2010 21 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 22 7.3 Methoden Weitere wichtige Methoden, die von Java bereitgestellt werden, sind beispielsweise: System.exit(0) beendet das Java-Programm. Ganzzahl = Integer.parseInt(Zeichenkette) Gleitzahl = Double.parseDouble(Zeichenkette) konvertieren eine Zeichenkette vom Typ String in eine Ganzzahl vom Typ int bzw. eine Gleitzahl vom Typ double. Zufallszahl = Math.random() erzeugt eine Zufallszahl vom Typ double, die grösser gleich 0.0 und kleiner 1.0 ist. Zeichenkette1.equals(Zeichenkette2) überprüft, ob zwei Zeichenketten identisch sind. Zahl.toString() wandelt eine Zahl in eine Zeichenkette. Math.pow(a,b) und Math.sqrt(c) berechnet die Potenz ab und die Wurzel c. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 23 7.3 Methoden Um beispielsweise eine double-zahl über die Konsole (Eingabeaufforderung, DOS-Shell) einzulesen, verwendet man in Java mehrere Methoden (neben mehreren Objekten): z.b..parsedouble(),.readline() try { Gleitzahl = Double.parseDouble((new BufferedReader( new InputStreamReader(System.in))).readLine()); catch(exception ex) { System.out.println(ex.toString()); Ganz am Anfang des Quelltextes muss zusätzlich noch folgende Anweisung stehen: import java.io.*; (Da Java plattformunabhängig läuft, bedarf es innerhalb eines Java-Programms mehrerer Befehle, um Werte einlesen zu können. Was hier try und catch und die anderen Ausdrücke bedeuten, wird in einem späteren Kapitel noch ausführlich erklärt. Versuchen bis dahin, die Methoden mit Copy&Paste einzusetzen.) Prof. Dr. Rolf Dornberger OOP: 22.09.2010 24
7.3 Methoden 7.3 Methoden Will man in Java selber Methoden implementieren, wie man Funktionen und Unterprogramme in anderen Programmiersprachen schreibt, so werden diese Methoden zusätzlich in die Klasse des Java-Programms geschrieben, in der die main-methode steht, und mit static benannt, wie beispielsweise das Programm MethodeStatic1 zeigt: public class MethodeStatic1 { // Hauptmethode public static void main(string[] args) {... // Methode für Berechnung der Summe static double berechnesumme(double a, double b) {... In welcher Reihenfolge die Methoden untereinander in einem Java-Programm (Klasse) letztendlich angeordnet sind, ist egal. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 25 Methoden haben Übergabeparameter und einen Rückgabewert, wie beispielhaft am Programm MethodeStatic1 mit der Methode berechnesumme gezeigt ist. Die Übergabeparameter an die Methode berechnesumme(double a, double b) sind die double-zahlen Zahl1 und Zahl2. public class MethodeStatic1 { // Hauptmethode public static void main(string[] args) { double Zahl1 = 5.0, Zahl2 = 6.5, Ergebnis; Ergebnis = berechnesumme(zahl1, Zahl2); System.out.println(Ergebnis); // Methode für Berechnung der Summe static double berechnesumme(double a, double b) { double Summe = a + b; return(summe); (Methoden werden in einem späteren Kapitel noch viel genauer erklärt.) Prof. Dr. Rolf Dornberger OOP: 22.09.2010 26 7.2 Wiederholung der Grundelemente und Syntax in Java 7.4.1 Sechsstellige Zufallszahl 7.4.2 Quadratwurzel nach Heron 7.4 Algorithmen Algorithmus In der Mathematik ein Verfahren, bei dem aufgrund eines Systems von Regeln gegebene Größen (Eingabeinformationen, Aufgaben) in andere Größen (Ausgabeinformationen, Lösungen) umgewandelt werden können. Durch Algorithmen können komplizierte Prozesse von (Rechen-) Automaten nachgebildet werden. Quelle: www.wissen.de [Stand: 23.9.02] Software beinhaltet im Allgemeinen sehr viele Algorithmen. Die meisten sind schon programmiert und werden vom System und zusätzlichen Programm- Bibliotheken angeboten. Will man einen Algorithmus selber programmieren, muss man Regeln und mathematische Formeln so in ein Computerprogramm implementieren, dass eindeutig alle Rechenvorschriften ausgeführt werden und auf alle Sonderfälle geachtet wird. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 27 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 28
7.4.1 Sechsstellige Zufallszahl Ein Beispiel, wie ein Algorithmus in Java implementiert werden kann, ist die Ermittlung einer sechsstelligen Zufallszahl (Ganzzahl), wie sie beispielsweise in der Joker- oder Super-6-Ziehung der Lottogesellschaften vorkommt, wie z.b.: Überlegungen zum Aufstellen des Algorithmus: In Java gibt es die Methode.random(), die eine Zufallszahl (Gleitzahl) zwischen 0.0 und kleiner 1.0 (also 0.9999999...) erzeugt. Die Jokerzahl liegt zwischen 000000 und 999999. D.h. die Java-Zufallszahl muss damit mit 1000000 multipliziert werden: 000000.000... und 999999.999... Die Kommastellen müssen abgeschnitten werden, d.h. es wird nur eine Ganzzahl benötigt. Achtung: Führende Nullen einer Zahl werden in der Ausgabe einer Zahl nicht dargestellt. D.h. dass z.b. die Zahl 5674 als 005674 zu lesen ist. 1. Zusatz: Alle Berechnungen sollen in eine separate Methode gepackt werden. 2. Zusatz: Es sollen solange Zufallszahlen ausgegeben werden, bis eine Zahl größer gleich 800000 dabei ist. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 29 7.4.1 Sechsstellige Zufallszahl Mit den Überlegungen alleine ist quasi schon der Algorithmus definiert. Der Algorithmus kann nun noch grafisch beispielsweise in einem Flussdiagramm dargestellt werden. Neben einer verbalen Formulierung kann dann public class SechsstelligeZufallszahl1 { das Flussdiagramm noch so weit verfeinert // Hauptmethode werden, public static dass void es main(string[] nahezu den args) Programmcode { double zahl; enthält. int ganzzahl; zahl = Math.random(); zahl *= 1000000; ganzzahl = (int) zahl; System.out.println("Sechsstellige Zufallszahl: " + ganzzahl); Prof. Dr. Rolf Dornberger OOP: 22.09.2010 30 7.4.1 Sechsstellige Zufallszahl 1. Zusatz: Nun sollen alle Berechnungen in eine separate Methode gepackt werden. Der Hintergrund könnte sein, dass diese Methode auch in anderen Programmen verwendet werden soll. public class SechsstelligeZufallszahl2 { // Hauptmethode public static void main(string[] args) { int einezahl; einezahl = ermittlezahl(); System.out.println("Sechsstellige Zufallszahl: " + einezahl); public static int ermittlezahl(){ double zahl; int ganzzahl; zahl = Math.random(); zahl *= 1000000; ganzzahl = (int) zahl; return ganzzahl; 7.4.1 Sechsstellige Zufallszahl 2. Zusatz: Nun sollen solange Zufallszahlen ausgegeben werden, bis eine Zahl größer gleich 800000 dabei ist. public class SechsstelligeZufallszahl3 { // Hauptmethode public static void main(string[] args) { int einezahl; do { einezahl = ermittlezahl(); System.out.println("Sechsstellige Zufallszahl: " + einezahl); while (einezahl < 800000); public static int ermittlezahl(){ double zahl; int ganzzahl; zahl = Math.random(); zahl *= 1000000; ganzzahl = (int) zahl; return ganzzahl; Prof. Dr. Rolf Dornberger OOP: 22.09.2010 31 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 32
7.4 Algorithmen Ein komplexeres Beispiel, wie ein Algorithmus in Java implementiert werden kann, ist die Quadratwurzelberechnung nach Heron. Heron war ein Mathematiker, der ein Näherungsverfahren zur Berechnung einer Quadratwurzel aus einer positiven Zahl x vorschlug, das alleine die Grundrechenarten Addition, Multiplikation und Quotient verwendet. (Wie Heron auf den Algorithmus kam, ist hier unerheblich.) Der Algorithmus Quadratwurzelberechnung nach Heron sieht wie folgt aus: Schritt 0: Setze x 0 = x Schritt n+1: x n + Setze 1 = 1 2 * x Die Folge der Zahlen x 0, x 1, x 2,... konvergiert dann gegen x. n Der Algorithmus soll nun solange laufen, bis die Differenz der nach Heron berechneten Quadratwurzel zu der vom Computer intern berechneten Quadratwurzel kleiner als ein epsilon = 0.00001 ist. + x x x n 7.4 Algorithmen Das entsprechende Programm QuadratwurzelHeron 1 sieht in einem ersten Schritt wie folgt aus: public class QuadratwurzelHeron1 { public static void main (String[] args) { // Einlesen der Zahl x, für die Wurzel berechnet werden soll double x = Double.parseDouble (args[0]); // Setzen der Genauigkeit epsilon double epsilon = 0.00001; // Schritt 0: x(n) = x(0) = x für n = 0 double xn = x; // Definition der Variablen x(n+1) und n double xn1; int n = 1; // Schritt n+1: Führe solange aus, bis Genauigkeit erreicht do { xn1 = 0.5 * (xn + x/xn); System.out.println("x(" + n++ + ") = " + xn1); xn = xn1; // Prüfe Genauigkeit while (Math.pow(xn1,2) - x > epsilon); // Ausgabe Ergebnis System.out.println("Ergebnis = " + xn1); System.out.println("zum Vergleich: sqrt(x) = " + Math.sqrt(x)); Prof. Dr. Rolf Dornberger OOP: 22.09.2010 33 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 34 7.4 Algorithmen Das entsprechende Programm QuadratwurzelHeron2 sieht nach einer Zusammenfassung der Variablen xn und xn1 wie folgt aus: public class QuadratwurzelHeron2 { public static void main (String[] args) { // Einlesen der Zahl x, für die Wurzel berechnet werden soll double x = Double.parseDouble (args[0]); // Setzen der Genauigkeit epsilon double epsilon = 0.00001; // Schritt 0: x(n) = x(0) = x für n = 0 double xn = x; // Definition der Variablen n int n = 1; // Schritt n+1: Führe solange aus, bis Genauigkeit erreicht do { xn = 0.5 * (xn + x/xn); System.out.println("x(" + n++ + ") = " + xn); // Prüfe Genauigkeit while (Math.pow(xn,2) - x > epsilon); 7.5 Rekursion 7.2 Wiederholung der Grundelemente und Syntax in Java // Ausgabe Ergebnis System.out.println("Ergebnis = " + xn); System.out.println("zum Vergleich: sqrt(x) = " + Math.sqrt(x)); Prof. Dr. Rolf Dornberger OOP: 22.09.2010 35 Prof. Dr. Rolf Dornberger OOP: 22.09.2010 36
7.5 Rekursion 7.5 Rekursion Java erlaubt, dass Methoden sich selber aufrufen, also rekursive Aufrufe ausführen. Dies wird als Rekursion bezeichnet. Ein klassisches Beispiel für rekursive Aufrufe ist die Berechnung der Fakultät einer positiven ganzen (Integer-) Zahl n: Fakultaet(n) = n! = 1 * 2 * 3 *.. * (n-1) * n Die Implementierung des Algorithmus Fakultät n! kann so erfolgen: Schritt n: Wenn n > 1 dann n! = n * (n-1)! Schritt n-1:(n-1)! wird wiederum mit einem rekursiven Aufruf berechnet, solange bis n = 1 wird. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 37 Hauptprogramm Zahl n einlesen n muss >0 sein Aufruf der Fakultäts-Methode berechnefakultaet() Fakultäts-Methode Berechnung von n * (n-1) rekursiver Aufruf der Methode import java.io.*; public class Rekursion1 { public static void main (String[] args) { System.out.println("Fakultaet von positiver Integer-Zahl berechnen"); // Zahl für Fakultaetsberechnung einlesen und auf Integer prüfen int zahl = 0; do { System.out.print("Zahl = "); try { zahl = Integer.parseInt((new BufferedReader( new InputStreamReader(System.in))).readLine()); catch(exception ex) { System.out.println("Eingabe keine Integer-Zahl"); while (zahl <= 0); // Aufruf der Fakultaets-Methode long ergebnis = berechnefakultaet(zahl); // Ausgabe des Ergebnisses System.out.println("Fakultaet von " + zahl + " = " + ergebnis); // Methode zur rekursiven Berechnung der Fakultaet static public long berechnefakultaet(int zahl) { long ergebnis; if (zahl > 1) ergebnis = zahl * berechnefakultaet(--zahl); else ergebnis = 1; return(ergebnis); Prof. Dr. Rolf Dornberger OOP: 22.09.2010 38 Lernziele Erklären können, welche grundlegenden Programmstrukturen es gibt und wie diese in Java umgesetzt werden. Die Grundelemente und Syntax von Java (Sprachelemente, Datentypen, Variablen, Operatoren, Datenfelder, Zeichenketten, main-methode, Parameterübergabe, Bedingungen und Schleifen) kennen und richtig anwenden bzw. einsetzen können. (Statische) Methoden als Funktionen in Java verstanden haben und einsetzen können. Wichtige Methoden, die von Java zur Verfügung gestellt werden, kennen und anwenden können. Einfache Algorithmen in Java implementieren können. Rekursion in Java programmieren können. Prof. Dr. Rolf Dornberger OOP: 22.09.2010 39