Aufgabe Vorschlag B - 1 - Klassen und Methoden implementi… · Abitur Hessen Praktische Informatik LK 2021
Thema: Klassen und Methoden implementieren · Aus der Prüfung LK (2021)
Aufgabenstellung
Kinocenter
Für das Management des Vorstellungsbetriebs eines Kinocenters sollen eine Client-Server-Anwendung und eine Datenbank entwickelt werden.
Material 1: UML-Klassendiagramm
Hinweis: Auf alle Attribute kann mittels get-Methoden zugegriffen werden.
Material 2: Klassendokumentationen
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, sonst 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 Listenelement an der Position index. Liefert das entfernte Element zurück bzw. null, falls index negativ oder größer gleich der Anzahl der momentan enthaltenen Elemente ist.
remove(obj: T): boolean entfernt das Objekt obj aus der Liste. Falls obj mehrmals in der Liste enthalten ist, wird nur das erste 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 DateTime
DateTime() erzeugt ein DateTime-Objekt mit dem aktuellen Systemdatum und der Systemuhrzeit, im Format dd.mm.yyyy hh:mm.
compareTo(dt: DateTime): int Vergleicht Datum und Uhrzeit des DateTime-Objekts mit dem des Parameters dt und liefert einen int-Wert:
< 0 wenn das Datum des DateTime-Objekts vor dem des Parameters dt liegt
= 0 wenn das Datum des DateTime-Objekts gleich dem von dt ist
> 0 wenn das Datum des DateTime-Objekts nach dem des Parameters dt liegt
isAfter(date: DateTime): boolean liefert true, wenn das DateTime-Objekt nach dem des Parameters dt liegt
isBefore(date: DateTime): boolean liefert true, wenn das DateTime-Objekt vor dem des Parameters dt liegt
isEqual(dt: DateTime): boolean liefert true, wenn das DateTime-Objekt gleich dem des Parameters dt ist
Klasse ServerSocket
ServerSocket(localPort: int) erzeugt einen Server-Socket und bindet ihn an den angegebenen Port.
accept(): Socket wartet darauf, dass ein Client eine Verbindung aufbauen will. Wurde eine Verbindung aufgebaut, liefert die Methode das entsprechende Socket-Objekt.
close() schließt den Server-Socket.
Klasse Socket
Socket(remoteHostIP: String, remotePort: int) erzeugt ein Socket-Objekt.
connect(): boolean stellt eine Verbindung zum RemoteHost her; liefert true, wenn eine Verbindung hergestellt werden konnte.
readLine(): String liest eine Zeile vom Socket, bzw. liefert null, wenn der Socket nicht geöffnet ist. Eine Zeile wird durch ein Zeilenendezeichen abgeschlossen; das Zeilenendezeichen wird jedoch nicht in den zurückgegebenen String übernommen. Die Methode blockiert, bis eine komplette Zeile eingelesen ist.
write(s: String) schreibt einen String zum Socket; ist die Schnittstelle nicht geöffnet geschieht nichts.
close() löst die Verbindung auf.
Material 3: Sitzplan und Sitzbelegung
Beispielhafter Sitzplan des Kinosaals 3 mit 9 Reihen und 25 Sitzen pro Reihe
Hinweise: Die Nummer eines Sitzes setzt sich aus der Nummer der Reihe und der zweistelligen Nummer des Sitzes innerhalb der Reihe zusammen. Die Reihe 1 ist vorne im Saal, die Reihe 9 hinten.
Beispielhafte Sitzbelegung einer Vorstellung in diesem Kinosaal
Hinweis: true bedeutet der Sitz ist frei, false bedeutet der Sitz ist belegt. Der default-Wert einer Variablen des Typs boolean ist false.
Material 4: Vorlage UML-Sequenzdiagramm
Material 5: Beispiele für Kinokarten
Hinweis: Mehrere Karten können zusammen gekauft werden, sie haben dann dasselbe Kaufdatum, dieselbe Kaufuhrzeit sowie dieselbe ID. Jede Kinokarte verfügt darüber hinaus über eine individuelle, eindeutige Nummer, die von 1 ab fortlaufend hochgezählt wird.
Material 6: Vorlage UML-Klassendiagramm des Kartenkaufs
1 Objektorientierte Entwicklung des Kino-Management-Systems
Ein erstes UML-Klassendiagramm finden Sie in Material 1.
1.1
Überführen Sie die im UML-Klassendiagramm (Material 1) dargestellte Klasse Film in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie die aufgeführten Methoden. [10 BE]
Hinweise: Die Liste der Vorstellungen eines Films ist nach Datum und Uhrzeit aufsteigend zu sortieren. Die Methode einfuegen(vorstellung: Vorstellung) fügt eine Vorstellung an der zeitlich korrekten Position in die Liste ein. Eine Beschreibung der Klassen List und DateTime ist in Material 2 zu finden.
1.2
Überführen Sie die im UML-Klassendiagramm (Material 1) dargestellte Klasse Vorstellung in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie die aufgeführten Methoden. [16 BE]
Hinweise: Ein Kinosaal hat eine bestimmte Anzahl von Reihen und Sitzen pro Reihe. Die Methode sucheBesteFreieSitze(anzahl: int) ermittelt die gewünschte Anzahl von freien und nebeneinanderliegenden Sitzen möglichst weit hinten. Sie liefert die Nummer des ersten freien Sitzes, bzw. den Wert 0, wenn es keine freien, nebeneinanderliegenden Sitze in einer Reihe in der gewünschten Anzahl gibt. Sie finden einen beispielhaften Sitzplan des Kinosaals in Material 3. Die Methode belegeSitz(sitznr: int) ermittelt die Reihe und den Sitz aus der übergebenen Sitznummer mithilfe der Ganzzahldivision und prüft, ob der Sitz noch frei ist. Wenn der Sitz frei ist, wird er belegt und es wird true zurückgegeben, andernfalls wird false zurückgegeben. Die Methode berechneNormalpreis() berechnet den regulären Preis aus dem Basispreis und ggf. dem Aufpreis bei einem überlangen Film. Ein Film hat Überlänge, wenn er länger als 150 Minuten dauert. Eine Beschreibung der Klasse List ist in Material 2 zu finden.

