Informatik

Containerterminal: Der Kran

Ein Portalkran fährt über gestapelte Container im Hafen Wörth.

Foto: Hozro, „Hafen Wörth, Kran Containerterminal (2)“, CC0 1.0, über Wikimedia Commons

Im Hafen stehen die Container in Stapeln. Der Portalkran fährt über die Stapel und greift einen Container immer von oben – an einen Container weiter unten kommt er nicht heran. Jeder Containerstapel ist also ein Stapel im Sinne der Informatik.

In diesem Kapitel baust du ein Terminal mit drei Stapeln und einer Freifläche in Java nach. Auf dieser Seite programmierst du den Kran selbst; auf den folgenden Seiten benutzt du ihn, um möglichst geschickt Container auf Lkw zu verladen.

Das Terminal in Java

Die Klasse Terminal

Das Terminal hat drei Stapel und eine Freifläche – jeweils ein Objekt der Abiturklasse Stack<Container>. Sie werden über eine Nummer angesprochen: 1, 2, 3 sind die Stapel, 0 ist die Freifläche. Die Stapel 1 bis 3 tragen höchstens vier Container, auf die Freifläche passt beliebig viel.

Methode Was sie tut
Container oben(int pStapel) der oberste Container oder null
int hoehe(int pStapel) Anzahl der Container auf dem Stapel
boolean istVoll(int pStapel) Stehen schon vier Container auf dem Stapel? Die Freifläche ist nie voll.
Stack<Container> stapel(int pStapel) eine Kopie des Stapels zum Nachsehen
void verladen(int pVon) verlädt den obersten Container auf einen Lkw
void umsetzen(int pVon, int pNach) setzt den obersten Container auf einen anderen Stapel – Aufgabe 2
int finde(String pNummer) Stapel, in dem der Container steht: 1 bis 3, 0 = Freifläche, -1 = nicht im Terminal – Aufgabe 3

Ein Container kennt seine Nummer: getNummer(). Unmögliche Bewegungen – etwa von einem leeren Stapel – führt der Kran nicht aus. Er meldet sie mit „Nicht moeglich: …“ und zählt einen Fehlversuch.

Der Startzustand im Konstruktor (jeweils von unten nach oben):

Stapel 1 Stapel 2 Stapel 3 Freifläche (0)
0815, 4711, 2001 1234, 3003 5005 leer

Aufgabe 1: Die Klasse untersuchen

a) Starte main. Beschreibe, was terminal.verladen(3) mit dem Terminal macht.

b) Erläutere, warum hoehe auf einer Kopie des Stapels zählt und nicht auf dem Stapel selbst. Welches Muster aus Mit dem Stapel arbeiten steckt in hoehe?

c) Die Methode gib ist private. Begründe, warum der Kran von außen nur über die Nummern 0 bis 3 angesprochen wird und niemand direkt an die Stapel s1 bis s3 kommt.

Aufgabe 2: Umsetzen

Implementiere umsetzen(int pVon, int pNach): Der oberste Container von Stapel pVon kommt oben auf Stapel pNach. Halte jede Bewegung mit merke("umsetzen(" + pVon + "," + pNach + ")") fest.

Berücksichtige die Grenzfälle – dann ruft die Methode fehlversuch(…) auf und bewegt nichts:

  • pVon und pNach sind derselbe Stapel,
  • Stapel pVon ist leer,
  • Stapel pNach ist voll.

Deine Methode stimmt, wenn im Reiter Testrunner die drei Tests testUmsetzen… grün sind.

Tipp 1: Vorbild verladen

verladen ist fast dasselbe: Grenzfall prüfen, fehlversuch aufrufen und mit return abbrechen – sonst den obersten Container vom Stapel nehmen. Bei umsetzen landet er nicht auf dem Lkw, sondern auf einem anderen Stapel.

Tipp 2: Die Reihenfolge

Erst nachsehen, dann entfernen: gib(pNach).push(gib(pVon).top()); und danach gib(pVon).pop();. Andersherum ist der Container weg, bevor er abgelegt wurde.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Aufgabe 3: Einen Container finden

Implementiere finde(String pNummer): Die Methode liefert die Nummer des Stapels, in dem der Container steht – 1 bis 3 oder 0 für die Freifläche. Steht er nirgends, liefert sie -1. Beim Suchen darf sich im Terminal nichts bewegen.

Deine Methode stimmt, wenn die Tests testFinde und testFindeFreiflaeche grün sind. Der Test testZusatzAnzahlDarueber darf rot bleiben, solange du den Zusatz nicht bearbeitest.

Tipp 1: Nachsehen in der Kopie

Gehe mit einer Schleife über die Nummern 0 bis 3. Hol dir für jede Nummer mit stapel(i) eine Kopie und baue sie ab wie beim Muster Abarbeiten. Die Kopie darfst du leeren – das Terminal merkt davon nichts.

Tipp 2: Früh aufhören

Sobald oben auf der Kopie der gesuchte Container steht, ist die Antwort klar: return i;. Erst wenn alle vier Kopien abgebaut sind, ohne dass er auftauchte, gibt es ihn nicht – das return -1; steht deshalb hinter der Schleife. Texte vergleichst du mit equals.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Zusatz: Wie viele stehen im Weg?

Implementiere anzahlDarueber(String pNummer): Die Methode liefert, wie viele Container über dem gesuchten stehen – so oft müsste der Kran umsetzen, bevor er ihn verladen kann. Steht der Container nicht im Terminal, liefert sie -1. Benutze finde.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Weiter geht es mit Containerterminal: Planen: Jetzt kostet jede Kranbewegung Geld.

Containerterminal: Der Kran

Teilbare URL erstellen

Abschnitte auswählen