Aufgabe Vorschlag C - 1 - Dynamische Datenstrukturen · Abitur Hessen Praktische Informatik LK 2021
Thema: Dynamische Datenstrukturen · Aus der Prüfung LK (2021)
Aufgabenstellung
Impfzentrum
Für das Management eines kommunalen Impfzentrums sollen eine Verwaltungsapplikation und eine Datenbank entwickelt werden. Das Einwohnermeldeamt stellt in Kooperation mit den Krankenkassen die Daten aller Personen zur Verfügung. Alle Personen ab dem 16. Lebensjahr sollen geimpft werden.
Material 1: UML-Klassendiagramm Impfzentrum
Hinweise zu Material 1
Die Konstante STRASSEN der Klasse ImpfzentrumVerwaltung legt die Anzahl der Impfstraßen fest, die Konstante PERSONEN_TAG_STRASSE die maximale Anzahl an Impflingen je Impfstraße und Tag. Die Methode anmelden() der Klasse ImpfzentrumVerwaltung sucht die Impfstraße mit der geringsten Anzahl wartender Personen, fügt die übergebene Person der entsprechenden Warteschlange hinzu und gibt die Nummer der Impfstraße zurück. Die Methode abmelden() entfernt die Person nach Abschluss des Impfvorgangs aus der entsprechenden Warteschlange. Der Impftermin der Klasse Impfung ist das aktuelle Datum bei der Objekterzeugung.
Material 2: Klassendokumentationen
Klasse Date
Date()
erzeugt ein Date-Objekt mit dem aktuellen Systemdatum.
Date(day: int, month: int, year: int)
erzeugt ein Date-Objekt mit den Werten von day, month und year.
addDays(numberOfDays: int): Date
liefert eine Kopie des Date-Objekts mit der addierten Anzahl von Tagen.
isBefore(d: Date): boolean
liefert true, wenn das Date-Objekt vor dem des Parameters d liegt.
isAfter(d: Date): boolean
liefert true, wenn das Date-Objekt nach dem des Parameters d liegt.
isBetween(d1: Date, d2: Date): boolean
liefert true, wenn das Date-Objekt zwischen den Parametern d1 und d2 liegt.
toString(): String
liefert eine String-Repräsentanz des Date-Objekts im Format dd.mm.yyyy.
Klasse List
List<T>()
erzeugt eine generische Liste mit Elementen des Typs T.
add(obj: T)
hängt das Objekt obj vom Typ T am Ende der Liste an.
add(index: int, obj: T)
fügt das Objekt obj vom Typ T an der Position index in die Liste ein.
contains(obj: T): boolean
liefert true, wenn das Objekt obj in der Liste enthalten ist, ansonsten false.
get(index: int): T
liefert das Listenelement an der Position index zurück bzw. null, falls index negativ oder größer gleich der Anzahl der momentan enthaltenen Elemente ist.
remove(index: int): T
entfernt das Objekt vom Typ T an der Position index aus der Liste und gibt es zurück.
remove(obj: T): boolean
entfernt das Objekt obj aus der Liste. Falls obj mehrmals in der Liste enthalten ist, wird nur das erste Vorkommen entfernt. Der Rückgabewert ist true, falls das Objekt gefunden und entfernt wurde, sonst false.
size(): int
liefert die Anzahl der Elemente in der Liste zurück.
Klasse String
equals(str: String): boolean
liefert true, wenn beide Strings gleich sind, ansonsten false.
split(str: String): String[]
teilt einen String am Trennzeichen str. Die Teil-Strings werden in einem Feld zurückgeliefert.
startsWith(str: String): boolean
liefert true, wenn der String mit str beginnt, ansonsten false.
Material 3: UML-Anwendungsfalldiagramm
Für die tägliche Abwicklung der Impfungen werden die zu impfenden Personen jeder Impfstraße mithilfe jeweils einer Warteschlange verwaltet (Material 1). Eine Person wird bei ihrer Anmeldung im Impfzentrum am Ende der Warteschlange einer Impfstraße hinzugefügt. Nach dem Impfvorgang wird die Person abgemeldet und dann von der ersten Position der Warteschlange entfernt. Es kann erforderlich sein, dass eine Person aus der Warteschlange gelöscht werden muss, obwohl sie nicht an erster Position der Warteschlange ist. Das ist zum Beispiel der Fall, wenn die Person ihr Einverständnis verweigert oder die Ärztin bzw. der Arzt (im Folgenden Arzt genannt) eine Impfuntauglichkeit festgestellt hat.
1.4.1
Bei den Datenstrukturen Warteschlange und Stapel handelt es sich um besondere Formen der verketteten Liste. Beschreiben Sie die wesentlichen Eigenschaften der Datenstrukturen verkettete Liste, Warteschlange sowie Stapel und erläutern Sie deren Umsetzung in einer objektorientierten Programmiersprache unter Berücksichtigung benötigter Operationen.
Hinweis: Es sind nur einfach verkettete Liste zu berücksichtigen.
[6 BE]
1.4.2
Implementieren Sie die Klasse Warteschlange aus Material 1.
Hinweis: Die Methode hinzufuegen() fügt die Person an das Ende der Warteschlange hinzu. Die Methode entfernen() entnimmt die am längsten wartende Person. Die Methode loeschen() sucht eine bestimmte Person in der Warteschlange und kettet sie aus.
[12 BE]

