Aufgabe Vorschlag C - 1 - Klassen und Methoden implementi… · Abitur Hessen Praktische Informatik LK 2021
Thema: Klassen und Methoden implementieren · 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
1 Objektorientierte Entwicklung des Impfzentrum-Systems
Ein erstes UML-Klassendiagramm finden Sie in Material 1.
1.1
Die Daten der zu impfenden Personen werden dem Impfzentrum in Form einer CSV-Datei zur Verfügung gestellt. Ein Datensatz hat folgenden Aufbau:
77665;Müller;Klaus;31.12.1980;35334;Hausen;Teichweg 8;1
Die einzelnen Elemente stehen für Personen-ID, Nachname, Vorname, Geburtsdatum, PLZ, Ort, Straße mit Hausnummer und Risikogruppe (1 ist Risikogruppe, 0 ist keine Risikogruppe).
Überführen Sie die Klasse Person (Material 1) in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie den Konstruktor ohne die weiteren Methoden.
Hinweise: Der Konstruktor erhält die Personendaten als Zeichenkette wie oben beschrieben. Das Geburtsdatum muss mithilfe der Methode pruefeDatum() der Klasse ImpfzentrumVerwaltung auf Plausibilität getestet werden, bevor ein Datums-Objekt erzeugt wird. Die Dokumentationen der Klassen Date und String sind in Material 2 zu finden. [6 BE]
1.2
Die Methode pruefeDatum() der Klasse ImpfzentrumVerwaltung (Material 1) gibt true zurück, wenn es sich bei den übergebenen Werten um ein plausibles Datum handelt, ansonsten false. Ein Datum ist hier nur gültig, wenn die Jahreszahl im Bereich von 1910 bis 2005 liegt.
Entwickeln und zeichnen Sie ein Struktogramm für diese Methode.
Hinweis: Ein Jahr ist ein Schaltjahr, wenn die Jahreszahl durch 4 teilbar ist. Jahreszahlen, die durch 100 teilbar sind, sind allerdings keine Schaltjahre, es sei denn, die Jahreszahl ist durch 400 teilbar. [7 BE]
1.3
Die Methode einladen(datum: Date) der Klasse ImpfzentrumVerwaltung (Material 1) generiert eine Liste mit Personen, die zu dem übergebenen Datum zur Impfung eingeladen werden sollen. Folgende Prioritäten sind bei der Erstellung der Liste zu berücksichtigen:
Erste Priorität haben Personen, deren 1. Impfung zum übergebenen Datum mehr als zwanzig Tage zurückliegt.
In zweiter Priorität folgen alle weiteren Personen nach Alter und gegebenenfalls Risikogruppenangehörigkeit absteigend sortiert. Handelt es sich um einen Risikopatienten, wird das Alter mit 2 multipliziert.
Es muss sichergestellt werden, dass die Impfkapazität eines Tages (Anzahl der Impfstraßen mal Personen am Tag je Impfstraße) nicht überschritten wird. Implementieren Sie die Methode.
Hinweis: Die Dokumentationen der Klassen Date und List sind in Material 2 zu finden. [10 BE]

Lösung
Nach den offiziellen Korrekturhinweisen
1.1 Überführen Sie die Klasse Person (Material 1) in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie den Konstruktor ohne die weiteren Methoden.
Lösung: ```java public class Person { private int personID; private String nachname; private String vorname; private Date gebDatum; private String plz; private String ort; private String strasse; private boolean risiko; private boolean einverstaendnis; private int anzahlImpfungen; private Impfung[] impfungen; private Person naechste; public Person(String personenDaten) { String[] werte = personenDaten.split(";"); this.personID = Integer.parseInt(werte[0]); this.nachname = werte[1]; this.vorname = werte[2]; String[] datum = werte[3].split("\\."); int t = Integer.parseInt(datum[0]); int m = Integer.parseInt(datum[1]); int j = Integer.parseInt(datum[2]); this.gebDatum = null; if (ImpfzentrumVerwaltung.pruefeDatum(t, m, j)) gebDatum = new Date(t, m, j); this.plz = werte[4]; this.ort = werte[5]; this.strasse = werte[6]; this.risiko = (Integer.parseInt(werte[7]) == 1); this.einverstaendnis = false; this.anzahlImpfungen = 0; this.impfungen = new Impfung[2]; this.naechste = null; } } ```
1.2 Entwickeln und zeichnen Sie ein Struktogramm für die Methode pruefeDatum().
Lösung: Beschreibung des Struktogramms (DIN 66261): 1. Initialisierung: `ok := true` 2. Bedingung zur Überprüfung des Monats und Jahres: `monat >= 1 und monat <= 12 und jahr >= 1910 und jahr <= 2005?` - Falls Nein: `ok := false` - Falls Ja: Festlegung von `maxTage := 31`. Anschließende Verzweigung für Monate mit 30 Tagen (`monat = 4 oder monat = 6 oder monat = 9 oder monat = 11?`): - Falls Ja: `maxTage := 30` - Falls Nein: Verzweigung auf `monat = 2?`: - Falls Ja: Schaltjahresprüfung (`jahr mod 4 = 0 und jahr mod 100 <> 0 oder jahr mod 400 = 0?`): - Ja: `maxTage := 29` - Nein: `maxTage := 28` 3. Überprüfung des Tages: `tag < 1 oder tag > maxTage?` - Falls Ja: `ok := false` 4. Rückgabe: `Rückgabe ok`
1.3 Implementieren Sie die Methode einladen(datum: Date) der Klasse ImpfzentrumVerwaltung.
Lösung: ```java public List<Person> einladen(Date datum) { List<Person> liste = new List<>(); // Zuerst alle Personen, deren 1. Impftermin länger als 20 Tage zurückliegt for (Person p : personen) { if (p.getAnzahlImpfungen() == 1) { Date d = p.getImpfungen()[0].getImpfTermin(); d = d.addDays(21); if (d.isBefore(datum)) { liste.add(p); } } } // Weitere Personen nach Priorität Alter und Risiko absteigend sortiert hinzufügen int index = 0; int abIndex = liste.size(); while (index < personen.size()) { Person p = personen.get(index); if (!liste.contains(p) && p.getGebDatum() != null) { int i = abIndex; int prio1 = p.ermittleAlter() * (p.getRisiko() ? 2 : 1); while (i < liste.size()) { int prio2 = liste.get(i).ermittleAlter() * (liste.get(i).getRisiko() ? 2 : 1); if (prio1 >= prio2) { break; } i++; } liste.add(i, p); } index++; } // n Personen oberer Priorität, Rest aus Liste löschen int n = STRASSEN * PERSONEN_TAG_STRASSE; int zuLoeschen = liste.size() - n; while (zuLoeschen > 0) { liste.remove(n); zuLoeschen--; } return liste; } ```
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 B - 1 - Klassen und Methoden implementi… · LK 2021