Programmkonstrukte
Beim Programmieren gibt es zentrale Programmkonstrukte. Diese Konzepte gibt es in praktisch jeder Programmiersprache, sie sind nur nicht immer gleich benannt und umgesetzt. Im Folgenden werden vier essenzielle Programmkonstrukte vorgestellt, die auch im Lehrplan 21 aufgegriffen werden.
Was ist Pseudocode
Programmiersprachen sind oft anders aufgebaut als normale Sprachen. Meistens sind sie am Anfang kaum zu verstehen. Deswegen wird für Menschen ohne Programmiererfahrung häufig Pseudocode verwendet. Pseudocode ist ein in normaler Sprache geschriebener Code. Das soll helfen, einen Algorithmus oder Ablauf zu verstehen, ohne eine Programmiersprache zu verwenden. Im Folgenden werden Beispiele in Pseudocode verwendet.
Schleifen
Schleifen sind im Grunde genommen Wiederholungen. Solche Wiederholungen begegnen uns im Alltag immer wieder. Angenommen, das Kochen müsste als Programm beschrieben werden, dann könnte der Pseudocode für das Schneiden der Kochzutaten so aussehen:
Nimm das Messer in deine Hand.
Bewege das Messer, bis du das Objekt, das geschnitten werden soll, berührst.
Drücke das Messer nach unten und bewege es dabei abwechselnd nach vorne und nach hinten, bis das Objekt durchgeschnitten ist.
Hebe das Messer nach oben.
Bewege das Messer einen Zentimeter nach links.
Bewege das Messer einen Zentimeter in Richtung des Objekts.
Drücke das Messer nach unten und bewege es dabei abwechselnd nach vorne und nach hinten, bis das Objekt durchgeschnitten ist...
Dabei werden einige Schritte mehrfach und in der gleichen Reihenfolge ausgeführt. Statt diese Schritte x-mal aufzuschreiben, könnte man angeben wie oft diese wiederholt werden sollen:
Wiederhole die folgenden Schritte zehn Mal:
1. Drücke das Messer nach unten und bewege es dabei abwechselnd nach vorne und nach hinten, bis das Objekt durchgeschnitten ist.
2. Hebe das Messer nach oben.
3. Bewege das Messer einen Zentimeter nach links.
So spart man sich eine Menge Schreibarbeit und deswegen werden Schleifen auch häufig in Programmiercode genutzt. Natürlich könnte man die Wiederholung auch 100 Mal, 1000 Mal oder unendlich lange ausführen lassen. Aber wird so jedes Objekt korrekt geschnitten? Vermutlich nicht. Hier kommt ein anderes, zentrales Programmierkonstrukt Spiel: die Fallunterscheidung (auch Bedingung oder Verzweigung genannt).
Fallunterscheidungen
Fallunterscheidungen sind vereinfacht gesagt Fragen, die mit ja oder nein beantwortet werden können. Im Pseudocode oben gibt es bereits eine Fallunterscheidung: «Bewege das Messer, bis du das Objekt, das geschnitten werden soll, berührst.»
Der Koch würde sich immer wieder fragen «Berühre ich schon das Objekt?» und diese Frage mit ja oder nein beantworten. Solange das Objekt nicht berührt wird, bewegt er das Messer näher zum Objekt. Sobald er das Objekt berührt, hält er an. Es gibt also zwei mögliche Handlungen, je nachdem, ob die Bedingung erfüllt ist oder nicht. Deswegen heissen Fallunterscheidungen auch Verzweigungen.
Für die Schneidebewegung kann also eine Bedingung gestellt werden:
Wiederhole die folgenden Schritte fortlaufend:
1. Bewege das Messer einen Zentimeter in Richtung des Objekts.
2. Falls du das Objekt berührst drücke das Messer nach unten und bewege es abwechselnd nach vorne und nach hinten.
Hebe das Messer nach oben.
Sonst: Beende das Programm
Jetzt muss der Koch nicht mehr x-mal das Nichts zerschneiden oder mit einer halb geschnittenen Karotte dastehen. Er schneidet das Objekt bis zum Ende indem er prüft, ob er immer noch ein Objekt berührt.
Variablen
Eine Variable ist zum Beispiel eine definierte Zahl, die verändert werden kann. Das Geld in deinem Portemonnaie könnte man als Variable darstellen. In vielen Programmiersprachen könnte man die Variable in dem Fall etwa «Geld_im_Portemonnaie» nennen. Angenommen, du hast 50 Franken. Dann könnte man «Geld_im_Portemonnaie=50» schreiben. Das Setzen dieses Ausgangswertes nennt man «Initialisierung». Bei der Initialisierung wird der Variable ein Anfangswert zugewiesen.
Eine Variable kann im Programm auch verändert werden. Wenn man 10 Franken mehr ins Portemonnaie steckt, hat man nachher das ursprüngliche Geld plus 10 Franken. In einer Programmiersprache könnte das so aussehen:
Geld_in_Portemonnaie = Geld_in_Portemonnaie + 10
Das Programm rechnet also 50 + 10 und weist den neuen Wert 60 der Variable «Geld_im_Portemonnaie» zu. Neu hat man also 60 CHF im Portmonnaie.
Variablen kann man beim Programmieren für verschiedenste Dinge brauchen. In einem Spiel kann man darin beispielsweise die bereits erzielten Punkte speichern, oder die Anzahl Leben oder das aktuelle Level.
Variablen können als Parameter verwendet werden. Ein Parameter ist eine Art Platzhalter, den man einer Funktion übergeben kann.
Funktionen und Parameter
Stell dir vor, du bist gerade dabei, einen Küchenroboter zu programmieren. Gerade hast du ihn programmiert, etwas zu schneiden – ein Vorgang, der aus mehreren Einzelschritten besteht. Jetzt könntest du diese Befehlszeilen immer wieder kopieren und an verschiedenen Stellen in deinem Programm einsetzen. Das braucht aber viel Platz und macht auch den Code schnell unübersichtlich. Wäre es nicht praktisch, wenn du dem Roboter einfach den Befehl «schneiden» geben könntest und er dann alle erforderlichen Einzelschritte ausführt?
Genau das macht eine Funktion. Eine Funktion ist ein Unterprogramm, mit dem ein oder mehrere Befehle gebündelt angewiesen werden können. Fürs Kochen könnte es zum Beispiel die Funktion «schneiden» geben, die die einzelnen Bewegungen des Messers umfasst. Vielleicht hat der Küchenroboter zudem Funktionen wie «braten», «kochen» oder «würzen».
Einem Koch könnte man sagen: «Schneide mal drei Karotten.» Geht das bei einem Roboter oder einem Programm auch? Ja. Man kann eine Funktion definieren, die mehrfach ausgeführt werden kann und dabei bestimmte Objekte benutzt. Das ist in diesem Fall der Unterschied zu einer Schleife. Beim Kochroboter könnte man den Pseudocode von oben nehmen und eine Funktion daraus bauen:
schneide (Anzahl Wiederholungen, Objekt)
In dieser Funktion «schneide (Anzahl Wiederholungen, Objekt)» könnte man die folgenden Befehle bündeln:
1. Wiederhole das Folgende Programm (Anzahl Wiederholungen) mal:
2. Nimm das (Objekt) und wiederhole die folgenden Schritte fortlaufend:
a. Falls du das (Objekt) berührst, drücke das Messer nach unten und bewege es abwechselnd nach vorne und nach hinten, bis das Objekt durchgeschnitten ist.
b. Hebe das Messer nach oben.
c. Bewege das Messer einen Zentimeter nach links.
Sonst: Beende diesen Durchgang und gehe zu Schritt 2.
Jetzt könnte diese Funktion aufgerufen werden, indem man hinzufügt, was wie oft geschnitten werden soll: «schneide(3, Karotte)». In dem Fall würde der Roboter drei Karotten zerschneiden.
In diesem Beispiel sind «Anzahl_Wiederholungen» und «Objekt» die Parameter der Funktion. Sobald man die Funktion aufruft, kann man per Parameter festlegen was die Funktion tun soll. Zum Beispiel genau drei Karotten zerschneiden. Das praktische an Funktionen ist, dass man diese nun mit anderen Parametern ausführen kann. Andere Aufrufe der gleichen Funktion könnten beispielsweise sein:
schneide(2, Zucchetti)
schneide(4, Tomaten)
schneide(3, Peperoni)
schneide(1, Aubergine)
Und fertig geschnibbelt ist das Ratatouille!
Praktische Aufgabe
Auf der Webseite der PH Zürich findest du eine Einleitung zum Programmieren mit Scratch. Nutze Scratch, um die oben genannten Programmkonstrukte auszuprobieren.