10. Methoden. Methoden. Beispiel Keksrechner. Keksrechner - Zusätzliche Anforderung

Ähnliche Dokumente
8. Funktionen II. Stepwise Refinement. Beispielproblem. Stepwise Refinement. Einfache Programmiertechnik zum Lösen komplexer Probleme

10. Funktionen II. Vor- und Nachbedingungen. Nachbedingungen. Vorbedingungen. // PRE: e >= 0 b!= 0.0. // POST: return value is b^e

10. Funktionen II. Stepwise Refinement. Beispielproblem. Stepwise Refinement. Einfache Programmiertechnik zum Lösen komplexer Probleme

5. Java Arrays und Strings

6. Fliesskommazahlen II. Fliesskommazahlensysteme; IEEE Standard; Grenzen der Fliesskommaarithmetik; Fliesskomma-Richtlinien; Harmonische Zahlen

8. Fliesskommazahlen II

7. Fliesskommazahlen II. Fliesskommazahlensysteme; IEEE Standard; Grenzen der Fliesskommaarithmetik; Fliesskomma-Richtlinien; Harmonische Zahlen

6. Fliesskommazahlen II. Fliesskommazahlensysteme; IEEE Standard; Grenzen der Fliesskommaarithmetik; Fliesskomma-Richtlinien; Harmonische Zahlen

10. Funktionen II. Stepwise Refinement, Gültigkeitsbereich, Bibliotheken, Standardfunktionen

Die erste C++ Funktion

6. Java Arrays und Strings

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Die erste C++ Funktion. Funktionsdefinitionen- und Aufrufe, Gültigkeitsbereich, Felder als Funktionsargumente, Bibliotheken, Standardfunktionen

n 1. Erste Schritte n 2. Einfache Datentypen n 3. Anweisungen und Kontrollstrukturen n 4. Verifikation n 5. Reihungen (Arrays)

Methoden und Wrapperklassen

! 1. Erste Schritte! 2. Einfache Datentypen! 3. Anweisungen und Kontrollstrukturen! 4. Verifikation! 5. Reihungen (Arrays) II.1.4. Verifikation - 1 -

4. Zahlendarstellungen

Tag 5. Repetitorium Informatik (Java) Dozent: Marius Kamp Lehrstuhl für Informatik 2 (Programmiersysteme)

Informatik Funktionen

2. Unterprogramme und Methoden

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Einstieg in die Informatik mit Java

Implementieren von Klassen

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Standardkonstrukte in Java

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays) II.1.4. Verifikation - 1 -

Prozeduren vs. Funktionen

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays) II.1.4. Verifikation - 1 -

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Aufgabe 1.1. Wählen Sie jene Variablendeklarationen mit Initialisierungen aus, die in Java hinsichtlich der Typen korrekt sind:

Einführung in die Programmierung I Systematisches Programmieren. Thomas R. Gross. Department Informatik ETH Zürich

Grundlagen der Objektorientierten Programmierung - Methoden -

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Einführung in C. EDV1-04C-Einführung 1

Java Einführung Methoden. Kapitel 6

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Abschnitt 11: Korrektheit von imperativen Programmen

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

4. Zahlendarstellungen

Einstieg in die Informatik mit Java

Programmieren für Wirtschaftswissenschaftler SS 2015

Programmiertechnik Klassenmethoden

2 Programmieren in Java I noch ohne Nachbearbeitung

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Klassenmethoden

Klassenvariablen, Klassenmethoden

Javakurs für Anfänger

Java I Vorlesung Imperatives Programmieren

JAVA - Methoden - Rekursion

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

{P} S {Q} {P} S {Q} {P} S {Q} Inhalt. Hoare-Kalkül. Hoare-Kalkül. Hoare-Tripel. Hoare-Tripel. Hoare-Tripel

Vorbereitende Aufgaben

Abschlußtest Programmieren 30. Juni 2017 Name: Punkte von 32: Gruppe: Haase-Di Haase-Do Stanek-Di Stanek-Do

Welche Informatik-Kenntnisse bringen Sie mit?

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben. Aufgabe 1.1. Alle Aufgaben beziehen sich auf Java.

3. Grundanweisungen in Java

