Listen

Bisher haben wir Variablen verwendet, um einzelne Werte zu speichern, die während der Programmausführung gelesen und geändert werden können. In vielen Situationen ist es aber nötig, mehrere Werte zu speichern, deren Anzahl variabel ist – zum Beispiele eine Menge von Vokabeln, die in einem Quiz in zufälliger Reihenfolge abgefragt werden sollen.

In dieser Lektion werden wir uns mit einer einfachen Datenstruktur beschäftigen, die es ermöglicht, mehrere Werte in einem Objekt zu speichern: die sogenannte “Liste”. Listenobjekte werden in Scratch ähnlich wie Variablen verwendet, mit dem Unterschied, dass in einer Liste beliebig viele Werte gleichzeitig gespeichert werden können, in einer Variablen zu jedem Zeitpunkt nur einer.

Listen

Eine Liste ist in der Programmierung eine lineare Datenstruktur zur Speicherung von mehreren Werten. Jedes Element der Liste ist durch eine Nummer identifiziert, die seine Position in der Liste beschreibt. In Scratch werden die Positionen der Elemente von 1 an aufsteigend durchnummeriert. Die Länge einer Liste ist die Anzahl der in ihr gespeicherten Elemente. Bei einer Liste der Länge 6 enthält das Element mit der Nummer 1 den ersten Wert in der Liste und das Element mit der Nummer 6 den letzten Wert.

Die Besonderheit einer Liste ist, dass während der Programmausführung Elemente zur Liste hinzugefügt und vorhandene Elemente aus der Liste gelöscht werden können – sie hat also keine statische, feste Länge, sondern eine dynamische Länge. Um Elemente hinzuzufügen (am Ende oder an einer beliebigen Position innerhalb der Liste) oder zu löschen gibt es bestimmte Anweisungen:

  • Hänge Wert x an Liste an: Ein neues Element mit dem Wert x wird an die Liste angehängt, also an Position n+1, wenn n die alte Länge der Liste ist. Die Länge der Liste wächst dabei um 1.
  • Füge Wert x bei Position i ein: Hier wird ein neues Element mit dem Wert x in die Liste eingefügt, so dass sich das neue Element an Position i befindet. Alle ab dieser Position vorhandenden Elemente werden dabei um eine Position nach hinten verschoben, und die Länge der Liste wächst um 1. Für die Einfügeposition i muss dabei 1 ≤ i ≤ n gelten, wobei n die alte Länge der Liste ist.
  • Lösche Element an Position i: Hier wird das Element an Position i aus der Liste entfernt. Alle folgenden Elemente werden also um eine Position nach vorne verschoben, und die Länge der Liste schrumpft um 1. Hier muss für die Löschposition 1 ≤ i ≤ n gelten, wobei n die alte Länge der Liste ist.
  • Ändere Wert an Position i zu x: Hier wird der Wert des Elements an Position i durch den angegebenen Wert x überschrieben. Dabei ändert sich die Länge der Liste nicht. Für die Position i muss 1 ≤ i ≤ n gelten, wobei n die Länge der Liste ist.

Definition und Zuweisung

Eine neue Liste muss zunächst definiert werden. Dazu wird in Scratch die Schaltfläche “Neue Liste” in der Block-Kategorie “Variablen” ausgewählt und ein eindeutiger Bezeichner für die neue Liste vergeben – am besten ein aussagekräftiger Name, der angibt, was die Liste im Programm bedeutet (zum Beispiel “Punkte” für die aktuellen Punktestände aller Teilnehmenden in einem Spiel). Anschließend erscheint ein neuer Werteblock mit dem Namen der neuen Liste in der Block-Bibliothek.

Durch Ankreuzen des Kästchens links neben dem Werteblock können die Werte, die momentan in der Liste gespeichert sind, live auf der Bühne angezeigt werden (wie wir es beispielweise auch von Variablen-Werteblöcken kennen). Hier lassen sich auch manuelle Einträge der Liste ändern, löschen und hinzufügen. Per Rechtsklick auf die Anzeige lassen sich auch Einträge aus einer Textdatei importieren.

