uebungen/readme.md

19 KiB

Programmieren 2 (Sommersemester 2026)

👋 Willkommen zum Kurs Programmieren 2

In Programmieren 2 lernen Sie die Programmierung in Java auf einem fortgeschrittenen Niveau. Sie werden alle wichtigen Konzepte von Java kennenlernen und diese in praktischen Übungen anwenden. Hierbei werden Sie in kleinen Teams arbeiten und komplexere, objektorientierte Programme in Java entwickeln. Die dazu nötigen objektorientierten Konzepte (Polymorphie, Vererbung, Interfaces, etc.) werden Sie ebenso im Kurs anwenden, wie die dazu grundlegenden Algorithmen und Datenstrukturen.

🎓 Freiwillige Übungen

Hier finden Sie die freiwilligen Übungen zur Vorlesung Programmieren 2 (PR2). Die Übungen sind unten aufgelistet. Die Spalte Ausgabe hat keine Bedeutung.

Hinweise zur nötigen Softwareausstattung finden Sie hier.

# Kapitel Thema Musterlösung
1. Auffrischung String in Großbuchstaben umwandeln ✅
2. Auffrischung Labeled Break ✅
3. Auffrischung Passwortbewertung ✅
4. Auffrischung printf mit Formatstring ✅
5. Auffrischung Maximum in einem Array suchen ✅
6. Auffrischung Taschenrechner ✅
7. Einführung Java-Coding-Standard anwenden ✅
8. Einführung Javadoc schreiben ✅
9. Einführung Klasse mit JUnit testen ✅
10. Strukturierung Information-Hiding einer Klasse verbessern ✅
11. Strukturierung Vorhandene Bibliotheken als JAR einbinden ✅
12. Vererbung Final anwenden ✅
13. Vererbung Figur und Rechteck ✅
14. Vererbung Figur erweitern ✅
15. Vererbung Figur noch einmal erweitern ✅
16. Vererbung Konstruktoren schreiben ✅
17. Vererbung Polymorphie einsetzen ✅
18. Vererbung Singleton ✅
19. Vererbung Statische Methoden und Attribute ✅
20. Vererbung Methode überladen ✅
21. Vererbung Methoden überschreiben ✅
22. Vererbung Varag-Methode schreiben ✅
23. Vererbung Vererbung von Figuren ✅
24. Abstrakte Klassen Abstrakte Klassen ✅
25. Abstrakte Klassen Abstrakte Klasse ✅
26. Interfaces Comparable implementieren ✅
27. Interfaces Interface Stack entwerfen ✅
28. Interfaces Interface: Uebersetzer ✅
29. Interfaces Interfaces anwenden und entwerfen ✅
30. Object und Wrapper Deep-Copy mit clone() ✅
31. Object und Wrapper Clone ✅
32. Object und Wrapper equals() und hashCode() implementieren und nutzen ✅
33. Object und Wrapper equals und hashCode ✅
34. Object und Wrapper toString()-Methode implementieren ✅
35. Object und Wrapper Optimierung bei Integer ✅
36. Object und Wrapper Methoden der Wrapper-Klassen ✅
37. Enumerationen Eigene Enumeration schreiben und verwenden ✅
38. Enumerationen Enumeration schreiben ✅
39. Enumerationen Singleton-Eigenschaft von Enumerationen ✅
40. Enumerationen Stein, Papier, Schere, Echse, Spock ✅
41. Ausnahmen Ausnahmen testen ✅
42. Ausnahmen Eigene Ausnahmen schreiben und an entsprechender Stelle werfen ✅
43. Ausnahmen Eigene Exception schreiben ✅
44. Ausnahmen Handle-or-Declare-Regel anwenden ✅
45. Ausnahmen Ausnahmen mit try und catch behandeln. ✅
46. Input und Output BufferedReader zum zeilenweisen Lesen einsetzen ✅
47. Input und Output DataOutputStream ✅
48. Input und Output DataOutputStream durch Serialisierung ersetzen ✅
49. Input und Output Daten mit DataOutputStream und DataInputStream verarbeiten ✅
50. Input und Output Daten mit einem InputStream lesen ✅
51. Input und Output Daten mit einem OutputStream schreiben ✅
52. Input und Output Filesystem-Abstraktion mit File ✅
53. Input und Output Fileattribute lesen ✅
54. Input und Output FilterReader ✅
55. Input und Output Konsolen Input/Output ✅
56. Input und Output Zeilen einer Textdatei zählen ✅
57. Input und Output RandomAccessFile ✅
58. Input und Output Reader verwenden ✅
59. Input und Output Rot13-Verschlüsselung ✅
60. Input und Output Datei zerhacken ✅
61. Input und Output Serialisierung ✅
62. Generische Typen Einen generischen Typ schreiben ✅
63. Generische Typen Generische Klasse Pair schreiben ✅
64. Generische Typen Generische Klasse Pair erweitern: NumberPair ✅
65. Generische Typen Generische Klasse Pair erweitern: SamePair ✅
66. Generische Typen PairList ✅
67. Generische Typen Wildcard benutzen ✅
68. Generische Typen Generische Queue ✅
69. Generische Typen super und extends einsetzen ✅
70. Generische Typen Generische Typen zusammen mit Wildcards einsetzen ✅
71. Geschachtelte Klassen Eigene compare-Methode schreiben ✅
72. Geschachtelte Klassen Innere Klasse Beobachter ✅
73. Geschachtelte Klassen Callback mit anonymer Klasse realisieren ✅
74. Lambdas Comparator als Lambda ✅
75. Lambdas Callback mit Lambda realisieren ✅
76. Geschachtelte Klassen MatrixSuche ✅
77. Lambdas StringTransmogrifier ✅
78. Lambdas StringTransmogrifier erweitern ✅
79. Collections Iterator schreiben ✅
80. Collections Iterator programmieren ✅
81. Collections List<T> und dessen Implementierungen ✅
82. Collections Map<T> verwenden ✅
83. Collections ReverserGeneric ✅
84. Collections Strings umgekehrt sortieren: Reverser ✅
85. Collections Set<T> und dessen Implementierungen ✅
86. Collections CommandLineSorter ✅
87. Collections CommandLineSorter -- Version 2 ✅
88. Collections Comparator<T> verwenden und Objekte sortieren ✅
89. Collections Wörterbuchprogramm ✅
90. Streams Kleinbuchstaben in einem String zählen ✅
91. Streams Buchstaben in einer Liste von Strings zählen ✅
92. Streams Kleinbuchstaben in einem String zählen ✅
93. Streams Liste filtern ✅
94. Streams Streams mit interner Iteration ✅
95. Streams Map und Filter auf Streams ✅
96. Streams Map und Reduce auf Streams ✅
97. Streams Reduce ✅
98. Streams Summe über reduce bestimmen ✅
99. Streams Wörter zählen ✅
100. Threads Fakultät parallel berechnen ✅
101. Threads Thread per interrupt beenden ✅
102. Threads wait und notify benutzen ✅
103. Threads Parallele Ausgaben erzeugen ✅
104. Threads Race-Condition finden und beheben ✅
105. Threads Stack und Heap unterscheiden ✅
106. Threads synchronized verwenden ✅
107. Threads Timer und TimerTask verwenden ✅
108. Reflection Klasse per Reflection analysieren ✅
109. Reflection Objekte per Reflection erzeugen ✅