Kontrollfluss. man Verzweigungen und Sprünge. o bisher linear (von oben nach unten) o Für interessante Programme braucht

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Einführung in das Programmieren Probeklausur Lösungen

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben

Korrektheit und Hoare-Kalkül für Imperative Programme

Grundelemente objektorientierter Sprachen (1)

JAVA - Methoden

Einführung in die Programmierung

Klassen und Objekte. Klassen sind Vorlagen für Objekte. Objekte haben. Attribute. Konstruktoren. Methoden. Merkblatt

Grundelemente objektorientierter Sprachen (1)

Vor- und Nachbedingungen in imperativen Programmen OOPM, Ralf Lämmel

Grundelemente objektorientierter Sprachen (1)

n 1. Grundzüge der Objektorientierung n 2. Methoden, Unterprogramme und Parameter n 3. Datenabstraktion n 4. Konstruktoren n 5. Vordefinierte Klassen

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben. Alle Aufgaben beziehen sich auf Java.

pue13 January 28, 2017

2.4 Schleifen. Schleifen unterscheiden sich hinsichtlich des Zeitpunktes der Prüfung der Abbruchbedingung:

13. Java Klassen. Lernziele. Klassen - Technisch. Definition: Klassen

System.out.println("TEXT");

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Programmiertechnik Methoden, Teil 2

Die abstrakte Klasse Expression:

Angewandte Mathematik und Programmierung

12 Abstrakte Klassen, finale Klassen und Interfaces

Repetitorium Programmieren I + II

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Java Anweisungen und Ablaufsteuerung

Erste Java-Programme (Scopes und Rekursion)

Delegates. «Delegierter» Methoden Schablone Funktionszeiger. Dr. Beatrice Amrhein

Einführung in die Programmierung für NF. Zuweisungen, main- Methode und Kommentare

Die einfachsten Anweisungen

Übung Grundlagen der Programmierung WS 2008/09. Übung 04: Methoden. Abgabetermin: Prosabeschreibung Java-Programm.

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Transkript:

Methoden 10. Methoden Methodendefinitionen- und Aufrufe, Auswertung von Methodenaufrufen, Der Typ void, Vor- und Nachbedingungen,Stepwise Refinement, Bibliotheken Code-Fragmente können zu Methoden geformt werden Vorteile: Einmal definieren mehrmals verwenden/aufrufen Übersichtlicherer Code, einfacher zu verstehen Code in Methoden kann separat getestet werden 277 278 Beispiel Keksrechner Keksrechner - Zusätzliche Anforderung public class Keksrechner public static void main(string[] args) Out.print("Kinder: " ); int kinder = In.readInt (); Out.print("Kekse: " ); int kekse = In.readInt (); Wir wollen sicherstellen, dass kinder positiv ist und jedes Kind mindestens einen Keks kriegt. Eingabe prüfen! Out.println("Jedes Kind kriegt " + kekse / kinder + " Kekse"); Out.println("Papa kriegt " + kekse % kinder + " Kekse"); 279 280

Keksrechner - Eingabeprüfung Aus... Out.print("Kinder: " ); int kinder = In.readInt ();... wird demnach: int kinder; do Out.print("Kinder: " ); kinder = In.readInt (); if (kinder < 1) Out.println("Wert zu klein. Mindestens " + 1); while (kinder < 1 ); Analog dazu müssen wir prüfen, dass kekse >= kinder ist. 281 Keksrechner - Es wird unübersichtlich public class Keksrechner public static void main(string[] args) int kinder; do Out.print("Kinder: " ); kinder = In.readInt (); Anzahl Kinder einlesen und prüfen if (kinder < 1) Out.println("Wert zu klein. Mindestens " + 1); while (kinder < 1 ); int kekse; do Out.print("Kekse: " ); kekse = In.readInt (); Anzahl Kekse einlesen und prüfen if (kekse < kinder) Out.println("Wert zu klein. Mindestens " + kinder); while (kekse < kinder ); Out.println("Jedes Kind kriegt " + kekse / kinder + " Kekse"); Out.println("Papa kriegt " + kekse % kinder + " Kekse"); 282 Keksrechner - Erkenntnisse Methodendeklaration Rückgabetyp der Methode: Die beiden Code-Fragmente sind fast identisch Folgende Aspekte sind unterschiedlich: Modifizierer Parameterliste Der Prompt, also "Kinder: " vs. "Kekse: " Das Minimum, also 1 vs. kinder private static int readint (String prompt, int min)... Wir können das Code-Fragment in eine Methode auslagern und somit wiederverwenden. Dabei müssen wir die unterschiedlichen Aspekte parametrisieren. Name der Methode Implementierung 283 284

