Informatik 1 – Tutorium 1 Informatik 1 Tutorium 1 1.1 Tihomir R. Todorov Informatik 1 – Tutorium 1 Kontankt E-Mail: [email protected] Skype: mr_ms_todorov ICQ: 53317269 Web: http://www.home.hs-karlsruhe.de/~toti0011/ 1.2 Tihomir R. Todorov Informatik 1 – Tutorium 1 Primitive Datentypen in Java byte, short, int, long, float, double, boolean, char Beispiel - Temperaturumrechnung package celsius_in_fahrenheit; public class CelsiusInFahrenheit { public static void main(String[] args) { double celsius = 23.0; // Declaration + Initialization. double fahrenheit; // Declaration. fahrenheit = celsius * 1.8 + 32; System.out.println(“Fahrenheit: “ + fahrenheit); } } 1.3 Tihomir R. Todorov Informatik 1 – Tutorium 1 Operatoren in Java +, -, *, /, % = (Zuweisungsoperator) >, <, >=, <= (Vergleichsoperatoren) Mathematik gegen Java Mathematik 7 : 5 = 1 Rest 2 1.4 Tihomir R. Todorov Java 7/5=1 7%5=2 Informatik 1 – Tutorium 1 Konvertierung in Java Widening Conversion (von klein zu groß) byte->short->int->long->float->double Bsp.: int i = 17L; // Compiler meldet Fehler. float f = 17L; // OK. Narrowing Conversion (von groß zu klein) double->float->long->int->short->byte (mit Hilfe des cast-Operators) Bsp.: int i = (int)17L; // OK. long l = (long)13.7f; // OK, Mit Verlust. 1.5 Tihomir R. Todorov Informatik 1 – Tutorium 1 Zuweisungsoperator = Wird von rechts nach links ausgewertet! Bsp.: a = b = 2 <=> a = (b = 2) Varianten von = 1.6 a += 1 <=> a = a + 1 a *= 7.0 <=> a = a * 7.0 a -= 3.1 <=> a = a - 3.1 a /= 1.55 <=> a = a / 1.55 Tihomir R. Todorov Informatik 1 – Tutorium 1 Boolesche Ausdrücke | - Oder, ^ - Entweder oder (XOR), & - Und, ! - Negation ! stärker als &, & stärker als ^, ^ stärker als | | false true & false true ^ false true false false true false false false false false true true true true true false true true true false ! 1.7 false true true false Tihomir R. Todorov Informatik 1 – Tutorium 1 if-, if-else-Anweisung if (logischer Ausdruck) <=> if (logischer Ausdruck) { Anweisung; Anweisung; } if (logischer Ausdruck) { Anweisung; Anweisung; } if (logischer Ausdruck) { // Um zw. den zwei Alternativen Anweisung; // einer Bedingung zu entschei} else { // den, kann das if-Konstrukt erAnweisung; // weitert werden. } 1.8 Tihomir R. Todorov Informatik 1 – Tutorium 1 if-else-Anweisung Die if-else-Strukturen können so aneinandergekettet werden, dass eine Selektion aus einer beliebigen Anzahl von Alternativen möglich ist. if (logischer Ausdruck) { Anweisung; } else if (logischer Ausdruck) { Anweisung; } else { Anweisung; } 1.9 Tihomir R. Todorov Informatik 1 – Tutorium 1 Übungsaufgaben 1 Auf. 1 Schreiben Sie ein Java-Programm, das m/s in km/h umrechnet. Dir Formel lautet: km/h = m/s * 3.6 package kmh_in_ms; public class KmHInMS { public static void main(String[] args) { double m_s = 4; // Declaration + Initialization. double km_h; // Declaration. km_h = m_s * 3.6; System.out.println(km_h); } } 1.10 Tihomir R. Todorov Informatik 1 – Tutorium 1 Auf. 2 (Ähnliche Aufgabe SS 07) Welchen Wert hat der folgende Ausdruck und welchen Datentyp hat das Ergebnis? 2 * ((byte) 3.2f) + ((int) 7L) * ((short) 2.7d) Wert = 20 Datentyp: byte->short->…->double Auf. 3 (Ähnliche Aufgabe WS 07-08) Welchen Datentyp haben folgende Ausdrücke? Ausdruck 1 + 3.0 / 3.0f – 10L 128 + ((byte) 56) 1.11 Tihomir R. Todorov Datentyp double short->int->…->double Informatik 1 – Tutorium 1 Auf. 4 Schreiben Sie ein Java-Programm, das zwei Zahlen dividiert und das folgende Ergebnis auf dem Bildschirm ausgibt: “Zahl_1 : Zahl_2 = X Rest Y“. Bitte beachten Sie, dass Zahl_1 und Zahl_2 bekannt sind und von Typ integer sind. package division; public class Division { public static void main(String[] args) { int a = 7; int b = 5; System.out.println(a + " : " + b + " = " + a/b + " Rest " + a%b); } } 1.12 Tihomir R. Todorov Informatik 1 – Tutorium 1 Auf. 5 Wie viel Bytes Speicherplatz benötigen die folgenden Datentypen? 1.13 boolean 1 long byte 1 float short 2 double int 4 char (unicode) Tihomir R. Todorov 8 4 8 2 Informatik 1 – Tutorium 1 Auf. 6 (Ähnliche Aufgabe WS 07-08) Welchen Wert haben folgenden Ausdrücken? 1.14 Ausdruck Wert 1+2/3*4 1 1 / 2 == 3 / 4 true 1 == 2 && 3 != 4 || 1 < 2 true ((int) (1.2 * 1.3)) * 2.0 2.0 (double) Tihomir R. Todorov Informatik 1 – Tutorium 2 Informatik 1 Tutorium 2 2.1 Tihomir R. Todorov Informatik 1 – Tutorium 2 Kontrollstrukturen in Java Verzweigungen (Auswahl) if-else-Anweisung switch-case-Anweisung switch Schleifen (Wiederholung) for-Schleife while-Schleife do-while-Schleife 2.2 Tihomir R. Todorov Informatik 1 – Tutorium 2 switch-case-Anweisung Syntax Beispiel switch (<Selektor>) { case <Konstante>: <Anweisung>; break; case <Konstante>: <Anweisung>; break; ... default: <Anweisung>; } char c = ‘b‘; switch (c) { case ‘a‘: System.out.println(“a“); break; case ‘b‘: System.out.println(“b“); break; default: System.out.println(“c“); } Erlaubten Datentypen für <Selektor>: int, char, enum 2.3 Tihomir R. Todorov Informatik 1 – Tutorium 2 if-else-Anweisung <=> if-else switch-case int i = 2; if (i == 1) { System.out.println(“1“); } if else (i == 2) { System.out.println(“2“); } else { System.out.println(“3“); } 2.4 switch-case-Anweisung Tihomir R. Todorov int i = 2; switch (i) { case 1: System.out.println(“1“); break; case 2: System.out.println(“2“); break; default: System.out.println(“3“); } Informatik 1 – Tutorium 2 for-Schleife Syntax for (<Initialisierung>; <Bedingung>; <Fortsetzung>) { <Anweisung>; } Beispiel package stuff; class Stuff { public static void main(String[] args) { for (int i = 1, j = 3; i < 3 || j > 2; i++, j--) { System.out.println(i + “ “ + j); } } } 2.5 Tihomir R. Todorov Informatik 1 – Tutorium 2 while-Schleife Syntax while (<Bedingung>) { <Anweisung>; } Beispiel package stuff; class Stuff { public static void main(String[] args) { int i = 1, j = 3; while (i < 3 || j > 2) { System.out.println(i + “ “ + j); i++; j--; } } } 2.6 Tihomir R. Todorov Informatik 1 – Tutorium 2 for-Schleife <=> while-Schleife for-Schleife for (<Initialisierung>; <Bedingung>; <Fortsetzung>) { <Anweisung>; } while-Schleife <Initialisierung>; while (<Bedingung>) { <Anweisung>; <Fortsetzung>; } 2.7 Tihomir R. Todorov Informatik 1 – Tutorium 2 do-while-Schleife Syntax do { <Anweisung>; } while (<Bedingung>); Eine do-while-Schleife testet die Bedingung allerdings erst am Ende. => Der Schleifenkörper wird mindesten 1-mal durchlaufen. Wird meist für eine Menüauswahl benutzt. Jede do-while-Schleife läst sich prinzipiell auch mit einer while-Schleife lösen, in der Regel sogar einfacher! => Verwendung selten. 2.8 Tihomir R. Todorov Informatik 1 – Tutorium 2 Methoden in Java Methodendeklaration <Zugriff / <Typ des <Methodenname> ( <Parameter- ) Sichtbarkeit> Rückgabewerts> Liste> Beispiel für eine Methode public double setX (double xValue) <Zugriff / Sichtbarkeit>: public, private, protected <Typ des Rückgabewertst>: Alle primitive Datentypen, void, Alle Objekten <Methodenname>: Beliebiger Name <Parameter Liste>: Beliebige Anzahl von <Parameter>s <Parameter>: <Datentyp> <Parametername> 2.9 Tihomir R. Todorov Informatik 1 – Tutorium 2 Methoden in Java Class Stuff package stuff; // Each method belongs to a class. public class Stuff { // Method mA with return value. public int mA() { return 0; } // Methods with no return value. // Methods must be always unique. // Polymorphy is allowed! public void mB() { } public void mB(int i) { } public void mB(short s) { } } 2.10 Tihomir R. Todorov Informatik 1 – Tutorium 2 Optional: Eingabe über die Konsole Programmfragment public static void main(String[] args) { int number_1 = 0, number_2 = 0; Scanner scanner; scanner = new Scanner(System.in); System.out.print("Geben Sie die erste Zahl ein : "); number_1 = scanner.nextInt(); scanner = new Scanner(System.in); System.out.print("Geben Sie die zweite Zahl ein: "); number_2 = scanner.nextInt(); System.out.print("Das Ergebnis der Addition ist: " + (number_1 + number_2)); } 2.11 Tihomir R. Todorov Informatik 1 – Tutorium 2 Optional: Runden von Gleitkommazahlen Programmfragment // … double d1 = 2.333333, d2 = 2.555555; double result = d1 + d2; System.out.println(result); // output: 4.888888 /*********************************** * The rounded result. ***********************************/ // Variant 1. String s = String.valueOf(result); double rounded = Double.parseDouble(s .substring(0, s.lastIndexOf('.') + 3)); System.out.println(rounded); // output: 4.88 // Variant 2. System.out.println(Math.round(result * 100) / 100.0); // 4.89 // Variant 3. System.out.println(Math.floor(result * 100) / 100.0); // 4.88 2.12 Tihomir R. Todorov Informatik 1 – Tutorium 2 Übungsaufgaben 2 Auf. 1 Gesucht ist die Summe der Zahlen von 1 bis n mit einer for-Schleife und mit einer while-Schleife. for-Schleife 2.13 while-Schleife int n = 100, summe = 0; int i = 1, n = 100, summe = 0; for (int i = 1; i <= n; i++) summe += i; while (i <= n) { summe += i; i++; } System.out.println(summe); System.out.println(summe); Tihomir R. Todorov Informatik 1 – Tutorium 2 Auf. 2 (Ähnliche Aufgabe im ersten Aufgabenblatt) Berechnen Sie die mathematische Folge mit einer for-Schleife. Hinweis: xy = Math.pow(double x, double y) 2.14 Tihomir R. Todorov Informatik 1 – Tutorium 2 Auf. 2 (Lösung) Überlegung bzw. Vereinfachung der oberen math. Folge: 1/20 + 1/21 + 1/22 + … + 1/27 => 7 Schritten, Jeder Schritt erhöht sich mit 1/2n für n = 0..7 Source package stuff; public class Stuff { public static void main(String[] args) { double s = 0.0; for (int n = 0; n <= 7; n++) { s = s + 1.0 / Math.pow(2, n); } System.out.println(s); // summe: 1.9921875 } } 2.15 Tihomir R. Todorov Informatik 1 – Tutorium 2 Auf. 3 (Ähnliche Aufgabe WS 04-05) Das folgende Java Programm enthält Syntaxfehler. Geben Sie jeweils die Nummer der fehlerhaften Zeile an und begründen Sie, warum ein Syntaxfehler vorliegt? 0: class SyntaxFehler { 1: 2: int eineZahl = 0; 3: 4: static int EineZahl = 1; 5: 6: void ändereZahlen() { 7: eineZahl = 2; 8: EineZahl = 3; 9: } 10: 11: static void zahlenÄndern() { 12: eineZahl = 4; 13: EineZahl = 5; 14: } 2.16 Tihomir R. Todorov 15: 16: public static void main(String s[]) { 17: SyntaxFehler syntaxFehler = new SyntaxFehler() 18: 19: SyntaxFehler.ändereZahlen(); 20: syntaxFehler.ändereZahl(); 21: } // End of main 22: } // End of SyntaxFehler Informatik 1 – Tutorium 2 Auf. 3 (Lösung) F1: Umlaute sind in Java nicht erlaubt! Zeile 6, 11, 19 und 20. F2: ; fehlt am Ende der Anweisung. Zeile 17. F3: Es gibt keine Methode ändereZahl() in der Klasse SyntaxFehler. Deshalb kann nicht das Objekt syntaxFehler eine solche Methode aufrufen. Zeile 20. F4: Innerhalb ein ‘static Method‘ müssen alle benutzten Variablen als ‘static‘ deklariert werden. Zeile 12. F5: In Zeile 19 wird versucht eine ‘static‘ Methode aufzurufen. ändereZahlen( ) ist aber keine Klassenmethode (static Method). Deshalb kann sie nicht mit dem Name der Klasse aufgerufen werden. 2.17 Tihomir R. Todorov Informatik 1 – Tutorium 3 Informatik 1 Tutorium 3 – UML 3.1 Tihomir R. Todorov Informatik 1 – Tutorium 3 Modellieren mit UML 2.0 Diagramme Aktivitätsdiagramm (Verhaltendiagramme) Klassendiagramm (Strukturdiagramme) Objektdiagramm (Strukturdiagramme) 3.2 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm Aktivitätsdiagramm ist ein wichtiges Diagramm für die Modellierung der Ablaufmöglichkeiten eines Systems. beschreibt einen Arbeitsvorgang (workflow) in einem System verwendet Aktivitäten (actions) kann Fallunterscheidungen und Parallelität modellieren Beispielen: 3.3 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Wichtigste Elemente 3.4 Symbol Name Semantik Aufwachen Aktivität (eng.: action) - Aufruf einer Aktion beliebiger Dauer. Fluss oder Kante (eng.: flow, edge) - Übergang zw. zwei Knoten (Aktionen). Entscheidung (Verzweigung) mit Bedingungen (eng.: decision) - Wird immer eine Bedingung gewählt. - Bedingungen müssen sich gegenseitig ausschließen. Zusammenführung (Verbindung) (eng.: merge) - Zusammenführung zweier oder mehrere Flüsse zu einem. Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Verzweigung & Verbindung Beispiel: Verzweigung Beispiel: Verbindung 3.5 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Wichtigste Elemente Symbol 3.6 Name Semantik Startknoten (eng.: initial node) - Startpunkt einer Aktivität - UML 2 erlaubt mehrere Startknoten. D.h. parallele Abläufe möglich. Endknoten (eng.: final node) - Aktivitätsende - UML 2 erlaubt mehrere Endknoten. Flussabschluss (eng.: flow final) - Ende eines Flusses Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Wichtigste Elemente Symbol Name Semantik Mausklick Signal senden - Aktion, die ein Signal sendet sendet. Signal empfangen - Aktion, die auf ein Signal wartet. - Können beliebig oft Signale empfangen Zeitsignal empfangen - Aktion, die auf einen Zeitpunkt wartet. Mausevent jede Minute 3.7 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Wichtigste Elemente Symbol Name Semantik Aufspaltung (Parallelisierung) (eng.: fork) - Aus einem Fluss werden mehrere nebeneinander laufende Flüsse. Synchronisation (eng.: join) - Synchronisation paralleler Abläufe. - Wartet bis alle Flüsse eingetroffen sind. Sprungmarke 3.8 Tihomir R. Todorov Informatik 1 – Tutorium 3 Übungsaufgaben 3 Auf. 1 Bevor Klaus das Haus verlässt, zieht er die Schuhe an und falls draußen kalt ist, zieht er auch den Mantel an. Benutzen Sie in Ihrer Lösung ein fork: und ein join 3.9 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join Start 1 3.9 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join 2 3.10 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join 3 3.11 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join 4 3.12 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join 5 3.13 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join 6 3.14 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join 7 3.15 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join 8 3.16 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join 9 3.17 Tihomir R. Todorov Informatik 1 – Tutorium 3 Aktivitätsdiagramm: Beispiel fork & join 10 3.18 Tihomir R. Todorov Informatik 1 – Tutorium 3 Optional: Teilaktivitäten einer Aktivität 3.19 Tihomir R. Todorov Informatik 1 – Tutorium 3 Auf. 2 Klaus möchte eine Party machen und Gäste einladen. Erst wählt er einen Zeitpunkt und dann lädt die Gäste ein. Wenn 50% der Gäste zugesagt haben kauft er dann ein. Falls weniger als 50% zugesagt haben, wählt Klaus einen neuen Zeitpunkt und lädt die Gäste wieder ein. Nach dem Einkauf, werden kalte Getränke auf dem Tisch eingestellt und parallel essen gekocht. Wenn das Essen genießbar ist und die Getränke auf dem Tisch sind fängt das Feiern ein. Falls das Essen verbrannt ist, wird es weggeworfen und werden Pizzas bestellt. Während des Feierns werden die Partygäste gezählt. Wenn 10% oder mehr noch da sind, werden die Vorräte geprüft. Wenn die Vorräte genug sind wird weiter gefeiert, sonst bei der Tankstelle nachkaufen und ebenso weiter feiern. Falls weniger als 10% da sind wird die Party beendet. Wenn die Polizei kommt, muss die Party unerwünscht abgebrochen. Wenn es genug Alkohol gab, fallen die Gäste betrunken ins Bett, sonst wird die Party einfach beendet. 3.20 Tihomir R. Todorov Informatik 1 – Tutorium 3 Auf. 2 (Lösung) 3.21 Tihomir R. Todorov Informatik 1 – Tutorium 3 Auf. 3 (Ähnliche Aufgabe SS 06) Klaus beginnt seine Arbeit immer mit einer rigorosen Überprüfung seines Gabelstaplers (G). Wenn alles in Ordnung ist, dann macht er eine Frühstückspause. Falls etwas nicht in Ordnung ist, beseitigt er das Problem – die Pause fällt dann aus. Bei seiner anschließenden Arbeit holt Klaus immer eine Palette (P) oben von einem Stapel von Paletten und stapelt die Palette (P) wieder oben auf einen anderen Stapel. Dieses wiederholt sich so lange, bis die Sirene den Feierabend einläutet (die letzte von einem Stapel entnommene Palette stapelt er aber pflichtbewusst noch auf einen Stapel bevor er geht). 3.22 Tihomir R. Todorov Informatik 1 – Tutorium 3 Auf. 3 (Beispiel-Lösung) Sirene läutet ein Gabelstapler überprüfen [Palette entnommen] [in Ordnung] [sonst] Frühstückpause machen Problem beseitigen Die Palette oben auf einem anderen Stapel stapeln Arbeit arbeiten Die obere Palette von einem Stapel holen arbeiten Die Palette oben auf einem anderen Stapel stapeln Sirene läutet ein 3.23 Tihomir R. Todorov [Palette nicht entnommen] Informatik 1 – Tutorium 4 Informatik 1 Tutorium 4 – UML 4.1 Tihomir R. Todorov Informatik 1 – Tutorium 4 Modellierungswerkzeuge Borland Together: Version 2008 SP2 Lizenzdatei bei Frau Knobel in Raum LI 140/141 eUML2 for Java Free Edition als Eclipse-Plugin verfügbar ArgoUML: UML-Medellierungswerkzeug frei verfügbar 4.2 Tihomir R. Todorov Informatik 1 – Tutorium 4 Modellieren mit UML 2.0 Diagramme Aktivitätsdiagramm (Verhaltendiagramme) Klassendiagramm (Strukturdiagramme) Objektdiagramm (Strukturdiagramme) Paketdiagramm (Strukturdiagramme) 4.3 Tihomir R. Todorov Informatik 1 – Tutorium 4 Klassendiagramm - Allgemein Ein Klassendiagramm ist ein Strukturdiagramm der UML zur grafischen Darstellung (Modellierung) von Klassen, Schnittstellen sowie deren Beziehungen. public class List { // aggregation implementation private ListElement elements; // ... } 4.4 Tihomir R. Todorov class ListElement { private Student data; private ListElement next; // ... } Informatik 1 – Tutorium 4 Klassendiagramm - Klassen Klassen sind Einheiten aus Attribute, Operationen (Methoden) und Zusicherungen. 4.5 Tihomir R. Todorov Informatik 1 – Tutorium 4 Klassendiagramm - Attribute Attribute sind nur über die Operationen (Methoden) einer Klasse zugänglich (Idee der Kapselung). Person - nachname : String - vorname : String - alter : int + Person() + Person(nachname : String, vorname : String, alter : int) + getNachname() : String + setNachname() : String + getVorname() : String + setVorname() : String … 4.6 Tihomir R. Todorov Informatik 1 – Tutorium 4 Klassendiagramm - Sichtbarkeitsstufen public, protected, private, package 4.7 Tihomir R. Todorov Informatik 1 – Tutorium 4 Klassendiagramm - Beziehungen Assoziation Eine Linie zwischen den Klassen stellt eine Assoziation dar. Eine Assoziation ist eine Beziehung zwischen Klassen. Die Objekte der Klassen kommunizieren über die Assoziationen miteinander. Die Assoziation kann einen Namen haben. Ein Pfeil an dem Assoziations-namen gibt die Leserichtung des Namens an. An den Assoziationsenden können die Rollen der beteiligten Klassen und die Multiplizität angegeben werden. Die zweigliedrige Assoziation kann, wie die mehrgliedrige Assoziation, durch eine Raute markiert werden. 4.8 Tihomir R. Todorov Informatik 1 – Tutorium 4 Klassendiagramm - Beziehungen Gerichtete Assoziation Mit einem Pfeil an der Assoziation kann die Navigationsrichtung angegeben werden. Der Pfeil drückt die Zugriffsrichtung der Objekte aus. Objekt A greift auf B zu, B greift nie auf A zu. 4.9 Tihomir R. Todorov Informatik 1 – Tutorium 4 Klassendiagramm - Beziehungen Aggregation Eine Aggregation drückt eine Teile-Ganzes-Beziehung aus. Das Ganze-Objekt besteht aus Teil-Objekten. Die Raute befindet sich an dem Ende des Ganzen. Die Aggregation ist eine spezielle Art der Assoziation. Da das Ganze die Teile enthält, sollten am Assoziationsende der Teile ein Navigationspfeil stehen. 4.10 Tihomir R. Todorov Informatik 1 – Tutorium 4 Klassendiagramm - Beziehungen Komposition Die Komposition ist auch eine Beziehung, die Teile zu einem Ganzen in Beziehung setzt. Die Teile und das Ganze sind bei dieser Beziehung existenzabhängig, d.h. die Teile können nicht ohne das Ganze existieren. Wird das Ganze gelöscht, so beenden auch die Teile ihre Existenz. 4.11 Tihomir R. Todorov Informatik 1 – Tutorium 4 Klassendiagramm - Beziehungen Vererbung auch Generalisierung/Spezialisierung genannt. Vererbungsbeziehungen werden mit einem Pfeil dargestellt. Die Pfeilspitze zeigt auf die Oberklasse. Die Ober-klasse vererbt ihre Eigenschaften an die Unterklassen. 4.12 Tihomir R. Todorov Informatik 1 – Tutorium 4 Übungsaufgaben 4 Vorgehensweise: Objekte identifizieren Objektbeziehungen identifizieren Objekten zu Klassen gruppieren Klassenbeziehungen identifizieren und typisieren 4.13 Tihomir R. Todorov Informatik 1 – Tutorium 4 Auf. 1 a) Grundbausteine Ein Dozent hat einen Namen und einen Login-Namen. Eine Prüfung hat einen Typ und eine Länge (z.B. „Klausur“, „120 Minuten“). Eine Veranstaltung (z.B. eine Vorlesung) hat einen Namen, wird von genau Einem Dozenten gehalten und hat eine textuelle Beschreibung des Inhaltes. Am Ende des Semesters wird das Wissen durch eine Prüfung getestet. Diese Prüfung muss nicht vorhanden sein, wenn es sich im eine modulübergreifende Prüfung handelt. 4.14 Tihomir R. Todorov Informatik 1 – Tutorium 4 Auf. 1 b) Module Ein Modul hat einen Namen. Es besteht aus mehreren Veranstaltungen und hat genau einen Dozenten als Verantwortlichen. Ein Modul kann geprüft werden. Für manche Module existieren Voraussetzungen, die ein Student erfüllen muss, damit er Prüfungen aus dem Modul besuchen kann. Eine Voraussetzungen ist entweder der erfolgreiche Besuch eines anderen Moduls, das abgeschlossene Vorstudium oder eine andere textuelle Beschreibung der Bedingung. Tipp: Die möglichen Voraussetzungen lassen sich recht einfach als Attribute einer Klasse umsetzen. 4.15 Tihomir R. Todorov Informatik 1 – Tutorium 4 Auf. 2 Sie wollen ein einfaches Textdokument im Rechner verwalten. Das Textdokument besteht aus Zeilen mit einzelnen Komponenten, bei denen es sich um Wörter, Links oder Bilder handeln kann. Jedes Wort und jeder Link besteht aus Buchstaben. Ein Link hat zusätzlich noch eine URL. Es soll beispielsweise möglich sein, eine Zeile anhand ihrer Nummer zu identifizieren und ein Textdokument anhand ihrem Dateiname. Ein Bild hat einen Name, eine Höhe und eine Breite. Erstellen Sie ein Klassendiagramm, das die aus Ihrer Sicht benötigten Klassen beinhaltet. Entwerfen Sie Ihre Klassenhierachie so, dass Sie später noch weitere Komponenten in die Zeilen einfügen können, ohne die Klasse für die Zeile verändern zu müssen. 4.16 Tihomir R. Todorov Informatik 1 – Tutorium 4 Auf. 2 (Lösung) 4.17 Tihomir R. Todorov Informatik 1 – Tutorium 4 Auf. 3 a) (SS08) Geben Sie für folgenden Sachverhalt ein vollständiges UML-Klassendiagramm an. Beachten Sie dabei die Java-Namenskonventionen aus der Vorlesung und das Geheimnisprinzip. Getter- und Settermethoden brauchen Sie nicht angeben. Das Lager besteht aus mehreren Regalen und Förderbändern. Ein Förderband hat eine maximale Geschwindigkeit, mit der es betrieben wird, und eine Länge. Ein Förderband ist mit keinem oder mehreren anderen Förderbändern verbunden. Jedes Förderband kann man vorwärts oder rückwärts laufen lassen. Das Band kann auch gestoppt werden. Jedes Regal besteht aus vielen Fächern. Ein Regal ist immer mit mehreren Förderbändern verbunden. Es gibt auch Regale ohne ein Förderband. Im Regal befinden sich die Produkte. Die Regale sind automatisiert und können jeweils ein Produkt von einem Fach vom Förderband entnehmen oder darauf legen. 4.18 Tihomir R. Todorov Informatik 1 – Tutorium 4 Auf. 3 a) (SS08 - Lösung) 4.19 Tihomir R. Todorov Informatik 1 – Tutorium 4 Auf. 3 b) (SS08) Geben Sie für Ihre drei wichtigsten Klassen jeweils einen kurzen und Spezifischen Java-Doc Klassenkommentar an. Auf. 3 b) (SS08-Lösung) /** * Ein Foerderband mit einer maximalen Geschwindigkeit in km/h und einer Laenge in Metern. * Ein Forderband ist mit beliebig vielen anderen Foerderbaendern verbunden. * @author toti0011 */ /** * Ein Regal, mit dem Produkte zwischen seinen Faechern und Foerderbaendern ausgetauscht * werden. * @author toti0011 */ /** * Ein Produkt, das in einem Regal liegt. * @author toti0011 */ 4.20 Tihomir R. Todorov Informatik 1 – Tutorium 5 Informatik 1 Tutorium 5 5.1 Tihomir R. Todorov Informatik 1 – Tutorium 5 Testen mit JUnit Javadoc Kommentaren bzw. Javadoc Tags Klassendiagramme Implementierung einer Klassendiagramm 5.2 Tihomir R. Todorov Informatik 1 – Tutorium 5 JUnit - Allgemein JUnit ist ein Open Source-Tool bzw. ein Framework. JUnit wird zum Schreiben und Ausführen automatischer Unit Test benutzt. Die Tests werden in Java programmiert. UML - Paketdiagramm junit.framewort my.package UML - Klassendiagramm TestCase Class1 ... Clasen public class Class1 extends TestCase { } 5.3 Tihomir R. Todorov Informatik 1 – Tutorium 5 Assert.class Die Klasse liegt im “junit.framework“-Paket. Enthält wichtige Methode um die Ergebnisse zu überprüfen. static public void assertEquals(String, String) static public void assertEquals(int, int) static public void assertEquals(double, double) … static public void assertFalse(boolean) static public void assertTrue(boolean) … 5.4 Tihomir R. Todorov Informatik 1 – Tutorium 5 Javadoc Kommentaren Möglichst kurz. Aussagekräftig. Innerhalb eines Javadoc-Kommentars können wir auch HTML-Tags Benutzen. /** * This is a Java comment for the class Stuff. * * <ul> * <li>Item 1</li> * <li>Item 2</li> * </ul> * * @author toti0011 */ public class Stuff { } 5.5 Tihomir R. Todorov Informatik 1 – Tutorium 5 Javadoc Tags für Klassen Tag 5.6 Ausgabe Verwendung in Seit @author name Beschreibt den Autor. Klasse, Interface 1.4.0 @version version Erzeugt einen Versionseintrag. Maximal einmal pro Klasse oder Interface. Klasse, Interface 1.4.0 @since jdk-version Seit wann die Funktionalität existiert. Klasse, Interface, Instanzvariable, Methode 1.4.0 @see reference Erzeugt einen Link auf ein anderes Element der Dokumentation. Klasse, Interface, Instanzvariable, Methode 1.4.0 Tihomir R. Todorov Informatik 1 – Tutorium 5 Javadoc Tags für Methoden Tag 5.7 Ausgabe Verwendung in Seit @param name description Parameterbeschreibung einer Methode. Methode 1.4.0 @return description Beschreibung des Returnwerts einer Methode. Methode 1.4.0 @exception classname description @throws classname description Beschreibung einer Exception, die von dieser Methode geworfen werden kann. Methode 1.4.0 @deprecated description Beschreibt eine veraltete Methode Methode, die nicht mehr verwendet werden sollte. 1.4.0 Tihomir R. Todorov Informatik 1 – Tutorium 5 Beispiel Javadoc Kommentaren und Javadoc Tags /** * Ein Hello-World-Programm in Java. * Dies ist ein Javadoc-Kommentar. * * @author John Doe * @version 1.0 */ public class Hello { /** * Hauptprogramm. * * @param args Kommandozeilenparameter */ public static void main(String[ ] args) { System.out.println("Hallo, Welt!"); } } 5.8 Tihomir R. Todorov Informatik 1 – Tutorium 5 Übungsaufgaben 5 Auf. 1 a) (Entwurf) Rationale Zahlen sind Zahlen die sich als Bruch p / q einer ganzen Zahl p und einer natürlichen Zahl q darstellen lassen (mit q != 0). Entwerfen und implementieren Sie eine Klasse RationaleZahl deren Objekte rationale Zahlen repräsentieren, die sich addieren und multiplizieren lassen. Zähler und Nenner der vollständig gekürzten rationalen Zahl sollen zurückgegeben werden können. Ebenso soll der double-Wert der Zahl zurückgegeben werden können. Einen Bruch können Sie vollständig kürzen, in dem Sie Zähler und Nenner durch den größten gemeinsamen Teiler des Zählers und Nenners dividieren. Achten Sie darauf, dass die Null eine eindeutige Darstellung hat. Ebenso darf nicht durch Null geteilt werden. Die Klasse sollte einen Konstruktor enthalten, der Zähler und Nenner als int-Werte übergeben bekommt. 5.9 Tihomir R. Todorov Informatik 1 – Tutorium 5 Auf. 1 a) (Entwurf - Lösung) Assert RationaleZahl - p : int - q : int {q != 0} TestCase + RationaleZahl (p : int, q : int) + addieren(r : RationaleZahl) : RationaleZahl + multiplizieren(r : RationaleZahl) : RationaleZahl - kuerzen() : void RationaleZahlTest * + getDouble() : double + getZaehler() : int + setNenner() : int Die Menge aller natürlichen Zahlen IN = {0, 1, 2, …} Die Menge aller ganzen Zahlen Z = {-1, -2, 0, 1, 2, …} Die Menge aller reellen (rationalen) Zahlen IR = {p/q | p є Z, q є Z, q != 0} 5.10 Addition zwei rationalen Zahlen Multiplikation zwei rationalen Zahlen z1 + z2 = 4/6 + 9/12 = 8/12 + 9/12 = 17/12 z1 * z2 = 4/6 * 9/12 = 2/3 * 3/4 = 1/2 Tihomir R. Todorov * Main Informatik 1 – Tutorium 5 Auf. 1 b) (Implementierung - Lösung) Sehen Sie das Java-Projekt mit Eclipse auf die Online-Seite. 5.11 Tihomir R. Todorov Informatik 1 – Tutorium 5 Auf. 1 c) (JUnit Klasse - Lösung) Sehen Sie das Java-Projekt mit Eclipse auf die Online-Seite. 5.12 Tihomir R. Todorov Informatik 1 – Tutorium 5 Auf. 1 d) (Javadoc Kommentaren und Javadoc Tags) Dokumentieren Sie ihre Konstruktoren sowie ihre Methoden Erstehlen Sie mit Hilfe von ‘javadoc.exe‘ eine Java – Dokumentation ihres Projekts. 5.13 Tihomir R. Todorov Informatik 1 – Tutorium 6 Informatik 1 Tutorium 6 6.1 Tihomir R. Todorov Informatik 1 – Tutorium 6 Felder - Allgemein Deklaration <Datentyp>[ ] <Variablenbezeichner>; <Datentyp> <Variablenbezeichner>[ ]; // Deklaration eines eindimensionalen Feldes // Alternative Deklaration (seltener verwendet) <Datentyp>[ ][ ] <Variablenbezeichner>; // Deklaration eines zweidimensionalen Feldes <Datentyp> <Variablenbezeichner>[ ][ ]; // Alternative Deklaration (seltener verwendet) Instanzierung // Instanzierung eines eindimensionalen Feldes <Variablenbezeichner> = new <Datentyp>[<Anzahl>]; // Instanzierung eines zweidimensionalen Feldes <Variablenbezeichner> = new <Datentyp>[<Anzahl>] [<Anzahl>]; 6.2 Tihomir R. Todorov Informatik 1 – Tutorium 6 Felder - Allgemein Beispiel eines eindimensionalen Feldes des Typs int der Länge 10 int[ ] feld; // Deklaration feld = new int [10]; // Instanzierung (Erzeugung mit new) int[ ] feld_2 = new int [10]; // Deklaration + Instanzierung // Deklaration + Instanzierung + Initialisierung int[ ] feld = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; Beispiel eines eindimensionalen Feldes des Typs String der Länge 3 String[ ] zahlen = { “eins“, “zwei“, “drei“ }; 6.3 Tihomir R. Todorov Informatik 1 – Tutorium 6 Felder - Allgemein Beispiel eines zweidimensionalen Feldes des Typs int int[ ][ ] matrix; matrix = new int [2] [2]; int[ ][ ] matrix = new int [2] [2]; // Deklaration // Instanzierung (Erzeugung mit new) // Deklaration + Instanzierung // Deklaration + Instanzierung + Initialisierung int[ ][ ] matrix = { {1, 0}, {0, 1} }; 6.4 Tihomir R. Todorov Informatik 1 – Tutorium 6 Felder - Indizierung In Java (auch in C/C++) beginnen die Indizes stets mit 0! Bei jedem Feldzugriff haben wir immer eine Indexüberprüfung. int laenge = feld.length; // length: liest die Länge eines Feldes aus. Ergebnis 10. int x = feld[laenge]; | |-> führt zu einer ArrayIndexOutOfBoundsException 6.5 Tihomir R. Todorov Informatik 1 – Tutorium 6 Felder - Allgemein Auslesen von Werten int a = feld[0]; int b = feld[3]; // Das Auslesen erfolgt durch Angabe des Index. Zuweisung von Werten feld[0] = 5; feld[1] = (int) 2.7; feld[9] = 0; // Java ist “nullbasiert“. // Bei Zuweisungen muss wie bei normalen // Variablen der Typ angepasst werden. // Die Indexierung läuft immer bis n-1! Länge eines Feldes int len = feld.length; // Liest die Länge des Feldes aus und speichert // sie in der Variablen len 6.6 Tihomir R. Todorov Informatik 1 – Tutorium 6 Felder - Beispiel Was wird ausgegeben? public class Stuff { public static void main(String[ ] args) { int[ ][ ] a = { { 0 }, { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } }; for (int i = 0; i < a.length; ++i) { for (int j = 0; j < a[i].length; ++j) { System.out.print(a[i][j]); } System.out.println(); } } } 6.7 Tihomir R. Todorov 0136 247 58 9 0 12 345 6789 Informatik 1 – Tutorium 6 Felder - Heap 6.8 Tihomir R. Todorov Informatik 1 – Tutorium 6 Felder - Beispiel public class Stuff { public static void main(String[ ] args) { int[ ][ ] a = new int[2][3]; a[0][0] = 1; int[ ][ ] a; a[0][1] = 2; a= new int[2][ ]; a[0][2] = 3; a[0]= new int[3]; a[1][0] = 4; a[1]= new int[3]; a[1][1] = 5; a[1][2] = 6; System.out.println("" + a[0][0] + a[0][1] + a[0][2]); System.out.println("" + a[1][0] + a[1][1] + a[1][2]); } } 6.9 Tihomir R. Todorov Informatik 1 – Tutorium 6 Felder - Heap int[ ] a = new int[3]; // a verweist jetzt auf ein Feld aus 3 int-Werte. // Die int-Werte sind als 0 initialisiert. a 0 0 0 a[0] = 2; // Weist dem 1. El. den Wert 2 zu. a 2 0 0 a[2] = 7; // Weist dem 3. El. den Wert 7 zu. a 2 0 7 long[ ] b = new long[3]; // Erzeugung eines neuen Feld b aus 3 long-Werte. a = b; // Compiler-Fehler!. Unzulässig! // Typ von a != Typ von b a 2 0 7 b 0 0 0 a = {1, 2, 3, 4}; a 2 0 7 b 0 0 0 Müll 1 2 3 4 6.10 Tihomir R. Todorov Informatik 1 – Tutorium 6 Felder - Heap int[ ] c = a; b 0 0 0 a 1 2 3 4 c a = {2, 0, 7}; 6.11 Tihomir R. Todorov b 0 0 0 c 1 2 3 4 a 2 0 7 Informatik 1 – Tutorium 6 Felder – Heap – Unterschied zw. Referenz und Kopie Verweis/Referenz a 1 2 3 4 int[ ] a = { 1, 2, 3, 4 }; int[ ] c = a; Kopie/Klone int[ ] a = { 1, 2, 3, 4 }; int[ ] c; // c soll die Kopie referenzieren c = new int[a.length]; for (int i = 0; i < a.length; i++) c[i] = a[i]; 6.12 Tihomir R. Todorov c a 1 2 3 4 c 1 2 3 4 Informatik 1 – Tutorium 6 Übungsaufgaben 6 Auf. 1 - Kleinsten Abstand 2-er benachbarter Zahlen Implementieren Sie eine Java-Methode, die für ein int-Feld den kleinsten Abstand zweier benachbarter Zahlen berechnet und den Index der ersten Zahl zurückgibt (vom ersten Vorkommen, falls es mehrere benachbarte Zahlen mit gleichem Abstand gibt). Hinweis: Verwenden Sie Math.abs() zum Berechnen des Betrags einer Zahl. Test Fall: 1, -11, 5, 15, -7, 8, 13, 18, 5 6.13 Tihomir R. Todorov Informatik 1 – Tutorium 6 Auf. 2 - Überprüfen eines Anagrams Ein Anagram ist ein Satz, der durch Umstellen aller Buchstaben eines anderen Satzes gebildet werden kann. Gross- und Kleinschreibung wird dabei ignoriert. Ebenso spielen Leerzeichen keine Rolle. Aus dem Wort "Todesstrafe" lässt sich zum Beispiel der Satz "oft Desaster" bilden. Schreiben Sie ein Java-Programm, mit dem zwei Zeichenketten daraufhin überprüft werden können, ob sie ein Anagram bilden. Hinweise: Bei Objekten s vom Typ String, können Sie mit s.toLowerCase() den String s in eine neuen String umwandeln, bei dem alle Gross- durch Kleinbuchstaben ersetzt wurden. s.toCharArray() gibt ein char-Feld zurück mit allen Zeichen von s. Test Fälle Todesstrafe = oft Desaster Desperation = A Rope Ends Is Volkswagen = Gase von LKW Rentenreform = ferner Mentar Sonnenaufgang = Anfang Neun Sog 6.13 Tihomir R. Todorov Informatik 1 – Tutorium 5 Auf. 3 – Bubblesort (SS 05) 7 4 4 4 1 1 1 6.14 4 7 6 1 4 2 2 9 6 1 6 2 4 3 Tihomir R. Todorov 6 1 7 2 4 3 4 1 7 2 4 3 4 4 7 2 4 3 6 6 6 2 4 3 7 7 7 7 4 3 7 7 7 7 7 3 9 9 9 9 9 9 Informatik 1 – Tutorium 7 Informatik 1 Tutorium 7 7.1 Tihomir R. Todorov Informatik 1 – Tutorium 7 Rekursion - Allgemein Viele Lösungen sind mit Rekursion einfacher zu verstehen und einfacher zu programmieren (z.B. Suchen in einem Baum) 0 a 1 7 b 2 h 8 4 c 3 d 5 f 7.2 6 g j i 9 e Tihomir R. Todorov k l m Informatik 1 – Tutorium 7 Rekursion verstehen an einem einfachen Beispiel Bsp.: Gesucht ist die Summe der Zahlen von 1 .. N <=> N .. 1 Als Rekursion bezeichnet man in Informatik eine Funktion, die sich selbst aufruft. return 3 Annahme: N = 3 public int sum(long n) { if (n == 0) { return 0; } else { return sum(n-1) + n; } public int sum(long n) { } if (n == 0) { return 0; } else { return sum(n-1) + n; } public int sum(long n) { } if (n == 0) { return 0; } else { return sum(n-1) + n; } } sum(3) sum(2) sum(1) sum(0) return 1 return 6 ... 7.3 Tihomir R. Todorov return 0 Tiefe: 3 Informatik 1 – Tutorium 7 Rekursion verstehen an einem einfachen Beispiel public int getFakultaet(int n) { if (n == 0) { return 1; // Rekursionsabbruch } else { return getFakultaet(n - 1) * n; } } int n = 4 int fac = obj.getFakultaet(n) getFakultaet(n) // n = 2 getFakultaet(n) // n = 1 obj.getFakultaet(n) // n = 4 if (n != 0) then return getFakultaet(n-1) * n; getFakultaet(n) // n = 3 getFakultaet(n) // n = 2 getFakultaet(n) // n = 4 getFakultaet(n) // n = 3 if (n != 0) then return getFakultaet(n-1) * n // return 1 * 1 3 2 getFakultaet(n) // n = 1 fac = 1 getFakultaet(n) // n = 0 getFakultaet(n) // n = 3 getFakultaet(n) // n = 2 if (n == 0) then return 1; 4 3 2 1 0 fac = 1 7.4 Tihomir R. Todorov if (n != 0) then return getFakultaet(n-1) * n // return 1 * 2 2 1 fac = 2 if (n != 0) then return getFakultaet(n-1) * n // return 2 * 3 1 0 fac = 6 getFakultaet(n) // n = 4 if (n != 0) then return getFakultaet(n-1) * n // return 6 * 4 0 fac = 24 Informatik 1 – Tutorium 7 Arten von Rekursion Lineare Rekursion Jeder Aufruf löst maximal einen rekursiven Aufruf Verzweigende Rekursion Jeder Aufruf kann mehr als einen rekursiven Aufruf auflösen Verschachtelte Rekursion Parameter eines rekursiven Aufrufs sind selbst wieder rekursive Aufrufe 7.5 Tihomir R. Todorov public int sum(long n) { // … return sum(n-1) + n; } public int sum(long n) { // … return sum(n-1) + sum(n-1); } public int sum(long n) { // … return sum(sum(n-1)); } Informatik 1 – Tutorium 7 Übungsaufgaben 7 Auf. 1 (SS05) Gegen sei folgende rekursiv definierte Funktion: Auf. 1 a) (SS05) Implementieren Sie eine rekursive Java Methode, die obige Funktion nach dem gegebenen rekursiven Schema berechnet, ohne irgendwelche Berechnungen zwischenzuspeichern und ohne weitere Vereinfachungen. Lsg: 7.6 public int getF(int n) { if (n == 1) { return 1;} else { return f(n-1) * f(n-1); } } Tihomir R. Todorov Informatik 1 – Tutorium 7 Auf. 1 b) (SS05) Um welchen Typ von Rekursion handelt es sich? Lsg.: Verzweigende Rekursion. Auf. 1 c) (SS05) Geben Sie die ersten fünf rekursiven Aufrufe für n=3 als Aufrufbaum mit Wurzel f(3) an sowie den Zustand des Laufzeitkellers, wenn der letzte Aufruf noch nicht mit return beendet wurde. Der erste (nicht rekursive) Aufruf der Methode zählt mit zu den fünf Aufrufen dazu. 7.7 Tihomir R. Todorov Informatik 1 – Tutorium 7 Auf. 2 (WS0405) Implementieren Sie eine rekursive Methode, die den Inhalt eines Feldes mit Feldtyp int umdreht. Zum Beispiel soll folgendes Feld der Länge 4 2 7 5 11 nach Aufruf der Methode folgenden Inhalt haben 11 5 7 2 Der Gesamtzeitaufwand ihrer Methode darf im schlimmsten Fall O(n) nicht überschreiten, wobei n die Länge des Feldes ist, dessen Inhalt umgedreht wird. Für die Implementierung dürfen keine for- oder while-Schleifen verwendet werden. Beachten Sie bei Ihrer Implementierung die in der Vorlesung vorgestellten Java-Namenskonventionen. 7.8 Tihomir R. Todorov Informatik 1 – Tutorium 7 Auf. 2 – Lsg. (WS0405) public static void umdrehen(int a[]) { umdrehen(a, 0, a.length-1); } private static void umdrehen(int a[], int l, int r) { if (l<r) { int tmp = a[l]; a[l] = a[r]; a[r] = tmp; umdrehen(a, l+1, r-1); } } Obige Hilfsfunktion (ohne die Parameter l und r) muss nicht notwendigerweise existieren. Static oder nicht spielt keine Rolle. 7.9 Tihomir R. Todorov Informatik 1 – Tutorium 8 Informatik 1 Tutorium 8 8.1 Tihomir R. Todorov Informatik 1 – Tutorium 8 Backtracking - Allgemein Durch systematisches Ausprobieren aller Möglichkeiten finden. Aufgabe: Suche eines bestimmten Wegs 1) Beginne mit Punkt 1 (alle mögl. Wege von diesem Punkt ausprobieren) 2) Überprüfe, ob einen Weg gibt, falls ja: in diese Richtung gehen. 3) Ziel gefunden? - Falls ja: fertig - Falls nein: ein Stück weiter-/zurückgehen und rekursiv mit 1) Punkt 1.1 8.2 Tihomir R. Todorov Informatik 1 – Tutorium 8 Übungsaufgaben 8 Auf. 1 Vier-Farben-Problem Rot Grün Blau Gelb 8.3 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.4 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.5 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.6 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.7 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.8 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.9 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.10 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.11 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.12 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.13 Tihomir R. Todorov Informatik 1 – Tutorium 8 Visuelle Darstellung des Problems Problem: Wir wollen eine Landkarte mit möglichst wenig Farben so anmalen, dass benachbarte Länder verschiedene Farben haben. 8.14 Tihomir R. Todorov Informatik 1 – Tutorium 8 Geschichte Vermutung (Francis Guthrie, 1852): 4 Farben reichen immer aus. Das Problem wurde aber erstmals 1976 bewiesen. Francis Guthrie 22.01.1831, London - 19.10.1899, Claremont war ein südafrikanischer Mathematiker und Botaniker. 8.15 Tihomir R. Todorov Informatik 1 – Tutorium 8 Auf. 1 Vier-Farben-Problem (Vereinfachung) Problem: Vier-Farben-Problem Gegeben: Eine Landkarte mit Regionen Gesucht: Eine Färbung der Region mit vier Farben 0 1 3 2 # 0 1 2 3 0 0 1 1 1 1 1 0 1 1 2 1 1 0 1 Adjazenzmatrix 8.16 Tihomir R. Todorov 3 1 1 1 0 Informatik 1 – Tutorium 8 Auf. 1 Vier-Farben-Problem (Klassendiagramm) VierFarbenProblem - farben: int[] - karte: int[][] + VierFarbenProblem(farben: int[], karte: int[][]) + faerben() : boolean - nachbarHatGleicheFarbe(land:int, farbe:int):boolean # 0 1 2 3 0 0 0 0 0 1 1 0 0 0 2 1 1 0 0 Adjazenzmatrix 8.17 Tihomir R. Todorov 3 1 1 1 0 Informatik 1 – Tutorium 8 Auf. 1 Vier-Farben-Problem (Pseudocode) public boolean faerben(int land) { for (int farbe = 1; farbe <= 4; farbe++) { if (!nachbarHatGleicheFarbe(land, farbe)) { this.farben[land] = farbe; if (land < karte.length - 1) { if (faerben(land + 1)) { return true; } else { this.farben[land] = 0; } } else { return true; } } } return false; } private boolean nachbarHatGleicheFarbe(int land, int farbe) { return false; } 8.18 Tihomir R. Todorov Informatik 1 – Tutorium 8 Auf. 1 Vier-Farben-Problem (Pseudocode) private boolean nachbarHatGleicheFarbe(int land, int farbe) { for (int nachbar = 0; nachbar < farben.length; nachbar++) { if (nachbar != land && farben[nachbar] == farbe && (karte[land][nachbar] == 1 || karte[nachbar][land] == 1)) { return true; } } return false; } 8.19 Tihomir R. Todorov Informatik 1 – Tutorium 9 Informatik 1 Tutorium 9 9.1 Tihomir R. Todorov Informatik 1 – Tutorium 9 9.2 Tihomir R. Todorov Informatik 1 – Tutorium 9 9.3 Tihomir R. Todorov