Abitur Hessen Praktische Informatik 2021 · LK

Abiturprüfung Praktische Informatik in Hessen 2021, LK: 18 Aufgaben mit Lösungen. Themen: Klassendiagramme und Objektdiagramme. Mit automatischer Korrektur.

Themen der Prüfung: Klassendiagramme und Objektdiagramme · Klassen und Methoden implementieren · Dynamische Datenstrukturen · Anwendungsfalldiagramme · Client-Server und Nebenläufigkeit · ER-Modelle entwickeln · Relationenmodell und Normalisierung · SQL-Anweisungen und Transaktionen

Aufgabe Vorschlag A - 1 - Klassen und Methoden implementi… · Klassen und Methoden implementieren

Lieferservice eines Restaurants

Für den Lieferservice eines Restaurants sollen ein Softwaresystem und eine Datenbank entwickelt werden. Zu einer eingegangenen Bestellung wird ein Lieferauftrag erzeugt, der von einer Fahrerin oder einem Fahrer (im Folgenden Fahrer genannt) mit einem Fahrzeug ausgeführt wird. Lieferungen bis zu 10km Entfernung werden mit einem E-Motorroller ausgefahren, dieser kann mit einem Führerschein der Klassen 'A' oder 'B' gefahren werden. Lieferungen über 10km werden mit einem Kleinwagen ausgefahren, für den ein Führerschein der Klasse 'B' notwendig ist. Der Fahrer mit der längsten Wartezeit erhält den Lieferauftrag. Jeder Fahrer hat eine RFID 1 -Kennung, mittels eines RFID-Chips erhält er Zugang zum Fahrzeug. Im Lieferauftrag werden der Startzeitpunkt der Lieferung sowie die Zeitpunkte der Auslieferung und der Rückkehr zum Restaurant festgehalten.

1 RFID (engl. Radio-frequency identification) ermöglicht das berührungslose Identifizieren von Objekten.

Material 1: UML-Klassendiagramm Lieferservice

Hinweis: Auf alle Attribute kann mittels get- und set-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, andernfalls 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 Vorkommen entfernt. Der Rückgabewert ist true, falls das Objekt gefunden und entfernt wurde, andernfalls ist er 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 aktuellen Systemzeit.

DateTime(date: String, time: String)

erzeugt ein DateTime-Objekt aus einer Zeichenkette im Format "dd.mm.yyyy" und einer Zeichenkette im Format "hh:mm".

millisUntil(other: DateTime): long

liefert die Anzahl der Millisekunden zwischen diesem DateTime-Objekt und other; liegt other zeitlich nach diesem DateTime-Objekt ist das Ergebnis eine positive Zahl, liegt other zeitlich vor diesem Date-Time-Objekt ist das Ergebnis eine negative Zahl.

toString(): String

liefert eine String-Repräsentanz dieses DateTime-Objekts im Format "dd.mm.yyyy hh:mm".

Klasse Serial

port: Name des Ports (z.B. „COM1“)

baud: Baudrate (z.B. 2400 oder 9600)

dataBits: Anzahl der Datenbits, 7 oder 8

stopBits: Anzahl der Stoppbits, 1 oder 2

parity: Parität, 0 für no, 1 für odd, 2 für even parity

Serial(...)

der Konstruktor initialisiert die serielle Schnittstelle, ohne sie zu öffnen.

open(): boolean

öffnet die serielle Schnittstelle; liefert true, wenn die Schnittstelle verwendbar ist.

close()

schließt die serielle Schnittstelle; die Schnittstelle ist dann solange nicht mehr verwendbar, bis sie wieder geöffnet wird.

dataAvailable(): int

liefert die Anzahl der Bytes, die von der seriellen Schnittstelle gelesen werden können.

read(): int

liest ein Byte (0..255) von der serielle Schnittstelle, bzw. −1, wenn die Schnittstelle nicht geöffnet ist. Die Methode blockiert, bis ein Byte verfügbar ist.

write(value: int)

schreibt ein Byte auf die serielle Schnittstelle; ist die Schnittstelle nicht geöffnet geschieht nichts.

Klasse String

String(data: char[])

erzeugt ein String-Objekt aus den Zeichen des Feldes data

equals(str: String): boolean

liefert true, wenn beide Strings gleich sind, andernfalls false.

isEmpty(): boolean

liefert true, wenn der String leer ist, d. h. die Länge 0 hat, andernfalls ist der Rückgabewert false.

startsWith(str: String): boolean

liefert true, wenn der String mit str beginnt, andernfalls false.

Material 3: Vorlage für Sequenzdiagramm

Material 4: UML-Klassendiagramm für die Zugangskontrolle der Fahrzeuge

Hinweise:

Dieses Klassendiagramm zeigt die Software der Fahrzeuge.

Mithilfe der Klasse FunkModul werden Kommandos vom Fahrzeug zur Lieferservice-Verwaltung (Material 1) gesendet und entsprechende Antworten empfangen.

Auf alle Attribute kann mittels get- und set-Methoden zugegriffen werden.

RS232-Protokoll zum Lesen der RFID-Kennung eines Fahrers

Übertragungsparameter: 9600 Baud, 8 Datenbits, 1 Stoppbit, kein Paritätsbit

Steuerzeichen: Start of Text - STX (0x02) und End of Text - ETX (0x03)

6 Datenbytes mit der RFID-Kennung des Fahrers

Prüfzeichen: alle Datenbytes bitweise mit dem XOR-Operator verknüpft

Datenrahmen:

STX

6 Datenbytes (ASCII-Format)

Prüfzeichen

ETX

Beispiel:

Start

Daten

Prüfz.

Ende

Position

0

1

2

3

4

5

6

7

8

Zeichen

STX

'1'

'2'

'1'

'2'

'1'

'2'

'3'

ETX

Zeichencode

0x02

0x31

0x32

0x31

0x32

0x31

0x32

0x33

0x03

Material 5: Struktogramm der run()-Methode der Klasse Controller

Hinweise:

Das Struktogramm zeigt das Entriegeln eines Fahrzeugs zu Beginn einer Fahrt, nur dieser Teil der Methode ist zu implementieren.

Kommandona me, Fahrzeugnummer und RFID-Kennung des Fahrers werden mit einer Leerstelle als Trennzeichen aneinandergehängt und an die Lieferservice-Verwaltung gesendet.

Beispiel: UNLOCK 1147 121212.

Wenn ein Fahrzeug nach 60 Sekunden wieder verriegelt wird, kann niemand in einem Wagen eingesperrt werden. Von innen lässt sich ein Fahrzeug immer öffnen.

Material 6: Auszug aus der Speisen- und Getränkekarte

Pizzen

Classic Preis (in €)

Groß Preis (in €)

Pizza Margherita

(Tomatensauce, Mozzarella, Basilikum)

6,90

8,50

Pizza Hawaii

(Tomatensauce, Ananas, Schinken, Käse)

7,90

9,50

Pizza Salami

(Salami, Käse)

6,50

7,90

Pasta

Preis (in €)

Pasta Arradiata

(cremige Tomatensauce, Knoblauch, Steakpfeffer, Pepperoni)

7,00

Pasta Alba

(Sahnesauce mit Schinken und frischen Champignons)

8,00

Getränke

Vol.

Preis (in €)

Pfand

Mineralwasser

0,5 l

2,00

kein Pfand

Limonade

0,5 l

2,00

25 ct

Limonade

1 l

3,00

25 ct

1 Objektorientierte Entwicklung einer Anwendung

1.1

Überführen Sie die im UML-Klassendiagramm (Material 1) dargestellten Klassen Fahrer und Lieferauftrag in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie die aufgeführten Methoden. [8 BE]

