Informatik

Ü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.

Auflösung. Erfrage das Passwort bei deiner Lehrkraft.

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).

Auflösung. Erfrage das Passwort bei deiner Lehrkraft.

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);
}
Auflösung. Erfrage das Passwort bei deiner Lehrkraft.

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.
Lösung. Erfrage das Passwort bei deiner Lehrkraft.

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 Stelle i, 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.
Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Selbsttest

Übungsstunde

Teilbare URL erstellen

Abschnitte auswählen