Die vorliegenden Materialien wurden von André Tempel erstellt und von Daniel Hoherz geprüft. Sollten andere Editoren die Materialien erstellt haben, werden diese explizit genannt.
Abstrakte Datentypen (ADT) sind, ähnlich wie primitive Datentypen (int, double, float, boolean, char,…), Konstruktionen für Objekte, die auf eine bestimmte Art und Weise funktionieren sollen. Ein ADT hat immer eine konkrete Implementation, die Datenstruktur, und eine Schnittstelle, mit welcher ein User arbeiten kann, das Interface. Dem User muss die konkrete Implementation nicht bekannt sein. Nur die vorhanden Operationen, die der ADT können soll, müssen namentlich und in ihrer Funktionsweise über das Interface bekannt sein. Die tatsächliche Umsetzung kann dann unbekannt bleiben.
In Modernen Containerhäfen lagern automatisierte Kräne die angelieferten Container auf mehreren Stapeln zwischen, bevor sie weiter verladen werden.
Die vorliegende Aufgabe ist nach einer Idee von Philip Schwarzbauer (Osnabrück, 2023) erstellt worden.
-
Im Folgenden modellieren wir die Funktionsweise
des Krans, dessen Rolle Sie übernehmen,
und eines Containerstapels.
Alle Handlungen sollen so kleinschrittig ausgeführt werden, als wären Sie ein Computer.
Es ist noch eine freie Stelle in der Reihe mit den Containerstapeln verfügbar und fünf Container, die aktuell noch auf dem Schiff gestapelt sind, müssen noch eingefügt werden.
Ziel: Um die Datenstruktur, mit der ein solcher Containerstapel algorithmisch als Klasse umgesetzt werden soll, möglichst minimal zu halten, müssen wir alle notwendigen Operationen, die der Kran auf dem Containerstapel ausführen kann und die minimale Anzahl an Attributen, die so ein Stapel haben muss, herausfinden. - Das Schiff hat angelegt. Entladen Sie das Schiff vollständig. Wichtig: Der Kran kann immer nur einen Container bewegen.
-
Nach einem Insidertipp meldet sich der Zoll beim Terminalmanager und sucht einen bestimmten Container mit Bananen aus Ecuador. In diesem Container wird eine größere Menge Kokain vermutet.
In den Containern sind die Waren enthalten. Der Kran kann die Ware sehen, wenn er einen Container anheben kann.
Schaut im obersten Container des Stapels nach, ob er Bananen enthält. -
Der oberste Container enthält leider keine Bananen. Ermittelt den richtigen Container im Stapel.
Der Kran kann nach wie vor nur sehen, was im obersten Container eines Stapels enthalten ist. Überlegen Sie sich auch, was Sie mit einem Container machen wollen, den Sie vom Stapel entfernen müssen. -
Der Insidertipp hat sich als falsch herausgestellt. Zwischengelagerte Container müssen nun wieder auf den Stapel auf dem Kai zurück.
Woran erkennt der Kran, wann er alle Container wieder zurückgeladen hat?
Holen Sie sich ein Set aus fünf Containern und die beiden Papierblättern, die das Schiff und das Terminal darstellen. Legen Sie die Blätter vor sich auf den Tisch und die Container auf das Schiffsblatt.
Sie sind nun der Kran, das Terminal soll der anfangs leere Containerstapel und die Container die Container sein, die auf einem Containerstapel auf dem Schiffsblatt liegen.
Wie Sie dem Aufbau entnehmen können, ist am Hafenkai noch ein Containerstapel frei. Alle weiteren Stapel sind voll belegt (Maximalhöhe: 5 Container). Ein Schiff liegt am Kai und wartet auf die Entladung (im Seemansdialekt „Löschung“).
Stapeln Sie zunächst alle fünf Container auf dem Schiff. Führen Sie dann nacheinander die folgenden Aktionen aus:
Um die notwendigen Attribute einer Klasse für solch einen Stapel zu erkennen, muss man sich überlegen, was genau der Kran, also der Computer, von einem Containerstapel wissen, also speichern muss.
Reflektieren Sie die Handlungen, die Sie in den Aufgabenteilen zu b) ausgeführt haben.
Benennen Sie alle notwendigen Attribute und Operationen, welche ein Objekt wie unser Stapel haben bzw. ausführen können muss, um die Funktionalität unseres Szenarios zu haben.
Welche essentiellen Operationen muss ein Kran mit diesem Stapel tun können? Er muss…
- einen Container auf den Stapel legen können,
- den Inhalt des obersten Containers einsehen können,
- einen Container vom Stapel entfernen können (das kann natürlich nur der oberste sein),
- feststellen können, ob der Stapel leer ist.
Formal sind das die Operationen der Klasse Stack:
| c Stack() | Instanziiert einen leeren Stapel (taucht in der Aufzählung oben nicht auf.) |
| isEmpty() : Wahrheitswert | Ist der Stack leer? |
| push(x : Inhaltstyp) | Ein Element erzeugen, mit dem Inhalt x verbinden und auf den Stack legen |
| top() : Inhaltstyp | Den Inhalt des obersten Elements zurückgeben |
| pop() : Inhaltstyp | Den Inhalt des obersten Elements zurückgeben und dieses entfernen |
Attribute der Klasse Stack:
Weitere Funktionalitäten benötigen wir nicht, um einen Stapel algorithmisch
als Klasse umzusetzen. Der Datentyp, der die bisher
genannte Funktionalität hat, nennt sich Stack oder Stapel oder Keller.
Der Container: In der Tabelle mit den Stapeloperationen kommt der Begriff Element vor. Die Struktur unseres Containerstapels besteht aus den einzelnen Containern. Die Inhalte, die „abgespeichert“ sind, sind die Inhalte der Container.
Solch einen Container nennen wir nun Element. Die Struktur eines Stapels im Speicher ist rechts abgebildet.
Jedes der Elemente, also der Kästen, (eigentlich nur die beiden Verweise) im Bild zur Struktur, muss zwei Informationen, also Attribute, haben. Einen Verweis auf das Folgeelement und einen Verweis auf den eigentlich abzuspeichernden Inhalt. Dies realisieren wir durch eine weitere Klasse Element, welche nur zwei Attribute, inhalt und next, hat.
Das Prinzip, dass man lediglich das oberste und somit zuletzt hinzugefügte Element entfernen kann, nennt sich LIFO-Prinzip (Last In – First Out). Also das Element, dass zuletzt hinzugefügt wurde, geht als erstes.
Attribute der Klasse Element
|
|
|---|---|
| Inhaltstyp inhalt |
Verweis auf ein Objekt eines beliebigen Inhaltstyps. Dafür wird die allgemeine Superklasse Object genutzt.
|
| Element next | Verweis auf das Folgeelement. |
Achtung: Die Attribute sind hier nciht private, damit man diese einfach setzen kann.
Operationen der Klasse Element:
Keine
Der Stapel besteht also aus einer Aneinanderreihung von Objekten, Elemente genannt. Diese werden durch Verweise im Speicher miteinander verbunden und haben jeweils einen Inhaltsverweis, der auf den im Element gespeicherten Inhalt zeigt.
Außerdem gibt es einen Verweis auf das oberste Stapel-Element, top genannt.
Man muss sich deutlich machen, dass der Computer von einem Stapel nur das Attribut top kennt und damit einen direkten Zugriff nur auf das oberste Element, das top-Element genannt, hat.
Kleine Zusammenfassung
Die vorliegende Aufgabe ist nach einer Idee von Philip Schwarzbauer (Osnabrück, 2023) erstellt worden.
- Nun starten wir mit einer ersten Modellierung unseres Containerstapels. Die Container sollen zunächst nur in Form von Zeichenketten gespeichert werden.
- Leichte Variante
- Container sollen bei der Ankunft auf die zwei Containerstapel aufgeteilt werden – Deutsche Container (beginnend mit „DE…“) sollen auf Stapel 1, andere Container auf Stapel 2.
Implementieren Sie einen entsprechenden Programmteil und testen Sie ihn mit verschiedenen Containern.
Hinweis: Es existieren nur Container mit den Kennungen DE, US und UK.
Überlegen Sie vorher, welchen Teil der Kennung Sie vergleichen müssen, um korrekt zu sortieren. - Standard:
- Das Containerterminal soll die ankommenden Container je nach Herkunftsland auf drei
Stapel sortieren, je einen für DE, US und UK.
Implementieren Sie einen entsprechenden Programmteil und testen Sie ihn mit verschiedenen Containern. - Schwierige Variante:
- Das gesamte Terminal besteht aus vier Containerstapeln, die flexibel durch
die Containerbrücken genutzt werden können.
Implementieren Sie das gesamte Terminal, indem Sie vier Stapel in einer statischen Reihung verwalten.
Entwerfen Sie danach ein Szenario, wie diese Stapel genutzt werden könnten.
Implementieren und testen Sie dieses Szenario.
Implementieren Sie ein Programm StackTest, in dem Sie zunächst ein Objekt der Klasse Stack erstellen und die Operation isEmpty testen.
Jeder Container wird durch eine Kennung eindeutig beschrieben. Diese besteht aus zwei Buchstaben für das Herkuntfsland und einer eindeutigen Nummer. Ein Schiff legt am Containerterminal an. Stapeln Sie die Container „DE1989“, „US1776“ und „UK2021“ auf den Stapel am Kai und testen Sie die Operationen top und isEmpty.
Hinweis: Es kann sein, dass Sie erst noch den Stack aktivieren müssen. Machen Sie dazu Rechtsklick auf den Workspace und gehen Sie dann auf Einstellungen. Hier wählen Sie dan „Abiturklassen Niedersachhsen“ aus.
Der Terminalmanager möchte wissen, aus welchem Land der oberste Container kommt.
Lassen Sie sich die ersten beiden Zeichen vom obersten Container ausgeben.
Hinweis: In unserem Fall sind die Inhalte der Stapelelemente Strings, diese werden aber vom Computer als Objects geführt. Informieren Sie sich über Typecasting bei Java und wandeln Sie anschließend die ausgelesenen Stackelement Inhalte vor der Ausgabe in Strings um.
Der Terminalmanager benötigt für die Inventur eine Auflistung aller Container des Stapels.
Beschreiben Sie, wie Sie hierfür bei einem Stapel vorgehen müssten und implementieren Sie dies.
Überprüfen Sie, wie der Stack anschließend aussieht.
Hinweis: Es hilft hier eventuell, das Vorgehen in einem Arbeitsschritt der Container-Simulation zu reflektieren.
Um bei Verdachtsfällen des Zolls in Zukunft schneller reagieren zu können, möchte der Terminalmanager automatisiert nach Containern im Stapel suchen können.
Implementieren Sie eine entsprechende Funktionalität, bei der der Nutzer eine Containerkennung eingibt und das Programm so lange Container vom Containerstapel entfernt, bis der entsprechende Container gefunden ist.
Nutzen Sie zudem die String-Operation .equals, um Strings zu vergleichen. Für das Einlesen von Text eignet sich Input.readString…
Für den Container „US1776“ hat der Zoll einen Hinweis erhalten: er soll gefälschte „Make-America-Great-Again-Again“-Mützen enthalten. Eine willkommene Gelegenheit, um euer Programm zu erproben.
Nach dem erfolgreichen Test Ihrer Implementierung beschließt der Terminalleiter, die Digitalisierung auszuweiten. Sie dürfen zunächst wählen, wie komplex diese Erweiterung ausfallen soll:
Implementieren Sie in Ihrem Programm StackTest eine Operation ausgabe, mit welcher der gesamte Stapelinhalt ausgegeben aber der Stapel nicht verändert wird.
Schwierigere Variante: Lassen Sie den Inhalt so anzeigen, wie er im Stapel liegt. Also von unten nach oben.
Erstellen Sie einen Stapel, der fünf zufällige Ganzzahlen gespeichert hat und eine Kopie dieses Stapel.
Lassen Sie sich den Inhalt der Kopie nacheinander ausgeben.
Hinweis: Informieren Sie sich gegebenenfalls im Internet, wie man eine Kopie eines Stapels erstellt.
-
Nun wird das Container-Szenario erweitert. Die Container sollen durch eine weitere Klasse
Containerund die Containerstapel mit einer KlasseContainerreihemodelliert werden. Sie sollten sich nun für eine der beiden folgenden Varianten entscheiden:Jeder Container besitzt eine Bezeichnung die aus bis zu drei Buchstaben, welche das Herkunftsland des Containers angibt, gefolgt von einem Bindestrich, und anschließend aus zwei bis vier Ziffern besteht. Zwei Beispiele für gültige Bezeichnungen sind:Basisvariante
Basisvariante der Klassenkarten Container und Containerreihe Challengevariante
Challengevariante der Klassenkarten Container und Containerreihe NAM-0211 Für einen Container aus Namibia RT-945 Für einen Container aus Togo
Implementieren Sie die Klasse Container, welche zunächst nur das Attribut bezeichnung und einen entsprechenden Konstruktor erhalten soll.
Implementieren Sie anschließend die Klasse Containerreihe, wobei zunächst nur die Attribute cStapel, kategorien und der Konstruktor, der einen leeren Stapel erzeugt (bzw. für die schwierigere Variante eine Stapel-Reihung), umgesetzt werden sollen. Die Reihung kategorien können Sie im Konstruktor zunächst ignorieren.
Implementieren Sie nun die Operationen pushContainer, popContainer, topContainer und isEmptyContainer der Klasse Containerreihe, welche die gleichen Funktionen der entsprechenden Stapel-Operationen haben sollen. (Für die schwierige Variante gibt die Ganzzahl den jeweiligen Index der Containerreihung an.)
Erweitern Sie die Klasse Containerreihe um eine Operation getLength, welche die Größe des Stapels zurückgibt. (Schwierige Variante: Die Operation getLength bekommt zusätzlich eine Ganzzahl übergeben und gibt die Größe des Stapels am übergebenen Index zurück.)
Weiter geht es mit der Operation getBezeichnung der Klasse Container. Sie soll die Bezeichnung zurückgeben. Implementieren Sie die Operation getBezeichnung.
Erstellen Sie nun ein Programm ContainerTest, in dem Sie ein Objekt der Klasse Containerreihe erstellen und den folgenden Containerstapel realisieren:
Containerstapel nach der Füllung
| EAK-523 |
| MGL-1151 |
| ZA-98 |
| A-792 |
| AQU-2133 |
Containerreihung mit zwei Container-Stacks nach der Füllung
| EAK-523 | |
| MGL-1151 | IE-83 |
| ZA-98 | RO-1354 |
| A-792 | MC-1111 |
| AQU-2133 | D-851 |
Lassen Sie sich die Bezeichnungen aller Container ausgeben.
(schwierig) Die Operation changeBezeichnung der Klasse Container soll die Bezeichnung am übergebenen Index a durch das Zeichen c ändern.
Implementieren Sie die Operation changeBezeichnung.
Ändern Sie die Bezeichnung eines beliebigen Containers und lassen Sie sich die geänderte Bezeichnung erneut ausgeben.
Die Operation checkBezeichnung der Klasse Container soll überprüfen, ob die Bezeichnung des Containers korrekt ist. Ist diese korrekt, gibt die Operation true, ansonsten false zurück. Sie können hier vereinfachend annehmen, dass als Länderkennung jede Kombination aus einem bis drei Buchstaben zulässig ist.
Hinweis: Ein Großbuchstabe als char hat einen ASCII-Wert von A=65 bis Z=90. Dieser kann verglichen werden. Ist z. B. char c = 'B', hat also einen ASCII-Wert von 66, so liefert nach int a = c; (Umwandeln des Zeichens in seinen ASCII-Wert) die Frage a < 67 die Antwort true. Ziffern haben einen ASCII-Wert von 48 (0) bis 57 (9).
Implementieren Sie die Operation checkBezeichnung.
Testen Sie, ob der oberste Container eine gültige Bezeichnung hat.
Fügen Sie Container mit der Bezeichnung „A-1“, „ABCD11“ und „11-11“ ein und testen Sie die Operation checkBezeichnung. Stellen Sie anschließend den Containerstapel wie vorher wieder her.
(schwierig) Die Zahl am Ende der Containerbezeichnung kann aus zwei, drei oder vier Ziffern bestehen. Diese enthalten unter anderem die Information, in welche Kategorie der Containerinhalt fällt. Ist die letzte Ziffer zwischen 0 und 3, enthält der entsprechende Container „Lebensmittel“. Ist sie zwischen 4 und 7 „Handelswaren“ und bei 8 oder 9 „Sonstige“.
Erweitern Sie die Operationen pushContainer und popContainer sowie den Konstruktor so, dass die Kategorien in die Reihung kategorien hinzugefügt bzw. entfernt werden. Die Operation getKategorien der Klasse Containerreihe soll die Kategorien aller Container in der angegebenen Form ausgeben.
- Eine ankommende Lieferung besteht aus Containern eines Unternehmens, welche zwei Produkte herstellt. Nehmen wir an, das Unternehmen hat als Kennzeichnung das Zeichen 'a' bei Produkt 1 und das 'b' bei Produkt 2 auf ihren Containern, welche vom Kran gelesen werden können. Die Container liegen in einer Reihe, können von vorne nach hinten aufgenommen und auf einen neuen Containerstapel gelegt werden. Der Kran liest jedes Mal das Zeichen auf dem aktuellen Container ein. Nun möchte der Hafenmeister wissen, ob der Lieferschein des Unternehmens, auf welchem vermerkt ist, dass gleich viele Container von beiden Produkten verschifft wurden, korrekt ist. Hierfür könnt ihr die Reihe von Containern als Zeichenkette, bestehend aus 'a' und 'b', darstellen.
Entwickeln Sie eine geeignete Vorgehensweise zur Lösung der Problematik mit Hilfe des ADT Stapel (Optional als Zusatz: und eine Variante ohne einen Stapel).
(Schwierigere Variante: Ein Klammerausdruck der Form ((())), also keine geschachtelten Klammerausdrücke der Form (()()), soll auf Korrektheit geprüft werden. Entwickeln Sie eine geeignete Vorgehensweise mit Hilfe des ADT Stapel.)
Schreiben Sie einen geeigneten Algorithmus, der das von Ihnen betrachtete Problem aus Aufgabenteil a) löst. Sie sollen hierbei den ADT Stapel nutzen. (Optional als Zusatz: und eine Variante ohne einen Stapel. Vergleichen Sie beide Varianten miteinander).
Der Algorithmus aus Aufgabenteil b) soll nun erweitert werden. Nun soll eine Zeichenkette, in der zunächst eine Reihe von a's, gefolgt von einem c und danach b's betrachtet werden. Es soll geprüft werden, ob die Anzahl der Zeichen a und b gleich ist. Zum Beispiel ist aaacbbb ein korrekter Ausdruck und aaaccbbb oder aacbbb nicht. Hierfür sollen Sie nun auch Switch-Case-Anweisungen, also eine Mehrfachverzweigung, nutzen. Allgemein ist diese wie folgt strukturiert:
Switch-Anweisung:
Zur Mehrfachverzweigung ist es effizienter, statt IF-Anweisungen die switch-case-Anweisung zu benutzen. Eine switch-case-Anweisung besteht aus einem Ausdruck und einem Rumpf. Der Ausdruck einer switch-Anweisung darf z. B. vom Typ String, byte, short, char oder int sein.
switch(Ausdruck) {
case wert1: //ausführen, wenn Ausdruck = wert1 ist
Anweisung 1;
break;
case wert2: //ausführen, wenn Ausdruck = wert2 ist
Anweisung 2;
break;
case wert3: //ausführen, wenn Ausdruck = wert3 ist
Anweisung 3;
break;
...
default: //Ausführen, wenn keiner der Fälle gilt
Anweisung_default;
break;
}
Hier ein konkretes Beispiel:
int a = Input.readInt("Gib eine Zahl ein.");
switch(a) {
case 1: //ausführen, wenn Ausdruck = wert1 ist
println("Du hast 1 eingegeben.");
break;
case 2: //ausführen, wenn Ausdruck = wert2 ist
println("Du hast 2 eingegeben.");
break;
case 3: //ausführen, wenn Ausdruck = wert3 ist
println("Du hast 3 eingegeben.");
break;
default: //Ausführen, wenn keiner der Fälle gilt
println("Du hast nicht 1, 2 oder 3 eingegeben.");
break;
}
Implementieren Sie je einen geeigneten Algorithmus mit Switch-Case und dem ADT Stapel.
(Schwierigere Variante: Ein Klammerausdruck der Form (([()])), also mit zwei Klammertypen, soll auf Korrektheit geprüft werden.)
-
Am Containerterminal gibt es leider erneut Schwierigkeiten mit dem Kranführer Herrn D. H. Er hat die neu eingeführte Containerbezeichnung nicht berücksichtigt. Alle Container verfügen über eine Länderkennzeichnung, die aus zwei Buchstaben besteht, gefolgt von einem Bindestrich, vier Ziffern, einem weiteren Bindestrich und einer abschließenden Ziffer.
Die letzte Ziffer gibt die Warenkategorie an. Es ist festgelegt, dass alle Container aus den Niederlanden (Länderkennung NL) mit der Warenkategorie 7 ausschließlich gemeinsam gestapelt werden dürfen. Es dürfen sich keine Fremdcontainer auf diesem Stapel befinden.
Obwohl die Arbeitsweise von Herrn D. H. Anlass zur Kritik gibt, ist er immerhin in der Lage, den Kran so zu programmieren, dass dieser einen Containerstapel entsprechend überprüft und bei Bedarf korrigiert. Der aktuell zu untersuchende Stack cStapel steht als globale Variable zur Verfügung. Unten sehen Sie den Entwurf eines entsprechenden Algorithmus in Form eines Struktogramms.
Analysieren Sie die Funktionsweise des Algorithmus für den Fall, dass cStapel wie folgt belegt ist (wobei links das oberste Element liegt): 'DE-1234-5', 'NL-2682-7', 'ES-7654-4', 'NL-6442-7', 'NL-1123-7'.
Verändern Sie das Struktogramm so, dass die Reihenfolge aller Container in s2 und cStapel im Vergleich zum ursprünglichen Algorithmus getauscht wird.
Die vorliegende Aufgabe ist nach einer Idee von Philip Schwarzbauer (Osnabrück, 2023) erstellt worden.
Der Leiter des Containerterminal arbeitet nebenberuflich auch am Flughafen BER. Hier ist er zuständig für die Sicherheitskontrolle, speziell um das Management der wartenden Passagiere. Nach den überaus guten Erfahrungen aus dem Hafen soll nun auch die Warteschlange der Sicherheitskontrolle am BER digitalisiert werden. Erneut seid ihr als CODER („Chief Officer of Digital sEcurity contRol“) gefragt.
Am Flughafen BER wird jeder Passagier durch eine eindeutige Kennung verwaltet. Diese besteht aus zwei Buchstaben für die Fluggesellschaft sowie einer fortlaufenden, dreistelligen Nummer. Passagier „LH003“ ist also Passagier Nr. 3 der Lufthansa. Um keine Bevölkerungsgruppen zu diskriminieren (teils ein reales Problem bei der Sicherheitskontrolle), werden alle PassagierInnen neutral als "Passagiere" bezeichnet und durch einfarbige LEGO-Steine dargestellt.
-
Die Warteschlange soll zunächst simuliert werden, um Ansätze für eine Implementierung zu sammeln und zu evaluieren. Es existiert genau eine Sicherheitskontrolle mit einer Warteschlange. Führen Sie alle folgenden Aktionen kleinschrittig aus.
Versetzen Sie sich immer in die Lage einer Sicherheitskraft und überlegenn Sie, was er bzw. sie von der Warteschlange sehen kann. Die Sicherheitskraft entspricht in unserem Modell dem Computer, die Warteschlange als solche der Datenstruktur, die einzelnen Passagiere sind die Elemente und die Kennungen sind die Inhalte der Elemente. - LH380,
- FR737,
- FI767,
- LH350,
- FR319.
Nehmen Sie sich ein Warteschlangen-Leog-Modell mit fünf Passagieren:
Die fünf Passigerer erscheinen in oben genannter Reihenfolge an der Sicherheitskontrolle und stellen sich an.
Der vorderste Passagier äußert lautstark Unmut darüber, dass es zu langsam voran geht. Die Sicherheitskraft möchte ihn mit seiner Kennung ansprechen, um deeskalierend zu wirken.
Welches Problem tritt auf, wenn der zweite Passagier ebenso lautstark Unmut äußert?
Die Sicherheitskontrolle nimmt ihre Arbeit auf und kontrolliert den vordersten Passagier. Dieser darf danach weiter zum Gate gehen.
Der weitere Tag verläuft ohne Komplikationen. Die Sicherheitskräfte arbeiten nach und nach alle Passagiere ab.
Woran erkennen die Sicherheitskräfte, wann sie endlich Feierabend machen dürfen?
- Um die Funktionalität der Warteschlange nun digital umzusetzen, wird eine Datenstruktur namens "Schlange" implementiert. Diese soll genau die Funktionalitäten der realen Warteschlange zur Verfügung stellen.
Reflektieren Sie Ihr Vorgehen in Aufgabe 1 und überlegen Sie sich, welcher Operationen (=Funktionalitäten der Warteschlange) die Datenstruktur besitzen muss.
Formulieren Sie weitere Einsatzgebiete, in denen sich die Verwendung einer Datenstruktur ähnlich der Sicherheitskontrollen-Warteschlange anbieten würde.
Begründen Sie, warum dies hier sinnvoll ist.
-
Füllen Sie die untenstehende Tabelle aus, indem Sie in der linken Spalte die Operationen der
Queueeintragt und rechts die entsprechende Handlung in der Sicherheitskontrolle beschreibt.
Die Vorgehensweise an der Sicherheitskontrolle entspricht einer Warteschlange und wird algorithmisch durch den ADT Queue (auch Schlange genannt) umgesetzt.
Der ADT Queue besteht aus einer (ggf. leeren) Sequenz von Elementen zusammen mit einem Headelement.
Der Datentyp arbeitet nach dem FIFO-Prinzip (First In - First Out), also nach dem Prinzip einer Warteschlange. Was zuerst eingefügt wird, wird zuerst abgearbeitet.
Formal sind die Operationen der Klasse Queue:
| c Queue() | Instanziiert eine leere Schlange (taucht in der Aufzählung oben nicht auf.) |
| isEmpty() : Wahrheitswert | Ist die Queue leer? |
| enqueue(x : Inhaltstyp) | Ein Element erzeugen, mit dem Inhalt x verbinden und am Ende der Queue einfügen |
| head() : Inhaltstyp | Den Inhalt des vordersten/ersten Elements zurückgeben |
| dequeue() : Inhaltstyp | Den Inhalt des vordersten/ersten Elements zurückgeben und dieses entfernen |
Die vorliegende Aufgabe ist nach einer Idee von Philip Schwarzbauer (Osnabrück, 2023) erstellt worden.
-
Nach der erfolgreichen Simulation der Sicherheitskontrolle startet nun der Betrieb des BER und seiner Sicherheitskontrollen. Sie haben sich als CODER („Chief Officer of Digital sEcurity contRol“) die Aufgabe, entsprechende digitale Funktionalitäten zu implementieren.
Jeder Fluggast hat eine eigene Kennung, die seine Fluggesellschaft und eine fortlaufende Nummer enthält, z. B. LH003 (Passagier Nr. 3 der Lufthansa). - Erstellen Sie eine zweite
Queue. Finden Sie einen Weg, um die Passagiere der ersten in die zweiteQueuezu übertragen. - Ein Passagier beschwert sich lauthals über die Unfairness beim Übertragen in die zweite Warteschlange. Beurteilen Sie, ob seine Beschwerde rechtmäßig ist.
Implementieren Sie ein Programm FlughafenTest, in dem Sie zunächst eine Queue für die Sicherheitskontrolle erstellen und deren Operation isEmpty testen.
Die ersten Passagiere erscheinen an der Kontrolle.
Fügen Sie die folgenden Kennungen der Warteschlange hinzu: LH380, FR737, FI767, LH350, FR319.
Lassen Sie sich die Kennung der vordersten Person in der Schlange ausgeben.
Kurz bevor die Sicherheitskontrolle beginnen kann, fällt der Körperscanner aufgrund eines technischen Defekts aus. Alle Passagiere müssen in die benachbarte, noch leere Warteschlange bewegt werden.
Leider ist im BER auch die Lautsprecheranlage noch nicht in Betrieb. Als ein Passagier aufgrund eines Notfalls ausgerufen werden soll, fordert der Flughafenchef Listen an, in denen die Passagiere der Warteschlangen aufgelistet sind.
Geben Sie alle wartenden Passagiere der Queue in richtiger Reihenfolge aus. Die Queue soll nach Ausgabe der Liste wieder die gleichen Daten enthalten wie zu Beginn.
Tipp: Eventuell hilft es, das Szenario einmal mithilfe des LEGO-Modells durchzuspielen.
Standard: Hinter der Sicherheitskontrolle existieren zwei Gates, an denen die verschiedenen Flugzeuge parken. Auch hier müssen die Passagiere erneut in einer Schlange auf das Boarding warten.
Es existiert eine Schlange für den nationalen Flug der Lufthansa (Kennung "LH…") und eine weitere Schlange für internationale Flüge (Kennungen "FR" und "FI").
Erstellen Sie zwei Schlangen für die Gates und teilen Sie die Passagiere auf die beiden Gates auf.
Tipp: Überlegen Sie sich vorher, welche Teile der Kennung Sie hierfür auslesen müssen.
Schwierige Variante: Hinter der Sicherheitskontrolle existiert ein Gate für jede Fluggesellschaft. Erstellen Sie Schlangen für alle drei Gates und teilen Sie die Passagiere ihrem Gate zu.
Tipp: Informieren Sie sich vorher über die String-Operationen substring() und String.equals().
Aufgrund eines unvorhersehbaren Extremwetters (heftiger Nieselregen) muss der Flugbetrieb am BER eingestellt werden. Alle am Gate wartenden Passagiere werden mit Bussen zum Bahnhof gebracht, um mit der Bahn ans Ziel zu kommen.
Überführen Sie die Passagiere beider bzw. aller drei Gates in eine weitere Warteschlange für den Bus.
Finden Sie hierfür ein faires Verfahren, sodass sich keiner der Passagiere beschwert.
-
Eine Hausarztpraxis möchte die durchschnittliche Wartezeit von Patientinnen und Patienten reduzieren. Hierfür soll eine digitale Anmeldung erfolgen, bei der die Patientinnen und Patienten zwischen verschiedenen Symptomen oder Beschwerden wählen sollen und einen Zeitraum angeben, in dem sie verfügbar sind. Anschließend wird ihnen ein konkreter Terminvorschlag per Email gesendet.
Die bestätigten Termine werden dann in nacheinander in der Praxis in der vorher festgelegten Reihenfolge abgearbeitet und neue Termine können nur hinten angehängt werden.Basisvariante
Basisvariante der Klassenkarten Praxis und Patient Challengevariante
Challengevariante der Klassenkarten Praxis, Patient und LocalDateTime
Die Wartenden sollen nun durch eine Klasse Patient und die Arztpraxis durch eine Klasse
Praxis modelliert werden, siehe Abbildung oben. Sie sollen sich für eine der beiden
Varianten entscheiden.
Implementieren Sie die beiden Klassen Praxis und Patient, wie oben angegeben.
(Hinweis zur Challengevariante: Der Datentyp LocalDateTime kann direkt genutzt werden.
Nachdem, mit dem Konstruktor, ein Objekt der Klasse LocalDateTime erstellt wurde, kann man
sich mit entsprechenden get-Opera/onen die Stunde und die Minuten zurückgeben lassen.)
Erstellen Sie nun in einem Programm PraxisTest vier beliebige Patientenobjekte mit von Ihnen gewählten Attributwerten und fügen Sie diese in die Warteschlange eines Objektes der Klasse Praxis ein.
Die Anliegen sollen aus zufälligen Ganzzahlen von 1 bis 3 bestehen und die Uhrzeiten der Termine sind Zeichenketten der Form hh:mm, z. B. "08:30". (Schwierige Variante: Vergeben Sie für die Uhrzeiten Termine im Bereich von 07:00 bis 17:00 Uhr. Der Tag soll bei allen Patienten identisch sein.)
Lassen Sie sich alle Patienteninformationen ausgeben. Achtung: Die Queue warteschlange soll anschließend wiederhergestellt werden.
Die Vornamen der Queue sollen mit dem Wort "Heinrich" verglichen werden. Es wird ein Wort gesucht, welches lexikographisch, also alphabetisch, größer ist. Zum Beispiel ist das Wort "wasabi" lexikographisch kleiner als das Wort "wasser". (Hinweis: Zeichenketten kann man mit der Operation compareTo vergleichen. Schauen Sie gegebenenfalls noch einmal im Material zu Algorithmen nach.)
Vergleichen Sie im Programm PraxisTest so lange die Vornamen der in Ihrer Queue gespeicherten Inhalte mit "Heinrich", bis der erste lexikographisch größere Vorname gefunden wurde, und geben Sie diesen mit einer entsprechenden Ausgabe aus. Finden Sie keinen passenden Vornamen, geben Sie ebenfalls etwas Entsprechendes aus. (Hinweis: Typecasts nicht vergessen!)
Fügen Sie zunächst einen neuen Patienten mit dem Nachnamen "Kaiser" in Ihre Warteschlange ein.
Um die Patientenbesuche weiter zu verwalten, sollen die Inhalte der Queue warteschlange in eine Patientenreihung preihe einsortiert werden. Es wird eine einfache Sortierung gewählt: Alle Patienten mit Nachnamen, die lexikographisch größer als "Kaiser" sind, werden rechts vom Patienten mit dem Nachnamen "Kaiser" und alle, die kleiner sind, links davon in die Reihung gesetzt.
Implementieren Sie in Ihrem Programm PraxisTest einen geeigneten Algorithmus, der diese Sortierung vornimmt.
Hinweis: Erweitern Sie zunächst die Klasse Praxis um eine Operation getLength, welche die Größe der Queue warteschlange zurückgibt.
(Zusatz für die schwierige Variante: Da die algorithmische Umsetzung noch recht neu ist, soll es eine Möglichkeit geben zu schauen, ob die Patienten in der Queue auch in der richtigen Terminreihenfolge einsortiert sind. Die Operation pruefeReihenfolge soll true zurückgeben, wenn die Patienten korrekt in die warteschlange eingefügt wurden, ansonsten false.
Entwerfen Sie zunächst einen Algorithmus in Sprachform, der dieses Problem löst.
Implementieren Sie Ihren Algorithmus als Operation pruefeReihenfolge in der Klasse Praxis.)
Die Anliegen aller Patienten (1: Erkältungssymptome, 2: Schmerzen, 3: Verletzungen) sollen in einer hierfür erstellten Zeichenkettenreihung anliegen in der gleichen Reihenfolge, wie die Patienten in der Warteschlange sind, gespeichert werden.
Setzen Sie dies um.
-
Aufgabe aus dem Informatik-Biber 2010: Im Restaurant der Biberschule gibt es normalerweise zwei Warteschlangen: In der einen holen sich die kleinen Biber ihre hohen grünen Teller, in der anderen holen sich die großen Biber ihre flachen braunen Teller. Wegen Bauarbeiten kann es heute nur eine Warteschlange für alle Biber geben. Die Küchenbiber müssen deshalb einen Tellerstapel vorbereiten, der zur Schlange passt: Sie müssen die grünen und braunen Teller so stapeln, dass jeder Biber in der Schlange den passenden Teller bekommt. (Beispiele A bis D)
Biber und Teller
Beschreiben Sie umgangssprachlich, wie Sie die Situationen aus der oberen Abbildung mithilfe der ADT Stack und Queue testen können.
Implementieren Sie ein Programm Biber, in welchem die Situation A getestet wird. Sie können die Teller mit t und T und die Biber mit b und B speichern.
Erweitern Sie Ihre Implementierung aus Aufgabenteil b) für eine beliebige Situation, indem Sie die Teller- und Biberreihenfolge per User-Eingabe einlesen lassen.
-
Ein kleiner Netzwerkverteilerknoten soll implementiert werden. Hierfür sollen in einer statischen Reihung
signalevom InhaltstypSchlange(bzw.Queue) vier Schlangen gespeichert werden, in denen ankommende Signale mit den Ganzzahlen1oder0gespeichert werden sollen.
Diese Aufgabe können Sie in drei Schwierigkeitsgraden bearbeiten.
Entscheiden Sie sich für einen.
Erstellen Sie eine Klasse Netzwerkknoten mit einem geeigneten Attribut signale in Form einer statischen Reihung (Array) vom Inhaltstyp Schlange (bzw. Queue).
Implementieren Sie einen Konstruktor, bei dessen Aufruf das Attribut signale mit vier Queues gefüllt wird. Dabei soll die Länge der ersten Queue zufällig bestimmt werden (mindestens 5, höchstens 10).
Anschließend wird der Nutzer nach einer Zeichenkette gefragt, die exakt so lang wie die berechnete Länge der Queue sein muss und ausschließlich aus den Zeichen 0 oder 1 bestehen darf. Die Queue wird nun mit den Zeichen der eingegebenen Zeichenkette gefüllt.
Dieser Vorgang wird dreimal wiederholt, bis alle vier Queues befüllt sind.
Implementieren Sie zudem ein Programm Netzwerktest, in dem Sie ein Objekt der Klasse Netzwerkknoten deklarieren und initialisieren.
Implementieren Sie eine Operation getQueues der Klasse Netzwerkknoten, welche nacheinander die Inhalte der vier Queues und deren jeweilige Länge zeilenweise ausgibt.
Die Signale sollen nun in der Reihenfolge der Queues verarbeitet werden.
Hierfür wird zunächst von der ersten Queue das entsprechende Signal gelesen, in einer Zeichenkette gespeichert und entfernt. Anschließend ist die zweite Queue an der Reihe, dann die dritte und am Ende die vierte. Wurden von allen Queues ein Zeichen gelesen, beginnt der Netzwerkknoten wieder mit der ersten.
Dies wird so lange wiederholt, bis alle Queues abgearbeitet sind.
Die Queues erhalten nach jeder Entnahme mit einer Wahrscheinlichkeit von 20% ein neues zufälliges Signal.
Implementieren Sie die Operation bearbeiten unter dieser neuen Voraussetzung.
Implementieren Sie eine Operation getTime in der Klasse Netzwerkknoten, welche die zu erwartende Bearbeitungszeit aller sich in den Queues befindenden Signale zurückgibt.
Die Bearbeitung eines Signals beansprucht 1 ms. Ein Netzwerkknoten darf nicht länger als 30 ms für die Bearbeitung benötigen. Sollte die Bearbeitungszeit länger als 30 ms sein, werden von den längsten Queues Signale entfernt und in einem zusätzlichen Array gespeichert, bis die Bearbeitungszeit exakt 30 ms beträgt.
In diesem Array stehen an den Stellen 1, 5, 9 usw. die entfernten Signale der ersten Queue. Analog dazu befinden sich an den Stellen 2, 6 usw. die der zweiten Queue und so weiter.
Implementieren Sie die Operation getTime unter dieser Voraussetzung.
Hinweis: Fügen Sie der Klasse Netzwerkknoten eine Operation getLength(s : Schlange) hinzu, welche die Länge der übergebenen Queue zurückgibt. Zusätzlich können Sie die Klasse um eine Operation getMax erweitern, welche den Index der aktuell größten Queue zurückgibt.
Erstellen Sie eine Klasse Netzwerkknoten mit einem geeigneten Attribut signale in Form einer statischen Reihung (Array) vom Inhaltstyp Schlange (bzw. Queue).
Implementieren Sie einen Konstruktor, bei dessen Aufruf das Attribut signale mit vier Queues gefüllt wird. Jede dieser Queues soll eine zufällige Anzahl an Signalen enthalten (mindestens fünf und höchstens zehn). Die Signale selbst sollen ebenfalls zufällige Werte von 0 oder 1 annehmen.
Implementieren Sie zudem ein Programm Netzwerktest, in dem Sie ein Objekt der Klasse Netzwerkknoten deklarieren und initialisieren.
Implementieren Sie eine Operation getQueues der Klasse Netzwerkknoten, welche nacheinander die Inhalte der vier Queues jeweils zeilenweise ausgibt.
Die Signale sollen nun in der Reihenfolge der Queues verarbeitet werden.
Hierfür wird zunächst von der ersten Queue das entsprechende Signal gelesen, in einer Zeichenkette gespeichert und entfernt. Anschließend ist die zweite Queue an der Reihe, dann die dritte und am Ende die vierte. Wurden von allen Queues ein Zeichen gelesen, beginnt der Netzwerkknoten wieder mit der ersten.
Dies wird so lange wiederholt, bis alle Queues abgearbeitet sind.
Implementieren Sie eine geeignete Operation bearbeiten, welche am Ende den gesamten Datenstrom ausgibt.
Implementieren Sie eine Operation getTime in der Klasse Netzwerkknoten, welche die zu erwartende Bearbeitungszeit aller sich in den Queues befindenden Signale zurückgibt. Es dauert 1 ms, ein Signal zu bearbeiten.
Implementieren Sie die Operation getTime.
Erstellen Sie eine Klasse Netzwerkknoten mit einem geeigneten Attribut signale in Form einer statischen Reihung (Array) vom Inhaltstyp Schlange (bzw. Queue).
Implementieren Sie einen Konstruktor, bei dessen Aufruf das Attribut signale mit vier Queues gefüllt wird, die jeweils fünf Zahlen (0 oder 1) beinhalten. Die konkrete Belegung können Sie im Konstruktor selbst festlegen.
Implementieren Sie zudem ein Programm Netzwerktest, in dem Sie ein Objekt der Klasse Netzwerkknoten deklarieren und initialisieren.
Implementieren Sie eine Operation getQueues der Klasse Netzwerkknoten, welche die Inhalte der ersten Queue in einer Zeile ausgibt.
Die Signale sollen nun in der Reihenfolge der Queues verarbeitet werden.
Hierfür wird zunächst von der ersten Queue das entsprechende Signal gelesen, in einer Zeichenkette gespeichert und entfernt. Im Gegensatz zum vorherigen Verfahren wird nun jede Queue der Reihenfolge entsprechend vollständig abgearbeitet, bevor die nächste Queue an der Reihe ist.
Dies wird so lange wiederholt, bis alle vier Queues nacheinander vollständig geleert wurden.
Implementieren Sie die Operation bearbeiten unter dieser neuen Voraussetzung.
Implementieren Sie eine Operation getTime in der Klasse Netzwerkknoten, welche die zu erwartende Bearbeitungszeit aller sich in der ersten Queue befindenden Signale zurückgibt. Es dauert 1 ms, ein Signal zu bearbeiten.
Implementieren Sie die Operation getTime unter dieser Voraussetzung.
Der Leiter des Containerterminals und der Sicherheitskontrolle H. Herz expandiert mit seinem Unternehmen und steigt nun in die Online-Kart-Racer-Spieleentwicklung der Firma Intendon ein. Hier ist er zuständig für die Verarbeitung der weltweiten Highscore der Gamer. Da Sie sich während der letzten Projekte so gut geschlagen haben, werden Sie auch hier wieder als CODER („Chief Officer of Digital OrdER) eingesetzt. Bei dem Kart-Racer von Intendon wird zunächst jeder Fahrer durch eine gewählte Farbe klassifiziert. Je nachdem wie gut die Spieler die Rennen abgeschlossen haben, werden sie in den weltweiten Highscore eingetragen.
-
Damit man sich den Prozess der Rangliste besser vorstellen kann wird dieser mithilfe von Lego-Fahrzeugen und einem Highscoreplan simuliert.
Nehmen Sie sich vier verschieden farbie Lego-Fahrzeuge, einen Highscoreplan und einen Stift. Führen Sie die folgenden Aktionen kleinschrittig aus.
Drei der Fahrer haben das Rennen so gut abgeschlissen, dass sie in den och leeren Highscore eingetragern werden.
Der Fahrer auf Platz 2 hat das Spiel bei sich gelöscht und wird nun auch aus der highscore entfernt. Was geschieht mit den Fahrern in der Highscoire, die hinter dem 2. Platzierten waren?
Ein Fahrer schafft es durch sein Fahrtalent in die und wird auf dem ersten freien Platze eingeordnet.
Ein neuer Fahrer schafft direkt den Sprung auf den zweiten Platz der Highscore und verdrängt damit andere Fahrer*innen.
Die Firma möchte gerne wissen, wie viele Fahrer es bereits in die Highscore geschafft haben.
Es gibt ein besonderes Herausforderungsrennen, dafür muss der dritte Fahrer der Highscore bestimmt werden.
Der Fahrer auf der Position 1 hat seine Farbe gewechselt.
Zum Ende der Saison werden alle Fahrer aus der Highscore gelöscht und ihre Namen werde nochmal zur Ehrung mitgeteilt.
- Um die Funktionalität der Highscore nun digital umzusetzen, wird eine Datenstruktur namens "Dynamische Reihung" implementiert. Diese soll genau die Funktionalitäten der realen Highscore zur Verfügung stellen.
Reflektieren Sie Ihr Vorgehen in Aufgabe 1 und überlegen Sie sich, welcher Operationen (=Funktionalitäten der Dynamischen Reihung) die Datenstruktur besitzen muss.
Formulieren Sie weitere Einsatzgebiete, in denen sich die Verwendung einer Datenstruktur ähnlich der Highscore-Dynamischen Reihung anbieten würde.
Begründen Sie, warum dies hier sinnvoll ist.
-
Füllen Sie die untenstehende Tabelle aus, indem Sie in der linken Spalte die Operationen der
Dynamischen Reihungeintragt und rechts die entsprechende Handlung in der Highscore beschreibt.
Die erforderte Datenstruktur, dynamisches Array oder dynamische Reihung, kann wieder eine Aneinanderreihung in linearer Form von Elementen sein, wie beim Stapel oder der Schlange.
Jedoch haben hier die einzelnen Elemente noch eine Position, Index genannt.
Ansonsten gibt es je einen Verweis auf den Anfang und die aktuelle Position, an der man sich gerade
befindet.
Als Attribute braucht man für eine dynamische Reihung (Klassenname DynArray):
Formal sind die Operationen der Klasse Dynamische Reihung:
| c DynArray() | Instanziiert eine leere Dynamische Reihung (taucht in der Aufzählung oben nicht auf.) |
| isEmpty() : Wahrheitswert | Prüft, ob das DynArray leer ist und gibt die Antwort zurück |
| getLerngth(): Ganzzahl | Gibt die Länge des DynArrays zurück |
| getItem(i: Ganzzahl): Inhaltstyp | Gibt den Inhalt des Elements mit dem Index i zurück |
| append(x: Inhaltstyp) | Erzeugt ein neues Element und hängt dieses mit dem Inhalt x hinten an |
| insertAt(i: Ganzzahl, x: Inhaltstyp) | Erzeugt ein neues Element und fügt es mit dem Inhalt x an der Posi tion i ein. Das vorherige Element an der Stelle i und alle folgenden werden eine Position nach hinten geschoben |
| setItem(i: Ganzzahl, x: Inhaltstyp) | Überschreibt den Inhalt des Elements an der Position i mit dem Inhalt x |
| delete(i: Ganzzahl) | Das Element an der Position i wird gelöscht. Alle nachfolgenden Elemente werden um eine Position vorgerückt |
-
Nach der erfolgreichen Simulation der Highscore starte nun der Betrieb des Online-Kart-Racers von Intendon und dessen Highscore. Sie haben als CODER („Chief Officer of Digital OrdER) die Aufgabe, entsprechende digitale Funktionalitäten zu implementieren. Es existiert bereits die Klasse
DynArray, welche eine Dynamische Reihung inklusive ihrer Operationen zur Verfügung stellt.
Jeder Fahrer der Highscore wird durch seine Farbe klassifiziert. - Der weiße Faherer fährt sich in die Highscore.
- Der beige Fahrer fährt direkt auf den 2. Platz der Highscore.
Implementieren Sie ein Programm HighscoreTest, in der Sie zunächst eine DynArray für die Highscore erstellen und deren Operation isEmpty testen.
Die ersten Fahrer haben die Rennen abgeschlossen und landen nun in der Highscore.
Fügen Sie die folgenden Farben der Highscore hinzu: rot, grün, blau und gelb
Lassen Sie sich die Farben der Fahrer auf den Plätzen ein und am letzten belegten Platz ausgeben.
Gleich zwei neue Fahrer machen die Highscore unsicher:
Der weiße Fahrer (letzte Platz der Highscore) ist so frustriert, dass er nicht besser wird und löscht seinen Account.
Entfernen Sie den weißen Fahrer aus der Liste.
Als Anreiz haben sich H. Herz und die Geschäftleitung G. Rowe von Ontendon überlegt, dass der erst platziert der Highscore eine besondere neue Farbe erhält, nämlich gold.
ändern Sie die farbe des Erst.Platzierten auf gold und lassen Sie sich die Farbe zur Kontrolle ausgeben.
Die Leitung von Intendon braucht für eine aktuelle Präsentation eine Liste der Highscore.
Lassen Sie sich die Highscore ausgeben. Hinweis: Eine while-Schleife ist hier nciht mehr sinnvoll. Denken Sie an die Reihungen zurück und welche Schleife wir dort verwendet haben.
Der blaue Fahrer hat gecheatet (betrogen) und soll aus der Highscore gelöscht werden.
Erstellen Sie einen Algorithmus, welcher den Fahrer sucht und anschließend löscht. Hinweis: Zeichenketten werden mit der Operation .equals() verglichen.
Da es in letter Zeit immer mal wieder zu Systemausfällen kommt, soll eine Backup-Highscore erstellt werden, welche eine Kopie der aktuellen Highscore darstellt.
Implementieren Sie einen Algorithmus zum Anlegen einer Kopie der aktuellen Highscore.
Die Saison ist vorbei und daher soll die Highscore für die nächsten Saison vorberiete werden, in dem alle Faherer entfernt werden.
Implmentieren Sie die Löschung der Highscore und Sie nach, dass alle Fahrer entfernt wurden.
- Nachdem der digitale Betrieb der Highscore seit einiger Zeit erfolgreich funktioniert, denkt die Geschäftsleitung nun über eine funktionale Erweiterung nach. Konkret geht es darum, Fahrer nicht mehr nur über die Farbe abzuspeichern, sondern das Datenmodell zu erweitern. Erneut sind Sie als CODER („Chief Officer of Digital OrdER) gefragt. Erstellen Sie hierfür eine neue Klasse HighscoreTest2. Die bereits bekannte DynArray-Implementierung können Sie weiterhin nutzen.
Implementieren Sie eine Klasse Fahrer, die einen Fahrer mit den Attributen Nickname (String), Highscorewert (Integer), Farbe (String) und ob der Fahrer in Besitz des Seasonpass ist (Wahrheitswert). Denken Sie auch an den Konstruktor und an geeignete Get- und Set-Operationen
Implementieren Sie die Klasse und fügen Sie in HighscoreTest2 fünf Fahrerer einer Dynamischen Reihung highscore hinzu.

