Aufgabe Vorschlag A - 1 - Client-Server und Nebenläufigke… · Abitur Hessen Praktische Informatik LK 2021

Thema: Client-Server und Nebenläufigkeit · Aus der Prüfung LK (2021)

Aufgabenstellung

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.

Aufgabenstellung: Aufgabe Vorschlag A - 1 - Client-Server und Nebenläufigke… · Abitur Hessen Praktische Informatik LK 2021

Lösung

Nach den offiziellen Korrekturhinweisen

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

Lösung: Das Sequenzdiagramm stellt den Ablauf der Methode `erstelleLieferauftrag(bestellung)` dar: 1. `getLieferadresse()` an `:bestellung`, Rückgabe `{lieferadresse}`. 2. `berechneEntfernung(lieferadresse)` an `:Entfernungsrechner`, Rückgabe `{entfernung}`. 3. Selbstaufruf `sucheFahrer(entfernung)`, Rückgabe `{f}`. 4. Selbstaufruf `sucheFahrzeug(entfernung)`, Rückgabe `{fz}`. 5. `setAufTour(true)` an `f : Fahrer`. 6. `setFrei(false)` an `fz : Fahrzeug`. 7. Erzeugung eines neuen Objekts `la : Lieferauftrag` mit `<<create>> Lieferauftrag(bestellung, f, fz)`. 8. `hinzufuegen(la)` an `f : Fahrer`. 9. `hinzufuegen(la)` an `fz : Fahrzeug`. 10. Rückgabe `{la}` an den Aufrufer.

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 · LK 2022 · Aufgabe Vorschlag B - 1 - Client-Server und Nebenläufigke… · LK 2021 ›

Mehr Aufgaben zu Client-Server und Nebenläufigkeit