Methodendeklaration Modifizierer: Werden später behandelt Rückgabetyp: Datentyp des Rückgabewertes. Falls die Methode keinen Wert zurückliefert, ist dieser Typ void. Name: Ein gültiger Name. Sollte mit Kleinbuchstaben anfangen. Parameterliste: Mit rundern Klammern umgebene Liste von Parametern, deklariert mit Datentyp und Name. Parameter werden beim Aufruf der Methode gesetzt und können dann wie lokale Variablen verwendet werden. Implementierung: Der Code, welcher ausgeführt wird wenn die Methode aufgerufen wird. Methodensignatur private static int readint (String prompt, int min)... Signatur der Methode Signatur ist eindeutig innerhalb einer Klasse. Es ist also möglich, mehrere Methoden mit gleichem Namen aber unterschiedlichen Parameter-Anzahl und -Typen zu haben aber nicht empfohlen! Rückgabetyp ist nicht Teil der Signatur! Es ist nicht möglich, mehrere Methoden zu haben, die sich nur im Rückgabetyp unterscheiden. 285 286 Methodenaufruf - Pass by Value Methodenaufruf - Pass by Value Ein Methodenaufruf ist ein Ausdruck, dessen Wert falls vorhanden der Rückgabewert der Methode ist. In Java gilt immer die Pass by Value Semantik. // Methodenaufruf int kekse = readint( "Kekse: ", kinder 5 ); K e k s e : Pass by Value bedeutet: Argumentwerte werden beim Methodenaufruf in die Parameter kopiert. Kopie der Referenz Kopie des Wertes Dies entspricht demselben Prinzip wie die Wertzuweisung an eine Variable. 287 private static int readint( String prompt, int min ) //... prompt min 5 288

Zurück zum Beispiel - Methode readint Rückgabewerte von Methoden private static int readint(string prompt, int min) int number; do Out.print(prompt); number = In.readInt(); if (number < min) Out.println("Wert zu klein. Mindestens " + min); while (number < min ); return number; Es gibt zwei Fälle Rückgabetyp = void: Die Auswertung der Methode kann mittels der Anweisung return beendet werden. Rückgabetyp void: Die Auswertung der Methode muss mittels der Anweisung return Wert beendet werden. Der Wert wird dann an die aufrufende Methode zurückgegeben. Wichtig: Im zweiten Fall muss jeder mögliche endliche Ausführungspfad eine return Anweisung enthalten. 289 290 Rückgabewerte auf allen Ausführungspfaden Richtig: private static int readint(string prompt, int min) int number; do Out.print(prompt); number = In.readInt(); if (number < min) Out.println("Wert zu klein. Mindestens " + min); while (number < min ); return number; Wird garantiert immer erreicht, falls Methode terminiert Rückgabewerte auf allen Ausführungspfaden Inhaltlich identische Lösung: private static int readint(string prompt, int min) int number; while (true) Out.print(prompt); number = In.readInt(); if (number >= min) return number; Out.println("Wert zu klein. Mindestens " + min); ; Compiler versteht die Endlosschleife und akzeptiert, dass das return nur hier vorkommt. 291 292

