Übungsstunde
Aufbau und Handhabung der Liste 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 einer Liste in dein eigenes Spiel einbauen | Spielwerkstatt: ein Inventar und die Mechaniken mit einer Liste |
Beide Wege üben dasselbe: eine Liste über ihre Methoden benutzen. Du kannst sie auch wechseln.
Stufe 1: Zustand verfolgen
Das Programm erzeugt eine Liste und verändert sie. Setze die Schritte im Objektdiagramm unter dem Programm um. Achte besonders darauf, wohin current zeigt.
List<String> farbenListe = new List<String>();
// 1. Diagramm
farbenListe.append("Rot");
farbenListe.append("Blau");
farbenListe.append("Gelb");
// 2. Diagramm
farbenListe.toFirst();
farbenListe.next();
farbenListe.remove();
farbenListe.next();
farbenListe.insert("Grün");
farbenListe.append("Orange");
// 3. Diagramm
Stufe 2: Code und Struktogramme lesen
In der Liste stehen Anna, Ben, Cem und Dora.
a) Was liefert raten(liste)? Beschreibe in einem Satz, was die Methode allgemein tut.
int raten(List<String> pListe) {
int ergebnis = 0;
pListe.toFirst();
while (pListe.hasAccess()) {
if (pListe.getContent().length() > 3) {
ergebnis++;
}
pListe.next();
}
return ergebnis;
}
b) In der Liste stehen Anna und Ben. Wie sieht sie aus, nachdem verdoppeln aus dem Struktogramm aufgerufen wurde?
c) Schreibe verdoppeln als Java-Methode void verdoppeln(List<String> pListe).
Stufe 3: Fehler finden
Jede der drei Methoden enthält genau einen Fehler. Beschreibe, was beim Aufruf mit der Liste Anna, Anna, Ben passiert, und verbessere die Methode.
a) Die Methode soll alle Namen ausgeben.
void ausgeben(List<String> pListe) {
pListe.toFirst();
while (pListe.hasAccess()) {
IO.println(pListe.getContent());
}
}
b) Die Methode soll jedes Vorkommen von pWert entfernen.
void entferneAlle(List<String> pListe, String pWert) {
pListe.toFirst();
while (pListe.hasAccess()) {
if (pListe.getContent().equals(pWert)) {
pListe.remove();
}
pListe.next();
}
}
c) Die Methode soll das erste Element liefern. Direkt nach dem Füllen der Liste liefert sie null. Warum?
String erstes(List<String> pListe) {
return pListe.getContent();
}
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(List<Integer> pZahlen) liefert die Summe aller Zahlen.
b) int zaehle(List<String> pListe, String pGesucht) liefert, wie oft pGesucht vorkommt.
c) int maximum(List<Integer> pZahlen) liefert die größte Zahl. Die Liste enthält mindestens eine Zahl.
d) String letztes(List<String> pListe) liefert das letzte Element, bei einer leeren Liste null. Es geht ohne Schleife.
e) void vertauschen(List<String> pListe, int pPos1, int pPos2) vertauscht die Elemente an den Stellen pPos1 und pPos2, gezählt ab 0. Hat die Liste nicht genügend Elemente, passiert nichts.
f) Bevor du vertauschen programmierst: Entwirf im Editor zuerst ein Struktogramm. Setze es danach um.
Tipp: vertauschen
Geh die Liste zweimal durch und zähle dabei die Stelle mit.
- Beim ersten Durchlauf merkst du dir die beiden Inhalte an
pPos1undpPos2. Hast du danach nicht beide gefunden, ist die Liste zu kurz. - Beim zweiten Durchlauf setzt du mit
setContentanpPos1den zweiten und anpPos2den ersten Inhalt.
Stufe 5: Knobelaufgabe
Doppelte entfernen. Implementiere void entferneDoppelte(List<String> pListe). Jeder Name soll danach nur noch einmal vorkommen, und zwar an der Stelle seines ersten Auftretens. Aus Anna, Ben, Anna, Cem, Ben wird Anna, Ben, Cem.
Die Schwierigkeit: Die Liste hat nur ein aktuelles Element. Wer beim Prüfen „kam der Name schon vor?“ in derselben Liste sucht, verliert die Stelle, an der er gerade steht.
Tipp
Lege eine zweite Liste gesehen an. Darin sammelst du jeden Namen, der dir zum ersten Mal begegnet. Steht der aktuelle Name schon in gesehen, wird er entfernt. Das Suchen in gesehen bewegt nur deren aktuelles Element – deine Stelle in pListe bleibt erhalten.