Hinweise: Die Methode ermittleWartezeit() der Klasse Fahrer liefert die seit dem Ende des letzten Lieferauftrags vergangene Zeit in Millisekunden. Der letzte (neueste) Lieferauftrag wurde zuletzt der Liste der Lieferaufträge hinzugefügt. Hatte ein Fahrer noch keinen Lieferauftrag, wird die Wartezeit auf 3 Stunden festgelegt. Der Konstruktor der Klasse Lieferauftrag setzt die aktuelle Zeit als start -Zeit. Eine Dokumentation der Klassen List und DateTime ist in Material 2 zu finden.

1.3

Die Methode sucheFahrer() der Klasse LieferserviceVerwaltung sucht in Abhängigkeit von der zu fahrenden Entfernung einen Fahrer für den Lieferauftrag.

Lieferungen bis zu 10 km Entfernung werden mit einem E-Motorroller ausgefahren, dieser kann mit einem Führerschein der Klasse 'A' gefahren werden. Lieferungen über 10 km werden mit einem Kleinwagen ausgefahren, dafür ist ein Führerschein der Klasse 'B' notwendig. Die Führerscheinklasse 'B' schließt die Klasse 'A' ein, d. h. ein E-Motorroller kann mit Führerscheinklasse 'A' oder 'B' gefahren werden. Der anwesende Fahrer (Attribut arbeitet) mit passendem Führerschein, der gerade nicht auf Tour ist und die längste Wartezeit hat, soll zurückgegeben werden.

Entwickeln Sie ein Struktogramm für diese Methode. [8 BE]

1.4.1

Die run -Methode der Klasse Controller steuert u. a. den Entriegelungsvorgang eines Fahrzeugs. Der Ablauf ist im Struktogramm in Material 5 dargestellt.

Überführen Sie die Klasse Controller in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie den Konstruktor und die Methode run(). [10 BE]

Hinweise: Die Dokumentation der Klasse Serial ist in Material 2 zu finden. Die Methode getTimer() der Klasse Controller liefert die aktuelle Zeit in Millisekunden.

1.4.2

Die Methode readCard() der Klasse RFIDReader liest die auf dem RFID-Chip gespeicherte RFID-Kennung des Fahrers über die serielle Schnittstelle. Das Datenformat (Material 4) sieht ein Prüfzeichen vor. Ist das Prüfzeichen korrekt, wird die RFID-Kennung in Form einer Zeichenkette zurückgegeben. Im Fehlerfall ist der Rückgabewert eine leere Zeichenkette. Implementieren Sie die Methode readCard(). [5 BE]

Hinweise: Die Dokumentation der Klasse String ist in Material 2 zu finden. Die Methode calcCheckChar() ermittelt das Prüfzeichen.

1.6

Eine Gutschrift-Funktion soll ergänzt werden. Wenn eine Kundin oder ein Kunde eine Bestellung aufgibt und vom Eingang der Bestellung bis zur Auslieferung mehr als 45 Minuten vergehen, erhält die Kundin bzw. der Kunde eine Gutschrift in Höhe von 3 Euro, die bei der nächsten Bestellung eingelöst werden kann.

Entwerfen Sie die notwendigen Erweiterungen der Klassen LieferserviceVerwaltung und Kunde mit Beziehungen im UML-Klassendiagramm und implementieren Sie eine Methode zur Zuweisung der Gutschrift für eine bestimmte Bestellung in einer objektorientierten Programmiersprache. [6 BE]

Aufgabe Vorschlag A - 1 - Client-Server und Nebenläufigke… · Client-Server und Nebenläufigkeit

Lieferservice eines Restaurants

Für den Lieferservice eines Restaurants sollen ein Softwaresystem und eine Datenbank entwickelt werden. Zu einer eingegangenen Bestellung wird ein Lieferauftrag erzeugt, der von einer Fahrerin oder einem Fahrer (im Folgenden Fahrer genannt) mit einem Fahrzeug ausgeführt wird. Lieferungen bis zu 10km Entfernung werden mit einem E-Motorroller ausgefahren, dieser kann mit einem Führerschein der Klassen 'A' oder 'B' gefahren werden. Lieferungen über 10km werden mit einem Kleinwagen ausgefahren, für den ein Führerschein der Klasse 'B' notwendig ist. Der Fahrer mit der längsten Wartezeit erhält den Lieferauftrag. Jeder Fahrer hat eine RFID 1 -Kennung, mittels eines RFID-Chips erhält er Zugang zum Fahrzeug. Im Lieferauftrag werden der Startzeitpunkt der Lieferung sowie die Zeitpunkte der Auslieferung und der Rückkehr zum Restaurant festgehalten.

1 RFID (engl. Radio-frequency identification) ermöglicht das berührungslose Identifizieren von Objekten.

Material 1: UML-Klassendiagramm Lieferservice

Hinweis: Auf alle Attribute kann mittels get- und set-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, andernfalls 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 Vorkommen entfernt. Der Rückgabewert ist true, falls das Objekt gefunden und entfernt wurde, andernfalls ist er 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 aktuellen Systemzeit.

DateTime(date: String, time: String)

erzeugt ein DateTime-Objekt aus einer Zeichenkette im Format "dd.mm.yyyy" und einer Zeichenkette im Format "hh:mm".

millisUntil(other: DateTime): long

liefert die Anzahl der Millisekunden zwischen diesem DateTime-Objekt und other; liegt other zeitlich nach diesem DateTime-Objekt ist das Ergebnis eine positive Zahl, liegt other zeitlich vor diesem Date-Time-Objekt ist das Ergebnis eine negative Zahl.

toString(): String

liefert eine String-Repräsentanz dieses DateTime-Objekts im Format "dd.mm.yyyy hh:mm".

Klasse Serial

port: Name des Ports (z.B. „COM1“)

baud: Baudrate (z.B. 2400 oder 9600)

dataBits: Anzahl der Datenbits, 7 oder 8

stopBits: Anzahl der Stoppbits, 1 oder 2

parity: Parität, 0 für no, 1 für odd, 2 für even parity

Serial(...)

der Konstruktor initialisiert die serielle Schnittstelle, ohne sie zu öffnen.

open(): boolean

öffnet die serielle Schnittstelle; liefert true, wenn die Schnittstelle verwendbar ist.

close()

schließt die serielle Schnittstelle; die Schnittstelle ist dann solange nicht mehr verwendbar, bis sie wieder geöffnet wird.

dataAvailable(): int

liefert die Anzahl der Bytes, die von der seriellen Schnittstelle gelesen werden können.

read(): int

liest ein Byte (0..255) von der serielle Schnittstelle, bzw. −1, wenn die Schnittstelle nicht geöffnet ist. Die Methode blockiert, bis ein Byte verfügbar ist.

write(value: int)

schreibt ein Byte auf die serielle Schnittstelle; ist die Schnittstelle nicht geöffnet geschieht nichts.

Klasse String

String(data: char[])

erzeugt ein String-Objekt aus den Zeichen des Feldes data

equals(str: String): boolean

liefert true, wenn beide Strings gleich sind, andernfalls false.

isEmpty(): boolean

liefert true, wenn der String leer ist, d. h. die Länge 0 hat, andernfalls ist der Rückgabewert false.

startsWith(str: String): boolean

liefert true, wenn der String mit str beginnt, andernfalls false.

Material 3: Vorlage für Sequenzdiagramm

Material 4: UML-Klassendiagramm für die Zugangskontrolle der Fahrzeuge

Hinweise:

Dieses Klassendiagramm zeigt die Software der Fahrzeuge.

