From 8c894d16ce968f347f1e04cf95a35eab9aa082fe Mon Sep 17 00:00:00 2001 From: appenmaier <47243617+appenmaier@users.noreply.github.com> Date: Sun, 5 Jan 2025 18:58:22 +0100 Subject: [PATCH] Fixes (#240) --- .../daniel/java1/sample-exam.md | 6 +- .../daniel/java2/sample-exam.md | 268 ++++++------------ docs/documentation/slf4j.mdx | 14 +- .../activity-diagrams/insertion-sort.md | 4 +- 4 files changed, 104 insertions(+), 188 deletions(-) diff --git a/docs/additional-material/daniel/java1/sample-exam.md b/docs/additional-material/daniel/java1/sample-exam.md index 13f3da95fb..41da780b49 100644 --- a/docs/additional-material/daniel/java1/sample-exam.md +++ b/docs/additional-material/daniel/java1/sample-exam.md @@ -12,8 +12,6 @@ tags: [] - Pakete und Klassenimporte müssen nicht angegeben werden - Es kann davon ausgegangen werden, dass sämtliche Klassen entsprechende Implementierungen der Object-Methoden besitzen -- Der Stereotyp `enumeration` impliziert, dass die Aufzählung einen passenden - Konstruktor sowie gegebenenfalls passende Getter für alle Attribute besitzt - So nicht anders angegeben sollen Konstruktoren, Setter, Getter sowie die Object-Methoden wie in der Vorlesung gezeigt implementiert werden - Die Konsolenausgaben-Methoden der Klasse `PrintStream` dürfen sinnvoll gekürzt @@ -154,7 +152,7 @@ public class Class { // 0,5 public String toString() { // 0,5 return "Class [description=" + description + ", courseOfStudies=" + courseOfStudies.description() - + ", lectures=" + lectures + ", students=" + students + "]"; // 1,5 + + ", lectures=" + lectures + ", students=" + students + "]"; // 1,5 } // 2 } @@ -173,7 +171,7 @@ public class ExamTask01 { // 0,5 System.out.println(wwibe224); // 1 System.out.println("Vorlesung mit den meisten ECTS-Punkten: " - + wwibe224.getLectureWithMostCreditPoints()); // 1 + + wwibe224.getLectureWithMostCreditPoints()); // 1 } // 7,5 diff --git a/docs/additional-material/daniel/java2/sample-exam.md b/docs/additional-material/daniel/java2/sample-exam.md index 24546d7fc1..40e8771c7c 100644 --- a/docs/additional-material/daniel/java2/sample-exam.md +++ b/docs/additional-material/daniel/java2/sample-exam.md @@ -1,5 +1,5 @@ --- -title: Klausur +title: Musterklausur description: '' sidebar_position: 10 tags: [] @@ -12,14 +12,9 @@ tags: [] - Pakete und Klassenimporte müssen nicht angegeben werden - Es kann davon ausgegangen werden, dass sämtliche Klassen entsprechende Implementierungen der Object-Methoden besitzen -- Der Stereotyp `enumeration` impliziert, dass die Aufzählung einen passenden - Konstruktor sowie gegebenenfalls passende Getter für alle Attribute besitzt -- Der Stereotyp `record` impliziert, dass die Datenklasse einen passenden - Konstruktor, Getter zu allen Attributen sowie entsprechende Implementierungen - der Object-Methoden besitzt - So nicht anders angegeben sollen Konstruktoren, Setter, Getter sowie die Object-Methoden wie in der Vorlesung gezeigt implementiert werden -- Annotationen der Lombok-Bibliothek dürfen verwendet werden +- Die Annotationen der Lombok-Bibliothek dürfen verwendet werden - Die Konsolenausgaben-Methoden der Klasse `PrintStream` dürfen sinnvoll gekürzt geschrieben werden (zum Beispiel _syso("Hello World")_ statt _System.out.println("Hello World")_) @@ -39,7 +34,6 @@ classDiagram SuperHuman <|-- Hero : extends Universe --o SuperHuman SuperLeague~T extends SuperHuman~ o-- Universe - WrongUniverseException <.. SuperLeague~T extends SuperHuman~ : throws class SuperHuman { <> @@ -66,22 +60,14 @@ classDiagram DC } - class WrongUniverseException { - <> - } - class SuperLeague~T extends SuperHuman~ { - -name: String #123;final#125; - -universe: Universe #123;final#125; - -members: Map~T, Boolean~ #123;final#125; - +SuperLeague(name: String, universe: Universe, members: Map~T, Boolean~) + <> + name: String + universe: Universe + members: Map~T, Boolean~ +addSuperHuman(t: T) void +getAllAvailableSuperHumans() List~T~ - +getMembers() Map~T, Boolean~ +getMostPowerfulSuperHuman() Optional~T~ - +getName() String - +getUniverse() Universe - +sendSuperHumanOnMission(t: T) void } ``` @@ -90,64 +76,37 @@ classDiagram - Die Schlüssel-Werte-Paare des Assoziativspeichers beinhalten als Schlüssel die Übermenschen der Liga sowie als Wert deren Verfügbarkeit - Die Methode `Optional getMostPowerfulSuperHuman()` soll den stärksten - Übermenschen der Liga zurückgeben + Übermenschen der Liga zurückgeben (5,5 Punkte) - Die Methode `void addSuperHuman(t: T)` soll der Liga den eingehenden Übermenschen als verfügbares Mitglied hinzufügen. Für den Fall, dass das Universum des eingehenden Übermenschen nicht dem Universum der Liga - entspricht, soll die Ausnahme `WrongUniverseException` ausgelöst werden + entspricht, soll die Ausnahme `WrongUniverseException` ausgelöst werden (4 + Punkte) - Die Methode `List getAllAvailableSuperHumans()` soll alle verfügbaren - Übermenschen der Liga zurückgeben -- Die Methode `void sendSuperHumanOnMission(t: T)` soll die Verfügbarkeit des - eingehenden Übermenschen auf _nicht verfügbar_ setzen + Übermenschen der Liga zurückgeben (4,5 Punkte) ### Musterlösung ```java title="SuperLeage.java" showLineNumbers -/* Option A */ -public record SuperLeague - (String name, Universe universe, Map members) { // 1 -/* Option A */ - -/* Option B */ -@Data // 0,5 -public class SuperLeague { // 0,125 - private final String name; // 0,125 - private final Universe universe; // 0,125 - private final Map members; // 0,125 -/* Option B */ - -/* Option C */ -public class SuperLeague { // 0,125 - private final String name; // 0,125 - private final Universe universe; // 0,125 - private final Map members; // 0,125 - public SuperLeague(String name, Universe universe, Map members) { - this.name = name; - this.universe = universe; - this.members = members; - } // 0,125 - public String getName() { return name; } // 0,125 - public Universe getUniverse() { return universe; } // 0,125 - public Map getMembers() { return members; } // 0,125 -/* Option C */ +public record SuperLeague (String name, Universe universe, + Map members) { // 2 public Optional getMostPowerfulSuperHuman() { // 0,5 T mostPowerfulSuperHuman = null; // 0,5 int power = 0; // 0,5 for (T t : members.keySet()) { // 1 - if (t.power() > power) { // 0,5 + if (t.power() > power) { // 1 power = t.power(); // 0,5 mostPowerfulSuperHuman = t; // 0,5 } } return Optional.ofNullable(mostPowerfulSuperHuman); // 1 - } // 5 + } // 5,5 public void addSuperHuman(T t) throws WrongUniverseException { // 1 if (!t.universe().equals(universe)) { // 1 throw new WrongUniverseException(); // 1 } - members.put(t, true); // 1 } // 4 @@ -161,14 +120,10 @@ public class SuperLeague { // 0,125 return allAvailableSuperHumans; // 0,5 } // 4,5 - public void sendSuperHumanOnMission(T t) { // 0,5 - members.put(t, false); // 1 - } // 1,5 - } // 16 ``` -## Aufgabe 2 (14 Punkte) +## Aufgabe 2 (18 Punkte) Erstelle die JUnit-5-Testklasse `SuperLeagueTest` anhand des abgebildeten Klassendiagramms. @@ -183,7 +138,6 @@ classDiagram SuperHuman <|-- Hero : extends Universe --o SuperHuman SuperLeague~T extends SuperHuman~ o-- Universe - WrongUniverseException <.. SuperLeague~T extends SuperHuman~ : throws class SuperHuman { <> @@ -210,30 +164,22 @@ classDiagram DC } - class WrongUniverseException { - <> - } - class SuperLeague~T extends SuperHuman~ { - -name: String #123;final#125; - -universe: Universe #123;final#125; - -members: Map~T, Boolean~ #123;final#125; - +SuperLeague(name: String, universe: Universe, members: Map~T, Boolean~) + <> + name: String + universe: Universe + members: Map~T, Boolean~ +addSuperHuman(t: T) void +getAllAvailableSuperHumans() List~T~ - +getMembers() Map~T, Boolean~ +getMostPowerfulSuperHuman() Optional~T~ - +getName() String - +getUniverse() Universe - +sendSuperHumanOnMission(t: T) void } class SuperLeagueTest { <> -avengers: SuperLeague~Hero~ - -superman: Hero - -ironman: Hero - -spiderman: Hero + -superman: Hero #123;Mock#125; + -ironman: Hero #123;Mock#125; + -spiderman: Hero #123;Mock#125; +setUp() void +testAddSuperHuman() void +testGetAllAvailableSuperHumans() void @@ -243,79 +189,69 @@ classDiagram ### Hinweise zur Klasse _SuperLeagueTest_ -- Die Lebenszyklus-Methode `void setUp()` soll den Superhelden _Superman_ (Name: - Superman, Universum: DC, Stärke: 10), den Superhelden _Iron Man_ (Name: Iron - Man, Universum: MARVEL, Stärke: 7), den Superhelden _Spider-Man_ (Name: - Spider-Man, Universum: MARVEL, Stärke: 8) sowie die Superheldenliga _Avengers_ - (Name: Avengers, Universum: MARVEL) erstellen und den entsprechenden - Attributen zuweisen und die Superhelden _Iron Man_ sowie _Spider-Man_ der - Superheldenliga _Avengers_ als verfügbare Superhelden hinzufügen +- Die Lebenszyklus-Methode `void setUp()` soll sämtliche Mock-Objekte sowie die + Superheldenliga _Avengers_ (Name: Avengers, Universum: MARVEL) erstellen und + den entsprechenden Attributen zuweisen und der Superheldenliga _Avengers_ den + Superhelden _Iron Man_ als verfügbaren sowie den Superhelden _Spider-Man_ als + nicht verfügbaren Superhelden hinzufügen (5 Punkte) - Die Testmethode `void testAddSuperHuman()` soll prüfen, ob beim Aufruf der Methode `void addSuperHuman(t: T)` mit dem Superhelden _Superman_ die Ausnahme - `WrongUniverseException` ausgelöst wird -- Die Testmethode `void testGetAllAvailableSuperHumans()` soll den Superheld - _Spider-Man_ auf eine Mission schicken und prüfen, ob beim Aufruf der Methode - `List getAllAvailableSuperHumans()` eine Liste der Größe 1 zurückgegeben - wird + `WrongUniverseException` ausgelöst wird. Hierzu soll das Mock-Objekt + _Superman_ beim Aufruf der Methode `Universe universe()` den Wert _DC_ + zurückgeben (3 Punkte) +- Die Testmethode `void testGetAllAvailableSuperHumans()` soll prüfen, ob beim + Aufruf der Methode `List getAllAvailableSuperHumans()` eine Liste der Größe + 1 zurückgegeben wird (2,5 Punkte) - Die Testmethode `void testGetMostPowerfulSuperHuman()` soll prüfen, ob beim Aufruf der Methode `Optional getMostPowerfulSuperHuman()` der Superheld - _Spider-Man_ als Optional zurückgegeben wird + _Spider-Man_ als Optional zurückgegeben wird. Hierzu soll das Mock-Objekt + _Iron Man_ beim Aufruf der Methode `int power()` den Wert 7 und das + Mock-Objekt _Spider-Man_ den Wert 8 zurückgeben (3,5 Punkte) ### Musterlösung ```java title="SuperLeagueTest.java" showLineNumbers public class SuperLeagueTest { // 0,5 - private SuperLeague avengers; // 0,25 - private Hero superman; // 0,25 - private Hero ironman; // 0,25 - private Hero spiderman; // 0,25 - - @BeforeEach // 0,25 - void setUp() { throws WrongUniverseException { // 0,25 +0,5 (bei Option A) - superman = new Hero("Superman", Universe.DC, 10); // 1 - ironman = new Hero("Iron Man", Universe.MARVEL, 7); // 1 - spiderman = new Hero("Spider-Man", Universe.MARVEL, 8); // 1 + private SuperLeague avengers; // 0,5 + @Mock // 0,5 + private Hero superman; // 0,5 + @Mock // 0,5 + private Hero ironman; // 0,5 + @Mock // 0,5 + private Hero spiderman; // 0,5 + + @BeforeEach // 0,5 + void setUp() { // 0,5 + MockitoAnnotations.openMocks(this); // 1 avengers = new SuperLeague<>("Avengers", Universe.MARVEL, new HashMap<>()); // 1 - - /* Option A */ - avengers.addSuperHuman(ironman); // 1 - avengers.addSuperHuman(spiderman); // 1 - /* Option A */ - - /* Option B */ avengers.members().put(ironman, true); // 1 - avengers.members().put(spiderman, true); // 1 - /* Option B */ - } // 6,5 + avengers.members().put(spiderman, false); // 1 + } // 5 - @Test // 0,25 - void testAddSuperHuman() { // 0,25 + @Test // 0,5 + void testAddSuperHuman() { // 0,5 + when(superman.universe()).thenReturn(Universe.DC)); // 0,5 assertThrows(WrongUniverseException.class, () -> avengers.addSuperHuman(superman)); // 1,5 - } // 2 + } // 3 - @Test // 0,25 - void testGetAllAvailableSuperHumans() { // 0,25 - avengers.sendSuperHumanOnMission(spiderman); // 0,5 + @Test // 0,5 + void testGetAllAvailableSuperHumans() { // 0,5 List heroes = avengers.getAllAvailableSuperHumans(); // 0,5 assertEquals(1, heroes.size()); // 1 } // 2,5 - @Test // 0,25 - void testGetMostPowerfulSuperHuman() { // 0,25 - /* Option A */ - assertEquals(spiderman, avengers.getMostPowerfulSuperHuman().get()); // 1 - /* Option A */ - - /* Option B */ - assertEquals(Optional.of(spiderman), avengers.getMostPowerfulSuperHuman()); // 1 - /* Option B */ - } // 1,5 + @Test // 0,5 + void testGetMostPowerfulSuperHuman() { // 0,5 + when(ironman.power()).thenReturn(7); // 0,5 + when(spiderman.power()).thenReturn(8); // 0,5 + assertEquals(Optional.of(spiderman), avengers.getMostPowerfulSuperHuman()); // 1,5 + } // 3,5 -} // 14 +} // 18 ``` -## Aufgabe 3 (22 Punkte) +## Aufgabe 3 (18 Punkte) Erstelle die Klasse `SingleQueries` anhand des abgebildeten Klassendiagramms. @@ -360,7 +296,6 @@ classDiagram +printAllSinglesWithMoreThan25MillionSalesPerCountry() void +printAverageBirthYearOfAllDeceasedArtists() void +isAnySingleFromChinaWithMoreThan10MillionSales() boolean - +getTop3SinglesOfThisCenturyBySalesInMillions() List~String~ +getAllSinglesFromEdSheeran() List~Single~ } ``` @@ -369,22 +304,18 @@ classDiagram - Die Methode `void printAllSinglesWithMoreThan25MillionSalesPerCountry()` soll alle Singles, die sich mehr als 25 Millionen mal verkauft haben, gruppiert - nach dem Land in der Form _Artist.country: [Single, Single,...]_ ausgeben + nach dem Land in der Form _[Land des Künstlers]: [Singles]_ ausgeben (4 + Punkte) - Die Methode `void printAverageBirthYearOfAllDeceasedArtists()` soll das - durchschnittliche Geburtsjahr aller verstorbenen Künstler bzw. aller - verstorbenen Künstlerinnen ausgeben. Für den Fall, dass es keinen verstorbenen - Künstler bzw. keine verstorbene Künstlerin gibt, soll der Wert -1 ausgegeben - werden + durchschnittliche Geburtsjahr aller verstorbenen Künstler ausgeben. Für den + Fall, dass es keinen verstorbenen Künstler gibt, soll der Wert -1 ausgegeben + werden (5,5 Punkte) - Die Methode `boolean isAnySingleFromChinaWithMoreThan10MillionSales()` soll - zurückgeben, ob es eine Single eines Künstlers bzw. einer Künstlerin aus China - gibt, welches sich mehr als 10 Millionen Mal verkauft hat -- Die Methode `List getTop3SinglesOfThisCenturyBySalesInMillions()` soll - die 3 am häufigsten verkauften Singles des jetzigen Jahrtausends sortiert nach - der Anzahl Verkäufe in Millionen in der Form _Single.name: Artist.name, - Single.salesInMillions Millionen_ zurückgeben + zurückgeben, ob es eine Single eines Künstlers aus China (3,5 Punkte) gibt, + welche sich mehr als 10 Millionen Mal verkauft hat - Die Methode `List getAllSinglesFromEdSheeran()` soll alle Singles des Künstlers Ed Sheeran (Land: Großbritannien, Geburtstag: 17.02.1991, Status: - lebendig) zurückgeben + lebendig) zurückgeben (4 Punkte) ### Musterlösung @@ -392,55 +323,42 @@ classDiagram public record SingleQueries(List singles) { // 1 public void printAllSinglesWithMoreThan25MillionSalesPerCountry() { // 0,5 - Map> allSinglesWithMoreThan25MillionSalesPerCountry; // 0,25 + Map> allSinglesWithMoreThan25MillionSalesPerCountry; // 0,5 allSinglesWithMoreThan25MillionSalesPerCountry = singles.stream() // 0,5 - .filter(s -> s.salesInMillions() > 25) // 0,5 - .collect(Collectors.groupingBy(s -> s.artist().country())); // 1 - + .filter(s -> s.salesInMillions() > 25) // 0,5 + .collect(Collectors.groupingBy(s -> s.artist().country())); // 1 allSinglesWithMoreThan25MillionSalesPerCountry - .forEach((c, sl) -> System.out.println(c + ": " + sl)); // 1,25 + .forEach((c, sl) -> System.out.println(c + ": " + sl)); // 1 } // 4 public void printAverageBirthYearOfAllDeceasedArtists() { // 0,5 - OptionalDouble averageBirthYearOfAllDeceasedArtists; // 0,25 + OptionalDouble averageBirthYearOfAllDeceasedArtists; // 0,5 averageBirthYearOfAllDeceasedArtists = singles.stream() // 0,5 - .map(Single::artist) // 0,5 - .distinct() // 0,5 - .filter(a -> !a.isAlive()) // 0,5 - .mapToInt(a -> a.birthdate().getYear()) // 1 - .average(); // 0,5 - + .map(Single::artist) // 0,5 + .distinct() // 0,5 + .filter(a -> !a.isAlive()) // 0,5 + .mapToInt(a -> a.birthdate().getYear()) // 1 + .average(); // 0,5 averageBirthYearOfAllDeceasedArtists - .ifPresentOrElse(System.out::println, () -> System.out.println(-1)); // 1,25 + .ifPresentOrElse(System.out::println, () -> System.out.println(-1)); // 1 } // 5,5 public boolean isAnySingleFromChinaWithMoreThan10MillionSales() { // 0,5 - boolean isAnySingleFromChinaWithMoreThan10MillionSales; // 0,25 + boolean isAnySingleFromChinaWithMoreThan10MillionSales; // 0,5 isAnySingleFromChinaWithMoreThan10MillionSales = singles.stream() // 0,5 - .filter(s -> s.salesInMillions() > 10) // 0,5 - .anyMatch(s -> s.artist().country().equals(Country.CHN)); // 1 - return isAnySingleFromChinaWithMoreThan10MillionSales; // 0,25 - } // 3 - - public List getTop3SinglesOfThisCenturyBySalesInMillions() { // 0,5 - List top3SinglesOfThisCenturyBySalesInMillions; // 0,25 - top3SinglesOfThisCenturyBySalesInMillions = singles.stream() // 0,5 - .filter(s -> s.publishingYear().compareTo("2000") >= 0) // 1 - .sorted((s1, s2) -> Integer.valueOf(s2.salesInMillions()).compareTo(s1.salesInMillions())) // 1 - .map(s -> s.name() + ": " + s.artist().name() + ", " + s.salesInMillions() + " Millionen") // 1 - .limit(3) // 0,5 - .toList(); // 0,5 - return top3SinglesOfThisCenturyBySalesInMillions; // 0,25 - } // 5 + .filter(s -> s.salesInMillions() > 10) // 0,5 + .anyMatch(s -> s.artist().country().equals(Country.CHN)); // 1 + return isAnySingleFromChinaWithMoreThan10MillionSales; // 0,5 + } // 3,5 public List getAllSinglesFromEdSheeran() { // 0,5 - List allSinglesFromEdSheeran; // 0,25 + List allSinglesFromEdSheeran; // 0,5 Artist sheeran = new Artist("Ed Sheeran", Country.GBR, LocalDate.of(1991, 2, 17), true); // 1 allSinglesFromEdSheeran = singles.stream() // 0,5 - .filter(s -> s.artist().equals(sheeran)) // 0,5 - .toList(); // 0,5 - return allSinglesFromEdSheeran; // 0,25 - } // 3,5 + .filter(s -> s.artist().equals(sheeran)) // 0,5 + .toList(); // 0,5 + return allSinglesFromEdSheeran; // 0,5 + } // 4 -} // 22 +} // 18 ``` diff --git a/docs/documentation/slf4j.mdx b/docs/documentation/slf4j.mdx index 05516c8456..32e3c0c6ae 100644 --- a/docs/documentation/slf4j.mdx +++ b/docs/documentation/slf4j.mdx @@ -51,29 +51,29 @@ verschiedene Nachrichten in der Datei _logs/app.log_ protokolliert werden. ```java title="Names.java" showLineNumbers public class Names { - private final static Logger LOGGER = LoggerFactory.getLogger(Names.class); + private final static Logger logger = LoggerFactory.getLogger(Names.class); public static List getNames(File file) throws IOException { List names = new ArrayList<>(); - LOGGER.info("Name list has been initialized successfully"); + logger.info("Name list has been initialized successfully"); if (!file.exists()) { - LOGGER.error("File {} does not exist", file); + logger.error("File {} does not exist", file); throw new IOException(); } Scanner scanner = new Scanner(file); - LOGGER.info("File Scanner has been initialized successfully"); + logger.info("File Scanner has been initialized successfully"); while(scanner.hasNextLine()) { String name = scanner.nextLine(); - LOGGER.debug(name); + logger.debug(name); names.add(name); } - LOGGER.info("{} names have been read", names.size()); + logger.info("{} names have been read", names.size()); scanner.close(); - LOGGER.info("File {} has been closed successfully", file); + logger.info("File {} has been closed successfully", file); return names; } diff --git a/docs/exam-exercises/exam-exercises-java1/activity-diagrams/insertion-sort.md b/docs/exam-exercises/exam-exercises-java1/activity-diagrams/insertion-sort.md index 13d778e1c1..37858dceb6 100644 --- a/docs/exam-exercises/exam-exercises-java1/activity-diagrams/insertion-sort.md +++ b/docs/exam-exercises/exam-exercises-java1/activity-diagrams/insertion-sort.md @@ -46,7 +46,7 @@ stateDiagram-v2 state "Element [Zählvariable B] von [Feld] = [Temporäre Variable]" as state6 state "Ausführen: [Feld ausgeben]" as state7 state "[Zählvariable A] inkrementieren" as state8 - state "Element [Zählvariable B] von [Feld] = Element [Zählvariable B - 1] von [Feld]" as state9 + state "Element [Zählvariable B] von [Feld] = Element [Zählvariable B] - 1 von [Feld]" as state9 state "[Zählvariable B] dekrementieren" as state10 state if1 <> @@ -62,7 +62,7 @@ stateDiagram-v2 state4 --> state5 state5 --> if2 if2 --> state6: sonst - if2 --> state9: [Zählvariable B] > 0 und Element [Zählvariable B - 1] von [Feld] > [Temporäre Variable] + if2 --> state9: [Zählvariable B] > 0 und Element [Zählvariable B] - 1 von [Feld] > [Temporäre Variable] state6 --> state7 state7 --> state8 state8 --> if1