Auf eine Liste kann nun in Anweisungen und Ausdrücken über den entsprechenden Listenblock zugegriffen werden.

Anweisungen für Listen

Die oben beschriebenen Anweisungen zum Arbeiten mit Listen sind in Scratch durch die folgenden Anweisungsblöcke durchführbar:

BlockHängt ein neues Element mit dem angegebenen Wert an die ausgewählte Liste an (Auswahl der Liste über das Symbol ▾). Hier wird bespielsweise ein neues Element mit dem Text “Ding” als Wert an die Liste namens “meine Liste” angehängt.
BlockLöscht das Element an der angegebenen Position aus der Liste. Hier wird das erste Element aus der Liste gelöscht, und alle anderen Elemente rücken um eine Position vor.
BlockLöscht alle Elemente aus der ausgewählten Liste.
BlockFügt ein neues Element mit dem angegebenen Wert an der angegebenen Position in die Liste ein. Hier wird ein neues Element mit dem Text “Ding” als Wert ganz vorne eingefügt, und alle anderen Element rücken um eine Position nach hinten.
BlockÜberschreibt den Wert an der angegebenen Position durch den angegebenen Wert. Hier wird der Wert des ersten Elements in der Liste durch den Text “Ding” ersetzt.

Ausdrücke mit Listen

Daneben gibt es eine Reihe von Werteblöcken, mit denen die Werte der Listenelemente oder andere Eigenschaften der Liste (z. B. ihre Länge) abgefragt werden können:

BlockGibt den Wert des Elements an der angegebenen Position in der ausgewählten Liste an.
BlockGibt als Wert die Position des angegebenen Wertes in der ausgewählten Liste an. Wenn der angegebene Wert mehrmals in der Liste vorkommt, wird die Position des ersten Vorkommens ermittelt.
BlockGibt als Wert die Länge der ausgewählten Liste an (d. h. die Anzahl ihrer Elemente).
BlockGibt als Wahrheitswert an, ob die ausgewählte Liste den angegebenen Wert (mindestens einmal) enthält.

Globale und private Listen

Genau wie Variablen können Listen als globale oder private Listen definiert werden.

  • Eine globale Liste ist ein globales Objekt, das es nur einmal gibt und gemeinsam von allen Objekten genutzt werden kann. Der Bezeichner jeder globalen Liste ist eindeutig, es kann also keine zweite globale Liste mit demselben Namen geben. Globale Listen verhalten sich also wie globale Variablen.
  • Eine private Liste gehört zu einem Objekt, genau wie eine Objektvariable oder ein Attribut. Jedes Objekt hat also seine eigenen privaten Listen, auch wenn diese gleich heißen. Auf eine private Liste kann nur dasjenige Objekt zugreifen, zu dem diese Liste gehört.1

Beim Erzeugen eines neuen Listenobjekts über die Schaltfläche “Neue Liste” erscheint ein Dialog, in dem ausgewählt werden kann, ob eine globale Liste (“Für alle Figuren”) oder eine private Liste für die aktuell ausgewählte Figur (“Nur für diese Figur”) erzeugt werden soll:

Um zu entscheiden, ob eine Liste global oder privat definiert werden soll, gelten dieselben Regeln wie für Variablen (Stichwort “Datenkapselung”): Ist die Information innerhalb der Liste nur für ein bestimmtes Objetk relevant, so dass der Zugriff auf dieses Objekt beschränkt werden kann? Oder soll sie von mehreren Objekten gemeinsam oder unabhängig von Objekten genutzt werden?

Anwendungsbeispiele

Fachkonzepte

Lineare Datenstrukturen

Iteration durch Listen

Fingerübungen

Vorbereitung für vertiefende Aufgaben

  • Einzelnes Zeichen eingeben
    • nur Ziffern 0–9
    • nur Buchstaben A–Z
  • Zeichen in einem String ersetzen
  • Zeichen aus einem String löschen

  1. Das unterscheidet private Listen von Objektvariablen: Der Wert einer Objektvariablen kann in Skripten anderer Objekte abgefragt werden, aber nicht geändert werden. Private Listen sind für andere Objekte dagegen vollständig unzugänglich. ↩︎