Rückgabewerte auf allen Ausführungspfaden Inhaltlich identische Lösung: private static int readint(string prompt, int min) int number; do Out.print(prompt); number = In.readInt(); if (number >= min) return number; Out.println("Wert zu klein. Mindestens " + min); while (number < min); return 0 Erfüllt: ein return auf diesem Pfad. Tatsächlich kann dies natürlich nie erreicht werden! (... warum?) 293 Keksrechner - Jetzt übersichtlicher public class Keksrechner public static void main(string[] args) int kinder = readint("kinder: ", 1); int kekse = readint("kekse: ", kinder); Out.println("Jedes Kind kriegt " + kekse/kinder + " Kekse"); Out.println("Papa kriegt " + kekse % kinder + " Kekse"); private static int readint(string prompt, int min) //... siehe vorige Slide return number; 294 Vor- und Nachbedingungen Beispiel: pow beschreiben (möglichst vollständig) was die Methode macht dokumentieren die Methode für Benutzer / Programmierer (wir selbst oder andere) machen Programme lesbarer: wir müssen nicht verstehen, wie die Methode es macht werden vom Compiler ignoriert Vor- und Nachbedingungen machen unter der Annahme ihrer Korrektheit Aussagen über die Korrektheit eines Programmes möglich. public static double pow(double b, int e) double result = 1.0; if (e < 0) // b^e = (1/b)^( e) b = 1.0/b; e = e; for (int i = 0; i < e; ++i) result = b; return result; 295 296

Gültigkeit formaler Argumente Vorbedingungen public static double pow(double b, int e) double r = 1.0; if (e<0) b = 1.0/b; e = e; for (int i = 0; i < e ; ++i) r = b; return r; public static void main(string[] args) double b = 2.0; int e = 2; double z = pow(b, e); Out.println(z); // 0.25 Out.println(b); // 2 Out.println(e); // 2 Vorbedingung (precondition): Was muss bei Methodenaufruf gelten? Spezifiziert Definitionsbereich der Methode. 0 e ist für e < 0 undefiniert // PRE: e >= 0 b!= 0.0 Nicht die formalen Argumente b und e von pow, sondern die hier definierten Variablen lokal zum Rumpf von main 297 298 Nachbedingungen Vor- und Nachbedingungen Nachbedingung (postcondition): Was gilt nach Methodenaufruf? Spezifiziert Wert und Effekt des Methodenaufrufes. Hier nur Wert, kein Effekt. // POST: return value is b^e sollten korrekt sein: Wenn die Vorbedingung beim Methodenaufruf gilt, dann gilt auch die Nachbedingung nach dem Methodenaufruf. Methode pow: funktioniert für alle Basen b 0 299 300

Vor- und Nachbedingungen Vor- und Nachbedingungen Gilt Vorbedingung beim Methodenaufruf nicht, so machen wir keine Aussage. Methode pow: Division durch 0 Vorbedingung sollte so schwach wie möglich sein (möglichst grosser Definitionsbereich) Nachbedingung sollte so stark wie möglich sein (möglichst detaillierte Aussage) 301 302 Beispiel: pow Beispiel: xor // PRE: e >= 0 b!= 0.0 // POST: return value is b^e public static double pow(double b, int e) double result = 1.0; if (e < 0) // b^e = (1/b)^( e) b = 1.0/b; e = e; for (int i = 0; i < e; ++i) result = b; return result; 303 // post: returns l XOR r public static boolean xor(boolean l, boolean r) return l &&!r!l && r; 304

Beispiel: harmonic Beispiel: min // PRE: n >= 0 // POST: returns nth harmonic number // computed with backward sum public static float harmonic(int n) float res = 0; for (int i = n; i >= 1; i) res += 1.0f / i; return res; // POST: returns the minimum of a and b static int min(int a, int b) if (a<b) return a; else return b; 305 306 Fromme Lügen... Fromme Lügen... sind erlaubt. // PRE: e >= 0 b!= 0.0 // POST: return value is b^e ist formal inkorrekt: Überlauf, falls e oder b zu gross sind b e vielleicht nicht als double Wert darstellbar (Löcher im Wertebereich) // PRE: e >= 0 b!= 0.0 // POST: return value is b^e Die exakten Vor- und Nachbedingungen sind plattformabhängig und meist sehr kompliziert. Wir abstrahieren und geben die mathematischen Bedingungen an. Kompromiss zwischen formaler Korrektheit und lascher Praxis. 307 308