Lösung
Nach den offiziellen Korrekturhinweisen
1.4.1 Beschreiben Sie die wesentlichen Eigenschaften der Datenstrukturen verkettete Liste, Warteschlange sowie Stapel und erläutern Sie deren Umsetzung in einer objektorientierten Programmiersprache unter Berücksichtigung benötigter Operationen.
Lösung: Verkettete Liste: Dynamische Speicherung beliebig vieler Objekte, jedes Element verweist auf den Nachfolger (über Objektreferenzen). Durchlaufen der Kette für Zugriff. Stapel (Stack): LIFO-Prinzip (Last In First Out). Wesentliche Operationen: push (Element ablegen), pop (zuletzt abgelegtes Element lesen und entfernen). Warteschlange (Queue): FIFO-Prinzip (First In First Out). Wesentliche Operationen: enqueue (Element anfügen), dequeue (zuerst gespeichertes Element lesen und entfernen).
1.4.2 Implementieren Sie die Klasse Warteschlange aus Material 1.
Lösung: ```java public class Warteschlange { private int anzahlPersonen; private Person erste; private Person letzte; public Warteschlange() { anzahlPersonen = 0; erste = null; letzte = null; } public void hinzufuegen(Person personNeu) { if (letzte != null) { letzte.setNaechste(personNeu); } else { erste = personNeu; } letzte = personNeu; anzahlPersonen++; } public Person entfernen() { Person p = erste; if (erste != null) { erste = erste.getNaechste(); p.setNaechste(null); anzahlPersonen--; } return p; } public Person loeschen(int personID) { Person aktuelle = erste; Person vorherige = erste; if (anzahlPersonen != 0) { // suche Element while (aktuelle != null && aktuelle.getPersonID() != personID) { vorherige = aktuelle; aktuelle = aktuelle.getNaechste(); } if (aktuelle != null) { // Element ausketten if (aktuelle == erste && anzahlPersonen == 1) { erste = null; letzte = null; } else if (aktuelle.getNaechste() == null) { letzte = vorherige; letzte.setNaechste(null); } else if (aktuelle == erste && anzahlPersonen > 1) { erste = aktuelle.getNaechste(); } else { vorherige.setNaechste(aktuelle.getNaechste()); } anzahlPersonen--; aktuelle.setNaechste(null); } } return aktuelle; } } ```
Die ausführliche Erklärung Schritt für Schritt (mit KI) gibt es mit Premium. Premium
Löse sie direkt hier: automatische Korrektur, Hinweise und Lösung Schritt für Schritt.
‹ Aufgabe Vorschlag C - 1 · LK 2022