Mithilfe der Klasse FunkModul werden Kommandos vom Fahrzeug zur Lieferservice-Verwaltung (Material 1) gesendet und entsprechende Antworten empfangen.

Auf alle Attribute kann mittels get- und set-Methoden zugegriffen werden.

RS232-Protokoll zum Lesen der RFID-Kennung eines Fahrers

Übertragungsparameter: 9600 Baud, 8 Datenbits, 1 Stoppbit, kein Paritätsbit

Steuerzeichen: Start of Text - STX (0x02) und End of Text - ETX (0x03)

6 Datenbytes mit der RFID-Kennung des Fahrers

Prüfzeichen: alle Datenbytes bitweise mit dem XOR-Operator verknüpft

Datenrahmen:

STX

6 Datenbytes (ASCII-Format)

Prüfzeichen

ETX

Beispiel:

Start

Daten

Prüfz.

Ende

Position

0

1

2

3

4

5

6

7

8

Zeichen

STX

'1'

'2'

'1'

'2'

'1'

'2'

'3'

ETX

Zeichencode

0x02

0x31

0x32

0x31

0x32

0x31

0x32

0x33

0x03

Material 5: Struktogramm der run()-Methode der Klasse Controller

Hinweise:

Das Struktogramm zeigt das Entriegeln eines Fahrzeugs zu Beginn einer Fahrt, nur dieser Teil der Methode ist zu implementieren.

Kommandona me, Fahrzeugnummer und RFID-Kennung des Fahrers werden mit einer Leerstelle als Trennzeichen aneinandergehängt und an die Lieferservice-Verwaltung gesendet.

Beispiel: UNLOCK 1147 121212.

Wenn ein Fahrzeug nach 60 Sekunden wieder verriegelt wird, kann niemand in einem Wagen eingesperrt werden. Von innen lässt sich ein Fahrzeug immer öffnen.

Material 6: Auszug aus der Speisen- und Getränkekarte

Pizzen

Classic Preis (in €)

Groß Preis (in €)

Pizza Margherita

(Tomatensauce, Mozzarella, Basilikum)

6,90

8,50

Pizza Hawaii

(Tomatensauce, Ananas, Schinken, Käse)

7,90

9,50

Pizza Salami

(Salami, Käse)

6,50

7,90

Pasta

Preis (in €)

Pasta Arradiata

(cremige Tomatensauce, Knoblauch, Steakpfeffer, Pepperoni)

7,00

Pasta Alba

(Sahnesauce mit Schinken und frischen Champignons)

8,00

Getränke

Vol.

Preis (in €)

Pfand

Mineralwasser

0,5 l

2,00

kein Pfand

Limonade

0,5 l

2,00

25 ct

Limonade

1 l

3,00

25 ct

1.2

Die Methode erstelleLieferauftrag() der Klasse LieferserviceVerwaltung (Material 1) ermittelt die Lieferadresse der übergebenen Bestellung, berechnet die Entfernung zu dieser Adresse mithilfe des Entfernungsrechners, sucht einen freien Fahrer und ein freies Fahrzeug für die zu fahrende Entfernung, kennzeichnet den Fahrer als „auf Tour“ und das Fahrzeug als belegt und erstellt schließlich den Lieferauftrag, der beim Fahrer und beim Fahrzeug hinzugefügt wird. Der erstellte Lieferauftrag wird zurückgegeben.

Entwickeln und zeichnen Sie ein Sequenzdiagramm für diese Methode.

Hinweise: Eine Vorlage ist in Material 3 zu finden. Es ist davon auszugehen, dass es ausreichend viele Fahrer und Fahrzeuge gibt.

Aufgabe Vorschlag A - 1 - Klassendiagramme und Objektdiag… · Klassendiagramme und Objektdiagramme

Lieferservice eines Restaurants

Für den Lieferservice eines Restaurants sollen ein Softwaresystem und eine Datenbank entwickelt werden. Zu einer eingegangenen Bestellung wird ein Lieferauftrag erzeugt, der von einer Fahrerin oder einem Fahrer (im Folgenden Fahrer genannt) mit einem Fahrzeug ausgeführt wird. Lieferungen bis zu 10km Entfernung werden mit einem E-Motorroller ausgefahren, dieser kann mit einem Führerschein der Klassen 'A' oder 'B' gefahren werden. Lieferungen über 10km werden mit einem Kleinwagen ausgefahren, für den ein Führerschein der Klasse 'B' notwendig ist. Der Fahrer mit der längsten Wartezeit erhält den Lieferauftrag. Jeder Fahrer hat eine RFID 1 -Kennung, mittels eines RFID-Chips erhält er Zugang zum Fahrzeug. Im Lieferauftrag werden der Startzeitpunkt der Lieferung sowie die Zeitpunkte der Auslieferung und der Rückkehr zum Restaurant festgehalten.

1 RFID (engl. Radio-frequency identification) ermöglicht das berührungslose Identifizieren von Objekten.

Material 1: UML-Klassendiagramm Lieferservice

Hinweis: Auf alle Attribute kann mittels get- und set-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, andernfalls 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 Vorkommen entfernt. Der Rückgabewert ist true, falls das Objekt gefunden und entfernt wurde, andernfalls ist er 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 aktuellen Systemzeit.

DateTime(date: String, time: String)

erzeugt ein DateTime-Objekt aus einer Zeichenkette im Format "dd.mm.yyyy" und einer Zeichenkette im Format "hh:mm".

millisUntil(other: DateTime): long

liefert die Anzahl der Millisekunden zwischen diesem DateTime-Objekt und other; liegt other zeitlich nach diesem DateTime-Objekt ist das Ergebnis eine positive Zahl, liegt other zeitlich vor diesem Date-Time-Objekt ist das Ergebnis eine negative Zahl.

toString(): String

liefert eine String-Repräsentanz dieses DateTime-Objekts im Format "dd.mm.yyyy hh:mm".

Klasse Serial

port: Name des Ports (z.B. „COM1“)

baud: Baudrate (z.B. 2400 oder 9600)

dataBits: Anzahl der Datenbits, 7 oder 8

stopBits: Anzahl der Stoppbits, 1 oder 2

parity: Parität, 0 für no, 1 für odd, 2 für even parity

Serial(...)

der Konstruktor initialisiert die serielle Schnittstelle, ohne sie zu öffnen.

open(): boolean

öffnet die serielle Schnittstelle; liefert true, wenn die Schnittstelle verwendbar ist.

close()

schließt die serielle Schnittstelle; die Schnittstelle ist dann solange nicht mehr verwendbar, bis sie wieder geöffnet wird.

dataAvailable(): int

liefert die Anzahl der Bytes, die von der seriellen Schnittstelle gelesen werden können.

read(): int

liest ein Byte (0..255) von der serielle Schnittstelle, bzw. −1, wenn die Schnittstelle nicht geöffnet ist. Die Methode blockiert, bis ein Byte verfügbar ist.

write(value: int)

schreibt ein Byte auf die serielle Schnittstelle; ist die Schnittstelle nicht geöffnet geschieht nichts.

Klasse String

String(data: char[])

erzeugt ein String-Objekt aus den Zeichen des Feldes data

equals(str: String): boolean

liefert true, wenn beide Strings gleich sind, andernfalls false.

isEmpty(): boolean

liefert true, wenn der String leer ist, d. h. die Länge 0 hat, andernfalls ist der Rückgabewert false.

startsWith(str: String): boolean

liefert true, wenn der String mit str beginnt, andernfalls false.

Material 3: Vorlage für Sequenzdiagramm

Material 4: UML-Klassendiagramm für die Zugangskontrolle der Fahrzeuge