Prüfen von Vorbedingungen...... mit Assertions Vorbedingungen sind nur Kommentare. Wie können wir sicherstellen, dass sie beim Methodenaufruf gelten? // PRE: e >= 0 b!= 0.0 // POST: return value is b^e public static double pow(double b, int e) assert e >= 0 b!= 0 : "division by zero"; double result = 1.0;... 309 310 Nachbedingungen mit Assertions Das Ergebnis komplizierter Berechnungen ist oft einfach zu prüfen. Dann lohnt sich der Einsatz von assert für die Nachbedingung // PRE: the discriminant p p/4 q is nonnegative // POST: returns larger root of the polynomial x^2 + p x + q static double root(double p, double q) assert(p p/4 >= q); // precondition double x1 = p/2 + sqrt(p p/4 q); assert(equals(x1 x1+p x1+q,0)); // postcondition return x1; 311 Stepwise Refinement Einfache Programmiertechnik zum Lösen komplexer Probleme Niklaus Wirth. Program development by stepwise refinement. Commun. ACM 14, 4, 1971 312

Stepwise Refinement Beispielproblem Problem wird schrittweise gelöst. Man beginnt mit einer groben Lösung auf sehr hohem Abstraktionsniveau (nur Kommentare und fiktive Methoden). Finde heraus, ob sich zwei Rechtecke schneiden! In jedem Schritt werden Kommentare durch Programmtext ersetzt und Methoden implementiert unterteilt (demselben Prinzip folgend). Die Verfeinerung bezieht sich auch auf die Entwicklung der Datenrepräsentation (mehr dazu später). Wird die Verfeinerung so weit wie möglich durch Methoden realisiert, entstehen Teillösungen, die auch bei anderen Problemen eingesetzt werden können. Stepwise Refinement fördert (aber ersetzt nicht) das strukturelle Verständnis des Problems. 313 314 Grobe Lösung Verfeinerung 1: Eingabe Rechtecke (Include-Direktiven und Main-Klasse ausgelassen) static void main(string args[]) // Eingabe Rechtecke h 1 (x 1, y 1, w 1, h 1 ) // Schnitt? // Ausgabe y (x 1, y 1 ) w 1 (x 2, y 2, w 2, h 2 ) (x 2, y 2 ) w 2 h 2 x 316 317

Verfeinerung 1: Eingabe Rechtecke Breite w und/oder Höhe h dürfen negativ sein! h 0 (x, y, w, h) Verfeinerung 1: Eingabe Rechtecke static void main(string args[]) Out.println("Enter two rectangles [x y w h each]"); int x1 = In.readInt(); int y1 = In.readInt(); int w1 = In.readInt(); int h1 = In.readInt(); int x2 = In.readInt(); int y2 = In.readInt(); int w2 = In.readInt(); int h2 = In.readInt(); w < 0 (x, y) // Schnitt? // Ausgabe der Loesung 318 319 Verfeinerung 2: Schnitt? und Ausgabe static void main(string args[]) Eingabe boolean clash = rectanglesintersect (x1,y1,w1,h1,x2,y2,w2,h2); if (clash) Out.println("intersection!"); else Out.println("no intersection!"); Verfeinerung 3: SchnittMethode... static boolean rectanglesintersect (int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) return false; // todo static void main(string args[]) Eingabe Schnitt Ausgabe 320 321

Verfeinerung 3: SchnittMethode... Verfeinerung 3:... mit PRE und POST! static boolean rectanglesintersect (int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) return false; // todo Methode main // PRE: (x1, y1, w1, h1), (x2, y2, w2, h2) are rectangles, // where w1, h1, w2, h2 may be negative. // POST: returns true if (x1, y1, w1, h1) and // (x2, y2, w2, h2) intersect static boolean rectanglesintersect (int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) return false; // todo 322 323 Verfeinerung 4: Intervallschnitte Zwei Rechtecke schneiden sich genau dann, wenn sich ihre x- und y-intervalle schneiden. h 1 (x 1, y 1 ) w 1 h 2 [y 1, y 1 + h 1 ] [y 2, y 2 + h 2 ] Verfeinerung 4: Intervallschnitte // PRE: (x1, y1, w1, h1), (x2, y2, w2, h2) are rectangles, where // w1, h1, w2, h2 may be negative. // POST: returns true if (x1, y1, w1, h1),(x2, y2, w2, h2) intersect static boolean rectanglesintersect (int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) return intervalsintersect (x1, x1 + w1, x2, x2 + w2) && intervalsintersect (y1, y1 + h1, y2, y2 + h2); (x 2, y 2 ) w 2 [x 1, x 1 + w 1 ] [x 2, x 2 + w 2 ] 324 325

