diff --git a/Assignment_009/img/rabbit.jpg b/Assignment_009/img/rabbit.jpg new file mode 100644 index 0000000..7cf4a5a Binary files /dev/null and b/Assignment_009/img/rabbit.jpg differ diff --git a/Assignment_009/readme.md b/Assignment_009/readme.md new file mode 100644 index 0000000..0e3086a --- /dev/null +++ b/Assignment_009/readme.md @@ -0,0 +1,71 @@ +# Was hoppelt den da? + +**🎓 Benotetes Assignment 🎓** + +📆 **Fällig: 19.05.2026** 📆 + +Nachdem Sie den Reptiloiden "Never gonna give you up" vorgesungen haben und ein Bild von Rick Astley entgegengehalten, sind diese wie zu Stein erstarrt und Sie können aus der Höhle flüchten. Hinter sich hören Sie noch das Grunzen und Schreien der Echsenwesen und glauben auch die Stimme von Mark Zuckerberg zu vernehmen. Nie wieder Facebook, Instagram und WhatsApp – das war einfach zu viel. In Zukunft holen Sie sich Ihren Dopamin-Kick nur noch bei TikTok. + +Geschafft! Sie sind an der Erdoberfläche angekommen und schlagen sich nach Hause durch. Die Reise dauert durchaus eine Weile, auch wegen der ständig verspäteten Züge. Als Sie ankommen, brauchen Sie erst einmal etwas Urlaub und Entspannung. + +Also buchen Sie einen schönen Urlaub in den Alpen. Von Ihrem Zimmer haben Sie einen wunderbaren Blick auf die Wiesen und natürlich die Berge. Das einzige Problem: Es gibt kein Internet und damit entfallen die ganzen schönen Online-Spiele und das Netflixen komplett. Sie tun also das, was man in solch einer Situation macht, und schauen aus dem Fenster. + + + +Sie sehen ein Kaninchen, das freudig über die Wiese hoppelt. "Ach, wie schön die Natur ist", denken Sie und seufzen entspannt. + +Während Sie so den Kaninchen zuschauen, denken Sie an Fibonacci und den Biologieunterricht in der Schule. Dort haben Sie gelernt, dass die Größe einer Kaninchenpopulation – solange man keine davon erlegt und isst (lecker) – der Folge der Fibonacci-Zahlen folgt. Da sowieso nichts zu tun ist, setzen Sie sich in und programmieren ein entsprechendes, kleines Programm. + +Die Fibonacci-Zahlen sind rekursiv definiert als: + +1. F_0 = 0 +2. F_1 = 1 +3. F_n = F_{n-1} + F_{n-2} + +Damit ist der Anfang der Fibonacci-Folge: + +| n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | +|-----|---|---|---|---|---|---|---|----|----|----| +| F_n | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | + +## Fibonacci-Berechnung + +Gehen Sie in das Paket [pr2.exceptions.fibonacci](../sources/src/main/java/pr2/exceptions/fibonacci/), in welchem eine Berechnung der Fibonacci-Zahlen durchgeführt wird. + +Das Interface `FibBerechner` für die Fibonacci-Berchnung ist bereits gegeben. + +Fehler, die bei der Berechnung von Fibonacci-Zahlen auftreten, müssen über Subklassen der Ausnahme `FibException` signalisiert werden. Welche Sie hier brauchen, können Sie über die Javadoc des Interfaces erfahren. Sie müssen die Ausnahmen den Methoden des Interfaces hizufügen. + +### Rekursive Berechnung + +Implementieren Sie das Interface mit einer entsprechenden Klasse `FibBerechnerRekursiv`. Verwenden Sie zur Berechnung der Fibonacci-Zahlen einen rekursiven Algorithmus und widerstehen Sie der Versuchung, die Berechnung zu optimieren. + +Diese Klasse ist **nicht** `public` und Instanzen können nur über die Factory erzeugt werden. + +### Iterative Berechnung + +Analog zur rekursiven Berechnung, schreiben Sie eine weitere Klasse `FibBerechnerIterativ`, welche einen iterativen Algorithmus zur Bestimmung verwendet. + +Diese Klasse ist **nicht** `public` und Instanzen können nur über die Factory erzeugt werden. + +### Verwendung einer Tabelle + +Optimieren Sie die Implementierung weiter, indem Sie eine Klasse `FibBerechnerTabelle` schreiben, welche die Zahlen gar nicht mehr berechnet, sondern eine Tabelle verwendet, welche die korrekten Zahlen enthält. + +Diese Klasse ist **nicht** `public` und Instanzen können nur über die Factory erzeugt werden. + +### Factory + +Schreiben Sie eine Factory-Klasse `FibBerechnerFactory` mit deren Hilfe man eine Instanz einer Implementierung von `FibBerechner` erzeugen kann. Verbergen Sie die konkrete Implementierung vor dem Verwender und stellen Sie sicher, dass er nur das Interface verwenden kann. Zur Auswahl der Implementierung wird eine Enumeration verwendet. Schauen Sie sich die vorgegebene [Klasse](../sources/src/main/java/pr2/exceptions/fibonacci/impl/FibBerechnerFactory.java) genau an. + +### Test + +Schreiben Sie automatisierte JUnit-Tests im Paket `pr2.exceptions.fibonacci.test`, welche alle drei Implementierungen testen. Provozieren Sie auch alle denkbaren Fehler der Methoden und überprüfen Sie, ob die richtigen Ausnahmen geworfen werden. + +### Benchmark + +Schreiben Sie eine Klasse `Benchmark`, welche die Perfomance der drei Implementierungen mit den in dem folgenden Array enthaltenen Zahlen: `{ 5, 6, 7, 8, 9, 30, 35, 38, 38, 38 }` testet. + +Welche Implementierung ist am schnellsten? + +**Tipp:** Denken Sie daran, keinen Code zu duplizieren und führen Sie gegebenenfalls weitere Klasse ein, um dies zu vermeiden. Erinnern Sie sich an das Template-Method-Pattern aus der Vorlesung. \ No newline at end of file diff --git a/Assignment_010/readme.md b/Assignment_010/readme.md new file mode 100644 index 0000000..bacfba8 --- /dev/null +++ b/Assignment_010/readme.md @@ -0,0 +1,11 @@ +# Live-Testat + +**🎓 Benotetes Assignment 🎓** + +📆 **Fällig: 13.05.2026** 📆 + +Am **13.05.2025** findet um 12:00 Uhr ein **Live-Testat** statt. Hierbei müssen Sie eine kleine Programmieraufgabe lösen. Das Live-Testat ist auf 60 Minuten angelegt. + +Da diese Aufgabe alleine und nicht im Team ausgeführt wird, bringen Sie bitte einen Laptop (so vorhanden) mit, auf dem Eclipse installiert ist. + +Falls Sie keinen Rechner mitbringen können, haben Sie die Möglichkeit, einen der Poolrechner zu benutzen, d.h. das Laptop ist nicht zwingend notwendig. \ No newline at end of file diff --git a/readme.md b/readme.md index 18754c5..7635d7f 100644 --- a/readme.md +++ b/readme.md @@ -25,6 +25,8 @@ Wichtige Einstellungen für Eclipse sind [hier](help/eclipse.md) beschrieben. | 6. | 15.04.2026 | [Racewars](Assignment_006/readme.md) | **28.04.2026** | | 7. | 22.04.2026 | [Live-Testat](Assignment_007/readme.md) | **22.04.2026** | | 8. | 29.04.2026 | [Ein Traum in Zucker oder kann ich dem Zufallsgenerator trauen?](Assignment_008/readme.md) | **05.05.2026** | +| 9. | 06.05.2026 | [Was hoppelt den da?](Assignment_009/readme.md) | **19.05.2026** | +| 10. | 13.05.2026 | [Live-Testat](Assignment_010/readme.md) | **13.05.2026** | ## 🏛️ Aufbau der Veranstaltung diff --git a/sources/src/main/java/pr2/algorithmen/rnd/DrawRandom.java b/sources/src/main/java/pr2/algorithmen/rnd/DrawRandom.java index 37ae492..57e126b 100644 --- a/sources/src/main/java/pr2/algorithmen/rnd/DrawRandom.java +++ b/sources/src/main/java/pr2/algorithmen/rnd/DrawRandom.java @@ -15,7 +15,7 @@ public class DrawRandom { private static final int W = 100; private static final int H = 100; - private static final int I = 5_000_000; + private static final int I = 50_000_000; private static void generate(RandomGeneratorFactory factory, String fn) throws IOException { @@ -65,7 +65,7 @@ public class DrawRandom { int x = i % W; int y = i / W; - int gray = (int) ((c[i] / (double) max)); + int gray = (int) ((c[i] / (double) max) * 255); int rgb = gray * 65536 + gray * 256 + gray; image.setRGB(x, y, rgb); @@ -77,6 +77,8 @@ public class DrawRandom { public static void main(String[] args) throws Exception { generate(StandardRandomGenerator::new, "standard_random.png"); + generate(SecRandomGenerator::new, "secure_random.png"); + generate(SuperSecRandomGenerator::new, "super_secure_random.png"); System.out.println("Alle Bilder erfolgreich erzeugt."); } } diff --git a/sources/src/main/java/pr2/exceptions/fibonacci/FibBerechner.java b/sources/src/main/java/pr2/exceptions/fibonacci/FibBerechner.java new file mode 100644 index 0000000..a51e6d3 --- /dev/null +++ b/sources/src/main/java/pr2/exceptions/fibonacci/FibBerechner.java @@ -0,0 +1,72 @@ +package pr2.exceptions.fibonacci; + +/** + * Interface für alle Klassen, die Fibonacci-Zahlen berechnen können. + */ +public interface FibBerechner { + + /** + * Die minimale Zahl, welche in eine Fibonacci-Zahl umgewandelt werden kann. + */ + int MIN_FIB = 2; + + /** + * Die maximale Zahl, welche in eine Fibonacci-Zahl umgewandelt werden kann. + */ + int MAX_FIB = 40; + + /** + * Berechnet die Fibonacci-Zahl zu der gegebenen Zahl n. Die Fibonacci-Zahl + * ist definiert als F(0)=0, F(1)=1, F(n)= F(n-1) + F(n-2). + * + * Achtung: Die Methode kann nur Fibonacci-Zahlen für + * {@link #MIN_FIB} <= n <= {@link #MAX_FIB} berechnen. + * + * @param n Zahl, zu der die Fibonacci-Zahl gefunden werden soll + * @return Fibonacci-Zahl zu {@code n} + * @throws FibNumberOutOfBoundsException Wird geworfen, wenn n nicht im + * berechenbaren Bereich liegt. + * @throws FibNegativeNumberException Wird geworfen, wenn der Eingabewert + * negativ ist. + */ + int fib(int n); + + /** + * Gibt ein Array zurück, in dem alle Werte aus der Eingabe durch die + * entsprechende Fibonacci-Zahl ersetzt wurden. + * + * @param numberArray Eingabedaten, die umgewandelt werden sollen + * @return korrespondierende Fibonacci-Zahlen in einem array + * @throws FibNumberOutOfBoundsException Wird geworfen, wenn mindestens ein + * Element des Arrays nicht im berechenbaren Bereich + * liegt. + @throws FibNegativeNumberException Wird geworfen, wenn der Eingabewert + * negativ ist. + */ + int[] fib(int[] numberArray); + + /** + * Liefert zu einer gegebenen Fibonacci-Zahl die zugehörige Zahl n, aus + * der die Fibonacci-Zahl berechnet werden kann. D.h. diese Methode + * ist die Umkehrfunktion von {@link FibBerechner#fib(int)}. + * + * @param fibNumber Fibonacci-Zahl, die zurückgeführt werden soll + * @return die ursprüngliche Zahl + * @throws FibNotAFibonacciNumberException wenn der übergebene Parameter + * keine Fibonacci-Zahl ist, wird die Ausnahme geworfen. + */ + int reverseFib(int fibNumber); + + /** + * Liefert zu einem Array von Fibonacci-Zahlen die zugehörigen Zahlen n, aus + * denen die Fibonacci-Zahl berechnet werden kann. D.h. diese Methode + * ist die Umkehrfunktion von {@link FibBerechner#fib(int[])}. + * + * @param fibNumbers Fibonacci-Zahlen, die zurückgeführt werden sollen + * @return die ursprünglichen Zahlen als Array + * @throws FibNotAFibonacciNumberException wenn das Array Zahlen enthält, + * die keine Fibonacci-Zahlen sind oder die außerhalb + * des Wertebereichs liegen. + */ + int[] reverseFib(int[] fibNumbers); +} diff --git a/sources/src/main/java/pr2/exceptions/fibonacci/FibException.java b/sources/src/main/java/pr2/exceptions/fibonacci/FibException.java new file mode 100644 index 0000000..b12aac6 --- /dev/null +++ b/sources/src/main/java/pr2/exceptions/fibonacci/FibException.java @@ -0,0 +1,9 @@ +package pr2.exceptions.fibonacci; + +/** + * Die Ausnahme, die geworfen wird, wenn die Fibonacci-Zahlen nicht + * berechnet werden können. + */ +public abstract class FibException extends Exception { + +} diff --git a/sources/src/main/java/pr2/exceptions/fibonacci/impl/FibBerechnerFactory.java b/sources/src/main/java/pr2/exceptions/fibonacci/impl/FibBerechnerFactory.java new file mode 100644 index 0000000..84947c9 --- /dev/null +++ b/sources/src/main/java/pr2/exceptions/fibonacci/impl/FibBerechnerFactory.java @@ -0,0 +1,48 @@ +package pr2.exceptions.fibonacci.impl; + +import pr2.exceptions.fibonacci.FibBerechner; + +/** + * Factory für die Fibonacci Berechner. Diese Klasse ist absichtlich nicht als + * static factory modelliert, um sie erweiterbar zu halten. + */ +public class FibBerechnerFactory { + + /** + * Enumeration zur Auswahl der jeweiligen Implementierung. + */ + public enum BerechnerTyp { + /** + * Rekursive Berechnung. + */ + REKURSIV, + + /** + * Berechnung mit Tabelle. + */ + TABELLE, + + /** + * Iterative Berechnung. + */ + ITERATIV; + } + + /** + * Erzeugt eine neue Factory für Fibonacci-Berechner. + */ + public FibBerechnerFactory() { + // nichts zu initialisieren + } + + /** + * Erzeugt einen Fibonacci-Berechner entsprechend dem gewünschten Typ. + * + * @param berechnerTyp Typ des Fibonacci-Berechners + * @return den gewünschten Fibonacci-Berechner + */ + public FibBerechner createFibBerechner(BerechnerTyp berechnerTyp) { + + return null; + } +} diff --git a/sources/src/main/java/pr2/exceptions/fibonacci/test/Benchmark.java b/sources/src/main/java/pr2/exceptions/fibonacci/test/Benchmark.java new file mode 100644 index 0000000..7ebe142 --- /dev/null +++ b/sources/src/main/java/pr2/exceptions/fibonacci/test/Benchmark.java @@ -0,0 +1,15 @@ +package pr2.exceptions.fibonacci.test; + +import pr2.exceptions.fibonacci.FibException; + +public class Benchmark { + + /** + * Testdaten. + */ + public static final int[] TEST_DATEN = {5, 6, 7, 8, 9, 30, 35, 38, 38, 38}; + + + public static void main(String[] args) throws FibException { + } +}