Hinweise:

Dieses Klassendiagramm zeigt die Software der Fahrzeuge.

Mithilfe der Klasse FunkModul werden Kommandos vom Fahrzeug zur Lieferservice-Verwaltung (Material 1) gesendet und entsprechende Antworten empfangen.

Auf alle Attribute kann mittels get- und set-Methoden zugegriffen werden.

RS232-Protokoll zum Lesen der RFID-Kennung eines Fahrers

Übertragungsparameter: 9600 Baud, 8 Datenbits, 1 Stoppbit, kein Paritätsbit

Steuerzeichen: Start of Text - STX (0x02) und End of Text - ETX (0x03)

6 Datenbytes mit der RFID-Kennung des Fahrers

Prüfzeichen: alle Datenbytes bitweise mit dem XOR-Operator verknüpft

Datenrahmen:

STX

6 Datenbytes (ASCII-Format)

Prüfzeichen

ETX

Beispiel:

Start

Daten

Prüfz.

Ende

Position

0

1

2

3

4

5

6

7

8

Zeichen

STX

'1'

'2'

'1'

'2'

'1'

'2'

'3'

ETX

Zeichencode

0x02

0x31

0x32

0x31

0x32

0x31

0x32

0x33

0x03

Material 5: Struktogramm der run()-Methode der Klasse Controller

Hinweise:

Das Struktogramm zeigt das Entriegeln eines Fahrzeugs zu Beginn einer Fahrt, nur dieser Teil der Methode ist zu implementieren.

Kommandona me, Fahrzeugnummer und RFID-Kennung des Fahrers werden mit einer Leerstelle als Trennzeichen aneinandergehängt und an die Lieferservice-Verwaltung gesendet.

Beispiel: UNLOCK 1147 121212.

Wenn ein Fahrzeug nach 60 Sekunden wieder verriegelt wird, kann niemand in einem Wagen eingesperrt werden. Von innen lässt sich ein Fahrzeug immer öffnen.

Material 6: Auszug aus der Speisen- und Getränkekarte

Pizzen

Classic Preis (in €)

Groß Preis (in €)

Pizza Margherita

(Tomatensauce, Mozzarella, Basilikum)

6,90

8,50

Pizza Hawaii

(Tomatensauce, Ananas, Schinken, Käse)

7,90

9,50

Pizza Salami

(Salami, Käse)

6,50

7,90

Pasta

Preis (in €)

Pasta Arradiata

(cremige Tomatensauce, Knoblauch, Steakpfeffer, Pepperoni)

7,00

Pasta Alba

(Sahnesauce mit Schinken und frischen Champignons)

8,00

Getränke

Vol.

Preis (in €)

Pfand

Mineralwasser

0,5 l

2,00

kein Pfand

Limonade

0,5 l

2,00

25 ct

Limonade

1 l

3,00

25 ct

Das in Material 1 dargestellte Klassendiagramm zeigt die Klassen zum Bestell- und Lieferprozess von Produkten, wobei die Bestellung nur die Bestelldaten und den Gesamtpreis enthält. Informationen über die bestellten Produkte und die Kunden fehlen noch. In Material 6 ist ein Auszug aus der Speisen- und Getränkekarte des Restaurants dargestellt.

Das UML-Klassendiagramm soll entsprechend erweitert werden:

Der Lieferservice liefert Pizza, Pasta und Getränke.

Kunden werden mit ihrem Namen, ihrer Telefonnummer und ihrer Adresse als Lieferadresse erfasst.

Eine Kundin oder ein Kunde kann mehrere Bestellungen aufgeben, eine Bestellung kommt von genau einer Kundin oder einem Kunden.

In einer Bestellung können unterschiedliche Produkte bestellt werden, die jeweils mit einer Anzahl versehen sind. Beispielsweise kann eine Bestellung zwei große Pizza Margherita, eine Lasagne und drei 0,5l-Flaschen Mineralwasser als Bestellpositionen umfassen. Jedes Produkt hat eine Produktnummer.

1.5.1

Vererbung, Aggregation und Komposition sind Konzepte der Objektorientierung.

Erläutern Sie diese Konzepte mit ihrer Notation in UML-Klassendiagrammen sowie ihrem Nutzen für die objektorientierte Modellierung und geben Sie jeweils ein Beispiel aus dem Kontext des Lieferservice an. (6 BE)

1.5.2

Entwickeln Sie das erweiterte UML-Klassendiagramm und zeichnen Sie die Änderungen vorhandener Klassen sowie neue Klassen mit Attributen (Sichtbarkeit und Datentypen), Methoden (Sichtbarkeit, Parameter und Rückgabetypen) und Assoziationen (Navigierbarkeit, Multiplizitäten und Rollen).

Hinweise: Vererbung, Aggregation und Komposition sind sinnvoll einzusetzen. Get- und set-Methoden müssen nicht dargestellt werden. (10 BE)

Aufgabe Vorschlag A - 2 - Relationenmodell und Normalisie… · Relationenmodell und Normalisierung

2 Entwicklung einer Datenbank für den Lieferservice

Ein Entity-Relationship-Modell (ERM) der Datenbank ist in Material 7 zu finden.

Material 7

Entity-Relationship-Modell

Hinweise:

Ein Fahrer kann tageweise für unterschiedliche Filialen des Restaurants tätig sein.

Die Attribute start, ausgeliefert und ende des Entitätstyps Lieferauftrag haben den Typ DATETIME.

Ein E-Motorroller hat, wie ein Moped, ein jährlich zu erneuerndes Versicherungskennzeichen. Ein Kleinwagen hat ein amtliches Kennzeichen.

2.1 Das ERM ist in das relationale Modell zu transformieren.

2.1.1

Diskutieren Sie die drei unterschiedlichen Möglichkeiten, die Spezialisierung zwischen Fahrzeug und E-Motorroller bzw. Kleinwagen in das relationale Modell zu transformieren unter Angabe der jeweiligen Relationen. Entscheiden Sie sich für eine Möglichkeit.

(6 BE)

2.1.2

Überführen Sie das gegebene ERM in das relationale Modell unter Einhaltung der 3. Normalform und unter Berücksichtigung Ihrer Entscheidung in Teilaufgabe 2.1.1.

(5 BE)

