diff --git a/Abstrakte_Klassen_001/readme.md b/Abstrakte_Klassen_001/readme.md index 5473313..ae04afe 100644 --- a/Abstrakte_Klassen_001/readme.md +++ b/Abstrakte_Klassen_001/readme.md @@ -1,6 +1,6 @@ # Abstrakte Klassen ## Lernziel - + [Musterlösung](solution/) Eine abstrakte Klasse einsetzen, um eine einheitliche Schnittstelle für unterschiedliche Klassen anzubieten. diff --git a/Abstrakte_Klassen_001/solution/readme.md b/Abstrakte_Klassen_001/solution/readme.md new file mode 100644 index 0000000..9132f53 --- /dev/null +++ b/Abstrakte_Klassen_001/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Abstrakte Klassen + +Musterlösung: + +[pr2.interfaces.abstrakte_klassen_s](../../solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/) diff --git a/Abstrakte_Klassen_002/readme.md b/Abstrakte_Klassen_002/readme.md index 1e421cf..6f073f6 100644 --- a/Abstrakte_Klassen_002/readme.md +++ b/Abstrakte_Klassen_002/readme.md @@ -1,6 +1,6 @@ # Abstrakte Klasse ## Lernziel - + [Musterlösung](solution/) Abstrakte Klasse verwenden. diff --git a/Abstrakte_Klassen_002/solution/readme.md b/Abstrakte_Klassen_002/solution/readme.md new file mode 100644 index 0000000..9d09e79 --- /dev/null +++ b/Abstrakte_Klassen_002/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Abstrakte Klasse + +Musterlösung: + +[pr2.interfaces.abstrakt_form](../../solutions/src/main/java/pr2/interfaces/abstrakt_form/) diff --git a/Auffrischung_001/readme.md b/Auffrischung_001/readme.md index eda7a40..afcaab4 100644 --- a/Auffrischung_001/readme.md +++ b/Auffrischung_001/readme.md @@ -1,6 +1,6 @@ # String in Großbuchstaben umwandeln ## Lernziel - + [Musterlösung](solution/) * Daten von der Kommandozeile lesen. diff --git a/Auffrischung_001/solution/readme.md b/Auffrischung_001/solution/readme.md new file mode 100644 index 0000000..1a6e1d0 --- /dev/null +++ b/Auffrischung_001/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: String in Großbuchstaben umwandeln + + +[pr2.auffrischung.grossmacher](../../solutions/src/main/java/pr2/auffrischung/grossmacher) diff --git a/Auffrischung_002/readme.md b/Auffrischung_002/readme.md index 9a55dbe..45c55b4 100644 --- a/Auffrischung_002/readme.md +++ b/Auffrischung_002/readme.md @@ -1,6 +1,6 @@ # Labeled Break ## Lernziel - + [Musterlösung](solution/) Ein labeled break verwenden. diff --git a/Auffrischung_002/solution/readme.md b/Auffrischung_002/solution/readme.md new file mode 100644 index 0000000..6102863 --- /dev/null +++ b/Auffrischung_002/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: Labeled Break + + +[pr2.auffrischung.labeled_break](../../solutions/src/main/java/pr2/auffrischung/labeled_break) diff --git a/Auffrischung_003/readme.md b/Auffrischung_003/readme.md index 781c81d..30f2c44 100644 --- a/Auffrischung_003/readme.md +++ b/Auffrischung_003/readme.md @@ -1,6 +1,6 @@ # Passwortbewertung ## Lernziel - + [Musterlösung](solution/) Einfache String-Verarbeitung. diff --git a/Auffrischung_003/solution/readme.md b/Auffrischung_003/solution/readme.md new file mode 100644 index 0000000..6b1732b --- /dev/null +++ b/Auffrischung_003/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: Passwortbewertung + + +[pr2.auffrischung.password](../../solutions/src/main/java/pr2/auffrischung/password) diff --git a/Auffrischung_004/readme.md b/Auffrischung_004/readme.md index b058cf6..a523c93 100644 --- a/Auffrischung_004/readme.md +++ b/Auffrischung_004/readme.md @@ -1,6 +1,6 @@ # printf mit Formatstring ## Lernziel - + [Musterlösung](solution/) Formatierung mit Formatstrings. diff --git a/Auffrischung_004/solution/readme.md b/Auffrischung_004/solution/readme.md new file mode 100644 index 0000000..bcda0d2 --- /dev/null +++ b/Auffrischung_004/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: printf mit Formatstring + + +[pr2.auffrischung.printf](../../solutions/src/main/java/pr2/auffrischung/printf) diff --git a/Auffrischung_005/readme.md b/Auffrischung_005/readme.md index 20552f8..a853bd1 100644 --- a/Auffrischung_005/readme.md +++ b/Auffrischung_005/readme.md @@ -1,6 +1,6 @@ # Maximum in einem Array suchen ## Lernziel - + [Musterlösung](solution/) Über Arrays iterieren. diff --git a/Auffrischung_005/solution/readme.md b/Auffrischung_005/solution/readme.md new file mode 100644 index 0000000..9cd6fa7 --- /dev/null +++ b/Auffrischung_005/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: Maximum in einem Array suchen + + +[pr2.auffrischung.suchemax](../../solutions/src/main/java/pr2/auffrischung/suchemax) diff --git a/Auffrischung_006/readme.md b/Auffrischung_006/readme.md index 874855a..5d4ba71 100644 --- a/Auffrischung_006/readme.md +++ b/Auffrischung_006/readme.md @@ -1,6 +1,6 @@ # Taschenrechner ## Lernziel - + [Musterlösung](solution/) `case` verwenden. diff --git a/Auffrischung_006/solution/readme.md b/Auffrischung_006/solution/readme.md new file mode 100644 index 0000000..7e37500 --- /dev/null +++ b/Auffrischung_006/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: Taschenrechner + + +[pr2.auffrischung.taschenrechner](../../solutions/src/main/java/pr2/auffrischung/taschenrechner) diff --git a/Ausnahmen_001/readme.md b/Ausnahmen_001/readme.md index 25d3898..2872da7 100644 --- a/Ausnahmen_001/readme.md +++ b/Ausnahmen_001/readme.md @@ -1,6 +1,6 @@ # Ausnahmen testen ## Lernziel - + [Musterlösung](solution/) Bei einer gegebenen Klasse Testfälle mit JUnit schreiben, die auf das Werfen von Ausnahmen testen. diff --git a/Ausnahmen_001/solution/readme.md b/Ausnahmen_001/solution/readme.md new file mode 100644 index 0000000..a03a8f2 --- /dev/null +++ b/Ausnahmen_001/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Ausnahmen testen + +Musterlösung: + +[pr2.exceptions.ausnahmen_testen](../../solutions/src/main/java/pr2/exceptions/ausnahmen_testen/) diff --git a/Ausnahmen_002/readme.md b/Ausnahmen_002/readme.md index a7299c1..2d6059b 100644 --- a/Ausnahmen_002/readme.md +++ b/Ausnahmen_002/readme.md @@ -1,6 +1,6 @@ # Eigene Ausnahmen schreiben und an entsprechender Stelle werfen ## Lernziel - + [Musterlösung](solution/) Ausnahmen programmieren und sinnvoll einsetzen. Bedeutung der Schlüsselwörter `throws` und `throw` verstehen. diff --git a/Ausnahmen_002/solution/readme.md b/Ausnahmen_002/solution/readme.md new file mode 100644 index 0000000..7cc2d13 --- /dev/null +++ b/Ausnahmen_002/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Eigene Ausnahmen schreiben und an entsprechender Stelle werfen + +Musterlösung: + +[pr2.exceptions.eigene_ausnahme](../../solutions/src/main/java/pr2/exceptions/eigene_ausnahme/) diff --git a/Ausnahmen_003/readme.md b/Ausnahmen_003/readme.md index 4713aa3..e51f4aa 100644 --- a/Ausnahmen_003/readme.md +++ b/Ausnahmen_003/readme.md @@ -1,6 +1,6 @@ # Eigene Exception schreiben ## Lernziel - + [Musterlösung](solution/) Eigene Exceptions entwerfen und verwenden. diff --git a/Ausnahmen_003/solution/readme.md b/Ausnahmen_003/solution/readme.md new file mode 100644 index 0000000..9c7ad33 --- /dev/null +++ b/Ausnahmen_003/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Eigene Exception schreiben + +Musterlösung: + +[pr2.exceptions.fakultaet](../../solutions/src/main/java/pr2/exceptions/fakultaet/) diff --git a/Ausnahmen_004/readme.md b/Ausnahmen_004/readme.md index 514e219..7be7da1 100644 --- a/Ausnahmen_004/readme.md +++ b/Ausnahmen_004/readme.md @@ -1,6 +1,6 @@ # Handle-or-Declare-Regel anwenden ## Lernziel - + [Musterlösung](solution/) In einem vorhandenen Programm die Ausnahmen korrekt weiter deklarieren und an den richtigen Stellen fangen. diff --git a/Ausnahmen_004/solution/readme.md b/Ausnahmen_004/solution/readme.md new file mode 100644 index 0000000..ca9a0e4 --- /dev/null +++ b/Ausnahmen_004/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Handle-or-Declare-Regel anwenden + +Musterlösung: + +[pr2.exceptions.handle_or_declare](../../solutions/src/main/java/pr2/exceptions/handle_or_declare/) diff --git a/Ausnahmen_005/readme.md b/Ausnahmen_005/readme.md index 0541024..fd0b99c 100644 --- a/Ausnahmen_005/readme.md +++ b/Ausnahmen_005/readme.md @@ -1,6 +1,6 @@ # Ausnahmen mit `try` und `catch` behandeln. ## Lernziel - + [Musterlösung](solution/) Vorhandene Ausnahmen mit `try` und `catch` abfangen und behandeln. diff --git a/Ausnahmen_005/solution/readme.md b/Ausnahmen_005/solution/readme.md new file mode 100644 index 0000000..f28d42d --- /dev/null +++ b/Ausnahmen_005/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Ausnahmen mit `try` und `catch` behandeln. + +Musterlösung: + +[pr2.exceptions.try_catch](../../solutions/src/main/java/pr2/exceptions/try_catch/) diff --git a/Einfuehrung_001/readme.md b/Einfuehrung_001/readme.md index 28b225e..a981876 100644 --- a/Einfuehrung_001/readme.md +++ b/Einfuehrung_001/readme.md @@ -1,6 +1,6 @@ # Java-Coding-Standard anwenden ## Lernziel - + [Musterlösung](solution/) Java-Code korrekt entsprechend dem [Coding-Standard von Oracle](http://www.oracle.com/technetwork/java/codeconventions-150003.pdf) formatieren. diff --git a/Einfuehrung_001/solution/readme.md b/Einfuehrung_001/solution/readme.md new file mode 100644 index 0000000..8a75113 --- /dev/null +++ b/Einfuehrung_001/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: Java-Coding-Standard anwenden + + +[pr2.intro.coding_standard](../../solutions/src/main/java/pr2/intro/coding_standard/) diff --git a/Einfuehrung_002/readme.md b/Einfuehrung_002/readme.md index c2907be..4a2c597 100644 --- a/Einfuehrung_002/readme.md +++ b/Einfuehrung_002/readme.md @@ -1,6 +1,6 @@ # JavaDoc schreiben ## Lernziel - + [Musterlösung](solution/) Eine vorhandene Klasse mit korrekten JavaDoc-Kommentaren versehen. diff --git a/Einfuehrung_002/solution/readme.md b/Einfuehrung_002/solution/readme.md new file mode 100644 index 0000000..e10eb89 --- /dev/null +++ b/Einfuehrung_002/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: JavaDoc schreiben + + +[pr2.intro.javadoc](../../solutions/src/main/java/pr2/intro/javadoc/) diff --git a/Einfuehrung_003/readme.md b/Einfuehrung_003/readme.md index 3e208b9..eb86b02 100644 --- a/Einfuehrung_003/readme.md +++ b/Einfuehrung_003/readme.md @@ -1,6 +1,6 @@ # Klasse mit JUnit testen ## Lernziel - + [Musterlösung](solution/) Einen JUnit-Test für eine gegebene Klasse schreiben. diff --git a/Einfuehrung_003/solution/readme.md b/Einfuehrung_003/solution/readme.md new file mode 100644 index 0000000..ee12743 --- /dev/null +++ b/Einfuehrung_003/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: Klasse mit JUnit testen + + +Gehen Sie in das Paket [pr2.intro.junit_faculty](../../solutions/src/main/java/pr2/intro/junit_faculty/). diff --git a/Enumerationen_001/readme.md b/Enumerationen_001/readme.md index 7b036ac..60f3890 100644 --- a/Enumerationen_001/readme.md +++ b/Enumerationen_001/readme.md @@ -1,6 +1,6 @@ # Eigene Enumeration schreiben und verwenden ## Lernziel - + [Musterlösung](solution/) Eine einfache Enumeration (ohne abstrakte Methoden) erstellen und in einem kleinen Programm einsetzen. diff --git a/Enumerationen_001/solution/readme.md b/Enumerationen_001/solution/readme.md new file mode 100644 index 0000000..e473906 --- /dev/null +++ b/Enumerationen_001/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Eigene Enumeration schreiben und verwenden + +Musterlösung: + +[pr2.enums.eigene](../../solutions/src/main/java/pr2/enums/eigene/) diff --git a/Enumerationen_002/readme.md b/Enumerationen_002/readme.md index 2d96a2e..a21124c 100644 --- a/Enumerationen_002/readme.md +++ b/Enumerationen_002/readme.md @@ -1,6 +1,6 @@ # Enumeration schreiben ## Lernziel - + [Musterlösung](solution/) Eine einfache Enumeration (ohne abstrakte Methoden) erstellen und in einem kleinen Programm einsetzen. diff --git a/Enumerationen_002/solution/readme.md b/Enumerationen_002/solution/readme.md new file mode 100644 index 0000000..9255964 --- /dev/null +++ b/Enumerationen_002/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Enumeration schreiben + +Musterlösung: + +[pr2.enums.filme](../../solutions/src/main/java/pr2/enums/filme/) diff --git a/Enumerationen_003/readme.md b/Enumerationen_003/readme.md index f986150..1deb232 100644 --- a/Enumerationen_003/readme.md +++ b/Enumerationen_003/readme.md @@ -1,6 +1,6 @@ # Singleton-Eigenschaft von Enumerationen ## Lernziel - + [Musterlösung](solution/) Die Singleton-Eigenschaft von Enumerationen verstehen. diff --git a/Enumerationen_003/solution/readme.md b/Enumerationen_003/solution/readme.md new file mode 100644 index 0000000..e4f7fe2 --- /dev/null +++ b/Enumerationen_003/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Singleton-Eigenschaft von Enumerationen + +Musterlösung: + +[pr2.enums.singleton](../../solutions/src/main/java/pr2/enums/singleton/) diff --git a/Enumerationen_004/readme.md b/Enumerationen_004/readme.md index d63cac8..c1a5dc3 100644 --- a/Enumerationen_004/readme.md +++ b/Enumerationen_004/readme.md @@ -1,6 +1,6 @@ # Assignment: Stein, Papier, Schere, Echse, Spock ## Lernziel - + [Musterlösung](solution/) Mit Enumerationen arbeiten. diff --git a/Enumerationen_004/solution/readme.md b/Enumerationen_004/solution/readme.md new file mode 100644 index 0000000..9c45825 --- /dev/null +++ b/Enumerationen_004/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Stein, Papier, Schere, Echse, Spock + +Musterlösung: + +[pr2.enums.schnick](../../solutions/src/main/java/pr2/enums/schnick). diff --git a/Interfaces_001/readme.md b/Interfaces_001/readme.md index efb5d6d..8fba410 100644 --- a/Interfaces_001/readme.md +++ b/Interfaces_001/readme.md @@ -1,6 +1,6 @@ # Comparable implementieren ## Lernziel - + [Musterlösung](solution/) Klasse "comparable" machen. diff --git a/Interfaces_001/solution/readme.md b/Interfaces_001/solution/readme.md new file mode 100644 index 0000000..d591697 --- /dev/null +++ b/Interfaces_001/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Comparable implementieren + +Musterlösung: + +[pr2.interfaces.comparable_student](../../solutions/src/main/java/pr2/interfaces/comparable_student/) diff --git a/Interfaces_002/readme.md b/Interfaces_002/readme.md index 94ceda5..7e55882 100644 --- a/Interfaces_002/readme.md +++ b/Interfaces_002/readme.md @@ -1,6 +1,6 @@ # Interface Stack entwerfen ## Lernziel - + [Musterlösung](solution/) Ein Interface entwerfen und dieses dann implementieren. diff --git a/Interfaces_002/solution/readme.md b/Interfaces_002/solution/readme.md new file mode 100644 index 0000000..18e1cff --- /dev/null +++ b/Interfaces_002/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Interface Stack entwerfen + +Musterlösung: + +[pr2.interfaces.stack](../../solutions/src/main/java/pr2/interfaces/stack/) diff --git a/Interfaces_003/readme.md b/Interfaces_003/readme.md index e05c6b9..a16f211 100644 --- a/Interfaces_003/readme.md +++ b/Interfaces_003/readme.md @@ -1,6 +1,6 @@ # Interface: Uebersetzer ## Lernziel - + [Musterlösung](solution/) Ein Interface implementieren. diff --git a/Interfaces_003/solution/readme.md b/Interfaces_003/solution/readme.md new file mode 100644 index 0000000..bc67dee --- /dev/null +++ b/Interfaces_003/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Interface: Uebersetzer + +Musterlösung: + +[pr2.interfaces.uebersetzer](../../solutions/src/main/java/pr2/interfaces/uebersetzer/) diff --git a/Interfaces_004/readme.md b/Interfaces_004/readme.md index 1e20447..bf5f3e5 100644 --- a/Interfaces_004/readme.md +++ b/Interfaces_004/readme.md @@ -1,6 +1,6 @@ # Interfaces anwenden und entwerfen ## Lernziel - + [Musterlösung](solution/) Ein vorhandenes Interface implementieren und ein eigenes Interface programmieren. Klassen schreiben, die mehrere Interfaces implementieren. Die Kollision von gleichnamigen Interface-Methoden und deren Konsequenzen verstehen. diff --git a/Interfaces_004/solution/readme.md b/Interfaces_004/solution/readme.md new file mode 100644 index 0000000..d93d652 --- /dev/null +++ b/Interfaces_004/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Interfaces anwenden und entwerfen + +Musterlösung: + +[pr2.interfaces.interfaces_s](../../solutions/src/main/java/pr2/interfaces/interfaces_s/) diff --git a/Object_und_Wrapper_001/readme.md b/Object_und_Wrapper_001/readme.md index de42507..7edc4a6 100644 --- a/Object_und_Wrapper_001/readme.md +++ b/Object_und_Wrapper_001/readme.md @@ -1,6 +1,6 @@ # Deep-Copy mit `clone()` ## Lernziel - + [Musterlösung](solution/) Den Nutzen der `clone()`-Methode verstehen und diese richtig einsetzen. Eine eigene `clone()`-Methode schreiben und eine tiefe Kopie durchführen. diff --git a/Object_und_Wrapper_001/solution/readme.md b/Object_und_Wrapper_001/solution/readme.md new file mode 100644 index 0000000..e4f05e2 --- /dev/null +++ b/Object_und_Wrapper_001/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Deep-Copy mit `clone()` + +Musterlösung: + +[pr2.object.clone_alien](../../solutions/src/main/java/pr2/object/clone_alien/) diff --git a/Object_und_Wrapper_002/readme.md b/Object_und_Wrapper_002/readme.md index d2f43b5..c459299 100644 --- a/Object_und_Wrapper_002/readme.md +++ b/Object_und_Wrapper_002/readme.md @@ -1,6 +1,6 @@ # Clone ## Lernziel - + [Musterlösung](solution/) Den Nutzen der `clone()`-Methode verstehen und diese richtig einsetzen. Eine eigene `clone()`-Methode schreiben und eine tiefe Kopie durchführen. diff --git a/Object_und_Wrapper_002/solution/readme.md b/Object_und_Wrapper_002/solution/readme.md new file mode 100644 index 0000000..9dc85a1 --- /dev/null +++ b/Object_und_Wrapper_002/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Clone + +Musterlösung: + +[pr2.object.clone_person](../../solutions/src/main/java/pr2/object/clone_person) diff --git a/Object_und_Wrapper_003/readme.md b/Object_und_Wrapper_003/readme.md index 337ee9e..abec53a 100644 --- a/Object_und_Wrapper_003/readme.md +++ b/Object_und_Wrapper_003/readme.md @@ -1,6 +1,6 @@ # `equals()` und `hashCode()` implementieren und nutzen ## Lernziel - + [Musterlösung](solution/) Die Methoden `equals()` und `hashCode()` der Klasse `Object` korrekt überschreiben und nutzen. diff --git a/Object_und_Wrapper_003/solution/readme.md b/Object_und_Wrapper_003/solution/readme.md new file mode 100644 index 0000000..ce0c7ab --- /dev/null +++ b/Object_und_Wrapper_003/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: `equals()` und `hashCode()` implementieren und nutzen + +Musterlösung: + +[pr2.object.equals_hashcode](../../solutions/src/main/java/pr2/object/equals_hashcode/) diff --git a/Object_und_Wrapper_004/readme.md b/Object_und_Wrapper_004/readme.md index cebe590..e2702ab 100644 --- a/Object_und_Wrapper_004/readme.md +++ b/Object_und_Wrapper_004/readme.md @@ -1,6 +1,6 @@ # equals und hashCode ## Lernziel - + [Musterlösung](solution/) Die Methoden `equals()` und `hashCode()` der Klasse `Object` korrekt überschreiben und nutzen. diff --git a/Object_und_Wrapper_004/solution/readme.md b/Object_und_Wrapper_004/solution/readme.md new file mode 100644 index 0000000..7d94bc2 --- /dev/null +++ b/Object_und_Wrapper_004/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: equals und hashCode + +Musterlösung: + +[pr2.object.equals_person](../../solutions/src/main/java/pr2/object/equals_person) diff --git a/Object_und_Wrapper_005/readme.md b/Object_und_Wrapper_005/readme.md index 5b276d3..add7d3c 100644 --- a/Object_und_Wrapper_005/readme.md +++ b/Object_und_Wrapper_005/readme.md @@ -1,6 +1,6 @@ # `toString()`-Methode implementieren ## Lernziel - + [Musterlösung](solution/) Klassen mit einer `toString()`-Methode versehen und diese gegenseitig nutzen. diff --git a/Object_und_Wrapper_005/solution/readme.md b/Object_und_Wrapper_005/solution/readme.md new file mode 100644 index 0000000..2073e97 --- /dev/null +++ b/Object_und_Wrapper_005/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: `toString()`-Methode implementieren + +Musterlösung: + +[pr2.object.tostring](../../solutions/src/main/java/pr2/object/tostring/). diff --git a/Object_und_Wrapper_006/readme.md b/Object_und_Wrapper_006/readme.md index b82c722..a22d9d0 100644 --- a/Object_und_Wrapper_006/readme.md +++ b/Object_und_Wrapper_006/readme.md @@ -1,6 +1,6 @@ # Optimierung bei Integer ## Lernziel - + [Musterlösung](solution/) Wrapper-Klassen und deren Optimierungen verstehen. diff --git a/Object_und_Wrapper_006/solution/readme.md b/Object_und_Wrapper_006/solution/readme.md new file mode 100644 index 0000000..82555df --- /dev/null +++ b/Object_und_Wrapper_006/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Optimierung bei Integer + +Musterlösung: + +[pr2.object.wrapper_boxsearch](../../solutions/src/main/java/pr2/object/wrapper_boxsearch/). diff --git a/Object_und_Wrapper_007/readme.md b/Object_und_Wrapper_007/readme.md index ed49b9f..2f68756 100644 --- a/Object_und_Wrapper_007/readme.md +++ b/Object_und_Wrapper_007/readme.md @@ -1,6 +1,6 @@ # Methoden der Wrapper-Klassen ## Lernziel - + [Musterlösung](solution/) Wrapper-Klassen nutzen, um Zahlen umzuwandeln. diff --git a/Object_und_Wrapper_007/solution/readme.md b/Object_und_Wrapper_007/solution/readme.md new file mode 100644 index 0000000..13bf079 --- /dev/null +++ b/Object_und_Wrapper_007/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Methoden der Wrapper-Klassen + +Musterlösung: + +[pr2.object.wrapper_umwandler](../../solutions/src/main/java/pr2/object/wrapper_umwandler/). diff --git a/Strukturierung_001/readme.md b/Strukturierung_001/readme.md index adde6bf..3e7fdd1 100644 --- a/Strukturierung_001/readme.md +++ b/Strukturierung_001/readme.md @@ -1,6 +1,6 @@ # Information-Hiding einer Klasse verbessern ## Lernziel - + [Musterlösung](solution/) Bei einer vorhandenen Klasse Information Hiding verbessern und Seiteneffekte reduzieren. diff --git a/Strukturierung_001/solution/readme.md b/Strukturierung_001/solution/readme.md new file mode 100644 index 0000000..7584997 --- /dev/null +++ b/Strukturierung_001/solution/readme.md @@ -0,0 +1,4 @@ +# Lösung: Information-Hiding einer Klasse verbessern + + +[pr2.strukturierung.information_hiding](../../solutions/src/main/java/pr2/strukturierung/information_hiding/) diff --git a/Strukturierung_002/readme.md b/Strukturierung_002/readme.md index 506b798..7b84b29 100644 --- a/Strukturierung_002/readme.md +++ b/Strukturierung_002/readme.md @@ -1,6 +1,6 @@ # Vorhandene Bibliotheken als JAR einbinden ## Lernziel - + [Musterlösung](solution/) Eine vorhandene Bibliothek in einem Projekt verwenden und hierzu ein JAR einbinden. diff --git a/Vererbung_001/readme.md b/Vererbung_001/readme.md index 77182a3..71c5480 100644 --- a/Vererbung_001/readme.md +++ b/Vererbung_001/readme.md @@ -1,6 +1,6 @@ # Final anwenden ## Lernziel - + [Musterlösung](solution/) Das Schlüsselwort `final` in seinen verschiedenen Bedeutungen kennenlernen und syntaktisch an die richtigen Stellen schreiben. diff --git a/Vererbung_001/solution/readme.md b/Vererbung_001/solution/readme.md new file mode 100644 index 0000000..9e13845 --- /dev/null +++ b/Vererbung_001/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Final anwenden + +Musterlösung: + +[pr2.vererbung.finals](../../solutions/src/main/java/pr2/vererbung/finals/) diff --git a/Vererbung_002/readme.md b/Vererbung_002/readme.md index 9360e77..1c13a17 100644 --- a/Vererbung_002/readme.md +++ b/Vererbung_002/readme.md @@ -1,6 +1,6 @@ # Figur und Rechteck ## Lernziel - + [Musterlösung](solution/) Vererbung sinnvoll einsetzen. diff --git a/Vererbung_002/solution/readme.md b/Vererbung_002/solution/readme.md new file mode 100644 index 0000000..f130d3d --- /dev/null +++ b/Vererbung_002/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Figur und Rechteck + +Musterlösung: + +[pr2.vererbung.geometrie1](../../solutions/src/main/java/pr2/vererbung/geometrie1/) diff --git a/Vererbung_003/readme.md b/Vererbung_003/readme.md index 40bd077..84e08a2 100644 --- a/Vererbung_003/readme.md +++ b/Vererbung_003/readme.md @@ -1,6 +1,6 @@ # Figur erweitern ## Lernziel - + [Musterlösung](solution/) Vererbung sinnvoll einsetzen. diff --git a/Vererbung_003/solution/readme.md b/Vererbung_003/solution/readme.md new file mode 100644 index 0000000..e69cd4f --- /dev/null +++ b/Vererbung_003/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Figur erweitern + +Musterlösung: + +[pr2.vererbung.geometrie2](../../solutions/src/main/java/pr2/vererbung/geometrie2/) diff --git a/Vererbung_004/readme.md b/Vererbung_004/readme.md index 5b086a7..c4c4aac 100644 --- a/Vererbung_004/readme.md +++ b/Vererbung_004/readme.md @@ -1,6 +1,6 @@ # Figur noch einmal erweitern ## Lernziel - + [Musterlösung](solution/) Vererbung sinnvoll einsetzen. diff --git a/Vererbung_004/solution/readme.md b/Vererbung_004/solution/readme.md new file mode 100644 index 0000000..d5886dd --- /dev/null +++ b/Vererbung_004/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Figur noch einmal erweitern + +Musterlösung: + +[pr2.vererbung.geometrie3](../../solutions/src/main/java/pr2/vererbung/geometrie3/) diff --git a/Vererbung_005/readme.md b/Vererbung_005/readme.md index 8eef5cd..f3cb310 100644 --- a/Vererbung_005/readme.md +++ b/Vererbung_005/readme.md @@ -1,6 +1,6 @@ # Konstruktoren schreiben ## Lernziel - + [Musterlösung](solution/) Für eine vorhandene Klasse Konstruktoren schreiben und Konstruktoren sich gegenseitig und auch Konstruktoren der Superklasse aufrufen lassen. diff --git a/Vererbung_005/solution/readme.md b/Vererbung_005/solution/readme.md new file mode 100644 index 0000000..38818c2 --- /dev/null +++ b/Vererbung_005/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Konstruktoren schreiben + +Musterlösung: + +[pr2.vererbung.konstruktoren](../../solutions/src/main/java/pr2/vererbung/konstruktoren/) diff --git a/Vererbung_006/readme.md b/Vererbung_006/readme.md index 0683bb7..8653a59 100644 --- a/Vererbung_006/readme.md +++ b/Vererbung_006/readme.md @@ -1,6 +1,6 @@ # Polymorphie einsetzen ## Lernziel - + [Musterlösung](solution/) Durch Polymorphie Subklassen wie Basisklassen behandeln können. diff --git a/Vererbung_006/solution/readme.md b/Vererbung_006/solution/readme.md new file mode 100644 index 0000000..3dcb152 --- /dev/null +++ b/Vererbung_006/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Polymorphie einsetzen + +Musterlösung: + +[pr2.vererbung.polymorphie](../../solutions/src/main/java/pr2/vererbung/polymorphie/) diff --git a/Vererbung_007/readme.md b/Vererbung_007/readme.md index 3decb9f..254a802 100644 --- a/Vererbung_007/readme.md +++ b/Vererbung_007/readme.md @@ -1,6 +1,6 @@ # Singleton ## Lernziel - + [Musterlösung](solution/) Das Design-Pattern _Singleton_ einsetzen. diff --git a/Vererbung_007/solution/readme.md b/Vererbung_007/solution/readme.md new file mode 100644 index 0000000..080acca --- /dev/null +++ b/Vererbung_007/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Singleton + +Musterlösung: + +[pr2.vererbung.singleton_einfach](../../solutions/src/main/java/pr2/vererbung/singleton_einfach/) diff --git a/Vererbung_008/readme.md b/Vererbung_008/readme.md index 04501a5..ba67d73 100644 --- a/Vererbung_008/readme.md +++ b/Vererbung_008/readme.md @@ -1,6 +1,6 @@ # Statische Methoden und Attribute ## Lernziel - + [Musterlösung](solution/) Eine Klasse mit statischen Attributen und Methoden entwickeln und die Unterschiede zu normalen Methoden und Attributen verstehen. diff --git a/Vererbung_008/solution/readme.md b/Vererbung_008/solution/readme.md new file mode 100644 index 0000000..8638c64 --- /dev/null +++ b/Vererbung_008/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Statische Methoden und Attribute + +Musterlösung: + +[pr2.vererbung.statics](../../solutions/src/main/java/pr2/vererbung/statics/) diff --git a/Vererbung_009/readme.md b/Vererbung_009/readme.md index 72cf564..4996548 100644 --- a/Vererbung_009/readme.md +++ b/Vererbung_009/readme.md @@ -1,6 +1,6 @@ # Methode überladen ## Lernziel - + [Musterlösung](solution/) Methoden überladen. diff --git a/Vererbung_009/solution/readme.md b/Vererbung_009/solution/readme.md new file mode 100644 index 0000000..5106e98 --- /dev/null +++ b/Vererbung_009/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Methode überladen + +Musterlösung: + +[pr2.vererbung.ueberladen_summe](../../solutions/src/main/java/pr2/vererbung/ueberladen_summe) diff --git a/Vererbung_010/readme.md b/Vererbung_010/readme.md index 516e8af..9b09bc6 100644 --- a/Vererbung_010/readme.md +++ b/Vererbung_010/readme.md @@ -1,6 +1,6 @@ # Methoden überschreiben ## Lernziel - + [Musterlösung](solution/) Bei Vererbung das Überschreiben von Methoden einsetzen. diff --git a/Vererbung_010/solution/readme.md b/Vererbung_010/solution/readme.md new file mode 100644 index 0000000..02ce09a --- /dev/null +++ b/Vererbung_010/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Methoden überschreiben + +Musterlösung: + +[pr2.vererbung.ueberschreiben_lebewesen](../../solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/) diff --git a/Vererbung_011/readme.md b/Vererbung_011/readme.md index 6397fc8..9ca3ce4 100644 --- a/Vererbung_011/readme.md +++ b/Vererbung_011/readme.md @@ -1,6 +1,6 @@ # Varag-Methode schreiben ## Lernziel - + [Musterlösung](solution/) Eine Varag-Methode schreiben. diff --git a/Vererbung_011/solution/readme.md b/Vererbung_011/solution/readme.md new file mode 100644 index 0000000..6eb5caf --- /dev/null +++ b/Vererbung_011/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Varag-Methode schreiben + +Musterlösung: + +[pr2.vererbung.vararg_summe](../../solutions/src/main/java/pr2/vererbung/vararg_summe/) diff --git a/Vererbung_012/readme.md b/Vererbung_012/readme.md index b8dc2dc..da8532d 100644 --- a/Vererbung_012/readme.md +++ b/Vererbung_012/readme.md @@ -1,6 +1,6 @@ # Vererbung von Figuren ## Lernziel - + [Musterlösung](solution/) Einfache Klassen schreiben und eine Vererbungshierarchie bilden. diff --git a/Vererbung_012/solution/readme.md b/Vererbung_012/solution/readme.md new file mode 100644 index 0000000..aa8e532 --- /dev/null +++ b/Vererbung_012/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Vererbung von Figuren + +Musterlösung: + +[pr2.vererbung.vererbung_geometrie](../../solutions/src/main/java/pr2/vererbung/vererbung_geometrie/) diff --git a/readme.md b/readme.md index a85d457..876d2ab 100644 --- a/readme.md +++ b/readme.md @@ -10,114 +10,114 @@ Hier finden Sie die **freiwilligen Übungen** zur Vorlesung Programmieren 2 (PR2 Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstattung.md). -| # | Kapitel | Thema | -|-----|-----------------------|---------------------------------------------------------------------------------------------------| -| 1. | Auffrischung | [String in Großbuchstaben umwandeln](Auffrischung_001/readme.md) | -| 2. | Auffrischung | [Labeled Break](Auffrischung_002/readme.md) | -| 3. | Auffrischung | [Passwortbewertung](Auffrischung_003/readme.md) | -| 4. | Auffrischung | [printf mit Formatstring](Auffrischung_004/readme.md) | -| 5. | Auffrischung | [Maximum in einem Array suchen](Auffrischung_005/readme.md) | -| 6. | Auffrischung | [Taschenrechner](Auffrischung_006/readme.md) | -| 7. | Einführung | [Java-Coding-Standard anwenden](Einfuehrung_001/readme.md) | -| 8. | Einführung | [JavaDoc schreiben](Einfuehrung_002/readme.md) | -| 9. | Einführung | [Klasse mit JUnit testen](Einfuehrung_003/readme.md) | -| 10. | Strukturierung | [Information-Hiding einer Klasse verbessern](Strukturierung_001/readme.md) | -| 11. | Strukturierung | [Vorhandene Bibliotheken als JAR einbinden](Strukturierung_002/readme.md) | -| 12. | Vererbung | [Final anwenden](Vererbung_001/readme.md) | -| 13. | Vererbung | [Figur und Rechteck](Vererbung_002/readme.md) | -| 14. | Vererbung | [Figur erweitern](Vererbung_003/readme.md) | -| 15. | Vererbung | [Figur noch einmal erweitern](Vererbung_004/readme.md) | -| 16. | Vererbung | [Konstruktoren schreiben](Vererbung_005/readme.md) | -| 17. | Vererbung | [Polymorphie einsetzen](Vererbung_006/readme.md) | -| 18. | Vererbung | [Singleton](Vererbung_007/readme.md) | -| 19. | Vererbung | [Statische Methoden und Attribute](Vererbung_008/readme.md) | -| 20. | Vererbung | [Methode überladen](Vererbung_009/readme.md) | -| 21. | Vererbung | [Methoden überschreiben](Vererbung_010/readme.md) | -| 22. | Vererbung | [Varag-Methode schreiben](Vererbung_011/readme.md) | -| 23. | Vererbung | [Vererbung von Figuren](Vererbung_012/readme.md) | -| 24. | Abstrakte Klassen | [Abstrakte Klassen](Abstrakte_Klassen_001/readme.md) | -| 25. | Abstrakte Klassen | [Abstrakte Klasse](Abstrakte_Klassen_002/readme.md) | -| 26. | Interfaces | [Comparable implementieren](Interfaces_001/readme.md) | -| 27. | Interfaces | [Interface Stack entwerfen](Interfaces_002/readme.md) | -| 28. | Interfaces | [Interface: Uebersetzer](Interfaces_003/readme.md) | -| 29. | Interfaces | [Interfaces anwenden und entwerfen](Interfaces_004/readme.md) | -| 30. | Object und Wrapper | [Deep-Copy mit `clone()`](Object_und_Wrapper_001/readme.md) | -| 31. | Object und Wrapper | [Clone](Object_und_Wrapper_002/readme.md) | -| 32. | Object und Wrapper | [`equals()` und `hashCode()` implementieren und nutzen](Object_und_Wrapper_003/readme.md) | -| 33. | Object und Wrapper | [equals und hashCode](Object_und_Wrapper_004/readme.md) | -| 34. | Object und Wrapper | [`toString()`-Methode implementieren](Object_und_Wrapper_005/readme.md) | -| 35. | Object und Wrapper | [Optimierung bei Integer](Object_und_Wrapper_006/readme.md) | -| 36. | Object und Wrapper | [Methoden der Wrapper-Klassen](Object_und_Wrapper_007/readme.md) | -| 37. | Enumerationen | [Eigene Enumeration schreiben und verwenden](Enumerationen_001/readme.md) | -| 38. | Enumerationen | [Enumeration schreiben](Enumerationen_002/readme.md) | -| 39. | Enumerationen | [Singleton-Eigenschaft von Enumerationen](Enumerationen_003/readme.md) | -| 40. | Enumerationen | [Stein, Papier, Schere, Echse, Spock](Enumerationen_004/readme.md) | -| 41. | Ausnahmen | [Ausnahmen testen](Ausnahmen_001/readme.md) | -| 42. | Ausnahmen | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Ausnahmen_002/readme.md) | -| 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | -| 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | -| 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | -| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | -| 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | -| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | -| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | -| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | -| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | -| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | -| 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | -| 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | -| 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | -| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | -| 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | -| 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | -| 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | -| 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | -| 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | -| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | -| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | -| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | -| 65. | Generische Typen | [Generische Klasse Pair erweitern: SamePair](Generische_Typen_004/readme.md) | -| 66. | Generische Typen | [PairList](Generische_Typen_005/readme.md) | -| 67. | Generische Typen | [Wildcard benutzen](Generische_Typen_006/readme.md) | -| 68. | Generische Typen | [Generische Queue](Generische_Typen_007/readme.md) | -| 69. | Generische Typen | [`super` und `extends` einsetzen](Generische_Typen_008/readme.md) | -| 70. | Generische Typen | [Generische Typen zusammen mit Wildcards einsetzen](Generische_Typen_009/readme.md) | -| 71. | Geschachtelte Klassen | [Eigene compare-Methode schreiben](Geschachtelte_Klassen_001/readme.md) | -| 72. | Geschachtelte Klassen | [Innere Klasse Beobachter](Geschachtelte_Klassen_002/readme.md) | -| 73. | Geschachtelte Klassen | [Callback mit anonymer Klasse realisieren](Geschachtelte_Klassen_003/readme.md) | -| 74. | Lambdas | [Comparator als Lambda](Lambdas_001/readme.md) | -| 75. | Lambdas | [Callback mit Lambda realisieren](Lambdas_002/readme.md) | -| 76. | Geschachtelte Klassen | [MatrixSuche](Geschachtelte_Klassen_001/readme.md) | -| 77. | Lambdas | [StringTransmogrifier](Lambdas_001/readme.md) | -| 78. | Lambdas | [StringTransmogrifier erweitern](Lambdas_002/readme.md) | -| 79. | Collections | [Iterator schreiben](Collections_001/readme.md) | -| 80. | Collections | [Iterator programmieren](Collections_002/readme.md) | -| 81. | Collections | [`List` und dessen Implementierungen](Collections_003/readme.md) | -| 82. | Collections | [`Map` verwenden](Collections_004/readme.md) | -| 83. | Collections | [ReverserGeneric](Collections_005/readme.md) | -| 84. | Collections | [Strings umgekehrt sortieren: Reverser](Collections_006/readme.md) | -| 85. | Collections | [`Set` und dessen Implementierungen](Collections_007/readme.md) | -| 86. | Collections | [CommandLineSorter](Collections_008/readme.md) | -| 87. | Collections | [CommandLineSorter -- Version 2](Collections_009/readme.md) | -| 88. | Collections | [`Comparator` verwenden und Objekte sortieren](Collections_010/readme.md) | -| 89. | Collections | [Wörterbuchprogramm](Collections_011/readme.md) | -| 90. | Streams | [Kleinbuchstaben in einem String zählen](Streams_001/readme.md) | -| 91. | Streams | [Buchstaben in einer Liste von Strings zählen](Streams_002/readme.md) | -| 92. | Streams | [Kleinbuchstaben in einem String zählen](Streams_003/readme.md) | -| 93. | Streams | [Liste filtern](Streams_004/readme.md) | -| 94. | Streams | [Streams mit interner Iteration](Streams_005/readme.md) | -| 95. | Streams | [Map und Filter auf Streams](Streams_006/readme.md) | -| 96. | Streams | [Map und Reduce auf Streams](Streams_007/readme.md) | -| 97. | Streams | [Reduce](Streams_008/readme.md) | -| 98. | Streams | [Summe über reduce bestimmen](Streams_009/readme.md) | -| 99. | Streams | [Wörter zählen](Streams_010/readme.md) | -| 100. | Threads | [Fakultät parallel berechnen](Threads_001/readme.md) | -| 101. | Threads | [Thread per interrupt beenden](Threads_002/readme.md) | -| 102. | Threads | [wait und notify benutzen](Threads_003/readme.md) | -| 103. | Threads | [Parallele Ausgaben erzeugen](Threads_004/readme.md) | -| 104. | Threads | [Race-Condition finden und beheben](Threads_005/readme.md) | -| 105. | Threads | [Stack und Heap unterscheiden](Threads_006/readme.md) | -| 106. | Threads | [synchronized verwenden](Threads_007/readme.md) | -| 107. | Threads | [Timer und TimerTask verwenden](Threads_008/readme.md) | -| 108. | Reflection | [Klasse per Reflection analysieren](Reflection_001/readme.md) | -| 109. | Reflection | [Objekte per Reflection erzeugen](Reflection_002/readme.md) | +| # | Kapitel | Thema | Musterlösung | +|-----|-----------------------|---------------------------------------------------------------------------------------------------|----------------| +| 1. | Auffrischung | [String in Großbuchstaben umwandeln](Auffrischung_001/readme.md) | [✅](Auffrischung_001/solution/) | +| 2. | Auffrischung | [Labeled Break](Auffrischung_002/readme.md) | [✅](Auffrischung_002/solution/) | +| 3. | Auffrischung | [Passwortbewertung](Auffrischung_003/readme.md) | [✅](Auffrischung_003/solution/) | +| 4. | Auffrischung | [printf mit Formatstring](Auffrischung_004/readme.md) | [✅](Auffrischung_004/solution/) | +| 5. | Auffrischung | [Maximum in einem Array suchen](Auffrischung_005/readme.md) | [✅](Auffrischung_005/solution/) | +| 6. | Auffrischung | [Taschenrechner](Auffrischung_006/readme.md) | [✅](Auffrischung_006/solution/) | +| 7. | Einführung | [Java-Coding-Standard anwenden](Einfuehrung_001/readme.md) | [✅](Einfuehrung_001/solution/) | +| 8. | Einführung | [JavaDoc schreiben](Einfuehrung_002/readme.md) | [✅](Einfuehrung_002/solution/) | +| 9. | Einführung | [Klasse mit JUnit testen](Einfuehrung_003/readme.md) | [✅](Einfuehrung_003/solution/) | +| 10. | Strukturierung | [Information-Hiding einer Klasse verbessern](Strukturierung_001/readme.md) | [✅](Strukturierung_001/solution/) | +| 11. | Strukturierung | [Vorhandene Bibliotheken als JAR einbinden](Strukturierung_002/readme.md) | [✅](Strukturierung_002/solution/) | +| 12. | Vererbung | [Final anwenden](Vererbung_001/readme.md) | [✅](Vererbung_001/solution/) | +| 13. | Vererbung | [Figur und Rechteck](Vererbung_002/readme.md) | [✅](Vererbung_002/solution/) | +| 14. | Vererbung | [Figur erweitern](Vererbung_003/readme.md) | [✅](Vererbung_003/solution/) | +| 15. | Vererbung | [Figur noch einmal erweitern](Vererbung_004/readme.md) | [✅](Vererbung_004/solution/) | +| 16. | Vererbung | [Konstruktoren schreiben](Vererbung_005/readme.md) | [✅](Vererbung_005/solution/) | +| 17. | Vererbung | [Polymorphie einsetzen](Vererbung_006/readme.md) | [✅](Vererbung_006/solution/) | +| 18. | Vererbung | [Singleton](Vererbung_007/readme.md) | [✅](Vererbung_007/solution/) | +| 19. | Vererbung | [Statische Methoden und Attribute](Vererbung_008/readme.md) | [✅](Vererbung_008/solution/) | +| 20. | Vererbung | [Methode überladen](Vererbung_009/readme.md) | [✅](Vererbung_009/solution/) | +| 21. | Vererbung | [Methoden überschreiben](Vererbung_010/readme.md) | [✅](Vererbung_010/solution/) | +| 22. | Vererbung | [Varag-Methode schreiben](Vererbung_011/readme.md) | [✅](Vererbung_011/solution/) | +| 23. | Vererbung | [Vererbung von Figuren](Vererbung_012/readme.md) | [✅](Vererbung_012/solution/) | +| 24. | Abstrakte Klassen | [Abstrakte Klassen](Abstrakte_Klassen_001/readme.md) | [✅](Abstrakte_Klassen_001/solution/) | +| 25. | Abstrakte Klassen | [Abstrakte Klasse](Abstrakte_Klassen_002/readme.md) | [✅](Abstrakte_Klassen_002/solution/) | +| 26. | Interfaces | [Comparable implementieren](Interfaces_001/readme.md) | [✅](Interfaces_001/solution/) | +| 27. | Interfaces | [Interface Stack entwerfen](Interfaces_002/readme.md) | [✅](Interfaces_002/solution/) | +| 28. | Interfaces | [Interface: Uebersetzer](Interfaces_003/readme.md) | [✅](Interfaces_003/solution/) | +| 29. | Interfaces | [Interfaces anwenden und entwerfen](Interfaces_004/readme.md) | [✅](Interfaces_004/solution/) | +| 30. | Object und Wrapper | [Deep-Copy mit `clone()`](Object_und_Wrapper_001/readme.md) | [✅](Object_und_Wrapper_001/solution/) | +| 31. | Object und Wrapper | [Clone](Object_und_Wrapper_002/readme.md) | [✅](Object_und_Wrapper_002/solution/) | +| 32. | Object und Wrapper | [`equals()` und `hashCode()` implementieren und nutzen](Object_und_Wrapper_003/readme.md) | [✅](Object_und_Wrapper_003/solution/) | +| 33. | Object und Wrapper | [equals und hashCode](Object_und_Wrapper_004/readme.md) | [✅](Object_und_Wrapper_004/solution/) | +| 34. | Object und Wrapper | [`toString()`-Methode implementieren](Object_und_Wrapper_005/readme.md) | [✅](Object_und_Wrapper_005/solution/) | +| 35. | Object und Wrapper | [Optimierung bei Integer](Object_und_Wrapper_006/readme.md) | [✅](Object_und_Wrapper_006/solution/) | +| 36. | Object und Wrapper | [Methoden der Wrapper-Klassen](Object_und_Wrapper_007/readme.md) | [✅](Object_und_Wrapper_007/solution/) | +| 37. | Enumerationen | [Eigene Enumeration schreiben und verwenden](Enumerationen_001/readme.md) | [✅](Enumerationen_001/solution/) | +| 38. | Enumerationen | [Enumeration schreiben](Enumerationen_002/readme.md) | [✅](Enumerationen_002/solution/) | +| 39. | Enumerationen | [Singleton-Eigenschaft von Enumerationen](Enumerationen_003/readme.md) | [✅](Enumerationen_003/solution/) | +| 40. | Enumerationen | [Stein, Papier, Schere, Echse, Spock](Enumerationen_004/readme.md) | [✅](Enumerationen_004/solution/) | +| 41. | Ausnahmen | [Ausnahmen testen](Ausnahmen_001/readme.md) | [✅](Ausnahmen_001/solution/) | +| 42. | Ausnahmen | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Ausnahmen_002/readme.md) | [✅](Ausnahmen_002/solution/) | +| 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | [✅](Ausnahmen_003/solution/) | +| 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | [✅](Ausnahmen_004/solution/) | +| 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | [✅](Ausnahmen_005/solution/) | +| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | | +| 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | | +| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | | +| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | | +| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | | +| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | | +| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | | +| 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | | +| 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | | +| 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | | +| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | | +| 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | | +| 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | | +| 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | | +| 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | | +| 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | | +| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | | +| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | | +| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | | +| 65. | Generische Typen | [Generische Klasse Pair erweitern: SamePair](Generische_Typen_004/readme.md) | | +| 66. | Generische Typen | [PairList](Generische_Typen_005/readme.md) | | +| 67. | Generische Typen | [Wildcard benutzen](Generische_Typen_006/readme.md) | | +| 68. | Generische Typen | [Generische Queue](Generische_Typen_007/readme.md) | | +| 69. | Generische Typen | [`super` und `extends` einsetzen](Generische_Typen_008/readme.md) | | +| 70. | Generische Typen | [Generische Typen zusammen mit Wildcards einsetzen](Generische_Typen_009/readme.md) | | +| 71. | Geschachtelte Klassen | [Eigene compare-Methode schreiben](Geschachtelte_Klassen_001/readme.md) | | +| 72. | Geschachtelte Klassen | [Innere Klasse Beobachter](Geschachtelte_Klassen_002/readme.md) | | +| 73. | Geschachtelte Klassen | [Callback mit anonymer Klasse realisieren](Geschachtelte_Klassen_003/readme.md) | | +| 74. | Lambdas | [Comparator als Lambda](Lambdas_001/readme.md) | | +| 75. | Lambdas | [Callback mit Lambda realisieren](Lambdas_002/readme.md) | | +| 76. | Geschachtelte Klassen | [MatrixSuche](Geschachtelte_Klassen_001/readme.md) | | +| 77. | Lambdas | [StringTransmogrifier](Lambdas_001/readme.md) | | +| 78. | Lambdas | [StringTransmogrifier erweitern](Lambdas_002/readme.md) | | +| 79. | Collections | [Iterator schreiben](Collections_001/readme.md) | | +| 80. | Collections | [Iterator programmieren](Collections_002/readme.md) | | +| 81. | Collections | [`List` und dessen Implementierungen](Collections_003/readme.md) | | +| 82. | Collections | [`Map` verwenden](Collections_004/readme.md) | | +| 83. | Collections | [ReverserGeneric](Collections_005/readme.md) | | +| 84. | Collections | [Strings umgekehrt sortieren: Reverser](Collections_006/readme.md) | | +| 85. | Collections | [`Set` und dessen Implementierungen](Collections_007/readme.md) | | +| 86. | Collections | [CommandLineSorter](Collections_008/readme.md) | | +| 87. | Collections | [CommandLineSorter -- Version 2](Collections_009/readme.md) | | +| 88. | Collections | [`Comparator` verwenden und Objekte sortieren](Collections_010/readme.md) | | +| 89. | Collections | [Wörterbuchprogramm](Collections_011/readme.md) | | +| 90. | Streams | [Kleinbuchstaben in einem String zählen](Streams_001/readme.md) | | +| 91. | Streams | [Buchstaben in einer Liste von Strings zählen](Streams_002/readme.md) | | +| 92. | Streams | [Kleinbuchstaben in einem String zählen](Streams_003/readme.md) | | +| 93. | Streams | [Liste filtern](Streams_004/readme.md) | | +| 94. | Streams | [Streams mit interner Iteration](Streams_005/readme.md) | | +| 95. | Streams | [Map und Filter auf Streams](Streams_006/readme.md) | | +| 96. | Streams | [Map und Reduce auf Streams](Streams_007/readme.md) | | +| 97. | Streams | [Reduce](Streams_008/readme.md) | | +| 98. | Streams | [Summe über reduce bestimmen](Streams_009/readme.md) | | +| 99. | Streams | [Wörter zählen](Streams_010/readme.md) | | +| 100. | Threads | [Fakultät parallel berechnen](Threads_001/readme.md) | | +| 101. | Threads | [Thread per interrupt beenden](Threads_002/readme.md) | | +| 102. | Threads | [wait und notify benutzen](Threads_003/readme.md) | | +| 103. | Threads | [Parallele Ausgaben erzeugen](Threads_004/readme.md) | | +| 104. | Threads | [Race-Condition finden und beheben](Threads_005/readme.md) | | +| 105. | Threads | [Stack und Heap unterscheiden](Threads_006/readme.md) | | +| 106. | Threads | [synchronized verwenden](Threads_007/readme.md) | | +| 107. | Threads | [Timer und TimerTask verwenden](Threads_008/readme.md) | | +| 108. | Reflection | [Klasse per Reflection analysieren](Reflection_001/readme.md) | | +| 109. | Reflection | [Objekte per Reflection erzeugen](Reflection_002/readme.md) | | diff --git a/solutions/src/main/java/pr2/auffrischung/grossmacher/Grossmacher.java b/solutions/src/main/java/pr2/auffrischung/grossmacher/Grossmacher.java new file mode 100644 index 0000000..2ed9101 --- /dev/null +++ b/solutions/src/main/java/pr2/auffrischung/grossmacher/Grossmacher.java @@ -0,0 +1,16 @@ +package pr2.auffrischung.grossmacher; + +public class Grossmacher { + + public static void main(String[] args) { + if (args.length < 1) { + System.err.println("Kein Argument angeben!"); + return; + } + + String ergebnis = args[0].toUpperCase(); + + System.out.printf("Ergebnis: %s%n", ergebnis); + System.out.printf("Zeichen : %d%n", ergebnis.length()); + } +} diff --git a/solutions/src/main/java/pr2/auffrischung/labeled_break/ArraySucher.java b/solutions/src/main/java/pr2/auffrischung/labeled_break/ArraySucher.java new file mode 100644 index 0000000..82e1359 --- /dev/null +++ b/solutions/src/main/java/pr2/auffrischung/labeled_break/ArraySucher.java @@ -0,0 +1,27 @@ +package pr2.auffrischung.labeled_break; + +public class ArraySucher { + + /** + * Sucht das erste Element, dass nicht 0 ist. + * + * @param array das Array in dem gesucht werden soll + * @return {@code true}, wenn ein Element gefunden wird, + * andernfalls {@code false}. + */ + public boolean suche(int[][] array) { + boolean found = false; + + outer: + for (int[] is : array) { + for (int i : is) { + if (i != 0) { + found = true; + break outer; + } + } + } + + return found; + } +} diff --git a/solutions/src/main/java/pr2/auffrischung/password/PasswortChecker.java b/solutions/src/main/java/pr2/auffrischung/password/PasswortChecker.java new file mode 100644 index 0000000..147b8be --- /dev/null +++ b/solutions/src/main/java/pr2/auffrischung/password/PasswortChecker.java @@ -0,0 +1,53 @@ +package pr2.auffrischung.password; + +public class PasswortChecker { + + private static final char[] NUMBERS = "1234567890".toCharArray(); + private static final char[] LOWERCASE + = "abcdefghijklmnopqrstuvwxyz".toCharArray(); + private static final char[] UPPERCASE + = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); + private static final char[] SPECIAL_CHARS = "!%()\"".toCharArray(); + + private static boolean contains(String string, char[] chars) { + for (char c : chars) { + if (string.indexOf(c) >= 0) { + return true; + } + } + return false; + } + + public static int checkPassword(String password) { + int points = 0; + + if (password.length() >= 8) { + points++; + } + + if (contains(password, NUMBERS) + && (contains(password, LOWERCASE) + || contains(password, UPPERCASE))) { + points++; + } + + if (contains(password, SPECIAL_CHARS)) { + points++; + } + + if (contains(password, LOWERCASE) && contains(password, UPPERCASE)) { + points++; + } + + return points; + } + + public static void main(String[] args) { + System.out.println(checkPassword("mutti")); + System.out.println(checkPassword("Mutti")); + System.out.println(checkPassword("mutti123")); + System.out.println(checkPassword("Mutti123")); + System.out.println(checkPassword("Mutti123!%")); + System.out.println(checkPassword("1234")); + } +} diff --git a/solutions/src/main/java/pr2/auffrischung/printf/DoubleFormatter.java b/solutions/src/main/java/pr2/auffrischung/printf/DoubleFormatter.java new file mode 100644 index 0000000..788b1a6 --- /dev/null +++ b/solutions/src/main/java/pr2/auffrischung/printf/DoubleFormatter.java @@ -0,0 +1,18 @@ +package pr2.auffrischung.printf; + +public class DoubleFormatter { + + public static void printDouble(double d) { + System.out.printf("%.3f%n", d); + } + + public static void main(String[] args) { + printDouble(1.0); + printDouble(10.1); + printDouble(2.01); + printDouble(2.001); + printDouble(2.0001); + printDouble(2.0004); + printDouble(2.0005); + } +} diff --git a/solutions/src/main/java/pr2/auffrischung/suchemax/GroessteZahl.java b/solutions/src/main/java/pr2/auffrischung/suchemax/GroessteZahl.java new file mode 100644 index 0000000..92f89b7 --- /dev/null +++ b/solutions/src/main/java/pr2/auffrischung/suchemax/GroessteZahl.java @@ -0,0 +1,21 @@ +package pr2.auffrischung.suchemax; + +public class GroessteZahl { + + public int sucheMax(int[] zahlen) { + int max = Integer.MIN_VALUE; + + for (int zahl : zahlen) { + max = Math.max(max, zahl); + } + + return max; + } + + public static void main(String[] args) { + GroessteZahl g = new GroessteZahl(); + System.out.println(g.sucheMax(new int[] {1, 5, 8, 2, 0})); + System.out.println(g.sucheMax(new int[] {-1, -5, -8, -2, -20})); + System.out.println(g.sucheMax(new int[] {10000, -10000, 1, 2, 33})); + } +} diff --git a/solutions/src/main/java/pr2/auffrischung/taschenrechner/Taschenrechner.java b/solutions/src/main/java/pr2/auffrischung/taschenrechner/Taschenrechner.java new file mode 100644 index 0000000..ecba9e2 --- /dev/null +++ b/solutions/src/main/java/pr2/auffrischung/taschenrechner/Taschenrechner.java @@ -0,0 +1,25 @@ +package pr2.auffrischung.taschenrechner; + +public class Taschenrechner { + + public double rechne(double o1, char op, double o2) { + return switch (op) { + case '+' -> o1 + o2; + case '-' -> o1 - o2; + case '*' -> o1 * o2; + case '/' -> o1 / o2; + case '^' -> Math.pow(o1, o2); + default -> Double.NaN; + }; +// return 0.0; + } + + public static void main(String[] args) { + Taschenrechner t = new Taschenrechner(); + System.out.println(t.rechne(1, '+', 2)); + System.out.println(t.rechne(1, '-', 2)); + System.out.println(t.rechne(2, '*', 2)); + System.out.println(t.rechne(4, '/', 2)); + System.out.println(t.rechne(2, '^', 32)); + } +} diff --git a/solutions/src/main/java/pr2/enums/eigene/Wuerfel.java b/solutions/src/main/java/pr2/enums/eigene/Wuerfel.java new file mode 100644 index 0000000..347679b --- /dev/null +++ b/solutions/src/main/java/pr2/enums/eigene/Wuerfel.java @@ -0,0 +1,9 @@ +package pr2.enums.eigene; + +import java.util.Random; + +/** + * Ein einfacher Würfel. + */ +public class Wuerfel { + diff --git a/solutions/src/main/java/pr2/enums/eigene/WuerfelTyp.java b/solutions/src/main/java/pr2/enums/eigene/WuerfelTyp.java new file mode 100644 index 0000000..c17f4fc --- /dev/null +++ b/solutions/src/main/java/pr2/enums/eigene/WuerfelTyp.java @@ -0,0 +1,71 @@ + +package pr2.enums.eigene; + +/** + * Enumeration für die verschiedenen Würfel-Typen. + */ +public enum WuerfelTyp { + + /** + * 4-seitiger Würfel. + */ + D4(4), + + /** + * 6-seitiger Würfel. + */ + D6(6), + + /** + * 8-seitiger Würfel. + */ + D8(8), + + /** + * 10-seitiger Würfel. + */ + D10(10), + + /** + * 12-seitiger Würfel. + */ + D12(12), + + /** + * 20-seitiger Würfel. + */ + D20(20); + + /** + * Anzahl der Seiten. + */ + private final int seiten; + + /** + * Neue Instanz anlegen. + * + * @param seiten Anzahl der Seiten. + */ + WuerfelTyp(int seiten) { + this.seiten = seiten; + } + + /** + * Anzahl der Seiten. + * + * @return Anzahl der Seiten. + */ + public int getSeiten() { + return seiten; + } + + /** + * Durchschnittliche Augenzahl bei einer großen Anzahl von + * Würfen. + * + * @return Durchschnittliche Augenzahl. + */ + public double average() { + return 0.5 * (seiten + 1); + } +} diff --git a/solutions/src/main/java/pr2/enums/eigene/test/WuerfelTest.java b/solutions/src/main/java/pr2/enums/eigene/test/WuerfelTest.java new file mode 100644 index 0000000..793c803 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/eigene/test/WuerfelTest.java @@ -0,0 +1,24 @@ +package pr2.enums.eigene.test; + +import org.junit.jupiter.api.Test; +import pr2.enums.eigene.Wuerfel; +import pr2.enums.eigene.WuerfelTyp; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Test für die Würfel. + */ +public class WuerfelTest { + + /** + * Anzahl der Durchläufe (Gesetz der großen Zahl!). + */ + private static final int RUNS = 10000000; + + @Test + void testFairness() { + for (WuerfelTyp typ : WuerfelTyp.values()) { + internalTestFairness(new Wuerfel(typ), typ.average()); + } + } diff --git a/solutions/src/main/java/pr2/enums/filme/LieblingsFilme.java b/solutions/src/main/java/pr2/enums/filme/LieblingsFilme.java new file mode 100644 index 0000000..7ae95b1 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/filme/LieblingsFilme.java @@ -0,0 +1,50 @@ +package pr2.enums.filme; + +public enum LieblingsFilme { + + /** + * Pulp Fiction. + */ + PULP_FICTION("Pulp Fiction", "Quentin Tarantino", 9), + /** + * Fight Club. + */ + FIGHT_CLUB("Fight Club", "David Fincher", 9), + /** + * Twelve Monkeys. + */ + TWELVE_MONKEYS("Twelve Monkeys", "Terry Giliam", 8), + /** + * Killer Tomatos. + */ + KILLER_TOMATOES("Attack of the Killer Tomatoes", "John de Bello", 4); + + private final String name; + private final int bewertung; + private final String regisseur; + + private LieblingsFilme(String name, String regisseur, + int bewertung) { + this.name = name; + this.regisseur = regisseur; + this.bewertung = bewertung; + } + + public String getName() { + return name; + } + + public int getBewertung() { + return bewertung; + } + + public String getRegisseur() { + return regisseur; + } + + @Override + public String toString() { + return String.format("'%s' von %s; Bewertung %d", name, + regisseur, bewertung); + } +} diff --git a/solutions/src/main/java/pr2/enums/filme/Main.java b/solutions/src/main/java/pr2/enums/filme/Main.java new file mode 100644 index 0000000..8a53673 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/filme/Main.java @@ -0,0 +1,9 @@ +package pr2.enums.filme; + +public class Main { + public static void main(String[] args) { + for (LieblingsFilme f : LieblingsFilme.values()) { + System.out.println(f); + } + } +} diff --git a/solutions/src/main/java/pr2/enums/schnick/Move.java b/solutions/src/main/java/pr2/enums/schnick/Move.java new file mode 100644 index 0000000..eccdd75 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/schnick/Move.java @@ -0,0 +1,46 @@ +package pr2.enums.schnick; + +public enum Move { + /** + * Konstante für Schere. + */ + SCISSORS("Scissors", "s"), + + /** + * Konstante für Papier. + */ + PAPER("Paper", "p"), + + /** + * Konstante für Stein. + */ + ROCK("Rock", "r"); + + private final String name; + private final String key; + + private Move(String name, String key) { + this.name = name; + this.key = key; + } + + @Override + public String toString() { + return name; + } + + /** + * Returns the move corresponding to the key entered. + * + * @param key the key pressed. + * @return the corresponding move. + */ + public static Move find(String key) { + for (Move m : values()) { + if (m.key.equals(key.toLowerCase())) { + return m; + } + } + return null; + } +} diff --git a/solutions/src/main/java/pr2/enums/schnick/SchnickSchnackSchnuck.java b/solutions/src/main/java/pr2/enums/schnick/SchnickSchnackSchnuck.java new file mode 100644 index 0000000..68ada87 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/schnick/SchnickSchnackSchnuck.java @@ -0,0 +1,89 @@ +package pr2.enums.schnick; + +import java.util.Random; +import java.util.Scanner; + +/** + * Schick - Schnack - Schnuck (Rock - Paper - Scissors). + */ +public class SchnickSchnackSchnuck { + + /** + * Vergleicht den Zug zweier Spieler. + * + * @param a Zug von Spieler a. + * @param b Zug von Spieler b. + * @return 1 spieler a hat gewonnen, 0, unentschieden, -1 spieler b + * hat gewonnen. + */ + private static int compare(Move a, Move b) { + + if (a == b) { + return 0; + } + else if (a == Move.SCISSORS && b == Move.PAPER) { + return 1; + } + else if (a == Move.ROCK && b == Move.SCISSORS) { + return 1; + } + else if (a == Move.PAPER && b == Move.ROCK) { + return 1; + } + else { + return compare(b, a) * -1; + } + } + + public static void main(String[] args) { + + Scanner scanner = new Scanner(System.in); + Random rnd = new Random(); + + int pointsPlayer = 0; + int pointsComputer = 0; + + // Play three rounds + for (int i = 0; i < 3; i++) { + + // Read the player's choice + Move movePlayer = null; + + while (movePlayer == null) { + System.out.printf( + "\nRunde %s: Dein Zug ([r]rock, [p]aper, [s]cissors)? ", + i); + String move = scanner.nextLine().trim(); + movePlayer = Move.find(move); + } + + // Random move of the computer + Move moveComputer = + Move.values()[rnd.nextInt(2)]; + + // Compare moves + int winner = compare(movePlayer, moveComputer); + + String winnerText; + + if (winner == 1) { + pointsPlayer++; + winnerText = "Du hast gewonnen"; + } else if (winner == -1) { + pointsComputer++; + winnerText = "Der Computer hat gewonnen"; + } else { + winnerText = "Unentschieden"; + } + System.out.printf("%s: %s, Computer: %s - [%d:%d]\n", + winnerText, + movePlayer, moveComputer, + pointsPlayer, pointsComputer); + } + + System.out.printf( + "\nErgebnis - Du %d Punkt(e), " + + "Computer %d Punkt(e)", + pointsPlayer, pointsComputer); + } +} diff --git a/solutions/src/main/java/pr2/enums/singleton/MyEnum.java b/solutions/src/main/java/pr2/enums/singleton/MyEnum.java new file mode 100644 index 0000000..be83cc0 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/singleton/MyEnum.java @@ -0,0 +1,7 @@ +package pr2.enums.singleton; + +enum MyEnum { + A, + B, + C; +} diff --git a/solutions/src/main/java/pr2/enums/singleton/SingletonBeweis.java b/solutions/src/main/java/pr2/enums/singleton/SingletonBeweis.java new file mode 100644 index 0000000..327cf52 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/singleton/SingletonBeweis.java @@ -0,0 +1,14 @@ +package pr2.enums.singleton; + +public class SingletonBeweis { + + public static void main(String[] args) { + MyEnum e1 = MyEnum.A; + MyEnum e2 = MyEnum.valueOf("A"); + MyEnum e3 = MyEnum.values()[0]; + + System.out.println(e1 == e2); + System.out.println(e2 == e3); + System.out.println(e1 == e3); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/CrypterCaesar.java b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/CrypterCaesar.java new file mode 100644 index 0000000..5b9f0ab --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/CrypterCaesar.java @@ -0,0 +1,164 @@ +package pr2.exceptions.ausnahmen_testen; + +/** + * Implementierung einer Caesar-Verschlüsselung. + *

