Containerschiffe

Ein Containerschiff ist ein speziell für den Transport von Containern gebautes Frachtschiff. Die Container sind genormte Behälter, die auf vorgesehenen Plätzen aufeinander gestapelt werden. Ein besonderer Schiffstyp, das sogenannte Feederschiff, hat nur eine geringe Anzahl von Plätzen zur Aufnahme von Containern und kann somit auch kleine Häfen anlaufen.

Eine Reederei besitzt mehrere Feederschiffe mit jeweils genau zwei Stapelplätzen. Die Plätze werden auf jedem Schiff mit platzA und platzB bezeichnet. Jeder Platz kann genau einen Containerstapel aufnehmen. Ein Container auf einem solchen Stapel darf nicht mehr als 28 t wiegen.

(A1)

Das Schiff soll möglichst ausgeglichen beladen werden. Aus diesem Grund werden neue Container immer auf dem leichteren Stapel abgelegt, bei gleich schweren Stapeln auf platzA.

Die Reederei möchte die Frachten der Feederschiffe mit einem objektorientierten Computerprogramm verwalten. Das folgende Diagramm zeigt die beteiligten Klassen. Die Klasse Containerstapel stellt dabei eine Erweiterung des ADT Stapel dar:

Erläutere, welche Auswirkungen die Methoden push und pop auf einen Stapel haben. Begründe, warum für diese Aufgabenstellung die Modellierung mit einem Stapel sinnvoll ist.

Die Klasse Containerstapel besitzt die Methode getGesamtgewicht(): double. Implementiere diese Methode in Java. Beachte dabei, dass hierfür keine zusätzlichen Attribute in die Klasse Containerstapel eingefügt werden dürfen.

(A2)

Das Schiff soll möglichst ausgeglichen beladen werden. Aus diesem Grund werden neue Container immer auf dem leichteren Stapel abgelegt, bei gleich schweren Stapeln auf platzA.

Implementiere die Methode aufladen(neu:Container) in der Klasse Schiff, die den übergebenen Container jeweils auf dem bisher leichteren der beiden Stapel ablegt, bzw. auf platzA, wenn beide Stapel gleich schwer sind.

(A3)

Eine experimentelle Lademethode aufladen2(neu:Container) beruht auf dem folgenden Algorithmus, hier notiert in Pseudocode. Er soll nur dann angewendet werden, wenn auf beiden Plätzen mindestens ein Container liegt. Die Prüfung, ob beide Stapel Container enthalten, ist hier nicht vorgesehen.

a = platzA.getGesamtgewicht();
b = platzB.getGesamtgewicht();
c = neu.getGewicht();
wenn (a < b)
wenn (a + c > b + 20)
platzA.push(platzB.pop());
platzB.push(neu);
sonst
platzA.push(neu);
ende wenn
sonst
wenn (b + c > a + 20)
platzB.push(platzA.pop());
platzA.push(neu);
sonst
platzB.push(neu);
ende wenn
ende wenn

Bei einem Ladevorgang befinden sich zu Beginn auf platzA und platzB je ein Container mit 10 t. Es sollen nun drei Container mit den Gewichten in der Reihenfolge 21 t, 27 t und 20 t geladen werden.

Stelle das Ergebnis des Ladevorgangs in einer Skizze dar.

Vergleiche die beiden Ladealgorithmen für die gegebene Containerreihenfolge schrittweise hinsichtlich der Ungleichheit der Stapelgewichte. Welche Schlussfolgerungen kannst du ziehen?

Diskutiere Vor- und Nachteile der experimentellen Lademethode.

(A4)

Zur Vorbereitung des Ladevorgangs wird eine Ladeliste erstellt, in der die Container – bezogen auf die Zielhäfen – in umgekehrter Reihenfolge notiert werden, damit die Container, die zuerst ausgeladen werden müssen, ganz oben stehen. Neu hinzu kommende Container werden an der richtigen Stelle in die Liste eingefügt. Dafür bietet eine verbesserte Containerstapel-Klasse eine Methode einfuegenAnKorrekterPosition(c:Container) an.

Beschreibe, wie innerhalb der Methode die Verkettung der Objekte verändert werden muss, um ein neues Objekt innerhalb einer verketteten Liste einzufügen.

Veranschauliche deine Beschreibung unter Verwendung einer aussagekräftigen Skizze.