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.

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 ›