Übungsstunde
Aufbau und Handhabung des Stapels habt ihr gemeinsam erarbeitet. In dieser Stunde suchst du dir einen von zwei Wegen aus.
| Weg | Was du machst | Wohin |
|---|---|---|
| Sicher werden | kleine Aufgaben ohne Projekt, Schritt für Schritt schwieriger, mit Tests zur Rückmeldung | weiter auf dieser Seite |
| Im Spiel anwenden | eine Mechanik mit einem Stapel in dein eigenes Spiel einbauen | Spielwerkstatt: Kisten schieben und zurücknehmen und die Mechaniken mit einem Stapel |
Beide Wege üben dasselbe: einen Stapel über seine vier Methoden benutzen. Du kannst sie auch wechseln.
Stufe 1: Zustand verfolgen
Auf beiden Stapeln liegt schon etwas – das zuletzt Genannte oben. Sage für jede Folge voraus, was top() und isEmpty() liefern, trage es ein und lass die Folge ablaufen. Zeichne nach jedem Schritt den Stapel.
Stufe 2: Code und Struktogramme lesen
Auf den Stapel wurden nacheinander "a", "b" und "c" gelegt.
a) Was liefert raten(stapel)? Beschreibe in einem Satz, was die Methode allgemein tut.
b) Ist der Stapel nach dem Aufruf noch derselbe?
String raten(Stack<String> pStapel) {
String ergebnis = "";
while (!pStapel.isEmpty()) {
ergebnis = ergebnis + pStapel.top();
pStapel.pop();
}
return ergebnis;
}
c) Auf einem Stapel liegen Anna, Ben und Cem, Cem oben. Wie sieht er aus, nachdem tauscheOben aus dem Struktogramm aufgerufen wurde?
d) Wozu dient der innere Sonst-Zweig?
e) Schreibe tauscheOben als Java-Methode void tauscheOben(Stack<String> pStapel).
Stufe 3: Fehler finden
Jede der drei Methoden enthält genau einen Fehler. Beschreibe, was beim Aufruf mit dem Stapel Anna, Ben, Cem (Cem oben) passiert, und verbessere die Methode.
a) Die Methode soll alle Namen ausgeben.
void ausgeben(Stack<String> pStapel) {
while (!pStapel.isEmpty()) {
IO.println(pStapel.top());
}
}
b) Die Methode soll die Anzahl liefern und den Stapel erhalten.
int anzahl(Stack<String> pStapel) {
Stack<String> hilf = new Stack<String>();
int zaehler = 0;
while (!pStapel.isEmpty()) {
hilf.push(pStapel.top());
pStapel.pop();
zaehler++;
}
return zaehler;
}
c) Die Methode soll liefern, ob oben pWert liegt. Mit Anna, Ben, Cem funktioniert sie. Wann nicht?
boolean obenIst(Stack<String> pStapel, String pWert) {
return pStapel.top().equals(pWert);
}
Stufe 4: Methoden schreiben
Implementiere die Methoden der Klasse Uebungen, bis alle Tests im Reiter Testrunner grün sind. Fang oben an – die Aufgaben werden nach unten schwieriger.
a) int summe(Stack<Integer> pZahlen) liefert die Summe aller Zahlen. Der Stapel darf dabei leer werden.
b) int zaehle(Stack<String> pStapel, String pGesucht) liefert, wie oft pGesucht vorkommt. Der Stapel bleibt unverändert.
c) int maximum(Stack<Integer> pZahlen) liefert die größte Zahl. Der Stapel enthält mindestens eine Zahl und bleibt unverändert.
d) void entferneAlle(Stack<String> pStapel, String pWert) entfernt jedes Vorkommen von pWert. Die übrigen Elemente behalten ihre Reihenfolge.
e) Stack<String> kopie(Stack<String> pStapel) liefert einen neuen Stapel mit denselben Elementen in derselben Reihenfolge. Der übergebene Stapel bleibt unverändert.
f) Bevor du kopie programmierst: Entwirf im Editor zuerst ein Struktogramm. Setze es danach um.
Tipp: Welches Muster brauche ich?
Schau im Werkzeugkasten nach.
- summe darf den Stapel leeren – das Muster Abarbeiten genügt.
- zaehle und maximum sollen den Stapel erhalten – das Muster Erhalten. Beim Maximum startest du mit dem obersten Element, nicht mit 0.
- entferneAlle ist das Muster Erhalten mit einer Bedingung: Was entfernt werden soll, kommt nicht auf den Hilfsstapel.
- kopie: Auf dem Hilfsstapel liegt alles verkehrt herum. Lege die Elemente deshalb erst beim Zurückschichten zusätzlich auf die Kopie.
Stufe 5: Knobelaufgabe
Rechnen ohne Klammern. In der umgekehrten polnischen Notation (UPN) steht das Rechenzeichen hinter den beiden Zahlen: 34+ bedeutet 3 + 4, und 34+2* bedeutet (3 + 4) · 2 = 14. Klammern braucht man nie.
Ausgewertet wird mit einem Stapel: Eine Zahl wird aufgelegt. Ein Rechenzeichen nimmt die beiden obersten Zahlen herunter, rechnet und legt das Ergebnis auf. Am Ende liegt das Ergebnis allein auf dem Stapel.
Implementiere int upn(String pAusdruck) für einstellige Zahlen und die Zeichen +, - und *. Beispiele: 34+2* ergibt 14, 52- ergibt 3, 234*+ ergibt 14.
Tipp
pAusdruck.substring(i, i + 1)liefert das Zeichen an der Stellei,Integer.parseInt(...)macht daraus eine Zahl.- Bei
52-liegt die 2 oben. Die zuerst heruntergenommene Zahl ist also die rechte: 5 − 2, nicht 2 − 5.