Lösung
Nach den offiziellen Korrekturhinweisen
1.1 Überführen Sie die im UML-Klassendiagramm (Material 1) dargestellte Klasse Film in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie die aufgeführten Methoden.
Lösung: ```java public class Film { private String titel; private int produktionsjahr; private int laenge; private List<Vorstellung> vorstellungen; public Film(String t, int pj, int l) { this.titel = t; this.produktionsjahr = pj; this.laenge = l; this.vorstellungen = new List<Vorstellung>(); } public void einfuegen(Vorstellung vorstellung){ boolean stelleGefunden = false; int i = 0; while (!stelleGefunden && i < vorstellungen.size()) { if (vorstellung.getDatumUhrzeit().isBefore(vorstellungen.get(i).getDatumUhrzeit())) { stelleGefunden = true; } else { i++; } } vorstellungen.add(i, vorstellung); } } ```
1.2 Überführen Sie die im UML-Klassendiagramm (Material 1) dargestellte Klasse Vorstellung in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie die aufgeführten Methoden.
Lösung: ```java public class Vorstellung { private static final double BASISPREIS = 10.00; private static final double AUFPREISUEBERLAENGE = 2.00; private DateTime datumUhrzeit; private boolean[][] sitzbelegung; private Kinosaal kinosaal; private Film film; public Vorstellung(Kinosaal kinosaal, Film film, DateTime datumUhrzeit) { this.datumUhrzeit = datumUhrzeit; this.kinosaal = kinosaal; this.film = film; sitzbelegung = new boolean[this.kinosaal.getReihen()][this.kinosaal.getSitzeProReihe()]; for (int i = 0; i < this.kinosaal.getReihen(); i++) { for (int j = 0; j < this.kinosaal.getSitzeProReihe(); j++) { sitzbelegung[i][j] = true; // Sitz frei } } } public int sucheBesteFreieSitze(int anzahl) { int ersterFreierSitz = 0; int anzahlFreieSitze = 0; for (int reihe = sitzbelegung.length - 1; reihe >= 0 && anzahlFreieSitze < anzahl; reihe--) { anzahlFreieSitze = 0; for (int sitz = 0; sitz < sitzbelegung[reihe].length && anzahlFreieSitze < anzahl; sitz++) { if (sitzbelegung[reihe][sitz]) { anzahlFreieSitze++; if (anzahlFreieSitze == anzahl) { ersterFreierSitz = (reihe + 1) * 100 + (sitz + 1) - anzahl + 1; } } else { anzahlFreieSitze = 0; } } } return ersterFreierSitz; } public boolean belegeSitz(int sitznr) { boolean ergebnis = true; int reihe = sitznr / 100; int sitz = sitznr % 100; reihe--; sitz--; if (sitzbelegung[reihe][sitz]) { sitzbelegung[reihe][sitz] = false; } else { ergebnis = false; // Sitz ist bereits belegt } return ergebnis; } public double berechneNormalpreis() { double ergebnis = Vorstellung.BASISPREIS; if (film.getLaenge() > 150) { ergebnis += Vorstellung.AUFPREISUEBERLAENGE; } return ergebnis; } } ```
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 A - 1 - Klassen und Methoden implementi… · LK 2021 · Aufgabe Vorschlag C - 1 - Klassen und Methoden implementi… · LK 2021 ›