Hinweis: Alle Relationen sind in der Schreibweise Relation(PK, Attribut,..., FK#) anzugeben.

Aufgabe Vorschlag A - 2 - SQL-Anweisungen und Transaktion… · SQL-Anweisungen und Transaktionen

2 Entwicklung einer Datenbank für den Lieferservice

Ein Entity-Relationship-Modell (ERM) der Datenbank ist in Material 7 zu finden.

Material 7

Entity-Relationship-Modell

Hinweise:

Ein Fahrer kann tageweise für unterschiedliche Filialen des Restaurants tätig sein.

Die Attribute start, ausgeliefert und ende des Entitätstyps Lieferauftrag haben den Typ DATETIME.

Ein E-Motorroller hat, wie ein Moped, ein jährlich zu erneuerndes Versicherungskennzeichen. Ein Kleinwagen hat ein amtliches Kennzeichen.

2.2 Die Datenbank soll erweitert und die Daten sollen ausgewertet und ergänzt werden.

2.2.1

Formulieren Sie eine SQL-Anweisung, die die Bestellnummern und die Lieferdauer (Zeit zwischen Start und Auslieferung) aller Lieferaufträge ermittelt, deren Lieferdauer mehr als 45 Minuten beträgt. [3 BE]

Hinweise: Die SQL-Funktion TIMEDIFF(time1, time2) liefert die Differenz time1 - time2 als Wert des Typs TIME. Die SQL-Funktion MINUTE(time) ermittelt die Minuten eines TIME-Wertes, die Funktion HOUR(time) die Stunden.

2.2.2

Das Kennzeichen des Kleinwagens sowie Vor- und Nachname des Fahrers für die Auslieferung der Bestellung mit der Nummer 4711 sollen ermittelt werden.

Geben Sie die entsprechende SQL-Anweisung an. [3 BE]

2.2.3

Implementieren Sie eine SQL-Anweisung, welche die Vor- und Nachnamen aller Fahrer mit der Anzahl ihrer durchgeführten Lieferaufträge auflistet. [3 BE]

Hinweis: Alle Fahrer sollen in der Liste erscheinen, auch solche, die noch keinen Lieferauftrag durchgeführt haben. Die Fahrer-Liste ist nach der Anzahl der Lieferaufträge absteigend zu sortieren.

2.2.4

Eine Tabelle Geschäftsführer soll in der Datenbank nach folgendem Modell ergänzt werden:

Der Fremdschlüssel zur Implementierung der Beziehung soll in der bestehenden Tabelle Filiale ergänzt werden. Frau Mira Bellenbaum ist Geschäftsführerin der Filiale Nr. 3 in der Bahnhofstr. 3 in 37213 Witzenhausen.

Entwickeln Sie die SQL-Anweisungen, um die Tabelle Geschäftsführer zu erstellen und die Tabelle Filiale, um den Fremdschlüssel personalnr zu erweitern sowie die Filiale in Witzenhausen und die Geschäftsführerin in die jeweiligen Tabellen einzufügen. [8 BE]

Hinweis: Die Personalnummer der Geschäftsführerin wird vom System automatisch vergeben und muss beim Einfügen der Filiale ermittelt werden.

2.3 Transaktionskonzept und ACID-Eigenschaften

Datenbankmanagementsysteme erlauben den gleichzeitigen Zugriff mehrerer Benutzer. Bei lesendem Zugriff auf die Daten ist das kein Problem. Wenn jedoch mehrere Benutzer zur gleichen Zeit die gleichen Daten ändern wollen, muss das Datenbankmanagementsystem für die Konsistenz der Daten sorgen.

2.3.1

Erläutern Sie in diesem Zusammenhang das Konzept einer Transaktion. [2 BE]

2.3.2

Ein Datenbankmanagementsystem garantiert bei der Ausführung einer Transaktion die Einhaltung der vier grundlegenden Eigenschaften atomicity, consistency, isolation und durability, die auch als ACID-Eigenschaften bezeichnet werden.

Beschreiben Sie diese vier grundlegenden Eigenschaften. [4 BE]

Aufgabe Vorschlag A - 2 - ER-Modelle entwickeln · ER-Modelle entwickeln

2 Entwicklung einer Datenbank für den Lieferservice

Ein Entity-Relationship-Modell (ERM) der Datenbank ist in Material 7 zu finden.

Material 7

Entity-Relationship-Modell

Hinweise:

Ein Fahrer kann tageweise für unterschiedliche Filialen des Restaurants tätig sein.

Die Attribute start, ausgeliefert und ende des Entitätstyps Lieferauftrag haben den Typ DATETIME.

Ein E-Motorroller hat, wie ein Moped, ein jährlich zu erneuerndes Versicherungskennzeichen. Ein Kleinwagen hat ein amtliches Kennzeichen.

2.4

Die Fahrzeuge des Lieferservice müssen in regelmäßigen Abständen gewartet werden und es kommt vor, dass ein Fahrzeug in einen Unfall verwickelt wird. Die Datenbank soll demzufolge weitere Anforderungen umsetzen:

Bei einer Fahrzeugwartung wird ein Werkstattauftrag geschrieben mit mindestens einer, evtl. mit mehreren nummerierten Positionen.

Eine Position wird in einem Text beschrieben und hat einen Einzelpreis.

Ein Werkstattauftrag wird von einem Kundenberater aufgenommen. Das Datum der Auftragserteilung wird vermerkt.

Ein Fahrzeug ist über einen Versicherungsvertrag versichert. Der Vertrag wird bei einer Versicherungsgesellschaft abgeschlossen.

Ist ein Fahrzeug an einem Unfall beteiligt, wird eine Schadenmeldung erstellt mit dem genauen Zeitpunkt des Unfalls, dem Ort und einer Beschreibung des Unfallhergangs.

Die Schadenmeldung wird an die Versicherung des Fahrzeugs gemeldet und dem Versicherungsvertrag zugeordnet.

Der Schaden erhält eine Schadennummer von der Versicherung. Ein Schaden kann in einer Werkstatt repariert werden, in diesem Fall wird ein Werkstattauftrag erteilt.

Entwickeln und zeichnen Sie unter Berücksichtigung des gegebenen Modells (Material 7) ein ER-Diagramm, das die genannten Anforderungen umsetzt.

Hinweise: Das Diagramm ist mit Entitätstypen, Attributen und Beziehungen mit Kardinalitäten in der [min, max]-Form darzustellen.

Aufgabe Vorschlag B - 1 - Klassen und Methoden implementi… · Klassen und Methoden implementieren

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.

Aufgabe Vorschlag B - 1 - Client-Server und Nebenläufigke… · Client-Server und Nebenläufigkeit

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.3

Die Klasse KinoManager (Material 1) besitzt die Methode erstelleVorstellung(film: Film, anzahlPlaetze: int, datumUhrzeit: DateTime). Diese Methode sucht nach einem Kinosaal, der zum gewünschten Zeitpunkt frei ist und mindestens die geforderte Anzahl von Plätzen hat. Ist ein passender Kinosaal gefunden, wird eine neue Vorstellung erzeugt und mit dem Film und dem Kinosaal verknüpft. Diese neue Vorstellung wird zurückgegeben. Falls keine neue Vorstellung erzeugt werden konnte, weil kein passender Kinosaal gefunden wurde, wird null zurückgegeben.

Entwickeln und zeichnen Sie ein Sequenzdiagramm für diese Methode.

Hinweis: Eine Vorlage ist in Material 4 zu finden.

1.4 Client-Server-Lösung

Das Kino-Management-System soll als Client-Server-Lösung realisiert werden, damit Kundinnen und Kunden (im Folgenden Kunde genannt) online Plätze reservieren können.

1.4.1

Erläutern Sie die Aufgaben und Funktionsweisen der Klassen Client, Server und ServerThread mit Thread sowie deren Zusammenarbeit mit der Klasse KinoManager (Material 1).

Hinweis: Der Server kann mehrere Clients parallel bedienen und läuft endlos.

1.4.2

Überführen Sie die im UML-Klassendiagramm (Material 1) dargestellte Klasse Server in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie die aufgeführten Methoden.

Hinweis: Die Socket-Klassen sind in Material 2 beschrieben.

1.4.3

Wenn zwei Clients gleichzeitig für eine Vorstellung dieselben Sitzplätze belegen wollen, kann es passieren, dass diese Sitzplätze mehrfach belegt werden.

Erklären Sie anhand des Ablaufs der Methode belegeSitz(sitznr: int), wie es zu der Mehrfachbelegung kommen kann, und beschreiben Sie, wie diese auf Programm- bzw. Methodenebene zu verhindern ist.

Aufgabe Vorschlag B - 1 - Klassendiagramme und Objektdiag… · Klassendiagramme und Objektdiagramme

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.5 Kinokarten werden für eine Vorstellung gekauft. In Material 5 sind zwei Kinokarten beispielhaft dargestellt. Alle notwendigen Informationen für den Kauf von Kinokarten sollen in das UML-Modell des Anwendungssystems aufgenommen werden.

1.5.1

Entwickeln und zeichnen Sie ein UML-Objektdiagramm für die Kinokarten aus Material 5.

Hinweis: Ein Teil der Objekte bezieht sich auf existierende Klassen (Material 1). Fehlende Attributwerte sind sinnvoll zu ergänzen.

1.5.2

Der Kinomanager (Klasse KinoManager in Material 1) kennt alle Kartenkäufe und ist zuständig für das Erstellen und Stornieren von Kartenkäufen. In einem Kartenkauf können mehrere Karten für eine Vorstellung erworben werden. Der Gesamtpreis eines Kartenkaufs kann berechnet werden.

Entwickeln Sie das erweiterte UML-Klassendiagramm unter Berücksichtigung von Material 1 und Material 5 und zeichnen Sie die Erweiterungen vorhandener Klassen sowie neue Klassen mit Attributen (Sichtbarkeit und Datentypen), Methoden (Sichtbarkeit, Parameter und Rückgabetypen) und den Assoziationen (Navigierbarkeit, Multiplizitäten und Rollen).

Hinweis: Eine Vorlage ist in Material 6 zu finden.

Aufgabe Vorschlag B - 2 - Relationenmodell und Normalisie… · Relationenmodell und Normalisierung

Entwicklung einer Datenbank für das Kinocenter

Ein Entity-Relationship-Model (ERM) der Datenbank finden Sie in Material 7.

Material 7: Entity-Relationship-Model

Hinweise: Ein Genre ist ein Film-Typ, z. B. Drama, Action oder Komödie. Die FSK-Angabe für einen Film ist die Altersfreigabe nach den Festlegungen der „Freiwilligen Selbstkontrolle“ der Filmwirtschaft.

Material 8

Hinweise: Ein Mitarbeiter hat einen Vertrag. Er kann beim Kinocenter angestellt oder von einer Zeitarbeitsfirma an das Kinocenter ausgeliehen sein. Die monatlichen Sollstunden (Sollstd.) sind im Vertrag enthalten. Die Iststunden (Iststd.) für den Bereich sind die Anzahl von Stunden, die ein Mitarbeiter im aktuellen Monat in diesem Bereich bereits gearbeitet hat.

2.1

Überführen Sie das gegebene ERM (Material 7) in das relationale Modell unter Einhaltung der 3. Normalform und begründen Sie Ihre Entscheidungen.

Hinweis: Alle Relationen sind in der Schreibweise Relation(PK, Attribut,..., FK#) anzugeben.

2.4.1

Zeigen Sie, dass die Tabelle in Material 8 Redundanzen und Inkonsistenzen enthält. Beschreiben Sie mithilfe von Beispielen aus der Tabelle die verschiedenen Arten von Anomalien.

2.4.2

Überführen Sie die Tabelle aus Material 8 in das relationale Modell in der 3. Normalform.

Hinweis: Alle Relationen sind in der Schreibweise Relation(PK, Attribut,..., FK#) anzugeben.

Aufgabe Vorschlag B - 2 - SQL-Anweisungen und Transaktion… · SQL-Anweisungen und Transaktionen

Entwicklung einer Datenbank für das Kinocenter

Ein Entity-Relationship-Model (ERM) der Datenbank finden Sie in Material 7.

Material 7: Entity-Relationship-Model

Hinweise: Ein Genre ist ein Film-Typ, z. B. Drama, Action oder Komödie. Die FSK-Angabe für einen Film ist die Altersfreigabe nach den Festlegungen der „Freiwilligen Selbstkontrolle“ der Filmwirtschaft.

Material 8

Hinweise: Ein Mitarbeiter hat einen Vertrag. Er kann beim Kinocenter angestellt oder von einer Zeitarbeitsfirma an das Kinocenter ausgeliehen sein. Die monatlichen Sollstunden (Sollstd.) sind im Vertrag enthalten. Die Iststunden (Iststd.) für den Bereich sind die Anzahl von Stunden, die ein Mitarbeiter im aktuellen Monat in diesem Bereich bereits gearbeitet hat.

2.2 Einige Daten der Datenbank sollen ergänzt bzw. ausgewertet werden.

2.2.1

Die Titel aller Komödien für Kinder (FSK höchstens 12) mit einer Länge von maximal 100 Minuten sollen angezeigt werden. Geben Sie eine entsprechende SQL-Anweisung an. (2 BE)

2.2.2

Der neue Animations-Film mit dem Titel "Logo Movie" soll der Datenbank hinzugefügt werden. Die Originalsprache des Films ist "English", er hat keine Altersbeschränkung (FSK 0) und ist 145 Minuten lang. Er ist im Verleih der "Logo Movie Production". Entwickeln Sie die entsprechende SQL-Anweisung.

Hinweis: Der neue Film bekommt die Film-ID 4723. Die Primärschlüssel des Verleihs "Logo Movie Production" und des Genres "Animation" sind zu ermitteln. (4 BE)

2.2.3

Implementieren Sie eine SQL-Anweisung, welche die Titel der Filme ermittelt, in welchen die beiden Schauspieler Amy Bale und Christian Adams mitgespielt haben.

Hinweis: Amy Bale hat die sid 114, Christian Adams hat die sid 111. (4 BE)

2.2.4

Entwickeln Sie eine SQL-Anweisung, die Vor- und Nachnamen aller Schauspieler mit der Anzahl ihrer Filme ausgibt, in denen sie mitgespielt haben, sofern es mehr als 3 Filme sind. (4 BE)

Aufgabe Vorschlag B - 2 - ER-Modelle entwickeln · ER-Modelle entwickeln

Entwicklung einer Datenbank für das Kinocenter

Ein Entity-Relationship-Model (ERM) der Datenbank finden Sie in Material 7.

Material 7: Entity-Relationship-Model

Hinweise: Ein Genre ist ein Film-Typ, z. B. Drama, Action oder Komödie. Die FSK-Angabe für einen Film ist die Altersfreigabe nach den Festlegungen der „Freiwilligen Selbstkontrolle“ der Filmwirtschaft.

Material 8

Hinweise: Ein Mitarbeiter hat einen Vertrag. Er kann beim Kinocenter angestellt oder von einer Zeitarbeitsfirma an das Kinocenter ausgeliehen sein. Die monatlichen Sollstunden (Sollstd.) sind im Vertrag enthalten. Die Iststunden (Iststd.) für den Bereich sind die Anzahl von Stunden, die ein Mitarbeiter im aktuellen Monat in diesem Bereich bereits gearbeitet hat.

2.3

Die Datenbank soll weitere Anforderungen umsetzen:

Für einen Film kann es mehrere Filmbesprechungen (Reviews) geben. Eine Filmbesprechung bezieht sich auf genau einen Film und wurde von einer Autorin oder einem Autor mit Vor- und Nachnamen an einem bestimmten Datum verfasst. Sie enthält neben dem Text auch eine Sterne-Bewertung, z. B. 4 von 5 Sternen.

Die Besucherzahlen der Filme pro Kalenderwoche sollen aufgenommen werden, beispielsweise:

Jahr

Kalenderwoche

Film-ID

Titel

Anzahl Besucher

2021

9

2311

Der weiße Hai

330

2021

9

2312

Casablanca

550

2021

10

2311

Der weiße Hai

250

Schauspielerinnen und Schauspieler spielen eine bestimmte Rolle in einem Film, z. B. die weibliche Hauptrolle oder die männliche Nebenrolle.

Alljährlich werden Filmpreise vergeben. Der wohl bekannteste Filmpreis ist der Academy Award, besser bekannt unter seinem Spitznamen Oscar. Ein anderer ist der Goldene Bär der Berlinale. Es gibt Filmpreise für Filme, z. B. den Oscar für den besten Film oder den besten Kurzfilm. Es gibt auch Filmpreise für Schauspielerinnen und Schauspieler in einem Film, z. B. den Oscar für die beste weibliche Hauptrolle oder für die beste männliche Hauptrolle.

Zu jedem Filmpreis gibt es mehrere Preisverleihungen in mehreren Kategorien.

Entwickeln und zeichnen Sie unter Berücksichtigung des gegebenen Modells (Material 7) ein ER-Diagramm, das die genannten Anforderungen umsetzt.

Hinweise: Das Diagramm ist mit Entitätstypen, Attributen und Beziehungen mit Kardinalitäten in der [min, max]-Form darzustellen. Bei der Erstellung des Diagramms sind nur die Erweiterungen und Änderungen zum gegebenen ER-Modell darzustellen. [8 BE]

Aufgabe Vorschlag C - 1 - Klassen und Methoden implementi… · Klassen und Methoden implementieren

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]

Aufgabe Vorschlag C - 1 - Dynamische Datenstrukturen · Dynamische Datenstrukturen

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]

Aufgabe Vorschlag C - 1 - Anwendungsfalldiagramme · Anwendungsfalldiagramme

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.5.1

Erläutern Sie den Zweck von Anwendungsfalldiagrammen. Beschreiben Sie die wesentlichen Notationselemente des vorliegenden UML-Anwendungsfalldiagramms sowie die Unterschiede zwischen extend- und include-Beziehungen.

1.5.2

Folgende weitere Anwendungsfälle sollen vom System bereitgestellt werden:

- Medizinische Fachkräfte führen Impfungen durch. Sie melden die Personen nach Abschluss der Impfung ab.

- Sie tragen die Impfung in den Impfpass ein, wenn einer vorliegt.

- Wenn kein Impfpass vorliegt, drucken sie eine Impfbescheinigung aus.

- Die Impftauglichkeit einer Person wird von einem Arzt geprüft.

- Der Arzt dokumentiert eventuelle Impfreaktionen.

Entwickeln und zeichnen Sie für diese Anwendungsfälle ein Anwendungsfalldiagramm in UML-Notation.

Hinweis: Das UML-Anwendungsfalldiagramm in Material 3 ist entsprechend zu ergänzen.

Aufgabe Vorschlag C - 1 - Klassendiagramme und Objektdiag… · Klassendiagramme und Objektdiagramme

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.5.3 Modellierung des erweiterten UML-Klassendiagramms

Das UML-Klassendiagramm in Material 1 soll um das Personal und die Anwendungsfälle aus Aufgabe 1.5.2 erweitert werden. Folgende weitere Festlegungen sind zu berücksichtigen:

Alle Mitarbeiter und Mitarbeiterinnen (im Folgenden Mitarbeiter genannt) sind Personen, die geimpft werden können. Jeder Mitarbeiter hat eine eindeutige Personalnummer.

Mitarbeiter haben Einsätze, die mit dem Datum zu speichern sind.

Bei den Mitarbeitern handelt es sich entweder um Empfangskräfte oder medizinische Fachkräfte. Empfangskräfte erhalten eine Aufwandsentschädigung. Medizinische Fachkräfte verfügen über eine Qualifikation.

Ärzte sind spezielle Fachkräfte mit einer bestimmten Fachrichtung (z.B. Allgemeinmedizin).

Die Impfreaktion einer Person und der für die Impfung verantwortliche Arzt sind im System festzuhalten.

Modellieren und zeichnen Sie das erweiterte UML-Klassendiagramm inklusive der erforderlichen Konstruktoren und Methoden.

Hinweise: Die Sichtbarkeit von Methoden und Attributen sowie set- und get-Methoden müssen nicht dargestellt werden. Datentypen, Übergabeparameter und Rückgabetypen sind aufzuführen.

Die Lösung wurde freigeschaltet. Vergleichen Sie Ihre Modellierung und Zeichnung mit dem Lösungsvorschlag.

Aufgabe Vorschlag C - 2 - Relationenmodell und Normalisie… · Relationenmodell und Normalisierung

Entwicklung einer Datenbank für das Impfzentrum

In einer ersten Version der Datenbank möchte das Impfzentrum die Daten der zu impfenden Personen verwalten. Ebenso sollen die Daten der Impfstoffe und ihrer Lagerstandorte, der Produzenten sowie der Impfstofflieferungen verwaltet werden. Dabei gilt:

Eine Person wird zweimal geimpft, wobei zwischen den Impfterminen drei Wochen liegen sollen. Es muss sichergestellt sein, dass eine Person bei beiden Impfungen den gleichen Impfstoff erhält.

Ein Entity-Relationship-Modell (ERM) ist in Material 4 dargestellt.

Material 4: Entity-Relationship-Modell

Hinweise: Ein Impfstoff wird von einem Forschungsinstitut entwickelt (Attribut entwickler). Die Herstellung und Lieferung eines Impfstoffs erfolgt durch Produzenten. Ein Impfstoff gehört zu einer Impfstoffgruppe (Attribut gruppe), wie zum Beispiel mRNA-Impfstoff oder Vektor-Impfstoff. Ein Impfstoff muss bei einer gewissen Temperatur (z.B. -70°C) gelagert werden (Attribut lagerTemperatur). Die verschiedenen Lagerstandorte weisen durch eine entsprechende Kühlung eine jeweils konstante Temperatur (Attribut temperatur) auf.

Material 5: Tabelle Impfprotokoll (Ausschnitt)

Impfling · Risikofaktoren · Impfstoff · Impf-Termin · Impfreaktionen · Verantwortlich

Nr. 123456

Ilka Meier

geb.

12.04.1937 · Diabetes

Übergewicht · BT223a2

(Gruppe mRNA-Impfstoff) · 07.04.21 · keine · Kürzel HEIL

Dr. Silke Heiler

(Allgemeinmedizin)

Nr. 776311

Karl Huber

geb.

08.05.1943 · Bluthochdruck

Übergewicht

Rheuma · BT223a2

(Gruppe mRNA-Impfstoff) · 07.04.21 · Schwindel, Übelkeit

Muskelschmerzen

allergische Reaktion · Kürzel BADE

Kai Bader

(Allgemeinmedizin)

Nr. 270887

Vera Stark

geb.

23.11.1950 · keine · BT223a2

(Gruppe mRNA-Impfstoff) · 07.04.21 · Schmerzen an der Injektionsstelle · Kürzel WIRT

Dr. Lena Wirt

(Innere Medizin)

… · … · … · … · … · …

Nr. 620087

Ina Kraus

geb.

16.09.1948 · keine · Vec23.Cov

(Gruppe Vektor-impfstoff) · 08.04.21 · Fieber

Kopfschmerzen

Appetitlosigkeit

Gelenkschmerzen · Kürzel KLEB

Dr. Kurt Kleber

(Internist)

… · … · … · … · … · …

Nr. 221009

Lars Bauer

geb.

16.06.1954 · Diabetes · BT223a2

(Gruppe mRNA-Impfstoff) · 09.04.21 · keine · Kürzel REIC

Prof. Dr. Til Reich

(Orthopäde)

… · … · … · … · … · …

Nr. 123456

Ilka Meier

geb.

12.04.1937 · Diabetes

Übergewicht · BT223a2

(Gruppe mRNA-Impfstoff) · 29.04.21 · Kopfschmerzen

Gelenkschmerzen · Kürzel WIRT

Dr. Lena Wirt

(Innere Medizin)

Nr. 620087

Ina Kraus

geb.

16.09.1948 · keine · Vec23.Cov

(Gruppe Vektor-Impfstoff) · 29.04.21 · Müdigkeit

Kopfschmerzen · Kürzel KLEB

Dr. Kurt Kleber

(Innere Medizin)

… · … · … · … · … · …

2.1 Das ERM soll in das relationale Modell einer Datenbank transformiert werden.

2.1.1

Beschreiben Sie das relationale Datenbankmodell. Nennen Sie mindestens einen Vor- und einen Nachteil.

[4 BE]

2.1.2

Überführen Sie das ERM (Material 4) in das relationale Modell in der 3. Normalform und begründen Sie Ihre Vorgehensweise.

Hinweis: Alle Relationen sind in der Schreibweise Relation( PK, Attribut,..., FK#) anzugeben.

[8 BE]

2.3 Analyse und Normalisierung des Erhebungsbogens

2.3

Ärzte, die die Impfungen begleiten, sind verpflichtet, Daten zu den geimpften Personen einzuholen und für Auswertungen zu protokollieren. In Material 5 ist ein Ausschnitt der Erhebung zu finden.

Analysieren Sie die Struktur der Tabelle hinsichtlich eventuell auftretender Probleme. Überführen Sie die Tabelle in die 3. Normalform und begründen Sie Ihre Vorgehensweise.

Hinweis: Alle Relationen sind in der Schreibweise Relation( PK, Attribut,..., FK#) anzugeben.

[12 BE]

Aufgabe Vorschlag C - 2 - SQL-Anweisungen und Transaktion… · SQL-Anweisungen und Transaktionen

Entwicklung einer Datenbank für das Impfzentrum

In einer ersten Version der Datenbank möchte das Impfzentrum die Daten der zu impfenden Personen verwalten. Ebenso sollen die Daten der Impfstoffe und ihrer Lagerstandorte, der Produzenten sowie der Impfstofflieferungen verwaltet werden. Dabei gilt:

Eine Person wird zweimal geimpft, wobei zwischen den Impfterminen drei Wochen liegen sollen. Es muss sichergestellt sein, dass eine Person bei beiden Impfungen den gleichen Impfstoff erhält.

Ein Entity-Relationship-Modell (ERM) ist in Material 4 dargestellt.

Material 4: Entity-Relationship-Modell

Hinweise: Ein Impfstoff wird von einem Forschungsinstitut entwickelt (Attribut entwickler). Die Herstellung und Lieferung eines Impfstoffs erfolgt durch Produzenten. Ein Impfstoff gehört zu einer Impfstoffgruppe (Attribut gruppe), wie zum Beispiel mRNA-Impfstoff oder Vektor-Impfstoff. Ein Impfstoff muss bei einer gewissen Temperatur (z.B. -70°C) gelagert werden (Attribut lagerTemperatur). Die verschiedenen Lagerstandorte weisen durch eine entsprechende Kühlung eine jeweils konstante Temperatur (Attribut temperatur) auf.

Material 5: Tabelle Impfprotokoll (Ausschnitt)

Impfling · Risikofaktoren · Impfstoff · Impf-Termin · Impfreaktionen · Verantwortlich

Nr. 123456

Ilka Meier

geb.

12.04.1937 · Diabetes

Übergewicht · BT223a2

(Gruppe mRNA-Impfstoff) · 07.04.21 · keine · Kürzel HEIL

Dr. Silke Heiler

(Allgemeinmedizin)

Nr. 776311

Karl Huber

geb.

08.05.1943 · Bluthochdruck

Übergewicht

Rheuma · BT223a2

(Gruppe mRNA-Impfstoff) · 07.04.21 · Schwindel, Übelkeit

Muskelschmerzen

allergische Reaktion · Kürzel BADE

Kai Bader

(Allgemeinmedizin)

Nr. 270887

Vera Stark

geb.

23.11.1950 · keine · BT223a2

(Gruppe mRNA-Impfstoff) · 07.04.21 · Schmerzen an der Injektionsstelle · Kürzel WIRT

Dr. Lena Wirt

(Innere Medizin)

… · … · … · … · … · …

Nr. 620087

Ina Kraus

geb.

16.09.1948 · keine · Vec23.Cov

(Gruppe Vektor-impfstoff) · 08.04.21 · Fieber

Kopfschmerzen

Appetitlosigkeit

Gelenkschmerzen · Kürzel KLEB

Dr. Kurt Kleber

(Internist)

… · … · … · … · … · …

Nr. 221009

Lars Bauer

geb.

16.06.1954 · Diabetes · BT223a2

(Gruppe mRNA-Impfstoff) · 09.04.21 · keine · Kürzel REIC

Prof. Dr. Til Reich

(Orthopäde)

… · … · … · … · … · …

Nr. 123456

Ilka Meier

geb.

12.04.1937 · Diabetes

Übergewicht · BT223a2

(Gruppe mRNA-Impfstoff) · 29.04.21 · Kopfschmerzen

Gelenkschmerzen · Kürzel WIRT

Dr. Lena Wirt

(Innere Medizin)

Nr. 620087

Ina Kraus

geb.

16.09.1948 · keine · Vec23.Cov

(Gruppe Vektor-Impfstoff) · 29.04.21 · Müdigkeit

Kopfschmerzen · Kürzel KLEB

Dr. Kurt Kleber

(Innere Medizin)

… · … · … · … · … · …

2.2 Einige Daten der Datenbank sollen ergänzt, geändert und ausgewertet werden.

2.2.1

Formulieren Sie eine SQL-Anweisung, die alle Personen mit Personen-ID, Vor- und Nachnamen sowie dem Termin der ersten Impfung auflistet, die bisher nur einmal mit dem Impfstoff mit der Bezeichnung BT223a2 geimpft wurden.

[3 BE]

2.2.2

Implementieren Sie eine SQL-Anweisung, die alle Impfstoffgruppen mit der Anzahl der im 1. Quartal 2021 zum zweiten Mal erfolgten Impfungen, absteigend sortiert nach der Anzahl, ausgibt.

[3 BE]

2.2.3

Der kanadische Impfstoffproduzent PharmaCorn (ID 96) in Vancouver (Postleitzahl BC V6T 1Z3) liefert am 26.04.2021 erstmalig 2500 Dosen des Impfstoffs BT223a2.

Entwickeln Sie die SQL-Anweisungen, um die Datenbank zu ergänzen und die Lagermenge zu aktualisieren.

[6 BE]

Hinweise: Es existieren bereits mehrere Lagerstandorte für den Impfstoff BT223a2. Die 2500 neuen Dosen können nur eingelagert werden, wenn an einem Standort genügend Platz vorhanden ist. Sie können davon ausgehen, dass es mindestens einen Standort gibt, der die gelieferte Menge aufnehmen kann. Der Standort mit der geringsten Anzahl an BT223a2-Impfdosen ist als Lagerstandort zu wählen.

2.2.4

Für die Terminplanung soll eine nach Impfstoffen gruppierte Aufstellung mit der jeweiligen Anzahl an vorrätigen Dosen und der Anzahl der noch für die 2. Impfung benötigten Dosen in der folgenden Form ausgegeben werden:

[4 BE]

Impfstoff

Vorrätige Dosen

Benötigte Dosen

ApolloVac

668

420

BT223a2

488

620

Vec23.Cov

52

102

Entwickeln Sie eine entsprechende SQL-Anweisung.

Du kannst auch nach Themen lernen

Übe ein Thema mit gemischten Aufgaben aus den Prüfungen aller Jahre.

Alle 8 Themen ansehen