Verfeinerung 4: Intervallschnitte // PRE: [a1, b1], [a2, b2] are (generalized) intervals, // with [a,b] := [b,a] if a>b // POST: returns true if [a1, b1],[a2, b2] intersect static boolean intervalsintersect (int a1, int b1, int a2, int b2) return false; // todo Methode rectanglesintersect Verfeinerung 5: Min und Max // PRE: [a1, b1], [a2, b2] are (generalized) intervals, // with [a,b] := [b,a] if a>b // POST: returns true if [a1, b1],[a2, b2] intersect static boolean intervalsintersect (int a1, int b1, int a2, int b2) return max(a1, b1) >= min(a2, b2) && min(a1, b1) <= max(a2, b2); Methode main 326 327 Verfeinerung 5: Min und Max // POST: the maximum of x and y is returned int max (int x, int y) if (x>y) return x; else return y; gibt es schon in der Standardbibliothek // POST: the minimum of x and y is returned int min (int x, int y) if (x<y) return x; else return y; Nochmal zurück zu Intervallen // PRE: [a1, b1], [a2, h2] are (generalized) intervals, // with [a,b] := [b,a] if a>b // POST: returns true if [a1, b1],[a2, b2] intersect boolean intervalsintersect (int a1, int b1, int a2, int b2) return Math.max(a1, b1) >= Math.min(a2, b2) && Math.min(a1, b1) <= Math.max(a2, b2); Methode intervalsintersect Methode rectanglesintersect Methode main 328 329

Das haben wir schrittweise erreicht! Ergebnis class Main // PRE: [a1, b1], [a2, h2] are (generalized) intervals, // with [a,b] := [b,a] if a>b // POST: returns true if [a1, b1],[a2, b2] intersect boolean intervalsintersect (int a1, int b1, int a2, int b2) return Math.max(a1, b1) >= Math.min(a2, b2) && Math.min(a1, b1) <= Math.max(a2, b2); static void main(string args[]) Out.println("Enter two rectangles [x y w h each]"); int x1 = In.readInt(); int y1 = In.readInt(); int w1 = In.readInt(); int h1 = In.readInt(); int x2 = In.readInt(); int y2 = In.readInt(); int w2 = In.readInt(); int h2 = In.readInt(); boolean clash = rectanglesintersect (x1,y1,w1,h1,x2,y2,w2,h2); Saubere Lösung des Problems Nützliche Methoden sind entstanden intervalsintersect rectanglesintersect // PRE: (x1, y1, w1, h1), (x2, y2, w2, h2) are rectangles, where // w1, h1, w2, h2 may be negative. // POST: returns true if (x1, y1, w1, h1),(x2, y2, w2, h2) intersect static boolean rectanglesintersect (int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) return intervalsintersect (x1, x1 + w1, x2, x2 + w2) && intervalsintersect (y1, y1 + h1, y2, y2 + h2); if (clash) Out.println("intersection!"); else Out.println("no intersection!"); Schnitt 330 331 Wiederverwendbarkeit Bibliotheken Methoden wie rectanglesintersect und pow sind in vielen Programmen nützlich. Lösung: Methode einfach ins Hauptprogramm hineinkopieren, wenn wir sie brauchen! Hauptnachteil: wenn wir die Methodendefinition ändern wollen, müssen wir alle Programme ändern, in denen sie vorkommt. Logische Gruppierung ähnlicher Methoden pow exp java.lang.math log sin 332 333

Methoden aus der Standardbibliothek Primzahltest mit Math.sqrt n 2 ist Primzahl genau dann, wenn kein d in 2,..., n 1 ein Teiler von n ist. vermeiden die Neuerfindung des Rades (wie bei pow); führen auf einfache Weise zu interessanten und effizienten Programmen; garantierten einen Qualitäts-Standard, der mit selbstgeschriebenen Methoden kaum erreicht werden kann. int d; for (d=2; n % d!= 0; ++d); 334 335 Primzahltest mit sqrt n 2 ist Primzahl genau dann, wenn kein d in 2,..., n 1 ein Teiler von n ist. double bound = Math.sqrt(n); int d; for (d = 2; d <= bound && n % d!= 0; ++d); Das funktioniert, weil Math.sqrt auf die nächste darstellbare double-zahl rundet (IEEE Standard 754). 336