Seite nicht gefunden
Wir konnten nicht finden, wonach Sie gesucht haben.
Bitte kontaktieren Sie den Besitzer der Seite, die Sie mit der ursprünglichen URL verlinkt hat, und teilen Sie ihm mit, dass der Link nicht mehr funktioniert.
diff --git a/pr-preview/pr-238/404.html b/pr-preview/pr-238/404.html new file mode 100644 index 0000000000..6294e96133 --- /dev/null +++ b/pr-preview/pr-238/404.html @@ -0,0 +1 @@ +
Wir konnten nicht finden, wonach Sie gesucht haben.
Bitte kontaktieren Sie den Besitzer der Seite, die Sie mit der ursprünglichen URL verlinkt hat, und teilen Sie ihm mit, dass der Link nicht mehr funktioniert.
enumeration
impliziert, dass die Aufzählung einen passenden
+Konstruktor sowie gegebenenfalls passende Getter für alle Attribute besitztPrintStream
dürfen sinnvoll gekürzt
+geschrieben werden (zum Beispiel syso("Hello World") statt
+System.out.println("Hello World"))Class
anhand des abgebildeten Klassendiagramms (18
+Punkte)ExamTask01
wie folgt (8 Punkte): Erstelle
+einen Kurs mit 2 Studierenden und 2 Vorlesungen und gib anschließend den Kurs
+sowie die Vorlesung mit den meisten Creditpoints auf der Konsole ausvoid addStudent(student Student)
soll der Studierendenliste
+(students
) den eingehenden Studierenden hinzufügen (1 Punkt)void addLecture(lecture Lecture)
soll der Vorlesungsliste
+(lectures
) die eingehende Vorlesung hinzufügen (1 Punkt)Lecture getLectureWithMostCreditPoints()
soll die Vorlesung mit
+den meisten Creditpoints zurückgeben (5 Punkte)String toString()
soll den Kurs in der Form Class
+[description=[Beschreibung des Kurses], courseOfStudies=[Beschreibung des
+Studiengangs], lectures=[Vorlesungen], students=[Studierende]]
+zurückgeben (2 Punkte)public class Class { // 0,5
private final String description; // 0,5
private final CourseOfStudies courseOfStudies; // 0,5
private final List<Lecture> lectures; // 0,5
private final List<Student> students; // 0,5
public Class(String description, CourseOfStudies courseOfStudies) { // 0,5
this.description = description; // 0,5
this.courseOfStudies = courseOfStudies; // 0,5
lectures = new ArrayList<>(); // 0,5
students = new ArrayList<>(); // 0,5
} // 2,5
public String description() { // 0,5
return description; // 0,5
} // 1
public CourseOfStudies courseOfStudies() { // 0,5
return courseOfStudies; // 0,5
} // 1
public List<Lecture> lectures() { // 0,5
return lectures; // 0,5
} // 1
public List<Student> students() { // 0,5
return students; // 0,5
} // 1
public void addLecture(Lecture lecture) { // 0,5
lectures.add(lecture); // 0,5
} // 1
public void addStudent(Student student) { // 0,5
students.add(student); // 0,5
} // 1
public Lecture getLectureWithMostCreditPoints() { // 0,5
Lecture lecture = null; // 0,5
int mostCreditPoints = 0; // 0,5
for (Lecture l : lectures) { // 1
if (l.creditPoints() > mostCreditPoints) { // 1
lecture = l; // 0,5
mostCreditPoints = l.creditPoints(); // 0,5
}
}
return lecture; // 0,5
} // 5
public String toString() { // 0,5
return "Class [description=" + description + ", courseOfStudies=" + courseOfStudies.description()
+ ", lectures=" + lectures + ", students=" + students + "]"; // 1,5
} // 2
}
public class ExamTask01 { // 0,5
public static void main(String[] args) { // 0,5
Class wwibe224 = new Class("WWIBE224", CourseOfStudies.WI); // 1
wwibe224.addStudent(new Student("8271625", "Hans Maier")); // 1
wwibe224.addStudent(new Student("9102934", "Peter Müller")); // 1
wwibe224.addLecture(new Lecture("Mathe", 5)); // 1
wwibe224.addLecture(new Lecture("Programmierung", 10)); // 1
System.out.println(wwibe224); // 1
System.out.println("Vorlesung mit den meisten ECTS-Punkten: "
+ wwibe224.getLectureWithMostCreditPoints()); // 1
} // 7,5
} // 8
Erstelle die Klasse ExamTask02
anhand des abgebildeten Klassendiagramms sowie
+anhand der abgebildeten Aktivitätsdiagramme.
Bitte PIN eingeben: 387
Länge der PIN ist ungültig
Bitte PIN eingeben: 3871
Zahlenwert der PIN ist ungültig
Bitte PIN eingeben: 3872
PIN ist gültig
public class ExamTask02 { // 0,5
private static int[] pin; // 0,5
public static void main(String[] args) { // 0,5
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in); // 1
System.out.print("Bitte PIN eingeben: "); // 0,5
String text = sc.next(); // 1
textToPin(text); // 0,5
if (!checkPinLength()) { // 1
System.out.println("Länge der PIN ist ungültig"); // 0,5
} else if (!checkPinValue()) { // 1
System.out.println("Zahlenwert der PIN ist ungültig"); // 0,5
} else { // 0,5
System.out.println("PIN ist gültig"); // 0,5
}
} // 7,5
private static boolean checkPinLength() { // 0,5
int length = pin.length; // 0,5
if (length < 4 || length > 8) { // 1
return false; // 0,5
}
return true; // 0,5
} // 3
private static boolean checkPinValue() { // 0,5
int length = pin.length; // 0,5
int total = 0; // 0,5
int i = 0; // 0,5
while (i < length) { // 1
int value = pin[i]; // 0,5
total += value; // 0,5
i++; // 0,5
}
if (total % 2 != 0) { // 1
return false; // 0,5
}
return true; // 0,5
} // 6,5
private static void textToPin(String text) { // 0,5
int length = text.length(); // 0,5
pin = new int[length]; // 1
int i = 0; // 0,5
while (i < length) { // 1
char c = text.charAt(i); // 1
pin[i] = Integer.valueOf(c); // 1
i++; // 0,5
}
} // 6
} // 24
Player
(9 Punkte) anhand des abgebildeten
+KlassendiagrammsExamTask03
wie folgt (20 Punkte):
+name
) mit dem eingehenden Namen belegen, die
+Lebenspunkte des Spielers (healthPoints
) auf den Wert 10 setzen sowie den
+Würfel (dice
) initialisieren (2 Punkte)int rollTheDice()
soll den Würfel des Spielers werfen und den
+Würfelwert zurückgeben (2 Punkte)void reduceHealthPoints()
soll die Lebenspunkte des Spielers
+(healthPoints
) um 1 reduzieren (1 Punkt)Spieler 1, gib bitte Deinen Namen ein: Hans
Spieler 2, gib bitte Deinen Namen ein: Peter
Hans hat 10 Lebenspunkte
Peter hat 10 Lebenspunkte
Hans würfelt eine 6
Peter würfelt eine 6
…
Hans hat 4 Lebenspunkte
Peter hat 1 Lebenspunkte
Hans würfelt eine 5
Peter würfelt eine 1
Peter verliert einen Punkt
Hans gewinnt
public class Player { // 0,5
private final String name; // 0,5
private int healthPoints; // 0,5
private final Dice dice; // 0,5
public Player(String name) { // 0,5
this.name = name; // 0,5
healthPoints = 10; // 0,5
dice = new Dice(); // 0,5
} // 2
public String name() { // 0,5
return name; // 0,5
} // 1
public int getHealthPoints() { // 0,5
return healthPoints; // 0,5
} // 1
public int rollTheDice() { // 0,5
dice.rollTheDice(); // 0,5
return dice.getValue(); // 1
} // 2
public void reduceHealthPoints() { // 0,5
healthPoints--; // 0,5
} // 1
} // 9
public class ExamTask03 { // 0,5
private static Player player1; // 0,5
private static Player player2; // 0,5
private static Scanner scanner; // 0,5
public static void main(String[] args) { // 0,5
scanner = new Scanner(System.in); // 1
System.out.print("Spieler 1, gib bitte Deinen Namen ein: "); // 0,5
String name1 = scanner.nextLine(); // 1
player1 = new Player(name1); // 0,5
System.out.print("Spieler 2, gib bitte Deinen Namen ein: "); // 0,5
String name2 = scanner.nextLine(); // 1
player2 = new Player(name2); // 0,5
System.out.println();
while (player1.getHealthPoints() > 0 && player2.getHealthPoints() > 0) { // 1
System.out.println(player1.name() + " hat " + player1.getHealthPoints() + " Lebenspunkte"); // 1
System.out.println(player2.name() + " hat " + player2.getHealthPoints() + " Lebenspunkte"); // 1
int value1 = player1.rollTheDice(); // 1
System.out.println(player1.name() + " würfelt eine " + value1); // 0,5
int value2 = player2.rollTheDice(); // 1
System.out.println(player2.name() + " würfelt eine " + value2); // 0,5
if (value1 > value2) { // 1
player2.reduceHealthPoints(); // 0,5
System.out.println(player2.name() + " verliert einen Punkt"); // 0,5
} else if (value2 > value1) { // 1
player1.reduceHealthPoints(); // 0,5
System.out.println(player1.name() + " verliert einen Punkt"); // 0,5
}
System.out.println();
}
if (player1.getHealthPoints() > player2.getHealthPoints()) { // 1
System.out.println(player1.name() + " gewinnt"); // 0,5
} else { // 0,5
System.out.println(player2.name() + " gewinnt"); // 0,5
}
} // 18
} // 20
Erstelle die Klassen StuffedCookie
(9 Punkte), CookieJar
(8 Punkte) und
+IngredientsReader
(6 Punkte) anhand des abgebildeten Klassendiagramms.
List<Ingredient> getIngredients()
soll alle Zutaten zurückgeben.
+Doppelte Zutaten sollen dabei nur einmal zurückgegeben werden (5,5 Punkte)void addCookie(cookie Cookie)
soll der Plätzchenbox ein
+Plätzchen hinzufügen (1 Punkt)StuffedCookie getStuffedCookie()
soll ein gefülltes Plätzchen
+zurückgeben und aus der Plätzchenbox entfernen. Für den Fall, dass kein
+gefülltes Plätzchen vorhanden ist, soll der Wert null
zurückgegeben werden
+(5 Punkte)Die statische Methode List<Ingredient> readIngredients()
soll alle Zutaten der
+eingehenden Zutatendatei lesen und zurückgeben (5,5 Punkte).
Mehl
Zucker
...
public class StuffedCookie extends Cookie { // 1
private final Recipe jam; // 0,5
public StuffedCookie(String name, Recipe dough, Recipe jam) { // 0,5
super(name, dough); // 1
this.jam = jam; // 0,5
} // 2
public List<Ingredient> getIngredients() { // 0,5
List<Ingredient> ingredients = super.getIngredients(); // 1
for (Ingredient i : jam.ingredients()) { // 1,5
if (ingredients.contains(i)) { // 1
continue; // 0,5
}
ingredients.add(i); // 0,5
}
return ingredients; // 0,5
} // 5,5
} // 9
public class CookieJar { // 0,5
private final List<Cookie> cookies; // 0,5
public CookieJar() { // 0,5
cookies = new ArrayList<>(); // 0,5
} // 1
public void addCookie(Cookie cookie) { // 0,5
cookies.add(cookie); // 0,5
} // 1
public StuffedCookie getStuffedCookie() { // 0,5
StuffedCookie stuffedCookie; // 0,5
for (Cookie c : cookies) { // 1
if (c instanceof StuffedCookie s) { // 1
cookies.remove(s); // 1
stuffedCookie = s; // 0,5
}
}
return stuffedCookie; // 0,5
} // 5
} // 8
public class IngredientsReader { // 0,5
public static List<Ingredient> readIngredients(File file) throws FileNotFoundException { // 0,5
Scanner sc = new Scanner(file); // 1
List<Ingredient> ingredients = new ArrayList<>(); // 0,5
while (sc.hasNextLine()) { // 1
String line = sc.nextLine(); // 0,5
Ingredient i = new Ingredient(line); // 0,5
ingredients.add(i); // 0,5
}
sc.close(); // 0,5
return ingredients; // 0,5
} // 5,5
} // 6
Im Rahmen der Vorlesungswiederholung soll Schritt für Schritt eine abgespeckte +Variante des Tabletop-Spiels +Warhammer 40,000 Kill Team +entwickelt werden. Bei diesem Strategiespiel für zwei Spieler kämpfen zwei +sogenannten Kill Teams mit dem Ziel gegeneinander, entsprechende Missionsziele +zu erfüllen bzw. das gegnerische Team auszulöschen.
+Erstelle eine ausführbare Klasse wie folgt:
+ER-Modell
+ +LP = Lebenspunkte
+Ablauf einer Runde
+Zu Beginn der Runde greift zunächst der Kämpfer des ersten Spielers den Kämpfer +des zweiten Spielers mit einem einfachen Angriff an. Anschließend greift der +Kämpfer des zweiten Spielers den Kämpfer des ersten Spielers mit einem einfachen +Angriff an.
+Ablauf eines einfachen Angriffs und Ermittlung des Schadens
+Der angreifende Spieler würfelt mit 4 W6-Würfeln, der verteidigende Spieler +würfelt mit 3 W6-Würfeln. Anschließend wird der Schaden berechnet und dem +verteidigenden Spieler Lebenspunkte in Höhe des Schadens abgezogen. Der Schaden +berechnet sich dabei gemäß der Formel Anzahl Treffer - Anzahl Blocks. Die +Anzahl Treffer ergibt sich aus der Summe der Wurfwerte des angreifenden +Spielers, die Anzahl Blocks aus der Summe der Wurfwerte des verteidigenden +Spielers. Die Problematiken, dass ein verteidigender Spieler bei einem Angriff +"geheilt" wird (Anzahl Treffer < Anzahl Blocks) und dass ein "toter" Spieler +angreift (Schaden beim ersten Angriff >= LP), sollen aktuell noch ignoriert +werden.
+Beispielhafte Konsolenausgabe
+Spieler 1, Name: Hans
Spieler 1, Kämpfer 1, Name: Gregor
Spieler 1, Kämpfer 1, LP: 8
Spieler 2, Name: Peter
Spieler 2, Kämpfer 1, Name: Bonekraka
Spieler 2, Kämpfer 1, LP: 10
*-------*
* Zug 1 *
*-------*
Kämpfer von Hans: Gregor (8 LP)
Kämpfer von Peter: Bonekraka (10 LP)
Gregor greift Bonekraka an.
Gregor würfelt 2, 2, 3 und 6.
Gregor erzielt 13 Treffer.
Bonekraka würfelt 1, 4 und 5.
Bonekraka erzielt 10 Blocks.
Bonekraka erleidet 3 Schaden und hat noch 7 LP.
*-------*
* Zug 2 *
*-------*
Kämpfer von Hans: Gregor (8 LP)
Kämpfer von Peter: Bonekraka (7 LP)
Bonekraka greift Gregor an.
Bonekraka würfelt 1, 1, 3 und 5.
Bonekraka erzielt 10 Treffer.
Gregor würfelt 2, 4 und 5.
Gregor erzielt 11 Blocks.
Gregor erleidet -1 Schaden und hat noch 9 LP.
Passe die ausführbare Klasse wie folgt an:
+ER-Modell
+ +LP = Lebenspunkte, VW = Verteidigungswert, RW = Rüstungswurf, AW = Attackenwert, +BF_KG = Ballistische Fertigkeit / Kampfgeschick, SW = Schadenswert
+Ablauf einer Runde
+Zu Beginn einer jeden Runde greift zunächst der Kämpfer des ersten Spielers den +Kämpfer des zweiten Spielers mit einem erweiterten einfachen Angriff an. Sollte +der Kämpfer des zweiten Spielers diesen Angriff überleben, greift dieser +anschließend den Kämpfer des ersten Spielers mit einem erweiterten einfachen +Angriff an.
+Ablauf eines erweiterten einfachen Angriffs und Ermittlung des Schadens
+Der angreifende Spieler würfelt mit der Anzahl AW seiner Waffe, der +verteidigende Spieler würfelt mit der Anzahl VW. Anschließend wird der Schaden +berechnet und dem verteidigenden Spieler Lebenspunkte in Höhe des Schadens +abgezogen. Der Schaden berechnet sich dabei gemäß der Formel (Anzahl Treffer - +Anzahl Blocks) x SW. Die Anzahl Treffer ergibt sich aus der Summe der Wurfwerte +des angreifenden Spielers >= BF_KG, die Anzahl Blocks aus der Summe der +Wurfwerte des verteidigenden Spielers >= RW.
+Beispielhafte Konsolenausgabe
+Spieler 1, Name eingeben: Hans
Spieler 1, Kämpfer 1, Name eingeben: Gregor
Spieler 1, Kämpfer 1, LP eingeben: 8
Spieler 1, Kämpfer 1, VW eingeben: 3
Spieler 1, Kämpfer 1, RW eingeben: 5
Spieler 1, Kämpfer 1, Waffe 1, Name eingeben: Boltpistole
Spieler 1, Kämpfer 1, Waffe 1, AW eingeben: 4
Spieler 1, Kämpfer 1, Waffe 1, BF_KG eingeben: 3
Spieler 1, Kämpfer 1, Waffe 1, SW eingeben: 2
Spieler 2, Name eingeben: Peter
Spieler 2, Kämpfer 1, Name eingeben: Bonekraka
Spieler 2, Kämpfer 1, LP eingeben: 10
Spieler 2, Kämpfer 1, VW eingeben: 3
Spieler 2, Kämpfer 1, RW eingeben: 5
Spieler 2, Kämpfer 1, Waffe 1, Name eingeben: Spalta
Spieler 2, Kämpfer 1, Waffe 1, AW eingeben: 4
Spieler 2, Kämpfer 1, Waffe 1, BF_KG eingeben: 4
Spieler 2, Kämpfer 1, Waffe 1, SW eingeben: 3
*----------------*
* Runde 1, Zug 1 *
*----------------*
Kämpfer von Hans: Gregor (8 LP)
Kämpfer von Peter: Bonekraka (10 LP)
Gregor greift Bonekraka mit Boltpistole an.
Gregor würfelt 6, 4, 3 und 2.
Gregor erzielt 3 Treffer.
Bonekraka würfelt 4, 1 und 5.
Bonekraka erzielt 1 Blocks.
Bonekraka erleidet 4 Schaden und hat noch 6 LP.
*----------------*
* Runde 1, Zug 2 *
*----------------*
Kämpfer von Hans: Gregor (8 LP)
Kämpfer von Peter: Bonekraka (6 LP)
Bonekraka greift Gregor mit Spalta an.
Bonekraka würfelt 2, 4, 3 und 2.
Bonekraka erzielt 1 Treffer.
Gregor würfelt 3, 5 und 5.
Gregor erzielt 2 Blocks.
Gregor erleidet 0 Schaden und hat noch 8 LP.
*----------------*
* Runde 2, Zug 1 *
*----------------*
Kämpfer von Hans: Gregor (8 LP)
Kämpfer von Peter: Bonekraka (6 LP)
Gregor greift Bonekraka mit Boltpistole an.
Gregor würfelt 1, 5, 5 und 3.
Gregor erzielt 3 Treffer.
Bonekraka würfelt 5, 4 und 2.
Bonekraka erzielt 1 Blocks.
Bonekraka erleidet 4 Schaden und hat noch 2 LP.
*----------------*
* Runde 2, Zug 2 *
*----------------*
Kämpfer von Hans: Gregor (8 LP)
Kämpfer von Peter: Bonekraka (2 LP)
Bonekraka greift Gregor mit Spalta an.
Bonekraka würfelt 6, 4, 6 und 1.
Bonekraka erzielt 3 Treffer.
Gregor würfelt 4, 2 und 4.
Gregor erzielt 0 Blocks.
Gregor erleidet 9 Schaden und stirbt.
Überführe den bisherigen imperativen Programmentwurf in einen objektorientierten +Programmentwurf. Erweitere zudem den objektorientierten Programmentwurf so, dass +zu Beginn einer jeden Runde per "Münzwurf" darüber entschieden wird, welcher +Spieler den ersten Angriff in der jeweiligen Runde ausführen darf.
enumeration
impliziert, dass die Aufzählung einen passenden
+Konstruktor sowie gegebenenfalls passende Getter für alle Attribute besitztrecord
impliziert, dass die Datenklasse einen passenden
+Konstruktor, Getter zu allen Attributen sowie entsprechende Implementierungen
+der Object-Methoden besitztPrintStream
dürfen sinnvoll gekürzt
+geschrieben werden (zum Beispiel syso("Hello World") statt
+System.out.println("Hello World"))Erstelle die Klasse SuperLeague<T extends SuperHuman>
anhand des abgebildeten
+Klassendiagrams.
Optional<T> getMostPowerfulSuperHuman()
soll den stärksten
+Übermenschen der Liga zurückgebenvoid 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 werdenList<T> getAllAvailableSuperHumans()
soll alle verfügbaren
+Übermenschen der Liga zurückgebenvoid sendSuperHumanOnMission(t: T)
soll die Verfügbarkeit des
+eingehenden Übermenschen auf nicht verfügbar setzen/* Option A */
public record SuperLeague<T extends SuperHuman>
(String name, Universe universe, Map<T, Boolean> members) { // 1
/* Option A */
/* Option B */
@Data // 0,5
public class SuperLeague<T extends SuperHuman> { // 0,125
private final String name; // 0,125
private final Universe universe; // 0,125
private final Map<T, Boolean> members; // 0,125
/* Option B */
/* Option C */
public class SuperLeague<T extends SuperHuman> { // 0,125
private final String name; // 0,125
private final Universe universe; // 0,125
private final Map<T, Boolean> members; // 0,125
public SuperLeague(String name, Universe universe, Map<T, Boolean> 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<T, Boolean> getMembers() { return members; } // 0,125
/* Option C */
public Optional<T> 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
power = t.power(); // 0,5
mostPowerfulSuperHuman = t; // 0,5
}
}
return Optional.ofNullable(mostPowerfulSuperHuman); // 1
} // 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
public List<T> getAllAvailableSuperHumans() { // 0,5
List<T> allAvailableSuperHumans = new ArrayList<>(); // 0,5
for (Entry<T, Boolean> entry : members.entrySet()) { // 1
if (entry.getValue().equals(true)) { // 1
allAvailableSuperHumans.add(entry.getKey()); // 1
}
}
return allAvailableSuperHumans; // 0,5
} // 4,5
public void sendSuperHumanOnMission(T t) { // 0,5
members.put(t, false); // 1
} // 1,5
} // 16
Erstelle die JUnit-5-Testklasse SuperLeagueTest
anhand des abgebildeten
+Klassendiagramms.
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ügenvoid testAddSuperHuman()
soll prüfen, ob beim Aufruf der
+Methode void addSuperHuman(t: T)
mit dem Superhelden Superman die Ausnahme
+WrongUniverseException
ausgelöst wirdvoid testGetAllAvailableSuperHumans()
soll den Superheld
+Spider-Man auf eine Mission schicken und prüfen, ob beim Aufruf der Methode
+List<T> getAllAvailableSuperHumans()
eine Liste der Größe 1 zurückgegeben
+wirdvoid testGetMostPowerfulSuperHuman()
soll prüfen, ob beim
+Aufruf der Methode Optional<T> getMostPowerfulSuperHuman()
der Superheld
+Spider-Man als Optional zurückgegeben wirdpublic class SuperLeagueTest { // 0,5
private SuperLeague<Hero> 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
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
@Test // 0,25
void testAddSuperHuman() { // 0,25
assertThrows(WrongUniverseException.class, () -> avengers.addSuperHuman(superman)); // 1,5
} // 2
@Test // 0,25
void testGetAllAvailableSuperHumans() { // 0,25
avengers.sendSuperHumanOnMission(spiderman); // 0,5
List<Hero> 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
} // 14
Erstelle die Klasse SingleQueries
anhand des abgebildeten Klassendiagramms.
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,...] ausgebenvoid 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
+werdenboolean 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 hatList<String> 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ückgebenList<Single> getAllSinglesFromEdSheeran()
soll alle Singles des
+Künstlers Ed Sheeran (Land: Großbritannien, Geburtstag: 17.02.1991, Status:
+lebendig) zurückgebenpublic record SingleQueries(List<Single> singles) { // 1
public void printAllSinglesWithMoreThan25MillionSalesPerCountry() { // 0,5
Map<Country, List<Single>> allSinglesWithMoreThan25MillionSalesPerCountry; // 0,25
allSinglesWithMoreThan25MillionSalesPerCountry = singles.stream() // 0,5
.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
} // 4
public void printAverageBirthYearOfAllDeceasedArtists() { // 0,5
OptionalDouble averageBirthYearOfAllDeceasedArtists; // 0,25
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
averageBirthYearOfAllDeceasedArtists
.ifPresentOrElse(System.out::println, () -> System.out.println(-1)); // 1,25
} // 5,5
public boolean isAnySingleFromChinaWithMoreThan10MillionSales() { // 0,5
boolean isAnySingleFromChinaWithMoreThan10MillionSales; // 0,25
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<String> getTop3SinglesOfThisCenturyBySalesInMillions() { // 0,5
List<String> 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
public List<Single> getAllSinglesFromEdSheeran() { // 0,5
List<Single> allSinglesFromEdSheeran; // 0,25
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
} // 22
Die Endergebnisse der Demos findet ihr in folgendem Branch
+git switch demos/steffen
Der Branch befindet sich im jappuccini/java-exercises Repository.
public class ExamTask01 {
public static void a() {
String s = "Programmierung";
char c = s.charAt(s.length() - 3);
int x = 0b1010010;
double d = 0.9;
int y = 2 * (int) d;
System.out.println("c: " + c);
System.out.println("x: " + x);
System.out.println("y: " + y);
}
}
Welche Konsolenausgabe erzeugt die Methode a der Klasse ExamTask01?
+public class ExamTask02 {
public static void b() {
String[] values = {"RO", "ER"};
boolean x = true;
int i = 3, j = 5, k = 4;
int index = ++i % 2 == 0 ? 0 : 1;
j -= x || ++k == 5 ? 5 : 0;
System.out.println(values[1] + values[index] + "R " + i + "" + j + "" + k);
}
}
Welche Konsolenausgabe erzeugt die Methode b der Klasse ExamTask02?
+Erstelle die Klassen Present (9 Punkte), GiftBag (7 Punkte) und +ExamTask02 (4 Punkte) anhand des abgebildeten Klassendiagramms.
+ +Beispielhafte Konsolenausgabe:
+Present[description=PS5, price=499.0, sender=Hans, recipient=Lisa]
Present [description=[Beschreibung], price=[Preis], sender=[Name des Senders], recipient=[Name des Empfängers]]
Erstelle die Klassen Circle (6 Punkte) und ShapeReader (14 Punkte) +anhand des abgebildeten Klassendiagramms.
+ +Circle [r=[Wert von r]]
Der Konstruktor soll für jedes Element des eingehenden Arrays ein Objekt der +Klasse Circle oder Rectangle erzeugen und der Formenliste (shapes) hinzugefügt +werden.
+Die Elemente des eingehenden Arrays haben folgende Struktur:
+Circle;2
Rectangle;1;4
Circle;1
Circle;6
Rectangle;2;2
Die Methode getCircles soll alle Kreise (Circle) der Formenliste (shapes) +als Liste zurückgeben.
+Die Methode getShape soll den spezifischen Konstruktor getShape(minArea: +double) aufrufen und alle Formen (Shape) zurückgeben.
+Die Methode getShape(minArea: double) soll alle Formen mit einem +Flächeninhalt der größer oder gleich dem eingehenden Flächeninhalt (minArea) +ist als Liste zurückgeben.
+Die Methode split soll ein Array vom Typ int so verarbeiten, dass ein neues +Array erstellt wird, was alle Elemente des eingehenden Arrays bis zum +angegebenen Index enthält. Das neu erstellte Array soll anschließend +zurückgegeben werden.
+Verwende keine ArrayList!
+Bsp.: Der Parameter numbers enthält die Elemente 10, 8, 3, 22 & 1 der Parameter +index ist gleich 2. Zurückgegeben werden soll ein neues Array, das die Elemente +10, 8 & 3 enthält.
+In der Methode main soll ein Arrays erstellt werden, dass die Ganzzahlen 10, 8, +3, 22 & 1 enthält. Erstelle mithilfe der Methode split ein neues Array, dass die +ersten drei Elemente des ersten Arrays enthalten soll. Gib mithilfe einer +For-Schleife alle Elemente des neu erstellten Arrays aus.
+Erstelle ein neues Fass, das die maximale Kapazität von 100 hat. Versuche +anschließend das Fass auf 101 zu füllen und fange die Ausnahme ab. Gib in der +Konsole aus, um wieviel die maximale Kapazität überschritten wurde.
+Bsp. Konsolenausgabe: Es wäre um 1 zu viel befüllt worden.
Erzeuge ein Kabeltelefon mit Akku und eines, dass an die Steckdose angeschlossen +ist. Erzeuge ein leeres Smartphone und eines das halb voll ist. Speichere alle +erzeugten Fahrzeuge in einer ArrayList. Ermittle mithilfe einer Schleife die +Anzahl der betriebsbereiten Telefone. Gib die Anzahl in der Konsole aus.
+Erstelle die Klassen EngineType (6 Punkte), Vehicle (4 Punkte), Car +(3 Punkte), Truck (4 Punkte) und ExamTask01 (7 Punkte) anhand des +abgebildeten Klassendiagramms.
+ +Erzeuge ein Elektroauto mit leerem Akku und ein Benzinauto mit einem Tanklevel +von 50. Erzeuge ein Dieseltruck mit einem Gewicht von 6000 und ein +Wasserstofftruck der 1500 wiegt.
+Überprüfe alle erzeugten Fahrzeuge mithilfe einer Schleife und ermittle die +Anzahl der betriebsbereiten Autos. Gib die Anzahl in der Konsole aus.
+public enum EngineType {
ELECTRO('E'),
HYDROGEN('H'),
DIESEL('D'),
PETROL('P');
private char type;
EngineType(char type) {
this.type = type;
}
public char getType() {
return type;
}
public boolean canBeSustainable() {
return this == EngineType.ELECTRO || this == EngineType.HYDROGEN;
}
}
public abstract class Vehicle {
private final static ArrayList<Vehicle> allVehicles = new ArrayList<>();
protected final EngineType engineType;
Vehicle(EngineType engineType) {
this.engineType = engineType;
Vehicle.allVehicles.add(this);
}
public abstract boolean readyForUse();
public static ArrayList<Vehicle> getAllVehicles() {
return Vehicle.allVehicles;
}
}
public class Car extends Vehicle {
private int fuelLevel;
public Car(EngineType engineType, int fuelLevel) {
super(engineType);
this.fuelLevel = fuelLevel;
}
public boolean readyForUse() {
return fuelLevel > 0;
}
}
public class Truck extends Vehicle {
private final static int MAXIMUM_ALLOWED_WEIGHT = 7500;
private int weight;
public Truck(EngineType engineType, int weight) {
super(engineType);
this.weight = weight;
}
public boolean readyForUse() {
return weight <= Truck.MAXIMUM_ALLOWED_WEIGHT;
}
}
public class ExamTask01 {
public static void main(String[] args) {
new Car(EngineType.ELECTRO, 0);
new Car(EngineType.PETROL, 50);
new Truck(EngineType.DIESEL, 6000);
new Truck(EngineType.HYDROGEN, 1500);
int readyVehicles = 0;
for (Vehicle vehicle : Vehicle.getAllVehicles()) {
if (vehicle instanceof Car && vehicle.readyForUse()) {
readyVehicles++;
}
}
System.out.println(readyVehicles);
}
}
Erstelle die Klassen Human (8 Punkte), Company (6.5 Punkte), +SalaryComparator (2.5 Punkte), ExamTask02 (4 Punkte) anhand des +abgebildeten Klassendiagramms.
+ +Der Konstruktor soll alle Attribute initialisieren.
+Die Methode compareTo soll die natürliche Ordnung der Klasse Human +definieren. Hierbei sollen die Menschen aufsteigend nach ihrem Alter sortiert +werden. Sind zwei Menschen gleich alt, sollen die Menschen absteigend nach dem +Gehalt sortiert werden.
+Die Methode toString soll die Werte eines Objektes als String zurückgeben.
+Bsp: "Human [Fullname=Steffen Merk] [age=28] [salary=1000]"
+Der Konstruktor soll alle Attribute initialisieren.
+Die Methode addEmployee soll den eingehenden Menschen der Mitarbeiterliste +hinzufügen.
+Die Methode sortDefault soll die Mitarbeiterliste der natürlichen Ordnung +nach sortieren.
+Die Methode sortBySalary soll die Mitarbeiterliste absteigend nach Gehalt +sortieren.
+Die Methode printAllEmployees soll jeden Mitarbeiter in der Konsole +ausgeben.
+Erzeuge eine Firma und füge dieser 2 Mitarbeiter hinzu. Der erste Mitarbeiter +heißt Steffen Merk, ist 24 Jahre alt und hat ein Gehalt von 1000. Die zweite +Mitarbeiterin heißt Marianna, ist 28 Jahre alt und hat ein Gehalt von 2000.
+Sortiere die Mitarbeiter zuerst nach dem Gehalt und anschließend nach der +natürlichen Ordnung. Gebe nach jeder Sortierung alle Mitarbeiter der Firma aus.
+public class Human implements Comparable<Human> {
public final String firstName;
public final String lastName;
public final int age;
public final int salary;
public Human(String firstName, String lastName, int age, int salary) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.salary = salary;
}
public int compareTo(Human other) {
if (age > other.age) {
return 1;
} else if (age < other.age) {
return -1;
} else {
if (salary > other.salary) {
return -1;
} else if (salary < other.salary) {
return 1;
} else {
return 0;
}
}
}
public String toString() {
return "Human [Fullname=" + firstName + " " + lastName + "] [age=" + age + "] [salary=" + salary + "]";
}
}
public class SalaryComparator implements Comparator<Human> {
public int compare(Human h1, Human h2) {
if (h1.salary > h2.salary) {
return -1;
} else if (h1.salary < h2.salary) {
return 1;
} else {
return 0;
}
}
}
public class Company {
private final ArrayList<Human> employees;
public Company() {
employees = new ArrayList<>();
}
public void addEmployee(Human human) {
employees.add(human);
}
public void sortDefault() {
Collections.sort(employees);
}
public void sortSortBySalary() {
Collections.sort(employees, new SalaryComparator());
}
public void printAllEmployees() {
for (Human employee : employees) {
System.out.println(employee.toString());
}
}
}
public class ExamTask02 {
public static void main(String[] args) {
Company c = new Company();
c.addEmployee(new Human("Steffen", "Merk", 24, 1000));
c.addEmployee(new Human("Marianna", "Maglio", 28, 2000));
c.sortSortBySalary();
c.printAllEmployees();
c.sortDefault();
c.printAllEmployees();
}
}
public interface Rentable { // 0.5
public void rent(Person person) throws NotRentableException, TooLowBudgetException; // 1.5
}
public class NotRentableException extends Exception { // 0.5
public NotRentableException() { // 0.5
super(); // 0.5
}
}
public class TooLowBudgetException extends Exception { // 0.5
final double missingMoney; // 0.25
public TooLowBudgetException(double missingMoney) { // 0.5
super(); // 0.5
this.missingMoney = missingMoney; // 0.25
}
}
public class Flat implements Rentable { // 0.5
public double fee; // 0.25
private Person renter; // 0.25
public Flat(double fee) { // 0.5
this.fee = fee; // 0.25
this.renter = null; // 0.25
}
public boolean isFree() { // 0.5
return renter == null; // 0.5
}
public boolean isRentable() { // 0.5
return fee > 0; // 0.5
}
public void rent(Person person) throws NotRentableException, TooLowBudgetException { // 1.0
if (!isRentable() || !isFree()) { // 0.5
throw new NotRentableException(); // 0.5
} else if (fee > person.budget) { // 0.5
throw new TooLowBudgetException(fee - person.budget); // 0.5
} else {
this.renter = person; // 0.5
}
}
}
public class House implements Rentable, Comparable<House> { // 1.0
private final int number; // 0.25
public final double fee; // 0.25
private Person renter; // 0.25
public final ArrayList<Flat> flats; // 0.25
public House(int number, int numberOfFlats) { // 0.5
this(number, numberOfFlats, 0); // 0.5
}
public House(int number, int numberOfFlats, double fee) { // 0.5
this.number = number; // 0.25
this.fee = fee; // 0.25
this.flats = new ArrayList<>(); // 0.25
this.renter = null; // 0.25
double flatFee = 500; // 0.25
for (int i = 0; i < number; i++) { // 0.5
this.flats.add(new Flat(flatFee)); // 0.5
flatFee += 100; // 0.25
}
}
public int getNumber() { // 0.5
return number; // 0.5
}
public boolean isRentable() { // 0.5
return fee > 0 && renter == null; // 0.5
}
public void rent(Person person) throws NotRentableException, TooLowBudgetException { // 1.0
if (!isRentable()) { // 0.5
throw new NotRentableException(); // 1
} else if (fee > person.budget) { // 0.5
throw new TooLowBudgetException(fee - person.budget); // 1
} else {
this.renter = person; // 0.5
}
}
public int compareTo(House o) { // 0.5
if (number > o.getNumber()) { // 0.5
return 1; // 0.25
} else {
return -1; // 0.25
}
}
}
public class HouseFeeComparator implements Comparator<House> { // 0.5
public int compare(House h1, House h2) { // 0.5
if (h1.fee > h2.fee) { // 0.5
return 1; // 0.25
} else if (h1.fee < h2.fee) { // 0.5
return -1; // 0.25
} else {
return 0; // 0.25
}
}
}
public class Street { // 0.5
public final ArrayList<House> houses; // 0.25
public Street(int numberOfHouses) { // 0.5
this.houses = new ArrayList<>(); // 0.25
for (int i = 0; i < numberOfHouses; i++) { // 0.5
int houseNumber = i + 1; // 0.25
if (houseNumber % 2 == 0) { // 0.5
this.houses.add(new House(houseNumber, 5)); // 0.5
} else {
this.houses.add(new House(houseNumber, 0, 2000)); // 0.5
}
}
}
public void rentHouse(Person person) { // 0.5
for (House house : houses) { // 0.5
try { // 0.25
house.rent(person); // 0.5
break; // 0.25
} catch (Exception e) { // 0.5
if (e instanceof TooLowBudgetException l) { // 0.5
System.out.println("Es wird " + l.missingMoney + " mehr Geld gebraucht"); // 0.5
}
if (e instanceof NotRentableException) { // 0.5
System.out.println(
"Die Hausnummer " + house.getNumber() + " kann nicht gemietet werden."); // 0.5
}
}
}
}
public boolean rentFlat(Person person) { // 0.5
for (House house : houses) { // 0.5
for (int i = 0; i < house.flats.size(); i++) { // 0.5
Flat flat = house.flats.get(i); // 0.5
try { // 0.25
flat.rent(person); // 0.5
return true; // 0.5
} catch (TooLowBudgetException e) { // 0.5
System.out.println("Zu wenig Geld für Wohnung. Gebühr: " + flat.fee); // 0.5
} catch (NotRentableException e) { // 0.5
System.out.println("Wohnung " + (i + 1) + " nicht Mietbar."); // 0.5
}
}
}
return false; // 0.5
}
public void sortByFee() { // 0.5
Collections.sort(this.houses, new HouseFeeComparator()); // 0.5
}
public void sort() { // 0.5
Collections.sort(this.houses); // 0.5
}
}
public class ExamTask01 { // 0.5
public static void main(String[] args) { // 0.5
Street s = new Street(20); // 0.5
s.sortByFee(); // 0.5
Flat cheapestFlat = null; // 0.25
for (House h : s.houses) { // 0.5
for (Flat flat : h.flats) { // 0.5
if (cheapestFlat == null) { // 0.5
cheapestFlat = flat; // 0.25
} else if (flat.fee < cheapestFlat.fee) { // 0.5
cheapestFlat = flat; // 0.25
}
}
}
System.out.println(cheapestFlat.fee); // 0.5
}
}
public class PlanetQueries {
public static ArrayList<Planet> planets = Planet.getPlantes();
public static void a() {
PlanetQueries.planets.stream()
.filter(p -> p.moons() > 5)
.forEach(p -> {
System.out.println(p.name() + ": " + p.moons());
});
}
public static OptionalDouble b() {
return PlanetQueries.planets.stream()
.filter(p -> p.type() == Type.GAS_PLANET)
.mapToDouble(p -> p.diameter())
.average();
}
public static List<Planet> c() {
return PlanetQueries.planets.stream()
.sorted((p1, p2) -> Double.compare(p2.mass(), p1.mass()))
.toList();
}
public static boolean d() {
return PlanetQueries.planets.stream()
.allMatch(p -> p.moons() > 0);
}
public static void e() {
Map<Type, List<Planet>> planetsMap = PlanetQueries.planets.stream()
.collect(Collectors.groupingBy(p -> p.type()));
planetsMap.entrySet()
.stream()
.forEach(entry -> {
System.out.println(entry.getKey() + ":" + entry.getValue());
});
}
}
Hinweise zu den Konstruktoren
+Die Konstruktoren sollen alle Attribute initialisieren.
+Hinweise zur Methode toString
+Die Methode toString soll die Attribute brand, model und addition zurückgeben. +Die Attribute sollen durch eine Leertaste getrennt sein. Falls addition keinen +Wert besitz, soll dieser ignoriert werden.
+Erstelle eine ausführbare Klasse in der ein Auto mit der Marke "Mercedes", dem +Modell "CLA45" und dem Zusatz "AMG" initialisiert wird. Gib das Auto in der +Konsole aus. Entferne den Zusatz von dem Auto und gebe das Auto erneut in der +Konsole aus.
+public class Car {
public String name;
public String brand;
public Optional<String> addition;
public Car(String name, String brand) {
this.name = name;
this.brand = brand;
this.addition = Optional.empty();
}
public Car(String name, String brand, String addition) {
this.name = name;
this.brand = brand;
this.addition = Optional.ofNullable(addition);
}
public String toString() {
if (addition.isPresent()) {
return brand + " " + name + addition.get();
} else {
return brand + " " + name;
}
}
}
public class Main {
public static void main(String[] args) {
Car benz = new Car("CLA45", "Mercedes", "AMG");
System.out.println(benz.toString());
benz.addition = Optional.empty();
System.out.println(benz.toString());
}
}
Hinweise zur Klasse Helper
+Im Klassendiagramm sind keine Rückgabetypen für die statischen Attribute +angegeben. Gib für jedes Attribut den geeigneten Typ an.
+Hinweise zur Klasse Data
+Hinweise zur Klasse Task2
Verwende für die nachfolgende Abfolge die
+Methoden der Klassen Data und Helper. Erzeuge einen Stream von Tieren und
+filtere jene heraus, die Größer als 50 Zentimeter sind. Gib anschließend den
+vollen Namen und die Größe der Tiere in der Konsole aus.
public record Animal(String firstName, String lastName, int age, int size) {}
public class Data {
public static Stream<Animal> getAnimals() {
return Stream.of(new Animal("Steffen", "Merk", 28, 170));
}
}
public class Helper {
public static Predicate<Animal> isNewBorn = animal -> animal.age() < 1;
public static Function<Animal, String> toOutput = animal -> animal.firstName()
+ " " + animal.lastName() + " ist " + animal.size() + " Zentimeter groß";
public static Predicate<Animal> isHigherThan(int size) {
return animal -> animal.size() > size;
}
}
public class Task2 {
public static void main(String[] args) {
Data.getAnimals()
.filter(Helper.isHigherThan(50))
.map(Helper.toOutput)
.forEach(System.out::println);
}
}
public class PhoneStore {
private ArrayList<Phone> phones;
public PhoneStore(ArrayList<Phone> phones) {
this.phones = phones;
}
public List<Phone> q1() {
return phones.stream()
.filter(p -> p.brand() == Brand.HUAWEI)
.filter(p -> p.cameras() > 3)
.sorted((p1, p2) -> Integer.compare(p2.cpuPower(), p1.cpuPower()))
.limit(3)
.sorted((p1, p2) -> Double.compare(p2.price(), p1.price()))
.toList();
}
public OptionalDouble q2() {
return phones.stream()
.filter(p -> p.batterySize() > 2500)
.mapToInt(p -> p.cameras())
.average();
}
public List<Phone> q3(double maxPrice) {
return phones.stream()
.filter(p -> p.price() <= maxPrice)
.filter(p -> p.connectionType().isModern())
.filter(p -> p.cpuPower() < 2400)
.sorted((p1, p2) -> Double.compare(p1.price(), p2.price()))
.toList();
}
public Map<String, Phone> q4() {
return phones.stream()
.collect(Collectors.toMap(
p -> p.brand().name() + p.connectionType().name(),
p -> p));
}
public Map<ConnectionType, List<Phone>> q5() {
return phones.stream()
.collect(Collectors.groupingBy(p -> p.connectionType()));
}
}
Für die Klausur am PC mit IDE gibt es kein Cheatsheet mehr.
+Die Konstruktoren sollen alle Attribute initialisieren. Verwende die korrekten +Methoden der Optional Klasse, sodass kein Fehler ausgelöst wird, falls eine +Null Referenz für addition übergeben wird.
+Die Methode print soll das Objekt auf der Konsole ausgeben. Ist eine +addition vorhanden soll diese berücksichtigt werden, andernfalls soll nur die +Marke und der Name ausgegeben werden.
+Beispiel:
+BMW 320i
Mercedes-Benz G63 AMG
Erstelle eine ausführbare Klasse in der ein Auto mit der Marke "BMW", dem Modell +"440i" und dem Zusatz "M" initialisiert wird. Gib das Auto in der Konsole aus. +Entferne den Zusatz von dem Auto und gebe das Auto erneut in der Konsole aus.
+public class Car {
public String make;
public String model;
public Optional<String> addition;
public Car(String make, String model) {
this.make = make;
this.model = model;
this.addition = Optional.empty();
}
public Car(String make, String model, String addition) {
this.make = make;
this.model = model;
this.addition = Optional.ofNullable(addition);
}
public void print() {
if (addition.isPresent()) {
System.out.println(make + " " + model + " " + addition.get());
} else {
System.out.println(make + " " + model);
}
}
}
public class ExamTask01 {
public static void main(String[] args) {
Car beamer = new Car("BMW", "440i", "M");
beamer.print();
beamer.addition = Optional.empty();
beamer.print();
}
}
Im Klassendiagramm sind nicht alle Datentypen angegeben. Verwende für alle +fehlenden Datentypen eine adequates funktionales Interface.
+Das Attribut canItRunCrysis soll eine Lambdafunktion enthalten die +ermittelt, ob ein Computer mindestens 4 Kerne und 16 GB RAM hat, damit das +Spiel Crysis ausgeführt werden kann.
+Das Attribut doubleRam soll eine Lambdafunktion enthalten, die ein +bestehenden Computer in einen verbesserten Computer umwandelt. Bei der +Umwandlung soll der RAM verdoppelt werden.
+Die Methode hasMinimumGhzSum soll eine Lambdafunktion zurückgeben, welche +ermittelt, ob die Gigaherzsumme dem Parameter entspricht. Die Gigaherzsumme +ist das Produkt von CPU Kernen und Gigaherz je Kern.
+Die Methode getComputers soll einen Stream von einem einzelnen Computer +mit frei gewählten Werten zurückgeben.
+Verwende für die nachfolgende Abfolge die Methoden der Klasse Computer.
+Erzeuge einen Stream von Computern und verdopple den RAM. Verwende einen Filter, +sodass nur Computer übrig bleiben, welche Crysis ausführen können und mindestens +eine Gigaherzsumme von 12 haben.
+public record Computer(int cpuCores, double ghzPerCore, int ram) {
public static Predicate<Computer> canItRunCrysis = computer -> computer.cpuCores() >= 4
&& computer.ram() >= 16;
public static Function<Computer, Computer> doubleRam = computer -> new Computer(computer.cpuCores(),
computer.ghzPerCore(), computer.ram() * 2);
public static Predicate<Computer> hasMinimumGhzSum(int ghzSum) {
return c -> c.cpuCores() * c.ghzPerCore() >= ghzSum;
}
public static Stream<Computer> getComputers() {
return Stream.of(new Computer(0, 0, 0));
}
}
public class Task02 {
public static void main(String[] args) {
Computer.getComputers()
.map(Computer.doubleRam)
.filter(Computer.canItRunCrysis)
.filter(Computer.hasMinimumGhzSum(12));
}
}
Jeder Professor kann durch einen Namen, das Alter und eine Liste von +Vorlesungen, welche er hält beschrieben werden.
+Jeder Student kann durch einen Namen, das Alter und seine Noten beschrieben +werden. Der Schlüssel entspricht dem Kurs und der Wert der Map der Note die er +in diesem Kurs erreicht hat.
+Die Universität enthält Professoren (professors) und Studenten (students). +Benutze die Java Stream API, um die Anforderungen des Rektors zu erfüllen.
+q1 Der Rektor möchte wissen, was für eine Durchschnittsnote seine +Studenten haben.
+Die Methode soll die Durchschnittsnote je Student ermitteln.
+q2 Der Rektor ist in People & Culture Laune und will seinen 3 ältesten +Mathe-Professoren die Big Bang Theory Blu Ray Sammlung schenken.
+Die Methode soll die drei ältesten Mathe-Professoren ermitteln und für jeden +Professor folgenden Gruß auf der Konsole ausgeben:
+6138 Minuten Bazinga Spaß an dich Steffen.
Ein Professor gilt als Mathe-Professor, sofern er eine Vorlesung in "Math" +gibt.
+q3 Der Rektor leidet unter Kontrollwahn. Er will wissen wie viele +Professoren nur zwei oder weniger Vorlesungen halten und nach Alter +gruppieren. Er glaubt, dass Boomer Professoren wenig machen.
+Die Methode soll ermittlen, wieviele Professoren wenig Vorlesungen halten und +diese nach Alter gruppieren.
+q4 Der Rektor leidet immer noch unter Kontrollwahn und möchte eine +abhänging vom Parameter professorName für jeden Professor herausfinden, welche +Studenten seine Vorlesung besucht haben.
+Die Methode soll eine Liste von Listen zurückgeben. Zuerst sollen jene +Professoren ermittelt werden, die dem Parameter professorName entsprechen. +Anschließend soll für jeden Professor eine Liste von Studenten ermittelt +werden, welche seine Vorlesung besucht haben.
+q5 Der Rektor leidet nun zusätzlich unter Größenwahn und will seine +Universität in eine Elite Universität umwandeln. Alle Studenten, die eine Note +von 1,5 oder schlechter haben sollen exmatrikuliert werden.
+Die Methode soll alle Studenten ermitteln, welche in irgendeinem Kurs eine +Note von 1,5 oder schlechter haben und deren Namen in Kleinbuchstaben +zurückgeben. Die Liste soll keine doppelten Werte enthalten.
+public record University(List<Professor> professors, List<Student> students) {
public List<Double> q1Long() {
return students().stream()
.map(student -> {
List<Double> grades = student.grades().values().stream().toList();
var averageGrade = grades.stream().mapToDouble(Double::valueOf).average();
if (averageGrade.isPresent()) {
return averageGrade.getAsDouble();
} else {
return 0.0;
}
})
.toList();
}
public List<Double> q1Short() {
return students().stream()
.map(student -> student.grades().values().stream()
.mapToDouble(grade -> grade).average().orElse(0))
.toList();
}
public void q2() {
professors().stream()
.filter(p -> p.courses().stream().anyMatch(c -> c.equalsIgnoreCase("Math")))
.sorted((p1, p2) -> Integer.compare(p2.age(), p1.age()))
.limit(3)
.forEach(p -> System.out.println("6138 Minuten Bazinga Spaß an dich " + p.name() + "."));
}
public Map<Integer, List<Professor>> q3() {
return professors.stream()
.filter(p -> p.courses().size() <= 2)
.collect(Collectors.groupingBy(p -> p.age()));
}
public List<List<Student>> q4(String professorName) {
return professors.stream()
.filter(professor -> professor.name().equals(professorName))
.map(professor -> students.stream()
.filter(student -> student.grades().keySet().stream()
.anyMatch(studentCourses -> professor.courses().stream()
.anyMatch(professorCourses -> studentCourses.equals(professorCourses))))
.toList())
.toList();
}
public List<String> q5() {
return students.stream()
.filter(s -> s.grades().values().stream().anyMatch(grade -> grade >= 1.5))
.map(s -> s.name().toLowerCase())
.distinct().toList();
}
}
public record Professor(String name, int age, List<String> courses) {}
public record Student(String name, int age, Map<String, Double> grades) {}
Der Projektbericht ist eine fünfseitige Ausarbeitung zu einem Problem, welche +vom Dozenten gestellt wird. Diese besteht aus vier Teilen:
+Die konkrete Problemstellung ist als Kommentar in eurer Abgabe vom +30.04.2024 in Moodle hinterlegt. Sie lässt sich in zwei Teilprobleme +unterteilen. Zuerst müssen Daten aggregiert und anschließend sortiert werden.
+Für die Implementierung der Aggregation soll die Aggregator Klasse implementiert +werden. Diese soll die Datensätze in eine aggregierte Liste umwandeln. Für die +Sortierung der aggregierten Daten soll die Sorter Klasse implementiert werden. +Die Klasse Row soll alle relevanten Attribute eines Datensatzes +enthalten, welche für die Aggregation benötigt werden. Die Klasse +AggregatedRow soll alle Attribute enthalten, welche eine aggregierte Zeile +eines Datensatzes enthält.
+Für die Implementierung der Sortierung ist ein Sortieralgorithmus auszuwählen, +welcher in der Vorlesung behandelt wurde. Für die Auswahl gelten nachfolgende +Anforderungen. Die Anzahl der aggregierten Zeilen wird mindestens eine Milliarde +Einträge enthalten. Der ausgewählte Algorithmus soll theoretisch in der Lage +sein, die Sortierung parallel zu verarbeiten.
+Die Klassen AggregatedRow und Row enthalten nur beispielhafte Attribute. +Die Attribute müssen abhängig von der Problemstellung definiert werden.
+Die Klassen Row und AggregatedRow sollen nur public Attribute enthalten. +Getter und Setter sollen nicht implementiert werden.
+Die Klassen Aggregator und Sorter können mehrere private Methoden +enthalten, um den Code übersichtlicher zu gestalten.
+Für die Implementierung, dürfen keine externen Frameworks oder Bibliotheken +verwendet werden.
+Für die Implementierung darf die Stream API von Java nicht verwendet werden.
+Für die Implementierung darf keine Sort API von Java verwendet werden, z.B. +Collections.sort.
+Die Einleitung soll die eigene Problemstellung und die vom Dozenten gestellte +Problemstellung enthalten.
+Im zweiten Teil sollen die in der Vorlesung behandelten Sortieralgorithmen in +eigenen Worten vorgestellt und verglichen werden. Anschließend soll ein +Sortieralgorithmus ausgewählt werden, welcher für die nachfolgende +Implementierung verwendet wird. Die Auswahlentscheidung soll begründet werden.
+Im dritten Teil soll die Lösung für die individuelle Problemstellung +implementiert werden. Es sind vier Klassen entsprechend dem oben angegebenen +Klassendiagramm zu implementieren. Der Quellcode in der Dokumentation soll keine +imports und package Definitionen enthalten. Kommentare sind nur sparsam zu +verwenden, falls erklärt wird, warum etwas gemacht wurde.
+Der Schluss soll prägnant das Problem, die Vorgehensweise mit +Zwischenergebnissen und das Ergebnis zusammenfassen.
=0;)(i=n[a])&&(o&&4^i.compareDocumentPosition(o)&&o.parentNode.insertBefore(i,o),o=i);return this},sort:function(t){function e(e,r){return e&&r?t(e.__data__,r.__data__):!e-!r}!t&&(t=M);for(var r=this._groups,i=r.length,n=Array(i),a=0;a1?this.each((null==e?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof e?function(t,e,r){return function(){var i=e.apply(this,arguments);null==i?this.style.removeProperty(t):this.style.setProperty(t,i,r)}}:function(t,e,r){return function(){this.style.setProperty(t,e,r)}})(t,e,null==r?"":r)):$(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?function(t){return function(){delete this[t]}}:"function"==typeof e?function(t,e){return function(){var r=e.apply(this,arguments);null==r?delete this[t]:this[t]=r}}:function(t,e){return function(){this[t]=e}})(t,e)):this.node()[t]},classed:function(t,e){var r=W(t+"");if(arguments.length<2){for(var i=E(this.node()),n=-1,a=r.length;++n=0&&(e=t.slice(r+1),t=t.slice(0,r)),{type:t,name:e}}),o=a.length;if(arguments.length<2){var s=this.node().__on;if(s){for(var l,h=0,c=s.length;h >1)+d+t+_+S.slice(T);break;default:t=S+d+t+_}return l(t)}return y=void 0===y?6:/[gprs]/.test(x)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),_.toString=function(){return t+""},_}return{format:d,formatPrefix:function(t,e){var r=d(((t=rb(t)).type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor(rw(e)/3))),n=Math.pow(10,-i),a=rM[8+i/3];return function(t){return r(n*t)+a}}}}(t)).format,ts=ta.formatPrefix})({thousands:",",grouping:[3],currency:["$",""]});let rB=6e4,rL=36e5,rA=864e5,rF=6048e5,r$=2592e6,rW=31536e6,rE=new Date,rD=new Date;function rZ(t,e,r,i){function n(e){return t(e=0==arguments.length?new Date:new Date(+e)),e}return n.floor=e=>(t(e=new Date(+e)),e),n.ceil=r=>(t(r=new Date(r-1)),e(r,1),t(r),r),n.round=t=>{let e=n(t),r=n.ceil(t);return t-e 0&&c 0&&d 0&&c 0&&d=l)return -1;if(37===(n=e.charCodeAt(o++))){if(!(a=C[(n=e.charAt(o++))in iu?e.charAt(o++):n])||(i=a(t,r,i))<0)return -1}else if(n!=r.charCodeAt(i++))return -1}return i}return b.x=w(r,b),b.X=w(i,b),b.c=w(e,b),k.x=w(r,k),k.X=w(i,k),k.c=w(e,k),{format:function(t){var e=w(t+="",b);return e.toString=function(){return t},e},parse:function(t){var e=_(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=w(t+="",k);return e.toString=function(){return t},e},utcParse:function(t){var e=_(t+="",!0);return e.toString=function(){return t},e}}}(t)).format,tl.parse,tl.utcFormat,tl.utcParse})({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function nb(t){return new Date(t)}function nk(t){return t instanceof Date?+t:+new Date(+t)}function nC(){return e0.apply((function t(e,r,i,n,a,o,s,l,h,c){var u=rm(),d=u.invert,f=u.domain,p=c(".%L"),g=c(":%S"),y=c("%I:%M"),m=c("%I %p"),x=c("%a %d"),b=c("%b %d"),k=c("%B"),C=c("%Y");function w(t){return(h(t)u});var i,n,a,o=r("96498"),s=r("33722"),l=r("94675"),h=s.Z?function(t,e){return(0,s.Z)(t,"toString",{configurable:!0,enumerable:!1,value:(0,o.Z)(e),writable:!0})}:l.Z,c=Date.now;let u=(i=h,n=0,a=0,function(){var t=c(),e=16-(t-a);if(a=t,e>0){if(++n>=800)return arguments[0]}else n=0;return i.apply(void 0,arguments)})},71842:function(t,e,r){"use strict";r.d(e,{Z:function(){return n}});var i=Function.prototype.toString;let n=function(t){if(null!=t){try{return i.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},96498:function(t,e,r){"use strict";r.d(e,{Z:function(){return i}});let i=function(t){return function(){return t}}},38487:function(t,e,r){"use strict";r.d(e,{Z:function(){return i}});let i=function(t,e){return t===e||t!=t&&e!=e}},94675:function(t,e,r){"use strict";r.d(e,{Z:function(){return i}});let i=function(t){return t}},45988:function(t,e,r){"use strict";r.d(e,{Z:()=>h});var i=r("65182"),n=r("75887");let a=function(t){return(0,n.Z)(t)&&"[object Arguments]"==(0,i.Z)(t)};var o=Object.prototype,s=o.hasOwnProperty,l=o.propertyIsEnumerable;let h=a(function(){return arguments}())?a:function(t){return(0,n.Z)(t)&&s.call(t,"callee")&&!l.call(t,"callee")}},31739:function(t,e,r){"use strict";r.d(e,{Z:function(){return i}});let i=Array.isArray},71581:function(t,e,r){"use strict";r.d(e,{Z:function(){return a}});var i=r(18782),n=r(49666);let a=function(t){return null!=t&&(0,n.Z)(t.length)&&!(0,i.Z)(t)}},61322:function(t,e,r){"use strict";r.d(e,{Z:function(){return a}});var i=r(71581),n=r(75887);let a=function(t){return(0,n.Z)(t)&&(0,i.Z)(t)}},25162:function(t,e,r){"use strict";r.d(e,{Z:()=>l});var i=r("52434"),n="object"==typeof exports&&exports&&!exports.nodeType&&exports,a=n&&"object"==typeof module&&module&&!module.nodeType&&module,o=a&&a.exports===n?i.Z.Buffer:void 0,s=o?o.isBuffer:void 0;let l=s||function(){return!1}},73217:function(t,e,r){"use strict";r.d(e,{Z:function(){return d}});var i=r(22769),n=r(23302),a=r(45988),o=r(31739),s=r(71581),l=r(25162),h=r(84342),c=r(48366),u=Object.prototype.hasOwnProperty;let d=function(t){if(null==t)return!0;if((0,s.Z)(t)&&((0,o.Z)(t)||"string"==typeof t||"function"==typeof t.splice||(0,l.Z)(t)||(0,c.Z)(t)||(0,a.Z)(t)))return!t.length;var e=(0,n.Z)(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if((0,h.Z)(t))return!(0,i.Z)(t).length;for(var r in t)if(u.call(t,r))return!1;return!0}},18782:function(t,e,r){"use strict";r.d(e,{Z:function(){return a}});var i=r(65182),n=r(58641);let a=function(t){if(!(0,n.Z)(t))return!1;var e=(0,i.Z)(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},49666:function(t,e,r){"use strict";r.d(e,{Z:function(){return i}});let i=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=0x1fffffffffffff}},58641:function(t,e,r){"use strict";r.d(e,{Z:function(){return i}});let i=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},75887:function(t,e,r){"use strict";r.d(e,{Z:function(){return i}});let i=function(t){return null!=t&&"object"==typeof t}},48366:function(t,e,r){"use strict";r.d(e,{Z:()=>c});var i=r("65182"),n=r("49666"),a=r("75887"),o={};o["[object Float32Array]"]=o["[object Float64Array]"]=o["[object Int8Array]"]=o["[object Int16Array]"]=o["[object Int32Array]"]=o["[object Uint8Array]"]=o["[object Uint8ClampedArray]"]=o["[object Uint16Array]"]=o["[object Uint32Array]"]=!0,o["[object Arguments]"]=o["[object Array]"]=o["[object ArrayBuffer]"]=o["[object Boolean]"]=o["[object DataView]"]=o["[object Date]"]=o["[object Error]"]=o["[object Function]"]=o["[object Map]"]=o["[object Number]"]=o["[object Object]"]=o["[object RegExp]"]=o["[object Set]"]=o["[object String]"]=o["[object WeakMap]"]=!1;var s=r("44026"),l=r("74413"),h=l.Z&&l.Z.isTypedArray;let c=h?(0,s.Z)(h):function(t){return(0,a.Z)(t)&&(0,n.Z)(t.length)&&!!o[(0,i.Z)(t)]}},40038:function(t,e,r){"use strict";r.d(e,{Z:()=>c});var i=r("12895"),n=r("58641"),a=r("84342");let o=function(t){var e=[];if(null!=t)for(var r in Object(t))e.push(r);return e};var s=Object.prototype.hasOwnProperty;let l=function(t){if(!(0,n.Z)(t))return o(t);var e=(0,a.Z)(t),r=[];for(var i in t)!("constructor"==i&&(e||!s.call(t,i)))&&r.push(i);return r};var h=r("71581");let c=function(t){return(0,h.Z)(t)?(0,i.Z)(t,!0):l(t)}},65269:function(t,e,r){"use strict";r.d(e,{Z:function(){return a}});var i=r(79401);function n(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw TypeError("Expected a function");var r=function(){var i=arguments,n=e?e.apply(this,i):i[0],a=r.cache;if(a.has(n))return a.get(n);var o=t.apply(this,i);return r.cache=a.set(n,o)||a,o};return r.cache=new(n.Cache||i.Z),r}n.Cache=i.Z;let a=n},41777:function(t,e,r){"use strict";r.d(e,{Z:()=>$});var i=r("11395"),n=r("49790"),a=r("38487");let o=function(t,e,r){(void 0!==r&&!(0,a.Z)(t[e],r)||void 0===r&&!(e in t))&&(0,n.Z)(t,e,r)};var s=r("45467"),l=r("49307"),h=r("32025"),c=r("76177"),u=r("62799"),d=r("45988"),f=r("31739"),p=r("61322"),g=r("25162"),y=r("18782"),m=r("58641"),x=r("65182"),b=r("53754"),k=r("75887"),C=Object.prototype,w=Function.prototype.toString,_=C.hasOwnProperty,v=w.call(Object);let T=function(t){if(!(0,k.Z)(t)||"[object Object]"!=(0,x.Z)(t))return!1;var e=(0,b.Z)(t);if(null===e)return!0;var r=_.call(e,"constructor")&&e.constructor;return"function"==typeof r&&r instanceof r&&w.call(r)==v};var S=r("48366");let M=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]};var B=r("29919"),L=r("40038");let A=function(t,e,r,i,n,a,s){var x=M(t,r),b=M(e,r),k=s.get(b);if(k){o(t,r,k);return}var C=a?a(x,b,r+"",t,e,s):void 0,w=void 0===C;if(w){var _,v=(0,f.Z)(b),A=!v&&(0,g.Z)(b),F=!v&&!A&&(0,S.Z)(b);if(C=b,v||A||F)(0,f.Z)(x)?C=x:(0,p.Z)(x)?C=(0,c.Z)(x):A?(w=!1,C=(0,l.Z)(b,!0)):F?(w=!1,C=(0,h.Z)(b,!0)):C=[];else if(T(b)||(0,d.Z)(b)){if(C=x,(0,d.Z)(x)){;_=x,C=(0,B.Z)(_,(0,L.Z)(_))}else(!(0,m.Z)(x)||(0,y.Z)(x))&&(C=(0,u.Z)(b))}else w=!1}w&&(s.set(b,C),n(C,b,i,a,s),s.delete(b)),o(t,r,C)},F=function t(e,r,n,a,l){if(e!==r)(0,s.Z)(r,function(s,h){if(l||(l=new i.Z),(0,m.Z)(s))A(e,r,h,n,t,a,l);else{var c=a?a(M(e,h),s,h+"",e,r,l):void 0;void 0===c&&(c=s),o(e,h,c)}},L.Z)},$=(0,r("92807").Z)(function(t,e,r){F(t,e,r)})},30594:function(t,e,r){"use strict";r.d(e,{o:function(){return s}});var i=r(74146),n={aggregation:18,extension:18,composition:18,dependency:6,lollipop:13.5,arrow_point:4};function a(t,e){if(void 0===t||void 0===e)return{angle:0,deltaX:0,deltaY:0};t=o(t),e=o(e);let[r,i]=[t.x,t.y],[n,a]=[e.x,e.y],s=n-r,l=a-i;return{angle:Math.atan(l/s),deltaX:s,deltaY:l}}(0,i.eW)(a,"calculateDeltaAndAngle");var o=(0,i.eW)(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),s=(0,i.eW)(t=>({x:(0,i.eW)(function(e,r,i){let s=0,l=o(i[0]).x
/gi,tb=m(t=>t?tL(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows");var tk=(i=!1,()=>{!i&&(tC(),i=!0)});function tC(){let t="data-temp-href-target";g.Z.addHook("beforeSanitizeAttributes",e=>{e instanceof Element&&"A"===e.tagName&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),g.Z.addHook("afterSanitizeAttributes",e=>{e instanceof Element&&"A"===e.tagName&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),"_blank"===e.getAttribute("target")&&e.setAttribute("rel","noopener"))})}m(tC,"setupDompurifyHooks");var tw=m(t=>(tk(),g.Z.sanitize(t)),"removeScript"),t_=m((t,e)=>{if(e.flowchart?.htmlLabels!==!1){let r=e.securityLevel;"antiscript"===r||"strict"===r?t=tw(t):"loose"!==r&&(t=tB(t=(t=(t=tL(t)).replace(/
'+(r?n:g(n,!0))+"
\n":""+(r?n:g(n,!0))+"
\n"}blockquote({tokens:t}){let e=this.parser.parse(t);return`+${e}+`}html({text:t}){return t}heading({tokens:t,depth:e}){return`
${this.parser.parseInline(t)}
+`}table(t){let e="",r="";for(let e=0;e${t}
`}br(t){return"An error occurred:
"+g(r.message+"",!0)+"";return e?Promise.resolve(t):t}if(e)return Promise.reject(r);throw r}}}let tp=new tf;function tg(t,e){return tp.parse(t,e)}tg.options=tg.setOptions=function(t){return tp.setOptions(t),tg.defaults=tp.defaults,s=tg.defaults,tg},tg.getDefaults=o,tg.defaults=s,tg.use=function(...t){return tp.use(...t),tg.defaults=tp.defaults,s=tg.defaults,tg},tg.walkTokens=function(t,e){return tp.walkTokens(t,e)},tg.parseInline=tp.parseInline,tg.Parser=tu,tg.parser=tu.parse,tg.Renderer=th,tg.TextRenderer=tc,tg.Lexer=tl,tg.lexer=tl.lex,tg.Tokenizer=v,tg.Hooks=td,tg.parse=tg,tg.options,tg.setOptions,tg.use,tg.walkTokens,tg.parseInline,tu.parse,tl.lex;var ty=r("18464");function tm(t,{markdownAutoWrap:e}){let r=t.replace(/
${t.tokens?.map(i).join("")}
`;else if("space"===t.type)return"";else if("html"===t.type)return`${t.text}`;else if("escape"===t.type)return t.text;return`Unsupported markdown: ${t.type}`}return(0,n.eW)(i,"output"),r.map(i).join("")}function tk(t){return Intl.Segmenter?[...new Intl.Segmenter().segment(t)].map(t=>t.segment):[...t]}function tC(t,e){return tw(t,[],tk(e.content),e.type)}function tw(t,e,r,i){if(0===r.length)return[{content:e.join(""),type:i},{content:"",type:i}];let[n,...a]=r,o=[...e,n];return t([{content:o.join(""),type:i}])?tw(t,o,a,i):(0===e.length&&n&&(e.push(n),r.shift()),[{content:e.join(""),type:i},{content:r.join(""),type:i}])}function t_(t,e){if(t.some(({content:t})=>t.includes("\n")))throw Error("splitLineToFitWidth does not support newlines in the line");return tv(t,e)}function tv(t,e,r=[],i=[]){if(0===t.length)return i.length>0&&r.push(i),r.length>0?r:[];let n="";" "===t[0].content&&(n=" ",t.shift());let a=t.shift()??{content:" ",type:"normal"},o=[...i];if(""!==n&&o.push({content:n,type:"normal"}),o.push(a),e(o))return tv(t,e,r,o);if(i.length>0)r.push(i),t.unshift(a);else if(a.content){let[i,n]=tC(e,a);r.push([i]),n.content&&t.unshift(n)}return tv(t,e,r)}function tT(t,e){e&&t.attr("style",e)}async function tS(t,e,r,i,a=!1){let o=t.append("foreignObject");o.attr("width",`${10*r}px`),o.attr("height",`${10*r}px`);let s=o.append("xhtml:div"),l=e.label;e.label&&(0,n.l0)(e.label)&&(l=await (0,n.uT)(e.label.replace(n.SY.lineBreakRegex,"\n"),(0,n.nV)()));let h=e.isNode?"nodeLabel":"edgeLabel",c=s.append("span");c.html(l),tT(c,e.labelStyle),c.attr("class",`${h} ${i}`),tT(s,e.labelStyle),s.style("display","table-cell"),s.style("white-space","nowrap"),s.style("line-height","1.5"),s.style("max-width",r+"px"),s.style("text-align","center"),s.attr("xmlns","http://www.w3.org/1999/xhtml"),a&&s.attr("class","labelBkg");let u=s.node().getBoundingClientRect();return u.width===r&&(s.style("display","table"),s.style("white-space","break-spaces"),s.style("width",r+"px"),u=s.node().getBoundingClientRect()),o.node()}function tM(t,e,r){return t.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em")}function tB(t,e,r){let i=t.append("text"),n=tM(i,1,e);tF(n,r);let a=n.node().getComputedTextLength();return i.remove(),a}function tL(t,e,r){let i=t.append("text"),n=tM(i,1,e);tF(n,[{content:r,type:"normal"}]);let a=n.node()?.getBoundingClientRect();return a&&i.remove(),a}function tA(t,e,r,i=!1){let a=e.append("g"),o=a.insert("rect").attr("class","background").attr("style","stroke: none"),s=a.append("text").attr("y","-10.1"),l=0;for(let e of r){let r=(0,n.eW)(e=>tB(a,1.1,e)<=t,"checkWidth");for(let t of r(e)?[e]:t_(e,r))tF(tM(s,l,1.1),t),l++}if(!i)return s.node();{let t=s.node().getBBox();return o.attr("x",t.x-2).attr("y",t.y-2).attr("width",t.width+4).attr("height",t.height+4),a.node()}}function tF(t,e){t.text(""),e.forEach((e,r)=>{let i=t.append("tspan").attr("font-style","em"===e.type?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight","strong"===e.type?"bold":"normal");0===r?i.text(e.content):i.text(" "+e.content)})}function t$(t){return t.replace(/fa[bklrs]?:fa-[\w-]+/g,t=>``)}(0,n.eW)(tm,"preprocessMarkdown"),(0,n.eW)(tx,"markdownToLines"),(0,n.eW)(tb,"markdownToHTML"),(0,n.eW)(tk,"splitTextToChars"),(0,n.eW)(tC,"splitWordToFitWidth"),(0,n.eW)(tw,"splitWordToFitWidthRecursion"),(0,n.eW)(t_,"splitLineToFitWidth"),(0,n.eW)(tv,"splitLineToFitWidthRecursion"),(0,n.eW)(tT,"applyStyle"),(0,n.eW)(tS,"addHtmlSpan"),(0,n.eW)(tM,"createTspan"),(0,n.eW)(tB,"computeWidthOfText"),(0,n.eW)(tL,"computeDimensionOfText"),(0,n.eW)(tA,"createFormattedText"),(0,n.eW)(tF,"updateTextContentAndStyles"),(0,n.eW)(t$,"replaceIconSubstring");var tW=(0,n.eW)(async(t,e="",{style:r="",isTitle:o=!1,classes:s="",useHtmlLabels:l=!0,isNode:h=!0,width:c=200,addSvgBackground:u=!1}={},d)=>{if(n.cM.debug("XYZ createText",e,r,o,s,l,h,"addSvgBackground: ",u),l){let a=tb(e,d),o=t$((0,i.SH)(a)),l=e.replace(/\\\\/g,"\\"),f={isNode:h,label:(0,n.l0)(e)?l:o,labelStyle:r.replace("fill:","color:")};return await tS(t,f,c,s,u)}{let i=tA(c,t,tx(e.replace(/