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_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_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_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_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_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/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_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_003/readme.md b/Einfuehrung_003/readme.md index d6e5b1c..9d15418 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 index ee12743..0771f5a 100644 --- a/Einfuehrung_003/solution/readme.md +++ b/Einfuehrung_003/solution/readme.md @@ -1,4 +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/). +Gehen Sie in das Paket [pr2.intro.junit_factorials](../../solutions/src/main/java/pr2/intro/junit_factorial/). diff --git a/Strukturierung_001/readme.md b/Strukturierung_001/readme.md index 0df925f..c4f8b2f 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_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/readme.md b/readme.md index a1f2b86..ed85bd2 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) | | +| 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) | | 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..707336a --- /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/intro/coding_standard/CodingStandard.java b/solutions/src/main/java/pr2/intro/coding_standard/CodingStandard.java new file mode 100644 index 0000000..ec56c7f --- /dev/null +++ b/solutions/src/main/java/pr2/intro/coding_standard/CodingStandard.java @@ -0,0 +1,52 @@ +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..f9ad19b --- /dev/null +++ b/solutions/src/main/java/pr2/intro/javadoc/Waehrung.java @@ -0,0 +1,140 @@ +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/strukturierung/information_hiding/Rechner.java b/solutions/src/main/java/pr2/strukturierung/information_hiding/Rechner.java new file mode 100644 index 0000000..42bdd2d --- /dev/null +++ b/solutions/src/main/java/pr2/strukturierung/information_hiding/Rechner.java @@ -0,0 +1,60 @@ +package pr2.strukturierung.information_hiding; + +/** + * Ein einfacher Taschenrechner. + */ +public class Rechner { + + /** Speicher des Taschenrechners. */ + private double speicher; + + /** + * Addiert zwei Werte und gibt das Ergebnis zurück. + * + * @param a erster Operand. + * @param b zweiter Operand. + * @return das Ergebnis. + */ + public double addiere(double a, double b) { + return a + b; + } + + /** + * Subtrahiert zwei Werte und gibt das Ergebnis zurück. + * + * @param a erster Operand. + * @param b zweiter Operand. + * @return das Ergebnis. + */ + public double subtrahiere(double a, double b) { + return a - b; + } + + /** + * Multipliziert zwei Werte und gibt das Ergebnis zurück. + * + * @param a erster Operand. + * @param b zweiter Operand. + * @return das Ergebnis. + */ + public double multipliziere(double a, double b) { + return a * b; + } + /** + * Gibt den gespeicherten Wert zurück. + * + * @return gespeicherter Wert. + */ + public double getSpeicher() { + return speicher; + } + + /** + * Speichert den gegebenen Wert. + * + * @param wert Wert, der gespeichert werden soll. + */ + public void setSpeicher(double wert) { + speicher = wert; + } +} diff --git a/solutions/src/test/java/pr2/auffrischung/grossmacher/GrossmacherTest.java b/solutions/src/test/java/pr2/auffrischung/grossmacher/GrossmacherTest.java new file mode 100644 index 0000000..cd6d979 --- /dev/null +++ b/solutions/src/test/java/pr2/auffrischung/grossmacher/GrossmacherTest.java @@ -0,0 +1,44 @@ +package pr2.auffrischung.grossmacher; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class GrossmacherTest { + + private static PrintStream out; + + @BeforeAll + static void setup() { + out = System.out; + } + + @AfterAll + static void tearDown() { + System.setOut(out); + } + + @ParameterizedTest + @ValueSource(strings = { "alles klein", "ALLES GROSS", "gemIschT" }) + void testMain(String text) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(bos); + System.setOut(ps); + + Grossmacher.main(new String[] { text }); + String result = String.format("Ergebnis: %s\nZeichen : %d", + text.toUpperCase(), + text.length()); + + assertEquals(result, bos.toString().trim()); + bos.close(); + // Don't close ps! + } +} diff --git a/solutions/src/test/java/pr2/auffrischung/labeled_break/ArraySucherTest.java b/solutions/src/test/java/pr2/auffrischung/labeled_break/ArraySucherTest.java new file mode 100644 index 0000000..1aafdc0 --- /dev/null +++ b/solutions/src/test/java/pr2/auffrischung/labeled_break/ArraySucherTest.java @@ -0,0 +1,28 @@ +package pr2.auffrischung.labeled_break; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + + +public class ArraySucherTest { + + final int[][] EMPTY = {{}}; + final int[][] ZERO = { { 0, 0, 0 }, { 0, 0, 0 }}; + final int[][] END = { { 0, 0, 0 }, { 0, 0, 1 }}; + final int[][] BEGINNING = { { 1, 0, 0 }, { 0, 0, 0 }}; + final int[][] ONE = { { 1, 1, 1 }, { 1, 1, 1 }}; + final int[][] TRIANGLE = { { 0, 0 }, { 0, 0 }, { 0, 0, 0 }, { 0, 0, 0, 1 } }; + + + @Test + void testSuche() { + var as = new ArraySucher(); + assertFalse(as.suche(EMPTY)); + assertFalse(as.suche(ZERO)); + assertTrue(as.suche(END)); + assertTrue(as.suche(BEGINNING)); + assertTrue(as.suche(ONE)); + assertTrue(as.suche(TRIANGLE)); + } +} diff --git a/solutions/src/test/java/pr2/auffrischung/password/PasswortCheckerTest.java b/solutions/src/test/java/pr2/auffrischung/password/PasswortCheckerTest.java new file mode 100644 index 0000000..8ff2758 --- /dev/null +++ b/solutions/src/test/java/pr2/auffrischung/password/PasswortCheckerTest.java @@ -0,0 +1,19 @@ +package pr2.auffrischung.password; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static pr2.auffrischung.password.PasswortChecker.checkPassword; + +public class PasswortCheckerTest { + + @Test + void testPasswordChecker() { + assertEquals(0, checkPassword("mutti")); + assertEquals(0, checkPassword("1234")); + assertEquals(1, checkPassword("Mutti")); + assertEquals(2, checkPassword("mutti123")); + assertEquals(3, checkPassword("Mutti123")); + assertEquals(4, checkPassword("Mutti123!%")); + } +} diff --git a/solutions/src/test/java/pr2/auffrischung/printf/DoubleFormatterTest.java b/solutions/src/test/java/pr2/auffrischung/printf/DoubleFormatterTest.java new file mode 100644 index 0000000..1318b53 --- /dev/null +++ b/solutions/src/test/java/pr2/auffrischung/printf/DoubleFormatterTest.java @@ -0,0 +1,60 @@ +package pr2.auffrischung.printf; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static pr2.auffrischung.printf.DoubleFormatter.printDouble; + +public class DoubleFormatterTest { + + private static PrintStream out; + + @BeforeAll + static void setup() { + out = System.out; + } + + @AfterAll + static void tearDown() { + System.setOut(out); + } + + @Test + void testPrintf() throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + PrintStream out = System.out; + PrintStream ps = new PrintStream(bos); + System.setOut(ps); + + printDouble(1.0); + assertEquals("1.000", bos.toString().trim()); + bos.reset(); + printDouble(10.1); + assertEquals("10.100", bos.toString().trim()); + bos.reset(); + printDouble(2.01); + assertEquals("2.010", bos.toString().trim()); + bos.reset(); + printDouble(2.001); + assertEquals("2.001", bos.toString().trim()); + bos.reset(); + printDouble(2.0001); + assertEquals("2.000", bos.toString().trim()); + bos.reset(); + printDouble(2.0004); + assertEquals("2.000", bos.toString().trim()); + bos.reset(); + printDouble(2.0005); + assertEquals("2.001", bos.toString().trim()); + bos.reset(); + + bos.close(); + // Don't close ps! + } +} diff --git a/solutions/src/test/java/pr2/auffrischung/suchemax/GroessteZahlTest.java b/solutions/src/test/java/pr2/auffrischung/suchemax/GroessteZahlTest.java new file mode 100644 index 0000000..2710577 --- /dev/null +++ b/solutions/src/test/java/pr2/auffrischung/suchemax/GroessteZahlTest.java @@ -0,0 +1,27 @@ +package pr2.auffrischung.suchemax; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class GroessteZahlTest { + + @Test + void testSucheMax() { + GroessteZahl g = new GroessteZahl(); + assertEquals(8, g.sucheMax( + new int[] {1, 5, 8, 2, 0})); + assertEquals(-1, g.sucheMax( + new int[] {-1, -5, -8, -2, -20})); + assertEquals(10000, g.sucheMax( + new int[] {10000, -10000, 1, 2, 33})); + assertEquals(9, g.sucheMax( + new int[] {9})); + assertEquals(0, g.sucheMax( + new int[] {0, 0, 0, 0, 0, 0, 0})); + assertEquals(Integer.MAX_VALUE, g.sucheMax( + new int[] {Integer.MIN_VALUE, Integer.MAX_VALUE})); + assertEquals(Integer.MIN_VALUE, g.sucheMax( + new int[] {Integer.MIN_VALUE, Integer.MIN_VALUE})); + } +} diff --git a/solutions/src/test/java/pr2/auffrischung/taschenrechner/TaschenrechnerTest.java b/solutions/src/test/java/pr2/auffrischung/taschenrechner/TaschenrechnerTest.java new file mode 100644 index 0000000..ec98243 --- /dev/null +++ b/solutions/src/test/java/pr2/auffrischung/taschenrechner/TaschenrechnerTest.java @@ -0,0 +1,35 @@ +package pr2.auffrischung.taschenrechner; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +public class TaschenrechnerTest { + + @Test + void testRechne() { + Taschenrechner t = new Taschenrechner(); + assertEquals(0.0, t.rechne(0.0, '+', 0.0)); + assertEquals(0.0, t.rechne(0.0, '-', 0.0)); + assertEquals(0.0, t.rechne(0.0, '*', 0.0)); + assertEquals(0.0, t.rechne(0.0, '/', 1.0)); + assertEquals(0.0, t.rechne(0.0, '^', 1.0)); + + assertEquals(2.0, t.rechne(1.0, '+', 1.0)); + assertEquals(0.0, t.rechne(1.0, '-', 1.0)); + assertEquals(1.0, t.rechne(1.0, '*', 1.0)); + assertEquals(1.0, t.rechne(1.0, '/', 1.0)); + assertEquals(1.0, t.rechne(1.0, '^', 1.0)); + + assertEquals(4.4, t.rechne(2.2, '+', 2.2)); + assertEquals(2.2, t.rechne(4.4, '-', 2.2)); + assertEquals(4.4, t.rechne(2.2, '*', 2.0)); + assertEquals(2.0, t.rechne(2.2, '/', 1.1)); + assertEquals(4.0, t.rechne(2.0, '^', 2.0)); + + assertEquals(Double.NaN, t.rechne(1.0, '~', 1.0)); + + assertNotEquals(0.0, t.rechne(1.0, '~', 1.0) ); + } +} diff --git a/solutions/src/test/java/pr2/strukturierung/information_hiding/test/RechnerTest.java b/solutions/src/test/java/pr2/strukturierung/information_hiding/test/RechnerTest.java new file mode 100644 index 0000000..264712f --- /dev/null +++ b/solutions/src/test/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); + } +}