+ * Der Eingabetext ({@literal message}) darf nur aus den Groß-Buchstaben A-Z + * bestehen. Alle anderen Zeichen (einschließlich der Leerzeichen) führen zu + * einer entsprechenden Ausnahme. + *

+ * Dasselbe gilt für die Entschlüsselung. Auch hier dürfen nur gültige + * Zeichen auftauchen. Andernfalls kommt es zu einer Ausnahme. + *

+ * Der Schlüssel darf nur aus einem einzelnen Zeichen bestehen und muss + * ebenfalls aus dem Bereich A-Z stammen. Kleinbuchstaben oder andere + * Zeichen führen zu einer Ausnahme. + *

+ * Zwischen den beiden Methoden muss bei gleichem Schlüssel {@code key} + * folgendes gelten: + *

+ * {@code text.equals(decrypt(key, encrypt(key, text)) == true}. + */ +public class CrypterCaesar { + + /** + * Gültige Zeichen für Schlüssel und Text. + */ + protected static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * Verschlüsselt den gegebenen Text mit dem angegebenen Schlüssel. + * + * @param key Schlüssel, der verwendet werden soll. + * @param message Nachricht, die Verschlüsselt werden soll. + * @return verschlüsselter Text. + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + public String encrypt(String key, String message) + throws IllegalMessageException, IllegalKeyException { + + checkKeyAndMessage(key, message); + + int shift = key.charAt(0) - 'A' + 1; + return shift(message, shift); + } + + /** + * Entschlüsselt den gegebenen Text mit dem angegebenen Schlüssel. + * + * @param key Schlüssel, der verwendet werden soll. + * @param cypherText Nachricht, die entschlüsselt werden soll. + * @return entschlüsselter Text. + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + public String decrypt(String key, String cypherText) + throws IllegalKeyException, IllegalMessageException { + + checkKeyAndMessage(key, cypherText); + + int shift = key.charAt(0) - 'A' + 1; + return shift(cypherText, -shift); + } + + /** + * Verschiebt die Zeichen im Text um den gegebenen Faktor. + * + * @param text Nachricht + * @param shift Verschiebefaktor + * @return das Ergebnis als String + */ + private String shift(String text, int shift) { + + StringBuilder result = new StringBuilder(); + + for (char c : text.toCharArray()) { + char newChar = (char) (c + shift); + + if (newChar > 'Z') { + // Überlauf nach hinten + newChar = (char) (newChar - ('Z' - 'A' + 1)); + } + else if (newChar < 'A') { + // Überlauf nach vorne + newChar = (char) (newChar + ('Z' - 'A' + 1)); + } + + result.append(newChar); + } + + return result.toString(); + } + + /** + * Prüft Schlüssel und Nachricht. + * + * @param key der Schlüssel + * @param message die Nachricht + * @throws IllegalKeyException Schlüssel nicht OK + * @throws IllegalMessageException Nachricht nicht OK + */ + private void checkKeyAndMessage(String key, String message) + throws IllegalKeyException, IllegalMessageException { + + if (!checkKey(key)) { + throw new IllegalKeyException(key); + } + + if (!checkCharacters(message, ALPHABET)) { + throw new IllegalMessageException(key); + } + } + + /** + * Testet den Schlüssel auf Korrektheit: Er muss mindestens die Länge 1 + * haben und darf nur Zeichen von A-Z enthalten. + * + * @param key zu testender Schlüssel + * @return {@code true} if characters are ok, otherwise {@code false} + */ + protected boolean checkKey(String key) { + + if (key.length() != 1) { + return false; + } + + return checkCharacters(key, ALPHABET); + } + + /** + * Checks the given input to ensure that it only contains the given + * character set and no other characters. + * + * @param inputChars the string to be checked + * @param charSet a string containing all allowed characters + * @return {@code true} if characters are ok, otherwise {@code false} + */ + protected boolean checkCharacters(char[] inputChars, String charSet) { + + for (char c : inputChars) { + if (charSet.indexOf(c) == -1) { + return false; + } + } + + return true; + } + + /** + * Checks the given input to ensure that it only contains the given + * character set and no other characters. + * + * @param input the string to be checked + * @param charSet a string containing all allowed characters + * @return {@code true} if characters are ok, otherwise {@code false} + */ + protected boolean checkCharacters(String input, String charSet) { + return checkCharacters(input.toCharArray(), charSet); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalKeyException.java b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalKeyException.java new file mode 100644 index 0000000..469e5bf --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalKeyException.java @@ -0,0 +1,31 @@ +package pr2.exceptions.ausnahmen_testen; + +/** + * Ungültiger Schlüssel. + */ +public class IllegalKeyException extends Exception { + + /** + * Legt eine neue Ausnahme an. + */ + public IllegalKeyException() { + super(); + } + + /** + * Legt eine neue Ausnahme an. + * + * @param message die Nachricht. + */ + public IllegalKeyException(String message) { + super(message); + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return getMessage(); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalMessageException.java b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalMessageException.java new file mode 100644 index 0000000..141a2b7 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalMessageException.java @@ -0,0 +1,31 @@ +package pr2.exceptions.ausnahmen_testen; + +/** + * Ungültige Nachricht. + */ +public class IllegalMessageException extends Exception { + + /** + * Legt eine neue Ausnahme an. + */ + public IllegalMessageException() { + super(); + } + + /** + * Legt eine neue Ausnahme an. + * + * @param message die Nachricht. + */ + public IllegalMessageException(String message) { + super(message); + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return getMessage(); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/test/CaesarTest.java b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/test/CaesarTest.java new file mode 100644 index 0000000..edc2ebc --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/test/CaesarTest.java @@ -0,0 +1,149 @@ +package pr2.exceptions.ausnahmen_testen.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pr2.exceptions.ausnahmen_testen.CrypterCaesar; +import pr2.exceptions.ausnahmen_testen.IllegalKeyException; +import pr2.exceptions.ausnahmen_testen.IllegalMessageException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +/** + * Testklasse für die Verschlüsselung. + */ +public class CaesarTest { + + + /** + * Testet auf falschen Schlüssel. + * + * @throws pr2.exceptions.ausnahmen_testen.IllegalMessageException + * Wird geworfen, wenn die Nachricht ungültig ist. + * @throws pr2.exceptions.ausnahmen_testen.IllegalKeyException + * Wird geworfen, wenn der Schlüssel ungültig ist. + */ + @Test + void testWrongKey1() + throws IllegalKeyException, IllegalMessageException { + + String key = "AB"; + CrypterCaesar c = new CrypterCaesar(); + + Assertions.assertThrows(IllegalKeyException.class, () -> { + c.encrypt(key, "HALLO"); + }); + } + + /** + * Testet auf falschen Schlüssel. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongKey2() + throws IllegalKeyException, IllegalMessageException { + String key = "0"; + CrypterCaesar c = new CrypterCaesar(); + Assertions.assertThrows(IllegalKeyException.class, () -> { + c.encrypt(key, "HALLO"); + }); + } + + /** + * Testet auf falsche Nachricht. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongMessage1() + throws IllegalKeyException, IllegalMessageException { + String key = "K"; + CrypterCaesar c = new CrypterCaesar(); + + Assertions.assertThrows(IllegalKeyException.class, () -> { + c.encrypt(key, "üäaD&"); + }); + } + + /** + * Testet auf falsche Nachricht. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongMessage2() + throws IllegalKeyException, IllegalMessageException { + String key = "K"; + CrypterCaesar c = new CrypterCaesar(); + + Assertions.assertThrows(IllegalKeyException.class, () -> { + c.encrypt(key, "üäaD&"); + }); + } + + /** + * Testet auf falsche Nachricht. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongCypher1() + throws IllegalKeyException, IllegalMessageException { + String key = "K"; + CrypterCaesar c = new CrypterCaesar(); + + Assertions.assertThrows(IllegalKeyException.class, () -> { + c.decrypt(key, "üäaD&"); + }); + } + + /** + * Testet auf falsche Nachricht. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongCypher2() + throws IllegalKeyException, IllegalMessageException { + String key = "K"; + CrypterCaesar c = new CrypterCaesar(); + Assertions.assertThrows(IllegalKeyException.class, () -> { + c.decrypt(key, "DIESiSTEINTEST&"); + }); + } + + + /** + * Testet die Verschlüsselung an sich. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testCaesar() + throws IllegalKeyException, IllegalMessageException { + String klarText = "KATHARGOMUSSFALLEN"; + CrypterCaesar c = new CrypterCaesar(); + assertEquals(klarText, c.decrypt("C", c.encrypt("C", klarText))); + assertEquals("FDHVDU", c.encrypt("C", "CAESAR")); + assertEquals(klarText, c.encrypt("Z", klarText)); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/Fuse.java b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/Fuse.java new file mode 100644 index 0000000..6f30f3e --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/Fuse.java @@ -0,0 +1,58 @@ +package pr2.exceptions.eigene_ausnahme; + +/** + * Eine Sicherung im Stromkreis. + */ +public class Fuse { + + /** + * 16 Ampere-Sicherung. + */ + public static final int A16 = 16; + + /** + * 25 Ampere-Sicherung. + */ + public static final int A25 = 25; + + /** + * 32 Ampere-Sicherung. + */ + public static final int A32 = 32; + + /** + * Strom, bei dem die Sicherung auslöst. + */ + private final int tripCurrent; + + /** + * Legt eine neue Sicherung an. + * + * @param tripCurrent Strom, bei dem die Sicherung auslösen soll. + * @throws IllegalCurrentException Ausnahme bei einem + * ungültigen Spannungswert. + */ + public Fuse(int tripCurrent) throws IllegalCurrentException { + switch (tripCurrent) { + case A16: + case A25: + case A32: + this.tripCurrent = tripCurrent; + break; + default: + throw new IllegalCurrentException(tripCurrent); + } + } + + /** + * Die Sicherung benutzen. + * + * @param current Strom, der durch die Sicherung fließt. + * @throws FuseTrippedException wird geworfen, wenn der Srom zu groß wird. + */ + public void use(int current) throws FuseTrippedException { + if (current > tripCurrent) { + throw new FuseTrippedException(current, tripCurrent); + } + } +} diff --git a/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/FuseTrippedException.java b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/FuseTrippedException.java new file mode 100644 index 0000000..82308a4 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/FuseTrippedException.java @@ -0,0 +1,37 @@ +package pr2.exceptions.eigene_ausnahme; + +/** + * Ausnahme, wenn die Sicherung auslöst. + */ +public class FuseTrippedException extends Exception { + /** + * Strom, bei dem die Sicherung ausgelöst hat. + */ + private final int current; + + /** + * Auslösestrom der Sicherung. + */ + private final int tripCurrent; + + /** + * Erzeugt eine neue Ausnahme. + * + * @param current Strom, bei dem die Sicherung ausgelöst hat. + * @param tripCurrent Auslösestrom der Sicherung. + */ + public FuseTrippedException(int current, int tripCurrent) { + super(); + this.current = current; + this.tripCurrent = tripCurrent; + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return String.format("Maximaler Strom: %d, Auslösestrom: %d", + tripCurrent, current); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/IllegalCurrentException.java b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/IllegalCurrentException.java new file mode 100644 index 0000000..980783e --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/IllegalCurrentException.java @@ -0,0 +1,30 @@ +package pr2.exceptions.eigene_ausnahme; + +/** + * Ausnahme, wenn eine Sicherung angelegt werden soll, die es nicht gibt. + */ +public class IllegalCurrentException extends Exception { + + /** + * Übergebener Strom. + */ + private final int givenValue; + + /** + * Erzeugt eine neue Ausnahme. + * + * @param givenValue gegebener Strom. + */ + public IllegalCurrentException(int givenValue) { + super(); + this.givenValue = givenValue; + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return String.format("Falscher Wert %d", givenValue); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/test/FuseTest.java b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/test/FuseTest.java new file mode 100644 index 0000000..5796211 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/test/FuseTest.java @@ -0,0 +1,158 @@ +package pr2.exceptions.eigene_ausnahme.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pr2.exceptions.eigene_ausnahme.Fuse; +import pr2.exceptions.eigene_ausnahme.FuseTrippedException; +import pr2.exceptions.eigene_ausnahme.IllegalCurrentException; + +/** + * Testet die Sicherung. + */ +public class FuseTest { + + + /** + * Testet die Erzeugung von Sicherungen mit gültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid() throws IllegalCurrentException { + new Fuse(Fuse.A16); + new Fuse(Fuse.A25); + new Fuse(Fuse.A32); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid1() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(15); + }); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid2() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(-1); + }); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid3() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(0); + }); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid4() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(Integer.MAX_VALUE); + }); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid5() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(Integer.MIN_VALUE); + }); + } + + /** + * Testet das Auslösen der Sicherung. + * + * @throws FuseTrippedException Sicherung hat ausgelöst. + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testTripping1() + throws FuseTrippedException, IllegalCurrentException { + + Fuse f = new Fuse(Fuse.A16); + f.use(5); + f.use(16); + f.use(0); + + f = new Fuse(Fuse.A25); + f.use(5); + f.use(16); + f.use(25); + + + Assertions.assertThrows(FuseTrippedException.class, () -> { + Fuse f2 = new Fuse(Fuse.A16); + f2.use(0); + f2.use(16); + f2.use(25); + }); + } + + /** + * Testet das Auslösen der Sicherung. + * + * @throws FuseTrippedException Sicherung hat ausgelöst. + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testTripping2() + throws FuseTrippedException, IllegalCurrentException { + Assertions.assertThrows(FuseTrippedException.class, () -> { + new Fuse(Fuse.A16).use(17); + }); + } + + /** + * Testet das Auslösen der Sicherung. + * + * @throws FuseTrippedException Sicherung hat ausgelöst. + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testTripping3() + throws FuseTrippedException, IllegalCurrentException { + + Assertions.assertThrows(FuseTrippedException.class, () -> { + new Fuse(Fuse.A16).use(Integer.MAX_VALUE); + }); + } + + /** + * Testet das Auslösen der Sicherung. + * + * @throws FuseTrippedException Sicherung hat ausgelöst. + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testTripping4() + throws FuseTrippedException, IllegalCurrentException { + Assertions.assertThrows(FuseTrippedException.class, () -> { + new Fuse(Fuse.A32).use(40); + }); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/fakultaet/Fakultaet.java b/solutions/src/main/java/pr2/exceptions/fakultaet/Fakultaet.java new file mode 100644 index 0000000..736edf6 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/fakultaet/Fakultaet.java @@ -0,0 +1,18 @@ +package pr2.exceptions.fakultaet; + +public class Fakultaet { + + public int fact(int n) throws FakultaetException { + if (n < 0) { + throw new FakultaetException("Keine negativen Zahlen!", n); + } + else if (n > 20) { + throw new FakultaetException("Keine Zahlen > 20", n); + } + return factIntern(n); + } + + private int factIntern(int n) { + return (n == 0) ? 1 : factIntern(n - 1) * n; + } +} diff --git a/solutions/src/main/java/pr2/exceptions/fakultaet/FakultaetException.java b/solutions/src/main/java/pr2/exceptions/fakultaet/FakultaetException.java new file mode 100644 index 0000000..5c47848 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/fakultaet/FakultaetException.java @@ -0,0 +1,15 @@ +package pr2.exceptions.fakultaet; + +public class FakultaetException extends Exception { + + private final int zahl; + + public FakultaetException(String message, int zahl) { + super(message); + this.zahl = zahl; + } + + public int getZahl() { + return zahl; + } +} diff --git a/solutions/src/main/java/pr2/exceptions/fakultaet/test/FakultaetTest.java b/solutions/src/main/java/pr2/exceptions/fakultaet/test/FakultaetTest.java new file mode 100644 index 0000000..3892e52 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/fakultaet/test/FakultaetTest.java @@ -0,0 +1,38 @@ +package pr2.exceptions.fakultaet.test; + +import org.junit.jupiter.api.Test; +import pr2.exceptions.fakultaet.Fakultaet; +import pr2.exceptions.fakultaet.FakultaetException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class FakultaetTest { + + @Test + void testFact() throws FakultaetException { + Fakultaet f = new Fakultaet(); + assertEquals(1, f.fact(0)); + assertEquals(1, f.fact(1)); + assertEquals(2, f.fact(2)); + assertEquals(6, f.fact(3)); + assertEquals(24, f.fact(4)); + assertEquals(3628800, f.fact(10)); + } + + @Test + void testFactEx1() { + assertThrows(FakultaetException.class, () -> { + Fakultaet f = new Fakultaet(); + f.fact(-1); + }); + } + + @Test + void testFactEx2() { + assertThrows(FakultaetException.class, () -> { + Fakultaet f = new Fakultaet(); + f.fact(21); + }); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/handle_or_declare/Buchstabenzaehler.java b/solutions/src/main/java/pr2/exceptions/handle_or_declare/Buchstabenzaehler.java new file mode 100644 index 0000000..895b5ab --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/handle_or_declare/Buchstabenzaehler.java @@ -0,0 +1,124 @@ +package pr2.exceptions.handle_or_declare; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Scanner; + +/** + * Anwendung, die die Buchstabenhäufigkeit in einem Text analysiert. + */ +public class Buchstabenzaehler { + + /** + * Einstiegspunkt in das Programm. + * + * @param args Kommandozeilenargumente + */ + public static void main(String[] args) { + Buchstabenzaehler bs = new Buchstabenzaehler(); + + try { + bs.run(); + } + catch (StatistikException e) { + System.out.println("Statistik-Fehler: " + e); + } + } + + /** + * Startet den Buchstabenzaehler. + * + * @throws StatistikException Fehler bei der Berechnung der + * Buchstabenhäufigkeit. + */ + private void run() throws StatistikException { + System.out.print("Bitte geben Sie den Dateinamen an: "); + Scanner scanner = new Scanner(System.in); + String dateiname = scanner.nextLine(); + + int[] statistik; + + + + + try { + statistik = parseFile("assets/" + dateiname); + printStatistik(statistik); + } + catch (FileNotFoundException e) { + System.out.println("Datei gibt es nicht"); + } + catch (IOException e) { + System.out.println("Fehler beim Zugriff auf die Datei: " + e); + } + finally { + scanner.close(); + } + } + + /** + * Druckt die Statistik aus. + * + * @param statistik Statistik + * @throws StatistikException Fehler bei den Eingabedaten + */ + private void printStatistik(int[] statistik) throws StatistikException { + + int summe = 0; + + for (int haeufigkeit : statistik) { + summe += haeufigkeit; + } + + double prozentSumme = 0.0; + + for (char c = 'a'; c <= 'z'; c++) { + int anzahl = statistik[c - 'a']; + double prozent = (double) anzahl / (double) summe * 100; + System.out.printf("%s: %.2f%% %n", "" + c, prozent); + + prozentSumme += prozent; + } + + if ((prozentSumme < 99.0) || (prozentSumme > 101.0)) { + throw new StatistikException(Double.toString(prozentSumme)); + } + + System.out.printf("Summe: %.2f%% %n", prozentSumme); + } + + /** + * Analysiert die übergebene Datei und berechnet die Buchstabenhäufigkeit. + * + * @param filename Dateiname + * @return die Buchstabenhäufigkeit. Das 'a' ist das erste Element, + * das 'b' das zweite etc. + * @throws IOException generelles IO-Problem + * @throws FileNotFoundException Datei gibt es nicht + */ + private int[] parseFile(String filename) + throws IOException, FileNotFoundException { + + int[] statistik = new int['z' - 'a' + 1]; + + BufferedReader br = new BufferedReader(new FileReader(filename)); + + String line; + + while ((line = br.readLine()) != null) { + char[] chars = line.toLowerCase().toCharArray(); + + for (char c : chars) { + if (('a' <= c) && (c <= 'z')) { + statistik[c - 'a']++; + } + } + } + + br.close(); + + return statistik; + } +} diff --git a/solutions/src/main/java/pr2/exceptions/handle_or_declare/StatistikException.java b/solutions/src/main/java/pr2/exceptions/handle_or_declare/StatistikException.java new file mode 100644 index 0000000..0d83170 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/handle_or_declare/StatistikException.java @@ -0,0 +1,31 @@ +package pr2.exceptions.handle_or_declare; + +/** + * Ausnahme, wenn die Statisitk nicht konsistent ist. + */ +public class StatistikException extends Exception { + + /** + * Legt eine neue Ausnahme an. + */ + public StatistikException() { + super(); + } + + /** + * Legt eine neue Ausnahme an. + * + * @param message die Nachricht. + */ + public StatistikException(String message) { + super(message); + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return getMessage(); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/try_catch/Zahlenraten.java b/solutions/src/main/java/pr2/exceptions/try_catch/Zahlenraten.java new file mode 100644 index 0000000..712287d --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/try_catch/Zahlenraten.java @@ -0,0 +1,67 @@ +package pr2.exceptions.try_catch; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Random; + +/** + * Ein simples Zahlenraten-Spiel. + */ +public final class Zahlenraten { + + /** + * Liest einen String von der Tastatur. + * + * @return der gelesene String + * @throws IOException Probleme mit der Console + */ + private static String readNumber() throws IOException { + BufferedReader br = + new BufferedReader(new InputStreamReader(System.in)); + return br.readLine(); + } + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente + */ + public static void main(String[] args) { + + // zu ratende Zahl bestimmen + int zahl = new Random().nextInt(100) + 1; + + int versuche = 0; + + while (true) { + System.out.print("Bitte geben Sie eine Zahl ein: "); + + int geraten; + + try { + geraten = Integer.parseInt(readNumber()); + } + catch (IOException e) { + System.out.println("Problem mit der Konsole."); + break; + } + catch (NumberFormatException e) { + System.out.println("Bitte nur Zahlen eingeben!"); + continue; + } + + versuche++; + + if (geraten < zahl) { + System.out.println("Zu niedrig"); + } + else if (geraten > zahl) { + System.out.println("Zu hoch."); + } + else { + System.out.printf("Richtig in %d Versuchen", versuche); + break; + } + } + } diff --git a/solutions/src/main/java/pr2/interfaces/abstrakt_form/Form.java b/solutions/src/main/java/pr2/interfaces/abstrakt_form/Form.java new file mode 100644 index 0000000..6ea1f70 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakt_form/Form.java @@ -0,0 +1,16 @@ +package pr2.interfaces.abstrakt_form; + +public abstract class Form { + + protected double x; + protected double y; + + public Form(double x, double y) { + this.x = x; + this.y = y; + } + + public abstract double flaeche(); + + public abstract double umfang(); +} diff --git a/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Dreieck.java b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Dreieck.java new file mode 100644 index 0000000..a11edee --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Dreieck.java @@ -0,0 +1,39 @@ +package pr2.interfaces.abstrakte_klassen_s; + +/** + * Ein Dreieck. + */ +public class Dreieck extends Figur { + + /** + * Grundseite des Dreiecks. + */ + private final double grundseite; + + /** + * Höhe. + */ + private final double hoehe; + + /** + * Erzeugt ein neues Dreieck. + * + * @param grundseite Grundseite. + * @param hoehe Höhe. + */ + public Dreieck(double grundseite, double hoehe) { + super(); + this.grundseite = grundseite; + this.hoehe = hoehe; + } + + /** + * Berechnet die Fläche. + * + * @return die Fläche. + */ + @Override + public double flaeche() { + return grundseite * hoehe / 2; + } +} diff --git a/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Figur.java b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Figur.java new file mode 100644 index 0000000..a0351f2 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Figur.java @@ -0,0 +1,14 @@ +package pr2.interfaces.abstrakte_klassen_s; + +/** + * Basisklasse für geometrische Figuren. + */ +public abstract class Figur { + + /** + * Berechnet die Fläche einer geometrischen Figur. + * + * @return die Fläche. + */ + public abstract double flaeche(); +} diff --git a/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Geometer.java b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Geometer.java new file mode 100644 index 0000000..3257c45 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Geometer.java @@ -0,0 +1,43 @@ +package pr2.interfaces.abstrakte_klassen_s; + +/** + * Flächenberechnung. + */ +public final class Geometer { + + /** + * Keine Instanzen. + */ + private Geometer() { + // keine Objekte + } + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente + */ + public static void main(String[] args) { + Figur[] figuren = new Figur[10]; + + figuren[0] = new Kreis(10.0); + figuren[1] = new Kreis(5.5); + figuren[2] = new Kreis(3.3); + figuren[3] = new Kreis(7.2); + figuren[4] = new Kreis(8.0); + + figuren[5] = new Dreieck(4.0, 3.0); + figuren[6] = new Dreieck(2.0, 1.0); + figuren[7] = new Dreieck(5.0, 8.0); + figuren[8] = new Dreieck(2.0, 7.2); + figuren[9] = new Dreieck(14.0, 3.8); + + double gesamtflaeche = 0.0; + + for (Figur figur : figuren) { + gesamtflaeche += figur.flaeche(); + } + + System.out.printf("Die Fläche beträgt: %.2f", gesamtflaeche); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Kreis.java b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Kreis.java new file mode 100644 index 0000000..86bf749 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Kreis.java @@ -0,0 +1,32 @@ +package pr2.interfaces.abstrakte_klassen_s; + +/** + * Ein Kreis. + */ +public class Kreis extends Figur { + + /** + * Radius des Kreises. + */ + private final double radius; + + /** + * Legt einen neuen Kreis an. + * + * @param radius Radius des Kreises. + */ + public Kreis(double radius) { + super(); + this.radius = radius; + } + + /** + * Berechnet die Fläche. + * + * @return die Fläche. + */ + @Override + public double flaeche() { + return Math.PI * radius * radius; + } +} diff --git a/solutions/src/main/java/pr2/interfaces/comparable_student/Student.java b/solutions/src/main/java/pr2/interfaces/comparable_student/Student.java new file mode 100644 index 0000000..13ab812 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/comparable_student/Student.java @@ -0,0 +1,42 @@ +package pr2.interfaces.comparable_student; + +public class Student implements Comparable { + + private final String vorname; + private final String nachname; + private final int matrikelNr; + + public Student(String vorname, String nachname, + int matrikelNr) { + this.vorname = vorname; + this.nachname = nachname; + this.matrikelNr = matrikelNr; + } + + @Override + public String toString() { + return String.format("%s, %s (%d)", nachname, vorname, + matrikelNr); + } + + @Override + public int compareTo(Object o) { + + Student other = (Student) o; + + if (nachname.compareTo(other.nachname) == 0) { + if (vorname.compareTo(other.vorname) == 0) { + if (matrikelNr == other.matrikelNr) { + return 0; + } + else { + return (matrikelNr > other.matrikelNr) ? 1 : -1; + } + } + + return vorname.compareTo(other.vorname); + } + + return nachname.compareTo(other.nachname); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/api/AnalogController.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/api/AnalogController.java new file mode 100644 index 0000000..5cea5ce --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/api/AnalogController.java @@ -0,0 +1,44 @@ +package pr2.interfaces.interfaces_s.api; + +import java.awt.Point; + +/** + * Analoger Joystick. + */ +public interface AnalogController { + + /** + * Nach oben bewegen. + * + * @param percentage Auslenkung in Prozent (zwischen 0 - 1) + */ + void up(double percentage); + + /** + * Nach unten bewegen. + * + * @param percentage Auslenkung in Prozent (zwischen 0 - 1) + */ + void down(double percentage); + + /** + * Nach links bewegen. + * + * @param percentage Auslenkung in Prozent (zwischen 0 - 1) + */ + void left(double percentage); + + /** + * Nach rechts bewegen. + * + * @param percentage Auslenkung in Prozent (zwischen 0 - 1) + */ + void right(double percentage); + + /** + * Liefert die aktuelle Position zurück. + * + * @return Die Position. + */ + Point getPosition(); +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/api/DigitalController.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/api/DigitalController.java new file mode 100644 index 0000000..ec760b9 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/api/DigitalController.java @@ -0,0 +1,36 @@ +package pr2.interfaces.interfaces_s.api; + +import java.awt.Point; + +/** + * Ein digitaler Joystick. + */ +public interface DigitalController { + + /** + * Nach oben bewegen. + */ + void up(); + + /** + * Nach unten bewegen. + */ + void down(); + + /** + * Nach links bewegen. + */ + void left(); + + /** + * Nach rechts bewegen. + */ + void right(); + + /** + * Liefert die aktuelle Position zurück. + * + * @return Die Position. + */ + Point getPosition(); +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/AnalogControllerImpl.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/AnalogControllerImpl.java new file mode 100644 index 0000000..e6241ee --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/AnalogControllerImpl.java @@ -0,0 +1,61 @@ +package pr2.interfaces.interfaces_s.impl; + +import pr2.interfaces.interfaces_s.api.AnalogController; + +import java.awt.Point; + +/** + * Analoger Joystick. + */ +public class AnalogControllerImpl implements AnalogController { + + /** + * Auslenkung in X-Richtung. + */ + private double deltaX; + + /** + * Auslenkung in Y-Richtung. + */ + private double deltaY; + + /** + * @see AnalogController#up(double) + */ + @Override + public void up(double percentage) { + deltaY -= percentage; + } + + /** + * @see AnalogController#down(double) + */ + @Override + public void down(double percentage) { + deltaY += percentage; + } + + /** + * @see AnalogController#left(double) + */ + @Override + public void left(double percentage) { + deltaX -= percentage; + } + + /** + * @see AnalogController#right(double) + */ + @Override + public void right(double percentage) { + deltaX += percentage; + } + + /** + * @see AnalogController#getPosition() + */ + @Override + public Point getPosition() { + return new Point((int) deltaX, (int) deltaY); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DigitalControllerImpl.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DigitalControllerImpl.java new file mode 100644 index 0000000..2007280 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DigitalControllerImpl.java @@ -0,0 +1,55 @@ +package pr2.interfaces.interfaces_s.impl; + +import pr2.interfaces.interfaces_s.api.DigitalController; + +import java.awt.Point; + +/** + * Implementierung eines digitalen Joysticks. + */ +public class DigitalControllerImpl implements DigitalController { + + private final Point position = new Point(0, 0); + + /** + * @see DigitalController#up() + */ + @Override + public void up() { + position.translate(0, -1); + } + + /** + * @see DigitalController#down() + */ + @Override + public void down() { + position.translate(0, 1); + } + + /** + * @see DigitalController#left() + */ + @Override + public void left() { + position.translate(-1, 0); + } + + /** + * @see DigitalController#right() + */ + @Override + public void right() { + position.translate(1, 0); + } + + /** + * @see DigitalController#getPosition() + */ + @Override + public Point getPosition() { + return (Point) position.clone(); + } + + +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DualShock4.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DualShock4.java new file mode 100644 index 0000000..35c2b8f --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DualShock4.java @@ -0,0 +1,95 @@ +package pr2.interfaces.interfaces_s.impl; + +import pr2.interfaces.interfaces_s.api.AnalogController; +import pr2.interfaces.interfaces_s.api.DigitalController; + +import java.awt.Point; + +/** + * Linke Seite eines DualShock 4 Controllers. + */ +public class DualShock4 implements AnalogController, DigitalController { + + private final AnalogController analogStick = new AnalogControllerImpl(); + + private final DigitalController digitalStick = new DigitalControllerImpl(); + + /** + * @see DigitalController#up() + */ + @Override + public void up() { + digitalStick.up(); + } + + /** + * @see DigitalController#down() + */ + @Override + public void down() { + digitalStick.down(); + } + + /** + * @see DigitalController#left() + */ + @Override + public void left() { + digitalStick.left(); + } + + /** + * @see DigitalController#right() + */ + @Override + public void right() { + digitalStick.right(); + } + + /** + * @see AnalogController#up(double) + */ + @Override + public void up(double percentage) { + analogStick.up(percentage); + } + + /** + * @see AnalogController#down(double) + */ + @Override + public void down(double percentage) { + analogStick.down(percentage); + } + + /** + * @see AnalogController#left(double) + */ + @Override + public void left(double percentage) { + analogStick.left(percentage); + } + + /** + * @see AnalogController#right(double) + */ + @Override + public void right(double percentage) { + analogStick.right(percentage); + } + + /** + * @see AnalogController#getPosition() + */ + @Override + public Point getPosition() { + Point resultAnalog = analogStick.getPosition(); + Point resultDigital = digitalStick.getPosition(); + Point result = new Point(); + + result.x = resultAnalog.x + resultDigital.x; + result.y = resultAnalog.y + resultDigital.y; + + return result; + } +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/test/AnalogControllerTest.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/test/AnalogControllerTest.java new file mode 100644 index 0000000..65dd577 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/test/AnalogControllerTest.java @@ -0,0 +1,52 @@ +package pr2.interfaces.interfaces_s.test; + +import org.junit.jupiter.api.Test; +import pr2.interfaces.interfaces_s.api.AnalogController; +import pr2.interfaces.interfaces_s.impl.AnalogControllerImpl; + +/** + * Tests für einen analogen Joystick. + */ +public class AnalogControllerTest extends DigitalControllerTest { + + /** + * Testet einen anlogen Controller. + */ + @Test + void testAnalogController() { + AnalogController c = new AnalogControllerImpl(); + testAnalogController(c); + } + + /** + * Interne Hilfsmethode zum Test von analogen Controllern. + * + * @param c Controller, der getestet wird + */ + protected void testAnalogController(AnalogController c) { + c.up(0.5); + assertPointEquals(0, 0, c.getPosition()); + c.up(0.5); + assertPointEquals(0, -1, c.getPosition()); + + c.left(0.3); + c.left(0.3); + c.left(0.3); + assertPointEquals(0, -1, c.getPosition()); + c.left(0.2); + assertPointEquals(-1, -1, c.getPosition()); + + c.down(1.0); + assertPointEquals(-1, 0, c.getPosition()); + + c.down(1.0); + assertPointEquals(-1, 1, c.getPosition()); + c.down(1.0); + assertPointEquals(-1, 2, c.getPosition()); + + c.right(0.5); + c.right(0.5); + c.right(0.5); + assertPointEquals(0, 2, c.getPosition()); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/test/DigitalControllerTest.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/test/DigitalControllerTest.java new file mode 100644 index 0000000..a533be7 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/test/DigitalControllerTest.java @@ -0,0 +1,62 @@ +package pr2.interfaces.interfaces_s.test; + +import org.junit.jupiter.api.Test; +import pr2.interfaces.interfaces_s.impl.DigitalControllerImpl; +import pr2.interfaces.interfaces_s.api.DigitalController; + +import java.awt.Point; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Tests für einen digitalen Joystick. + */ +public class DigitalControllerTest { + + /** + * Testet einen digitalen Controller. + */ + @Test + void testDigitalController() { + DigitalController c = new DigitalControllerImpl(); + testDigitalController(c); + } + + /** + * Interne Hilfsmethode zum Test von digitalen Controllern. + * + * @param c Controller, der getestet wird + */ + protected void testDigitalController(DigitalController c) { + assertPointEquals(0, 0, c.getPosition()); + c.up(); + c.up(); + assertPointEquals(0, -2, c.getPosition()); + c.down(); + c.down(); + assertPointEquals(0, 0, c.getPosition()); + c.left(); + c.right(); + assertPointEquals(0, 0, c.getPosition()); + c.left(); + assertPointEquals(-1, 0, c.getPosition()); + c.left(); + assertPointEquals(-2, 0, c.getPosition()); + c.right(); + c.right(); + c.right(); + assertPointEquals(1, 0, c.getPosition()); + } + + /** + * Interne Hilfsmethode, um einen Punkt mit seinem x und + * y-Wert zu vergleichen. + * + * @param x x-Wert + * @param y y-Wert + * @param point Punkt, der verglichen werden soll + */ + protected void assertPointEquals(int x, int y, Point point) { + assertEquals(new Point(x, y), point); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/test/DualShock4Test.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/test/DualShock4Test.java new file mode 100644 index 0000000..9f4bb3d --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/test/DualShock4Test.java @@ -0,0 +1,45 @@ +package pr2.interfaces.interfaces_s.test; + +import org.junit.jupiter.api.Test; +import pr2.interfaces.interfaces_s.api.AnalogController; +import pr2.interfaces.interfaces_s.api.DigitalController; +import pr2.interfaces.interfaces_s.impl.DualShock4; + + +/** + * Tests für einen analogen Joystick. + */ +public class DualShock4Test extends AnalogControllerTest { + + /** + * Testet einen DualShock4 Kombi-Controller. + */ + @Test + void testDualShock4() { + DigitalController cd = new DualShock4(); + testDigitalController(cd); + + AnalogController ca = new DualShock4(); + testAnalogController(ca); + + DualShock4 ds = new DualShock4(); + + ds.up(); + ds.up(1.0); + assertPointEquals(0, -2, ds.getPosition()); + + ds.left(); + ds.right(); + ds.right(0.5); + ds.right(0.5); + assertPointEquals(1, -2, ds.getPosition()); + + ds.down(); + ds.down(); + ds.down(0.3); + ds.down(0.3); + ds.down(0.3); + ds.down(0.1); + assertPointEquals(1, 1, ds.getPosition()); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/stack/Stack.java b/solutions/src/main/java/pr2/interfaces/stack/Stack.java new file mode 100644 index 0000000..f9e4e14 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/stack/Stack.java @@ -0,0 +1,12 @@ +package pr2.interfaces.stack; + +public interface Stack { + + void push(Object o); + + Object pop(); + + Object peek(); + + int size(); +} diff --git a/solutions/src/main/java/pr2/interfaces/stack/StackImpl.java b/solutions/src/main/java/pr2/interfaces/stack/StackImpl.java new file mode 100644 index 0000000..2d286e0 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/stack/StackImpl.java @@ -0,0 +1,43 @@ +package pr2.interfaces.stack; + +public class StackImpl implements Stack { + + private final Object[] puffer; + private int pos = -1; + + public StackImpl(int size) { + puffer = new Object[size]; + } + + @Override + public void push(Object o) { + if (pos < puffer.length - 1) { + puffer[++pos] = o; + } + } + + @Override + public Object pop() { + if (pos >= 0) { + return puffer[pos--]; + } + else { + return null; + } + } + + @Override + public Object peek() { + if (pos >= 0) { + return puffer[pos]; + } + else { + return null; + } + } + + @Override + public int size() { + return pos + 1; + } +} diff --git a/solutions/src/main/java/pr2/interfaces/stack/test/StackTest.java b/solutions/src/main/java/pr2/interfaces/stack/test/StackTest.java new file mode 100644 index 0000000..4c1534f --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/stack/test/StackTest.java @@ -0,0 +1,35 @@ +package pr2.interfaces.stack.test; + +import org.junit.jupiter.api.Test; +import pr2.interfaces.stack.Stack; +import pr2.interfaces.stack.StackImpl; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class StackTest { + + @Test + void testStack() { + Stack s = new StackImpl(100); + + assertEquals(0, s.size()); + + s.push("Hallo"); + s.push("wie"); + s.push("gehts"); + + assertEquals(3, s.size()); + + assertEquals("gehts", s.peek()); + assertEquals("gehts", s.pop()); + + assertEquals("wie", s.peek()); + assertEquals("wie", s.pop()); + + assertEquals("Hallo", s.peek()); + assertEquals("Hallo", s.pop()); + + assertNull(s.pop()); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/uebersetzer/Translator.java b/solutions/src/main/java/pr2/interfaces/uebersetzer/Translator.java new file mode 100644 index 0000000..e65a2b2 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/uebersetzer/Translator.java @@ -0,0 +1,38 @@ + +package pr2.interfaces.uebersetzer; + +public class Translator { + + public static void main(String[] args) { + if (args.length != 2) { + System.err.println("Bitte geben Sie genau zwei " + + "Optionen an: Zielsprache und zu " + + "übersetzendes Wort"); + System.exit(1); + } + + String sprache = args[0].toLowerCase(); + String wort = args[1]; + + Uebersetzer uebersetzer = null; + + if ("englisch".equals(sprache)) { + uebersetzer = new UebersetzerDeutschEnglisch(); + } else if ("spanisch".equals(sprache)) { + uebersetzer = new UebersetzerDeutschSpanisch(); + } else { + System.out.println("Unbekannte Sprache"); + System.exit(1); + } + + String uebersetzung = uebersetzer.uebersetze(wort); + + if (uebersetzung != null) { + System.out.printf("Übersetzung: deutsch -> " + + "%s%n%s -> %s%n", + sprache, wort, uebersetzung); + } else { + System.out.printf("Unbekanntes Wort: %s%n", wort); + } + } +} diff --git a/solutions/src/main/java/pr2/interfaces/uebersetzer/Uebersetzer.java b/solutions/src/main/java/pr2/interfaces/uebersetzer/Uebersetzer.java new file mode 100644 index 0000000..50cf30d --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/uebersetzer/Uebersetzer.java @@ -0,0 +1,13 @@ +package pr2.interfaces.uebersetzer; + +public interface Uebersetzer { + + /** + * Übersetzt den gegebeben String. + * + * @param string String, der übersetzt werden soll + * @return die Übersetzung oder {@literal null}, wenn das Wort nicht + * bekannt ist + */ + public String uebersetze(String string); +} diff --git a/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschEnglisch.java b/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschEnglisch.java new file mode 100644 index 0000000..e5d1ebc --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschEnglisch.java @@ -0,0 +1,17 @@ + +package pr2.interfaces.uebersetzer; + +public class UebersetzerDeutschEnglisch implements Uebersetzer { + + @Override + public String uebersetze(String string) { + + return switch (string) { + case "gehen" -> "go"; + case "schalfen" -> "sleep"; + case "tanzen" -> "dance"; + default -> null; + }; + + } +} diff --git a/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschSpanisch.java b/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschSpanisch.java new file mode 100644 index 0000000..9877392 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschSpanisch.java @@ -0,0 +1,17 @@ + +package pr2.interfaces.uebersetzer; + +public class UebersetzerDeutschSpanisch implements Uebersetzer { + + @Override + public String uebersetze(String string) { + + return switch (string) { + case "gehen" -> "ir"; + case "schalfen" -> "dormir"; + case "tanzen" -> "bailar"; + default -> null; + }; + + } +} diff --git a/solutions/src/main/java/pr2/intro/coding_standard/CodingStandard.java b/solutions/src/main/java/pr2/intro/coding_standard/CodingStandard.java new file mode 100644 index 0000000..64a8726 --- /dev/null +++ b/solutions/src/main/java/pr2/intro/coding_standard/CodingStandard.java @@ -0,0 +1,54 @@ +package pr2.intro.coding_standard; + +/** + * Klasse dient als Beispiel für den Coding-Standard und die Namenskonventionen + * bei Java-Programmen. + */ + +@SuppressWarnings("PMD.UnusedPrivateField") +public class CodingStandard { + + /** + * Konstante, die dem Rest der Welt etwas mitteilen soll. + */ + public static final int KONSTANTE_MIT_TOLLEM_WERT = 3; + + private int erstesFeld; + + private double zweitesFeld; + + /** + * Legt eine neue Instanz an. + * + * @param erstesFeld das erste Feld. + * @param zweitesFeld das zweite Feld. + */ + public CodingStandard(int erstesFeld, double zweitesFeld) { + this.erstesFeld = erstesFeld; + this.zweitesFeld = zweitesFeld; + } + + /** + * Methode, die etwas tut. + * + * @param parameter Eingabewert für die Methode. + * @return gibt einen Wert abhängig von {@code parameter} zurück. + */ + public int methodeDieWasTut(int parameter) { + + int result; + + if (parameter > KONSTANTE_MIT_TOLLEM_WERT) { + result = 12; + } + else { + result = 13; + } + + erstesFeld = result; + zweitesFeld = 2 * result; + + return result; + } +} + diff --git a/solutions/src/main/java/pr2/intro/javadoc/Waehrung.java b/solutions/src/main/java/pr2/intro/javadoc/Waehrung.java new file mode 100644 index 0000000..5cb7837 --- /dev/null +++ b/solutions/src/main/java/pr2/intro/javadoc/Waehrung.java @@ -0,0 +1,142 @@ +package pr2.intro.javadoc; + + +/** + * Objekte dieser Klasse repräsentieren eine Währung. Eine Währung zeichnet + * sich durch einen Namen (z.B. EURO), ein Kürzel (z.B. € oder EUR) und einen + * Umrechnungskurs zum US-Dollar aus. + *

+ * Objekte dieser Klasse sind imutable, d.h. sie können nach der Erzeugung + * nicht mehr verändert werden. + */ + +public class Waehrung { + + /** + * Teiler für die Nachkommastellen. + */ + private static final long TEILER = 10000; + + /** + * Umrechnungskurs zum Dollar. + */ + private final int kurs; + + /** + * Langer Name der Währung. + */ + private final String name; + + /** + * Abkürzung zur Währung. + */ + private final String kuerzel; + + /** + * Erzeugt ein neues Objekt. + * + * @param name Name der Währung (z.B. EURO). + * @param kuerzel Kürzel der Währung (z.B. €). + * @param kurs Wechselkurs zum Dollar. + */ + public Waehrung(String name, String kuerzel, double kurs) { + this.kurs = (int) (kurs * TEILER); + this.name = name; + this.kuerzel = kuerzel; + } + + /** + * Rechnet einen Berag in der aktuellen Währung in eine andere Währung + * um. + * + * @param betrag Betrag der umgerechnet werden soll. + * @param toWaehrung die Zielwährung. + * @return Ergebnis der Umrechnung. + */ + public long umrechnen(long betrag, Waehrung toWaehrung) { + return betrag * kurs / toWaehrung.kurs; + } + + /** + * Gibt den Kurs der aktuellen Währung zurück. + * + * @return Wechselkurs bezogen auf den US-Dollar. + */ + public int getKurs() { + return kurs; + } + + /** + * Gibt den Namen der Währung zurück. + * + * @return Name der Währung (z.B. Euro oder Dollar). + */ + public String getName() { + return name; + } + + /** + * Gibt das Kürzel für die Währung zurück. + * + * @return Das Kürzel der Währung (z.B. EUR oder $) + */ + public String getKuerzel() { + return kuerzel; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format("%s [%s] 1 %s = %.4f %s", name, kuerzel, "$", + kurs / (double) TEILER, kuerzel); + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + kurs; + result = prime * result + ((kuerzel == null) ? 0 : kuerzel.hashCode()); + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Waehrung other = (Waehrung) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } + else if (!name.equals(other.name)) { + return false; + } + if (kurs != other.kurs) { + return false; + } + if (kuerzel == null) { + return other.kuerzel == null; + } + else { + return kuerzel.equals(other.kuerzel); + } + } +} diff --git a/solutions/src/main/java/pr2/intro/junit_faculty/Fakultaet.java b/solutions/src/main/java/pr2/intro/junit_faculty/Fakultaet.java new file mode 100644 index 0000000..2f31efa --- /dev/null +++ b/solutions/src/main/java/pr2/intro/junit_faculty/Fakultaet.java @@ -0,0 +1,14 @@ +package pr2.intro.junit_faculty; + +public class Fakultaet { + + /** + * Berechnet die Fakultät fuer die gegebene Zahl. + * + * @param n Zahl für die die Fakultät berechnet werden soll. + * @return die Fakultät + */ + public int fact(int n) { + return (n == 0) ? 1 : n * fact(n - 1); + } +} diff --git a/solutions/src/main/java/pr2/intro/junit_faculty/test/FakultaetTest.java b/solutions/src/main/java/pr2/intro/junit_faculty/test/FakultaetTest.java new file mode 100644 index 0000000..33f1df1 --- /dev/null +++ b/solutions/src/main/java/pr2/intro/junit_faculty/test/FakultaetTest.java @@ -0,0 +1,20 @@ +package pr2.intro.junit_faculty.test; + +import org.junit.jupiter.api.Test; +import pr2.intro.junit_faculty.Fakultaet; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class FakultaetTest { + + @Test + void testFact() { + Fakultaet f = new Fakultaet(); + assertEquals(1, f.fact(0)); + assertEquals(1, f.fact(1)); + assertEquals(2, f.fact(2)); + assertEquals(6, f.fact(3)); + assertEquals(24, f.fact(4)); + assertEquals(3628800, f.fact(10)); + } +} diff --git a/solutions/src/main/java/pr2/object/clone_alien/Alien.java b/solutions/src/main/java/pr2/object/clone_alien/Alien.java new file mode 100644 index 0000000..b993a4a --- /dev/null +++ b/solutions/src/main/java/pr2/object/clone_alien/Alien.java @@ -0,0 +1,100 @@ +package pr2.object.clone_alien; + +/** + * Ein Alien. + */ +public class Alien implements Cloneable { + + /** + * Name des Aliens. + */ + private final String name; + + /** + * Raumanzug des Aliens. + */ + private Raumanzug raumanzug; + + /** + * Erzeugt ein neues Alien. + * + * @param name Name des Aliens. + * @param raumanzug Anzug. + */ + public Alien(String name, Raumanzug raumanzug) { + this.name = name; + this.raumanzug = raumanzug; + } + + /** + * Gibt den Namen des Aliens zurück. + * + * @return Name des Aliens. + */ + public String getName() { + return name; + } + + /** + * Gibt den Anzug zurück. + * + * @return der Anzug. + */ + public Raumanzug getAnzug() { + return raumanzug; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((raumanzug + == null) ? 0 : raumanzug.hashCode()); + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Alien other = (Alien) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } + else if (!name.equals(other.name)) { + return false; + } + if (raumanzug == null) { + return other.raumanzug == null; + } + else { + return raumanzug.equals(other.raumanzug); + } + } + + /** + * @see java.lang.Object#clone() + */ + @Override + public Object clone() throws CloneNotSupportedException { + Alien o = (Alien) super.clone(); + o.raumanzug = (Raumanzug) raumanzug.clone(); + return o; + } +} diff --git a/solutions/src/main/java/pr2/object/clone_alien/Raumanzug.java b/solutions/src/main/java/pr2/object/clone_alien/Raumanzug.java new file mode 100644 index 0000000..ae4171e --- /dev/null +++ b/solutions/src/main/java/pr2/object/clone_alien/Raumanzug.java @@ -0,0 +1,75 @@ +package pr2.object.clone_alien; + +/** + * Ein Raumanzug. + */ +public class Raumanzug implements Cloneable { + + /** + * Sauerstoffvorrat, der noch im Raumanzug ist. + */ + private double sauerstoffVorrat; + + /** + * Ertzeugt einen neuen Raumanzug. + */ + public Raumanzug() { + sauerstoffVorrat = Math.random(); + } + + /** + * Sauerstoffvorrat im Anzug. + * + * @return Vorrat in % (0.0-1.0) + */ + public double getSauerstoffVorrat() { + return sauerstoffVorrat; + } + + /** + * Tankt den Anzug auf. + */ + public void auftanken() { + sauerstoffVorrat = 1.0; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + long temp; + temp = Double.doubleToLongBits(sauerstoffVorrat); + result = prime * result + (int) (temp ^ (temp >>> 32)); + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Raumanzug other = (Raumanzug) obj; + return Double.doubleToLongBits(sauerstoffVorrat) + == Double.doubleToLongBits(other.sauerstoffVorrat); + } + + /** + * @see java.lang.Object#clone() + */ + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } +} diff --git a/solutions/src/main/java/pr2/object/clone_alien/test/AlienCloneTest.java b/solutions/src/main/java/pr2/object/clone_alien/test/AlienCloneTest.java new file mode 100644 index 0000000..4248732 --- /dev/null +++ b/solutions/src/main/java/pr2/object/clone_alien/test/AlienCloneTest.java @@ -0,0 +1,37 @@ +package pr2.object.clone_alien.test; + +import org.junit.jupiter.api.Test; +import pr2.object.clone_alien.Alien; +import pr2.object.clone_alien.Raumanzug; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; + +/** + * Test für die Clone-Methoden. + */ +public class AlienCloneTest { + + /** + * Test-Methode. + * + * @throws CloneNotSupportedException wird geworfen, wenn clone_alien + * nicht korrekt implementiert wurde. + */ + @Test + void testClone() throws CloneNotSupportedException { + Raumanzug r1 = new Raumanzug(); + Alien a1 = new Alien("Predator", r1); + + Alien a2 = (Alien) a1.clone(); + Raumanzug r2 = a2.getAnzug(); + + assertNotSame(a1, a2); + assertNotSame(r1, r2); + + assertEquals(a1, a2); + assertEquals(r1, r2); + assertEquals(r1.getSauerstoffVorrat(), r2.getSauerstoffVorrat(), + 0.0001); + } +} diff --git a/solutions/src/main/java/pr2/object/clone_person/Person.java b/solutions/src/main/java/pr2/object/clone_person/Person.java new file mode 100644 index 0000000..8f69899 --- /dev/null +++ b/solutions/src/main/java/pr2/object/clone_person/Person.java @@ -0,0 +1,34 @@ +package pr2.object.clone_person; + +import java.util.Date; + +public class Person implements Cloneable { + + private final String vorname = ""; + private final String nachname = ""; + private Date geburtsdatum = new Date(); + + @Override + public Object clone() { + Person clone; + try { + clone = (Person) super.clone(); + clone.geburtsdatum = (Date) geburtsdatum.clone(); + return clone; + } + catch (CloneNotSupportedException e) { + // cannot happen + return null; + } + } + + + @Override + public String toString() { + return "Person{" + + "vorname='" + vorname + '\'' + + ", nachname='" + nachname + '\'' + + ", geburtsdatum=" + geburtsdatum + + '}'; + } +} diff --git a/solutions/src/main/java/pr2/object/equals_hashcode/Ork.java b/solutions/src/main/java/pr2/object/equals_hashcode/Ork.java new file mode 100644 index 0000000..abae1a9 --- /dev/null +++ b/solutions/src/main/java/pr2/object/equals_hashcode/Ork.java @@ -0,0 +1,57 @@ +package pr2.object.equals_hashcode; + +/** + * Ork. + */ +public class Ork extends Wesen { + + /** + * Stärke der Orks. + */ + private static final int ORK_STAERKE = 17; + + /** + * Zeigt an, ob der Ork gut oder böse ist. + */ + private final boolean boese; + + /** + * Legt einen neuen Ork an. + * + * @param name Name des Orks. + * @param boese zeigt an, ob der Ork gut oder böse ist + */ + public Ork(String name, boolean boese) { + super(name, ORK_STAERKE); + this.boese = boese; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + (boese ? 1231 : 1237); + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Ork other = (Ork) obj; + return boese == other.boese; + } +} diff --git a/solutions/src/main/java/pr2/object/equals_hashcode/Wesen.java b/solutions/src/main/java/pr2/object/equals_hashcode/Wesen.java new file mode 100644 index 0000000..424641c --- /dev/null +++ b/solutions/src/main/java/pr2/object/equals_hashcode/Wesen.java @@ -0,0 +1,66 @@ +package pr2.object.equals_hashcode; + +/** + * Ein Wesen in der Spielwelt. + */ +public class Wesen { + + /** + * Name des Wesens. + */ + private final String name; + + /** + * Stärke des Wesens. + */ + private final int staerke; + + /** + * Legt ein neues Wesen an. + * + * @param name Name des Wesens. + * @param staerke Stärke des Wesens. + */ + public Wesen(String name, int staerke) { + this.name = name; + this.staerke = staerke; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + staerke; + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Wesen other = (Wesen) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } + else if (!name.equals(other.name)) { + return false; + } + return staerke == other.staerke; + } +} diff --git a/solutions/src/main/java/pr2/object/equals_hashcode/test/WesenTest.java b/solutions/src/main/java/pr2/object/equals_hashcode/test/WesenTest.java new file mode 100644 index 0000000..bdbe397 --- /dev/null +++ b/solutions/src/main/java/pr2/object/equals_hashcode/test/WesenTest.java @@ -0,0 +1,87 @@ +package pr2.object.equals_hashcode.test; + +import org.junit.jupiter.api.Test; +import pr2.object.equals_hashcode.Ork; +import pr2.object.equals_hashcode.Wesen; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; + +/** + * Testklasse für die Wesen. + */ +public class WesenTest { + + /** + * Testet equals und hashCode von Wesen. + */ + @Test + void testWesen() { + Wesen w1 = new Wesen("Azok", 30); + Wesen w2 = new Wesen("Azok", 30); + Wesen w3 = new Wesen("Azok", 31); + Wesen w4 = new Wesen("Gorrok", 30); + Wesen w5 = new Wesen("Gorrok", 31); + + assertNotSame(w1, w2); + assertEquals(w1, w2); + + assertNotSame(w1, w3); + assertNotEquals(w1, w3); + + assertNotSame(w1, w4); + assertNotEquals(w1, w4); + + assertNotSame(w1, w5); + assertNotEquals(w1, w5); + + assertEquals(w1.hashCode(), w2.hashCode()); + } + + /** + * Testet equals und hashCode von Ork. + */ + @Test + void testOrk() { + Ork o1 = new Ork("Snagas", true); + Ork o2 = new Ork("Snagas", true); + Ork o3 = new Ork("Snagas", false); + Ork o4 = new Ork("Berg-Ork", false); + Ork o5 = new Ork("Berg-Ork", true); + Ork o6 = new Ork("Berg-Ork", false); + Wesen w = new Wesen("Snagas", 17); + + assertNotSame(o1, o2); + assertEquals(o1, o2); + + assertNotSame(o1, o3); + assertNotEquals(o1, o3); + + assertNotSame(o1, o4); + assertNotEquals(o1, o4); + + assertNotSame(o1, o5); + assertNotEquals(o1, o5); + + assertEquals(o1.hashCode(), o2.hashCode()); + assertEquals(o4.hashCode(), o6.hashCode()); + + assertNotEquals(w, o1); + assertNotEquals(w, o2); + assertNotEquals(w, o3); + assertNotEquals(null, o1); + assertNotEquals("Hugo", o1); + assertEquals(o1, o1); + + // Diese Tests muss nicht zwangsweise funktionieren, da + // ungleiche Objekte einen identischen Hashcode haben können. + // Wir gehen hier aber davon aus, dass eine Hashkollision + // sehr selten ist und machen daher aus didaktischen Gründen + // diesen Test. + assertNotEquals(o1.hashCode(), o3.hashCode()); + assertNotEquals(o1.hashCode(), o4.hashCode()); + assertNotEquals(o1.hashCode(), o5.hashCode()); + assertNotEquals(o4.hashCode(), o5.hashCode()); + } +} diff --git a/solutions/src/main/java/pr2/object/equals_person/Person.java b/solutions/src/main/java/pr2/object/equals_person/Person.java new file mode 100644 index 0000000..b45948d --- /dev/null +++ b/solutions/src/main/java/pr2/object/equals_person/Person.java @@ -0,0 +1,54 @@ +package pr2.object.equals_person; + +public class Person { + + private String vorname; + private String nachname; + private int alter; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + alter; + result = prime * result + + ((nachname == null) ? 0 : nachname.hashCode()); + result = prime * result + + ((vorname == null) ? 0 : vorname.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (this == obj) { + return true; + } + if (getClass() != obj.getClass()) { + return false; + } + + Person other = (Person) obj; + + if (alter != other.alter) { + return false; + } + + if (nachname == null) { + if (other.nachname != null) { + return false; + } + } + else if (!nachname.equals(other.nachname)) { + return false; + } + if (vorname == null) { + return other.vorname == null; + } + else { + return vorname.equals(other.vorname); + } + } +} diff --git a/solutions/src/main/java/pr2/object/tostring/Alien.java b/solutions/src/main/java/pr2/object/tostring/Alien.java new file mode 100644 index 0000000..0a18c04 --- /dev/null +++ b/solutions/src/main/java/pr2/object/tostring/Alien.java @@ -0,0 +1,56 @@ +package pr2.object.tostring; + +/** + * Ein Alien. + */ +public class Alien implements Cloneable { + + /** + * Name des Aliens. + */ + private final String name; + + /** + * Raumanzug des Aliens. + */ + private final Raumanzug raumanzug; + + /** + * Erzeugt ein neues Alien. + * + * @param name Name des Aliens. + * @param raumanzug Anzug. + */ + public Alien(String name, Raumanzug raumanzug) { + this.name = name; + this.raumanzug = raumanzug; + } + + /** + * Gibt den Namen des Aliens zurück. + * + * @return Name des Aliens. + */ + public String getName() { + return name; + } + + /** + * Gibt den Anzug zurück. + * + * @return der Anzug. + */ + public Raumanzug getAnzug() { + return raumanzug; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format( + "Ich bin ein Alien und heiße '%s'. Ich trage " + "einen %s.", + name, raumanzug); + } +} diff --git a/solutions/src/main/java/pr2/object/tostring/Ausgabe.java b/solutions/src/main/java/pr2/object/tostring/Ausgabe.java new file mode 100644 index 0000000..637f3c6 --- /dev/null +++ b/solutions/src/main/java/pr2/object/tostring/Ausgabe.java @@ -0,0 +1,24 @@ +package pr2.object.tostring; + +/** + * Ausgabe. + */ +public final class Ausgabe { + + /** + * Konstruktor. + */ + private Ausgabe() { + // keine Objekte. + } + + /** + * Einstiegspunkt in das Programm. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + Alien alien = new Alien("E.T.", new Raumanzug("Spaceman 2000")); + System.out.println(alien); + } +} diff --git a/solutions/src/main/java/pr2/object/tostring/Raumanzug.java b/solutions/src/main/java/pr2/object/tostring/Raumanzug.java new file mode 100644 index 0000000..795e95e --- /dev/null +++ b/solutions/src/main/java/pr2/object/tostring/Raumanzug.java @@ -0,0 +1,52 @@ +package pr2.object.tostring; + +/** + * Ein Raumanzug. + */ +public class Raumanzug implements Cloneable { + + /** + * Hersteller des Raumanzuges. + */ + private final String hersteller; + + /** + * Sauerstoffvorrat, der noch im Raumanzug ist. + */ + private double sauerstoffVorrat; + + /** + * Ertzeugt einen neuen Raumanzug. + * + * @param hersteller Hersteller des Anzuges. + */ + public Raumanzug(String hersteller) { + this.hersteller = hersteller; + sauerstoffVorrat = Math.random(); + } + + /** + * Sauerstoffvorrat im Anzug. + * + * @return Vorrat in % (0.0-1.0) + */ + public double getSauerstoffVorrat() { + return sauerstoffVorrat; + } + + /** + * Tankt den Anzug auf. + */ + public void auftanken() { + sauerstoffVorrat = 1.0; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format("Raumanzug von %s (Füllstand %d%%)", hersteller, + (int) (sauerstoffVorrat * 100)); + } +} diff --git a/solutions/src/main/java/pr2/object/wrapper_boxsearch/BoxSearcher.java b/solutions/src/main/java/pr2/object/wrapper_boxsearch/BoxSearcher.java new file mode 100644 index 0000000..7370cda --- /dev/null +++ b/solutions/src/main/java/pr2/object/wrapper_boxsearch/BoxSearcher.java @@ -0,0 +1,18 @@ +package pr2.object.wrapper_boxsearch; + +public class BoxSearcher { + + public static void main(String[] args) { + Integer[] array = new Integer[200]; + + for (int i = 0; i < array.length; i++) { + array[i] = i; + } + + for (Integer element : array) { + boolean identisch = (element == Integer.valueOf( + element.intValue())); + System.out.printf("%d: %s%n", element, identisch); + } + } +} diff --git a/solutions/src/main/java/pr2/object/wrapper_umwandler/Umwandler.java b/solutions/src/main/java/pr2/object/wrapper_umwandler/Umwandler.java new file mode 100644 index 0000000..53090d4 --- /dev/null +++ b/solutions/src/main/java/pr2/object/wrapper_umwandler/Umwandler.java @@ -0,0 +1,47 @@ +package pr2.object.wrapper_umwandler; + +/** + * Enthält Methoden, um Integer-Zahlen umzuwandeln. + */ +public final class Umwandler { + + /** + * Konstruktor. + */ + private Umwandler() { + // keine Instanzen + } + + /** + * Wandelt eine Zahl in meherer Formate um. + * + * @param i die Zahl. + * @return String mit mehreren Formaten. + */ + public static String toString(int i) { + return "Dezimal: " + i + "\n" + "Hex : " + Integer.toHexString(i) + + "\n" + "Oktal : " + Integer.toOctalString(i) + "\n" + + "Binär : " + Integer.toBinaryString(i); + } + + /** + * Wandelt einen String (zur Basis 10) in eine Zahl um. + * + * @param s String, der umgewandelt werden soll + * @return Umgewandelte Zahl + */ + public static int fromString(String s) { + return Integer.parseInt(s); + } + + /** + * Einstiegspunkt in das Programm. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + String s = "17871"; + int i = fromString(s); + System.out.println(toString(i)); + } +} diff --git a/solutions/src/main/java/pr2/strukturierung/information_hiding/Rechner.java b/solutions/src/main/java/pr2/strukturierung/information_hiding/Rechner.java new file mode 100644 index 0000000..b85b71d --- /dev/null +++ b/solutions/src/main/java/pr2/strukturierung/information_hiding/Rechner.java @@ -0,0 +1,6 @@ +package pr2.strukturierung.information_hiding; + +/** + * Ein einfacher Taschenrechner. + */ +public class Rechner { diff --git a/solutions/src/main/java/pr2/strukturierung/information_hiding/test/RechnerTest.java b/solutions/src/main/java/pr2/strukturierung/information_hiding/test/RechnerTest.java new file mode 100644 index 0000000..264712f --- /dev/null +++ b/solutions/src/main/java/pr2/strukturierung/information_hiding/test/RechnerTest.java @@ -0,0 +1,50 @@ +package pr2.strukturierung.information_hiding.test; + +import org.junit.jupiter.api.Test; +import pr2.strukturierung.information_hiding.Rechner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Unit-Test für den Rechner. + */ +public class RechnerTest { + + /** + * Testet alle Grundoperationen des Rechners. + */ + @Test + void testRechner() { + Rechner r = new Rechner(); + + // 2 + 2 = 4 + assertEquals(4.0, r.addiere(2.0, 2.0), 0.0001); + + // 3 - 1 = 2 + assertEquals(2.0, r.subtrahiere(3, 1), 0.0001); + + // 3 * 3 = 9 + assertEquals(9.0, r.multipliziere(3, 3), 0.0001); + + // 2 + 2 * 2 = 6 + r.setSpeicher(r.multipliziere(2, 2)); + assertEquals(6.0, r.addiere(2, r.getSpeicher()), 0.0001); +// // 2 + 2 = 4 +// r.addiere(2.0, 2.0); +// assertEquals(4.0, r.wert, 0.0001); +// +// // 3 - 1 = 2 +// r.subtrahiere(3, 1); +// assertEquals(2.0, r.wert, 0.0001); +// +// // 3 * 3 = 9 +// r.multipliziere(3, 3); +// assertEquals(9.0, r.wert, 0.0001); +// +// // 2 + 2 * 2 = 6 +// r.multipliziere(2, 2); +// r.speichern(); +// r.addiere(2, r.speicher); +// assertEquals(6.0, r.wert, 0.0001); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/finals/A.java b/solutions/src/main/java/pr2/vererbung/finals/A.java new file mode 100644 index 0000000..c698cd3 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/finals/A.java @@ -0,0 +1,32 @@ +package pr2.vererbung.finals; + +/** + * A-Klasse. + */ +public class A { + + /** + * Konstante für die Vorzeichenumkehr. + */ + public static final int KONSTANTE = 100; + + /** + * Addiert zwei Zahlen. Wenn das Ergebnis größer ist als + * der Wert von KONSTANTE, dann wird das + * Vorzeichen umgekehrt. + * + * @param a erster Wert + * @param b zweiter Wert + * @return Ergebnis + */ + public final int add(final int a, final int b) { + final int result = a + b; + + if (result > KONSTANTE) { + return result * -1; + } + else { + return result; + } + } +} diff --git a/solutions/src/main/java/pr2/vererbung/finals/B.java b/solutions/src/main/java/pr2/vererbung/finals/B.java new file mode 100644 index 0000000..4abf03b --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/finals/B.java @@ -0,0 +1,22 @@ +package pr2.vererbung.finals; + +/** + * B-Klasse. + */ +public final class B extends A { + + /** + * Subtrahiert zwei Zahlen. Wenn das Ergebnis kleiner ist als + * der Wert von KONSTANTE, dann wird das + * Vorzeichen umgekehrt. + * + * @param a erster Wert + * @param b zweiter Wert + * @return Ergebnis + */ + public static int sub(final int a, final int b) { + final int result = a + b; + + return (result < KONSTANTE) ? (result * -1) : (result); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie1/Figur.java b/solutions/src/main/java/pr2/vererbung/geometrie1/Figur.java new file mode 100644 index 0000000..193626a --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie1/Figur.java @@ -0,0 +1,14 @@ +package pr2.vererbung.geometrie1; + +public class Figur { + + protected int flaeche; + + protected Figur() { + /* nichts zu tun */ + } + + public int getFlaeche() { + return flaeche; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie1/Main.java b/solutions/src/main/java/pr2/vererbung/geometrie1/Main.java new file mode 100644 index 0000000..803774b --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie1/Main.java @@ -0,0 +1,12 @@ +package pr2.vererbung.geometrie1; + +public class Main { + + public static void main(String[] args) { + Figur f1 = new Rechteck(10, 10); + Figur f2 = new Rechteck(5, 10); + + System.out.println(f1.getFlaeche()); + System.out.println(f2.getFlaeche()); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie1/Rechteck.java b/solutions/src/main/java/pr2/vererbung/geometrie1/Rechteck.java new file mode 100644 index 0000000..b86cbaf --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie1/Rechteck.java @@ -0,0 +1,8 @@ +package pr2.vererbung.geometrie1; + +public class Rechteck extends Figur { + + public Rechteck(int breite, int hoehe) { + flaeche = breite * hoehe; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie2/Figur.java b/solutions/src/main/java/pr2/vererbung/geometrie2/Figur.java new file mode 100644 index 0000000..59536d1 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie2/Figur.java @@ -0,0 +1,18 @@ +package pr2.vererbung.geometrie2; + +public class Figur { + + private final int flaeche; + + +// protected Figur() { +// /* nichts zu tun */ +// } + protected Figur(int flaeche) { + this.flaeche = flaeche; + } + + public int getFlaeche() { + return flaeche; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie2/Main.java b/solutions/src/main/java/pr2/vererbung/geometrie2/Main.java new file mode 100644 index 0000000..bf3ee32 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie2/Main.java @@ -0,0 +1,12 @@ +package pr2.vererbung.geometrie2; + +public class Main { + + public static void main(String[] args) { + Figur f1 = new Rechteck(10, 10); + Figur f2 = new Rechteck(5, 10); + + System.out.println(f1.getFlaeche()); + System.out.println(f2.getFlaeche()); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie2/Rechteck.java b/solutions/src/main/java/pr2/vererbung/geometrie2/Rechteck.java new file mode 100644 index 0000000..62c1f25 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie2/Rechteck.java @@ -0,0 +1,13 @@ +package pr2.vererbung.geometrie2; + + +public class Rechteck extends Figur { + + public Rechteck(int breite, int hoehe) { + super(breite * hoehe); + } + +// public Rechteck(int breite, int hoehe) { +// flaeche = breite * hoehe; +// } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Dreieck.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Dreieck.java new file mode 100644 index 0000000..9a1a5bf --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Dreieck.java @@ -0,0 +1,8 @@ +package pr2.vererbung.geometrie3; + +public class Dreieck extends Figur { + + public Dreieck(int grundseite, int hoehe) { + super(grundseite * hoehe / 2); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Figur.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Figur.java new file mode 100644 index 0000000..983f4ea --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Figur.java @@ -0,0 +1,19 @@ +package pr2.vererbung.geometrie3; + +public class Figur { + + private int flaeche; + + protected Figur() { + /* leer */ + } + + protected Figur(int flaeche) { + this.flaeche = flaeche; + } + + public int getFlaeche() { + return flaeche; + } + +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Gerade.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Gerade.java new file mode 100644 index 0000000..58f2461 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Gerade.java @@ -0,0 +1,17 @@ +package pr2.vererbung.geometrie3; + +public class Gerade extends Figur { + + private final int laenge; + + public Gerade(int laenge) { + this.laenge = laenge; + } + + @Override + public String toString() { + return "Gerade{" + + "laenge=" + laenge + + '}'; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Main.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Main.java new file mode 100644 index 0000000..ef073b9 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Main.java @@ -0,0 +1,12 @@ +package pr2.vererbung.geometrie3; + +public class Main { + + public static void main(String[] args) { + Figur f1 = new Gerade(10); + Figur f2 = new Gerade(5); + + System.out.println(f1.getFlaeche()); + System.out.println(f2.getFlaeche()); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Quadrat.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Quadrat.java new file mode 100644 index 0000000..bc20fa0 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Quadrat.java @@ -0,0 +1,8 @@ +package pr2.vererbung.geometrie3; + +public class Quadrat extends Rechteck { + + public Quadrat(int seitenlaenge) { + super(seitenlaenge, seitenlaenge); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Rechteck.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Rechteck.java new file mode 100644 index 0000000..a02354c --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Rechteck.java @@ -0,0 +1,8 @@ +package pr2.vererbung.geometrie3; + +public class Rechteck extends Figur { + + public Rechteck(int breite, int hoehe) { + super(breite * hoehe); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/konstruktoren/Nachtelf.java b/solutions/src/main/java/pr2/vererbung/konstruktoren/Nachtelf.java new file mode 100644 index 0000000..852640b --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/konstruktoren/Nachtelf.java @@ -0,0 +1,47 @@ +package pr2.vererbung.konstruktoren; + +/** + * Nachtelf aus der Allianz. + */ +public class Nachtelf extends Wesen { + + /** + * Standardmäßige Stärke der Fähigkeit Naturwiderstand. + */ + public static final int STANDARD_NATURWIDERSTAND = 5; + + /** + * Fähigkeit zum Widerstand gegen Naturmagie. + */ + private int naturwiderstand; + + /** + * Legt einen neuen Nachtelf an. + * + * @param name Name der Figur. + * @param naturwiderstand Stärke der Fähigkeit Naturwiderstand. + */ + public Nachtelf(String name, int naturwiderstand) { + super(name); + this.naturwiderstand = naturwiderstand; + } + + /** + * Legt einen neuen Nachtelf an. Die Stärke des Naturwiderstandes entspricht + * dem Standardwert. + * + * @param name Name der Figur. + */ + public Nachtelf(String name) { + this(name, STANDARD_NATURWIDERSTAND); + } + + /** + * Stärke des Naturwiderstandes. + * + * @return the naturwiderstand + */ + public int getNaturwiderstand() { + return naturwiderstand; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/konstruktoren/Untoter.java b/solutions/src/main/java/pr2/vererbung/konstruktoren/Untoter.java new file mode 100644 index 0000000..7505875 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/konstruktoren/Untoter.java @@ -0,0 +1,47 @@ +package pr2.vererbung.konstruktoren; + +/** + * Untoter aus der Horde. + */ +public class Untoter extends Wesen { + + /** + * Standardmäßige Stärke der Fähigkeit zur Unterwasseratmung. + */ + public static final int STANDARD_UNTERWASSERATMUNG = 10; + + /** + * Fähigkeit zur Atmung unter Wasser. + */ + private int unterwasseratmung; + + /** + * Legt einen neuen Untoten an. + * + * @param name Name der Figur. + * @param unterwasseratmung Stärke der Fähigkeit zur Unterwasseratmung. + */ + public Untoter(String name, int unterwasseratmung) { + super(name); + this.unterwasseratmung = unterwasseratmung; + } + + /** + * Legt einen neuen Untoten an. Die Stärke der Unterwasseratmung entspricht + * dem Standardwert. + * + * @param name Name der Figur. + */ + public Untoter(String name) { + this(name, STANDARD_UNTERWASSERATMUNG); + } + + /** + * Fähigkeit zur Unterwasseratmnung. + * + * @return the Stärke der Fähigkeit. + */ + public int getUnterwasseratmung() { + return unterwasseratmung; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/konstruktoren/Wesen.java b/solutions/src/main/java/pr2/vererbung/konstruktoren/Wesen.java new file mode 100644 index 0000000..0287b62 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/konstruktoren/Wesen.java @@ -0,0 +1,30 @@ +package pr2.vererbung.konstruktoren; + +/** + * Basisklasse für Spielfiguren. + */ +public class Wesen { + + /** + * Name der Spielfigur. + */ + private final String name; + + /** + * Legt eine neue Spielfigur an. + * + * @param name Name der Figur. + */ + public Wesen(String name) { + this.name = name; + } + + /** + * Gibt den Namen der Spielfigur zurück. + * + * @return Name der Spielfigur. + */ + public String getName() { + return name; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/konstruktoren/test/WesenTest.java b/solutions/src/main/java/pr2/vererbung/konstruktoren/test/WesenTest.java new file mode 100644 index 0000000..3587cf9 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/konstruktoren/test/WesenTest.java @@ -0,0 +1,47 @@ +package pr2.vererbung.konstruktoren.test; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.konstruktoren.Nachtelf; +import pr2.vererbung.konstruktoren.Untoter; +import pr2.vererbung.konstruktoren.Wesen; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Test für die Aufgabe. + */ +public class WesenTest { + + /** + * Testet den Nachtelf. + */ + @Test + void testNachtelf() { + assertTrue(new Nachtelf("") instanceof Wesen, + "Nachtelf erbt nicht " + "von Wesen"); + + assertEquals(Nachtelf.STANDARD_NATURWIDERSTAND, + new Nachtelf("").getNaturwiderstand()); + + assertEquals(120, new Nachtelf("", 120).getNaturwiderstand()); + + assertEquals("Hugo", new Nachtelf("Hugo").getName()); + } + + /** + * Testet den Untoten. + */ + @Test + void testUntoten() { + assertTrue(new Untoter("") instanceof Wesen, + "Untoter erbt nicht von " + "Wesen"); + + assertEquals(Untoter.STANDARD_UNTERWASSERATMUNG, + new Untoter("").getUnterwasseratmung()); + + assertEquals(120, new Untoter("", 120).getUnterwasseratmung()); + + assertEquals("Hugo", new Untoter("Hugo").getName()); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/Affe.java b/solutions/src/main/java/pr2/vererbung/polymorphie/Affe.java new file mode 100644 index 0000000..612e4ee --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/Affe.java @@ -0,0 +1,16 @@ +package pr2.vererbung.polymorphie; + +/** + * Ein Affe im Zoo. + */ +public class Affe extends ZooTier { + + /** + * Legt einen neuen Affen an. + * + * @param name Name des Affen. + */ + public Affe(String name) { + super(name); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/Futterstelle.java b/solutions/src/main/java/pr2/vererbung/polymorphie/Futterstelle.java new file mode 100644 index 0000000..a378303 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/Futterstelle.java @@ -0,0 +1,16 @@ +package pr2.vererbung.polymorphie; + +/** + * Fütterung der Tiere. + */ +public class Futterstelle { + + /** + * Füttert das Tier. + * + * @param tier Tier, das gefüttert werden soll. + */ + public void gibFutter(ZooTier tier) { + tier.fuettern(); + } + diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/Giraffe.java b/solutions/src/main/java/pr2/vererbung/polymorphie/Giraffe.java new file mode 100644 index 0000000..1c4cf69 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/Giraffe.java @@ -0,0 +1,16 @@ +package pr2.vererbung.polymorphie; + +/** + * Eine Giraffe im Zoo. + */ +public class Giraffe extends ZooTier { + + /** + * Legt einen neue Giraffe an. + * + * @param name Name der Giraffe. + */ + public Giraffe(String name) { + super(name); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/Gorilla.java b/solutions/src/main/java/pr2/vererbung/polymorphie/Gorilla.java new file mode 100644 index 0000000..fd6f23d --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/Gorilla.java @@ -0,0 +1,16 @@ +package pr2.vererbung.polymorphie; + +/** + * Ein Gorilla. + */ +public class Gorilla extends Affe { + + /** + * Legt einen neuen Gorilla an. + * + * @param name Name des Gorilla. + */ + public Gorilla(String name) { + super(name); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/ZooSimulation.java b/solutions/src/main/java/pr2/vererbung/polymorphie/ZooSimulation.java new file mode 100644 index 0000000..11db908 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/ZooSimulation.java @@ -0,0 +1,39 @@ +package pr2.vererbung.polymorphie; + +/** + * Simulationsklasse. + */ +public final class ZooSimulation { + + /** + * Konstruktor. + */ + private ZooSimulation() { + // keine Objekte benötigt + } + + /** + * Main-Methode. + * + * @param args Kommandozeilen-Argumente. + */ + public static void main(String[] args) { + Futterstelle futterstelle = new Futterstelle(); + + ZooTier[] tiere = {new Affe("Charlie"), new Gorilla("Buck"), + new Giraffe("Debbie")}; + + for (ZooTier tier : tiere) { + System.out.println(tier); + } + + System.out.println("Fütterung..."); + + for (ZooTier tier : tiere) { + futterstelle.gibFutter(tier); + } + + for (ZooTier tier : tiere) { + System.out.println(tier); + } + } diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/ZooTier.java b/solutions/src/main/java/pr2/vererbung/polymorphie/ZooTier.java new file mode 100644 index 0000000..ff9edf9 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/ZooTier.java @@ -0,0 +1,41 @@ +package pr2.vererbung.polymorphie; + +/** + * Ein Tier im Zoo. + */ +public class ZooTier { + + /** + * Name des Tiers. + */ + private final String name; + + /** + * Zeigt an, ob das Tier hungrig ist. + */ + private boolean hungrig = true; + + /** + * Legt ein neues Zootier an. + * + * @param name Name des Tiers + */ + public ZooTier(String name) { + this.name = name; + } + + /** + * Gibt dem Tier futter. + */ + public void fuettern() { + hungrig = false; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return name + ": Ich bin " + (hungrig ? "hungrig" : "satt") + "!"; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/singleton_einfach/Singleton.java b/solutions/src/main/java/pr2/vererbung/singleton_einfach/Singleton.java new file mode 100644 index 0000000..f471b44 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/singleton_einfach/Singleton.java @@ -0,0 +1,12 @@ +package pr2.vererbung.singleton_einfach; + +public final class Singleton { + + private static final Singleton INSTANCE = new Singleton(); + + private Singleton() { /* leer */ } + + public static Singleton getInstance() { + return INSTANCE; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/statics/Spiel.java b/solutions/src/main/java/pr2/vererbung/statics/Spiel.java new file mode 100644 index 0000000..afa174a --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/statics/Spiel.java @@ -0,0 +1,33 @@ +package pr2.vererbung.statics; + +/** + * Spiel mit den Würfeln. + */ +public final class Spiel { + + /** + * Keine Objekte. + */ + private Spiel() { + // leer + } + + /** + * Programm-Einstieg. + * + * @param args Kommandozeilen-Argumente. + */ + public static void main(String[] args) { + Wuerfel wuerfel1 = new Wuerfel(); + Wuerfel wuerfel2 = new Wuerfel(); + + // 1000 Mal würfeln + for (int i = 0; i < 1000; i++) { + wuerfel1.wuerfele(); + wuerfel2.wuerfele(); + } + + // Statistik ausgeben + System.out.println("Statistik für alle Würfel"); + System.out.println(Wuerfel.statistik()); + System.out.println(); diff --git a/solutions/src/main/java/pr2/vererbung/statics/Wuerfel.java b/solutions/src/main/java/pr2/vererbung/statics/Wuerfel.java new file mode 100644 index 0000000..98856c1 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/statics/Wuerfel.java @@ -0,0 +1,52 @@ +package pr2.vererbung.statics; + +import java.util.Random; + +/** + * Ein einfacher Würfel. + */ +public class Wuerfel { + + /** Häufigkeit der Werte. */ + private static final int[] HAEUFIGKEIT = new int[6]; + + /** Anzahl der Würfe mit dem Würfel. */ + private static int wuerfe = 0; + + /** Zufallsgenerator. */ + private final Random random = new Random(); + + /** + * Bestimmt den nächsten Wurf. + * + * @return der Wurf. + */ + public int wuerfele() { + int wert = random.nextInt(6); + HAEUFIGKEIT[wert]++; + wuerfe++; + return wert + 1; + } + + /** + * Gibt die Häufigkeit der Würfe zurück. + * + * @return die Statistik mit der Häufigkeit. + */ + public static String statistik() { + StringBuilder result = new StringBuilder(); + + for (int i = 0; i < HAEUFIGKEIT.length; i++) { + result.append(i + 1) + .append(": ") + .append(String.format("%.2f %%", + ((double) HAEUFIGKEIT[i] / wuerfe) * 100)) + .append("\n"); + } + + result.append("Summe: ") + .append(wuerfe) + .append("\n"); + + return result.toString(); + } diff --git a/solutions/src/main/java/pr2/vererbung/ueberladen_summe/Summator.java b/solutions/src/main/java/pr2/vererbung/ueberladen_summe/Summator.java new file mode 100644 index 0000000..7f0bfa1 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberladen_summe/Summator.java @@ -0,0 +1,20 @@ +package pr2.vererbung.ueberladen_summe; + +public class Summator { + + public int sum(int a, int b) { + return a + b; + } + + public int sum(int a, int b, int c) { + return a + b + c; + } + + public int sum(int a, int b, int c, int d) { + return a + b + c + d; + } + + public int sum(int a, int b, int c, int d, int e) { + return a + b + c + d + e; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberladen_summe/test/SummatorTest.java b/solutions/src/main/java/pr2/vererbung/ueberladen_summe/test/SummatorTest.java new file mode 100644 index 0000000..d20882e --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberladen_summe/test/SummatorTest.java @@ -0,0 +1,22 @@ +package pr2.vererbung.ueberladen_summe.test; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.ueberladen_summe.Summator; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SummatorTest { + + @Test + void testSum() { + Summator s = new Summator(); + assertEquals(3, s.sum(1, 2)); + assertEquals(1, s.sum(-1, 2)); + assertEquals(6, s.sum(1, 2, 3)); + assertEquals(0, s.sum(1, 2, -3)); + assertEquals(10, s.sum(1, 2, 3, 4)); + assertEquals(2, s.sum(1, 2, 3, -4)); + assertEquals(15, s.sum(1, 2, 3, 4, 5)); + assertEquals(5, s.sum(1, 2, 3, 4, -5)); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Amoebe.java b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Amoebe.java new file mode 100644 index 0000000..86dcc48 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Amoebe.java @@ -0,0 +1,9 @@ +package pr2.vererbung.ueberschreiben_lebewesen; + +public class Amoebe extends Lebewesen { + + @Override + public void bewegen() { + System.out.println("Schleimen"); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Dackel.java b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Dackel.java new file mode 100644 index 0000000..89aeb8d --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Dackel.java @@ -0,0 +1,13 @@ +package pr2.vererbung.ueberschreiben_lebewesen; + +public class Dackel extends Lebewesen { + + @Override + public void bewegen() { + System.out.println("Auf kurzen Beinen vorwärts wackeln"); + } + + public void bellen() { + System.out.println("Wau wau wau"); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Lebewesen.java b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Lebewesen.java new file mode 100644 index 0000000..85ebef2 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Lebewesen.java @@ -0,0 +1,8 @@ +package pr2.vererbung.ueberschreiben_lebewesen; + +public class Lebewesen { + + public void bewegen() { + /* nichts machen */ + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Main.java b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Main.java new file mode 100644 index 0000000..e535a17 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Main.java @@ -0,0 +1,16 @@ +package pr2.vererbung.ueberschreiben_lebewesen; + +public class Main { + + public static void main(String[] args) { + Lebewesen l1 = new Dackel(); + Lebewesen l2 = new Amoebe(); + + l1.bewegen(); + l2.bewegen(); + + if (l1 instanceof Dackel) { + ((Dackel) l1).bellen(); + } + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vararg_summe/Summator.java b/solutions/src/main/java/pr2/vererbung/vararg_summe/Summator.java new file mode 100644 index 0000000..6457e2a --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vararg_summe/Summator.java @@ -0,0 +1,22 @@ +package pr2.vererbung.vararg_summe; + +public class Summator { + + public int sum(int a, int b) { + return a + b; + } + + public int sum(int a, int b, int c) { + return a + b + c; + } + + public int sum(int a, int b, int c, int... as) { + int sum = a + b + c; + + for (int i : as) { + sum += i; + } + + return sum; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vararg_summe/test/SummatorTest.java b/solutions/src/main/java/pr2/vererbung/vararg_summe/test/SummatorTest.java new file mode 100644 index 0000000..93aba84 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vararg_summe/test/SummatorTest.java @@ -0,0 +1,23 @@ +package pr2.vererbung.vararg_summe.test; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.vararg_summe.Summator; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SummatorTest { + + @Test + void testSum() { + Summator s = new Summator(); + assertEquals(3, s.sum(1, 2)); + assertEquals(1, s.sum(-1, 2)); + assertEquals(6, s.sum(1, 2, 3)); + assertEquals(0, s.sum(1, 2, -3)); + assertEquals(10, s.sum(1, 2, 3, 4)); + assertEquals(2, s.sum(1, 2, 3, -4)); + assertEquals(15, s.sum(1, 2, 3, 4, 5)); + assertEquals(5, s.sum(1, 2, 3, 4, -5)); + assertEquals(36, s.sum(1, 2, 3, 4, 5, 6, 7, 8)); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Dreieck.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Dreieck.java new file mode 100644 index 0000000..70162b9 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Dreieck.java @@ -0,0 +1,17 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Ein Dreieck. + */ +public class Dreieck extends Figur { + + /** + * Erzeugt ein neues Dreieck mit den gegebenen Daten. + * + * @param grundseite Grundseite des Dreiecks. + * @param hoehe Höhe des Dreiecks. + */ + public Dreieck(double grundseite, double hoehe) { + super(grundseite * hoehe / 2); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Figur.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Figur.java new file mode 100644 index 0000000..ebe5383 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Figur.java @@ -0,0 +1,37 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Basisklasse für geometrische Formen. + */ +public class Figur { + + /** + * Fläche der Figur. + */ + private double flaeche; + + /** + * Legt eine neue Figur mit der Fläche 0 an. + */ + protected Figur() { + /* leer */ + } + + /** + * Legt eine neue Figur mit der gegebenen Fläche an. + * + * @param flaeche Fläche der Figur. + */ + protected Figur(double flaeche) { + this.flaeche = flaeche; + } + + /** + * Liefert die Fläche der Figur. + * + * @return die Fläche. + */ + public double getFlaeche() { + return flaeche; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Gerade.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Gerade.java new file mode 100644 index 0000000..55dbcf3 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Gerade.java @@ -0,0 +1,31 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Eine Gerade. + */ +public class Gerade extends Figur { + + /** + * Länge der Geraden. + */ + private double laenge; + + /** + * Legt eine neue Gerade mit der gegebenen Länge an. + * + * @param laenge Länge der Geraden. + */ + public Gerade(double laenge) { + super(); + this.laenge = laenge; + } + + /** + * Liefert die Länge der Geraden. + * + * @return die Länge. + */ + public double getLaenge() { + return laenge; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Quadrat.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Quadrat.java new file mode 100644 index 0000000..5e0626f --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Quadrat.java @@ -0,0 +1,16 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Qudrat. + */ +public class Quadrat extends Rechteck { //*** replace(public class Quadrat {) + + /** + * Legt ein neues Quadrat an. + * + * @param seitenlaenge Länge der Seiten des Quadrates. + */ + public Quadrat(double seitenlaenge) { + super(seitenlaenge, seitenlaenge); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Rechteck.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Rechteck.java new file mode 100644 index 0000000..e1dd8dc --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Rechteck.java @@ -0,0 +1,17 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Rechteck. + */ +public class Rechteck extends Figur { + + /** + * Legt ein neues Rechteck an. + * + * @param breite Breite. + * @param hoehe Höhe. + */ + public Rechteck(double breite, double hoehe) { + super(breite * hoehe); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/test/FigurenTest.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/test/FigurenTest.java new file mode 100644 index 0000000..446402d --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/test/FigurenTest.java @@ -0,0 +1,67 @@ +package pr2.vererbung.vererbung_geometrie.test; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.vererbung_geometrie.Dreieck; +import pr2.vererbung.vererbung_geometrie.Gerade; +import pr2.vererbung.vererbung_geometrie.Quadrat; +import pr2.vererbung.vererbung_geometrie.Rechteck; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Tests für die Figuren. + */ +public class FigurenTest { + + private static final double PRECISION = 0.0001; + + /** + * Rechteck. + */ + @Test + void testReckteck() { + Rechteck r1 = new Rechteck(4.0, 5.0); + Rechteck r2 = new Rechteck(0.0, 3.0); + assertEquals(20.0, r1.getFlaeche(), PRECISION); + assertEquals(0.0, r2.getFlaeche(), PRECISION); + } + + /** + * Dreieck. + */ + @Test + void testDreieck() { + Dreieck d1 = new Dreieck(6.0, 3.5); + assertEquals(10.5, d1.getFlaeche(), PRECISION); + } + + /** + * Gerade. + */ + @Test + void testGerade() { + Gerade g1 = new Gerade(8.0); + assertEquals(8.0, g1.getLaenge(), PRECISION); + assertEquals(0.0, g1.getFlaeche(), PRECISION); + + g1 = new Gerade(0.0); + assertEquals(0.0, g1.getLaenge(), PRECISION); + assertEquals(0.0, g1.getFlaeche(), PRECISION); + } + + /** + * Quadrat. + */ + @Test + void testQuadrat() { + Quadrat q1 = new Quadrat(3.0); + assertEquals(9.0, q1.getFlaeche(), PRECISION); + + Rechteck r1 = new Rechteck(5.0, 5.0); + Quadrat q2 = new Quadrat(5.0); + assertEquals(r1.getFlaeche(), q2.getFlaeche(), PRECISION); + + q1 = new Quadrat(0.0); + assertEquals(0.0, q1.getFlaeche(), PRECISION); + } +}