Hello Dart: Einführung in die Programmierung (Deutsch)

Teil 5: Funktionen

Rotkäppchen

Es war einmal ein kleines Mädchen, das immer ein rotes Käppchen trug. Darum hiess es bei allen Leuten nur „Rotkäppchen". Eines Tages sagte die Mutter zu dem Kind: "Rotkäppchen, heute hat Deine Grossmutter Geburtstag. Back ihr doch ihren Lieblingskuchen, nimm eine Flasche vom guten alten Wein aus dem Keller, leg alles in einen Korb und geh sie besuchen."

Helfen Sie Rotkäppchen beim Kuchenbacken! Gleichzeitig erweitern wir dabei unsere Kenntnisse über Funktionen.

Funktionen mit Parametern

Über Parameter können einer Funktion Werte übergeben werden. So kann man bei folgender Funktion angeben, wie viele Schritte der Spieler gehen soll:

multiMove(int steps) {
  int i = 0;

  while (i < steps)     {
    move();

    i = i + 1;
  }
}

Um z.B. 5 Schritte zu gehen, wird beim Aufruf der Funktion der Wert 5 in der Klammer angegeben:

multiMove(5);

Um eine Funktion mit mehreren Parametern aufzurufen, werden die Werte durch Kommas getrennt.

drawRectangle(21, 4);

Erklärungen

  1. Bei den bisherigen Programmen war es eher lästig, die Funktionen immer mit einem Klammerpaar () zu versehen. Nun wird klar, dass die bisher eingesetzten Funktionen nur Spezialfälle darstellten, bei denen kein Parameter übergeben wird.
  2. In der Klammer wird der Parameter (hier steps) mit einem Typ angegeben (hier int). Mehrere Parameter werden durch Kommas getrennt. Beispiel:
drawRectangle(int width, int height)
  1. Beim Aufruf einer Funktion wird der Wert in die Variable (hier width und height) kopiert.
Wichtig: Wenn Funktionen innerhalb einer Klasse stehen (was meist der Fall ist), dann werden diese oft auch Methoden genannt!

Kuchen backen

Wir wollen nun mit unserem Spieler für die Grossmutter einen Geburtstagskuchen “backen”. Der Kuchen wird aus Sternen bestehen.

AUFGABE 5.01: Baking a Cake

Baking a Cake

Als Vorbereitung für das Backen sollen folgende Methoden zur Verfügung gestellt werden:

  1. turnAround()
    Dreht den Spieler um 180 Grad.

  2. multiMove(int steps)
    Der Spieler geht die Anzahl Schritte (steps) in die aktuelle Blickrichtung (siehe Beispiel im Theorieteil oben).

  3. putStars(int count)
    Der Spieler legt die Anzahl (count) Sterne. Der erste Stern legt er an der aktuellen Position, die weiteren fortgesetzt in seine Blickrichtung.

Der Spieler soll mit Sternen ein Rechteck zeichnen, welches den Kuchen symbolisiert.

Der Spieler startet in der Ecke unten links. Der Spieler soll nicht nur eine fixe Grösse eines Rechteckes zeichnen können, sondern ein Rechteck mit variabler Breite und Höhe! Der Funktionsaufruf drawRectangle(21, 4) soll demnach ein Rechteck mit der Breite 21 und der Höhe 4 erzeugen.

AUFGABE 5.02: Candles on Cake

Candles on Cake

Damit unser Kuchen auch wie ein Geburtstagskuchen aussieht, braucht er natürlich noch ein paar Kerzen. Erweitern Sie Ihr Programm um eine zusätzliche Funktion drawCandles(int count), welche die angegebene Anzahl Kerzen auf den Kuchen setzt.

Funktionen mit Rückgabewerten

Über den Rückgabewert kann eine Funktion einen Wert als Ergebnis zurückliefern. So errechnet die folgende Funktion die angegebenen Zahl mal zwei und gibt das Resultat zurück:

int twoTimes(int number) {
  return 2 * number;
}

Das Resultat kann entweder in eine Variable gespeichert oder direkt wie folgt verwendet werden:

multiMove(twoTimes(4));

Erklärungen

  1. Der Typ des Rückgabewerts (hier int) wird vor dem Namen der Funktion angegeben. Wenn die Funktion keinen Rückgabewert enthält, wird das meist mit void ausgedrückt.
  2. Die Rückgabe eines Wertes in einer Funktion geschieht mit return, gefolgt vom Wert.

AUFGABE 5.03: Candles for Age

Wir möchten der Grossmutter für jedes Jahrzehnt eine Kerze auf den Kuchen stecken. Da Rotkäppchen nicht genau weiss, wie alt die Grossmutter wird, muss es zuerst ihre Mutter fragen.

Programmieren Sie eine Funktion howOldIsGrandma(), die das Alter der Grossmutter zurückgibt. Mit Hilfe dieser Funktion soll dann für jedes Jahrzehnt eine Kerze auf dem Kuchen platziert werden.

Hinweis: Bei der Division von zwei Zahlen entsteht in Dart immer ein double. Damit wir wieder einen int erhalten, können wir die Funktion toInt() oder round() verwenden.
Beispiel: (5 / 3).toInt()

AUFGABE 5.04 (schwierig): Layered Cake

Candles on Cake

“Backen” Sie mit unserem Spieler eine Torte mit einer Schicht für jedes Jahrzehnt, das die Grossmutter über 50 ist. Jede Schicht soll zwei Zeilen haben und soll auf beiden Seiten um zwei Sternen nach innen gerückt sein.


Ende … und wie weiter?

Erfahren Sie die nächsten Schritte.


Quellen
Planet Cute Bilder stammen von Daniel Cook (Lostgarden.com), veröffentlicht unter CC BY 3.0.
Oleg Yadrov hat die “Planet Cute” Bilder weiterentwickelt und mir zur Verfügung gestellt. Optimiert wurden sie mit dem grossartigen TexturePacker.
Einige Übungen in Hello Dart sind inspiriert von Kara. Kara wurde entwickelt von Jürg Nievergelt, Werner Hartmann, Raimond Reichert und anderen.