funciones-con-retorno-bitbloq

Die Spiegel täten gut daran, sich ein wenig zu besinnen, ehe sie die Bilder zurückwerfen.

Jean Cocteau

In der vorigen Lektion haben wir gelernt was eine Funktion ist und wofür sie verwendet werden kann. Dabei wurde auch die folgende Funktionsart erwähnt: Funktionen mit Ausgabe. Von diesen handelt dieser Beitrag. Seid ihr bereit, noch tiefer in die Kunst des Programmierens mit Funktionen einzutauchen? Wollt ihr zu wahren Zauberkünstlern im Programmieren werden? Oder wollt ihr vielleicht einfach nur die schönsten Programme der bitbloq Community erstellen? Los geht´s! Für die heutigen Beispiele benötigst du:

  • 1 x ZumBloq Mini-Servo
  • 1 x ZumBloq Potentiometer
  • 1 x ZumBloq Lichtsensor
  • 1 x ZumBloq Summer
  • 1 x ZumBloq LCD
  • Eine Steuerplatine ZUM BT 328 oder eine, die mit Arduino UNO kompatibel ist
  • Ein USB-Kabel

Der Block „Funktion mit Ausgabe“ und der Block „Funktion mit Ausgabe aufrufen“

Diwo - Funciones con retorno Bloques

Die Funktionen mit Ausgabe sind den Funktionen ohne Ausgabe sehr ähnlich. Der Unterschied besteht darin, wie sie eingesetzt werden.

Die Funktionen mit Ausgabe erstellen eine Art Mini-Programm, mit dem eine Variable erhalten, vorbereitet oder verändert werden kann. Die Funktion mit Ausgabe gibt uns diesen Wert genau dann aus, wenn wir sie danach fragen. Dies geschieht, ohne dass wir dem Programm jedes Mal erklären müssen, wie es zu dieser Information, die wir benötigen, gelangen kann. Ein Beispiel könnte eine Funktion sein mit deren Hilfe man den Wert des Potentiometers umwandeln und anschließend den umgewandelten Wert ausgeben kann. Man könnte auch eine Funktion erstellen, die je nach der vom Ultraschallsensor gemessenen Entfernung angibt, ob ein vor dir liegendes Objekt in der Nähe oder weiter entfernt ist (so ein Programm hätte beispielsweise der Titanic geholfen).

Die Variablen, die wir in unseren Funktionen mit Ausgabe verwenden, können numerisch, in Textform oder auch Vektoren sein (diese Variablen mit drei Fächern von denen wir in der Lektion über den Joystick gesprochen haben).

Seht ihr die Lücke im Block „Funktion mit Ausgabe“? Dort gehört die Variable hinein, die von der Funktion beim Aufrufen ausgegeben wird. Verwendet den Block Variable, um ihr anzuzeigen, was sie ausgeben muss. Später werden wir sehen, dass es manchmal auch nützlich sein kann, eine Zahl oder einen Text einzusetzen der immer gleichbleibt (mit einem Zahlen- oder Text-Block).

Wem ist aufgefallen, dass der Block „Eine Funktion mit Ausgabe aufrufen“ die gleiche Form besitzt wie der Block „eine Variable verwenden“?

Diwo - Parecido funciones y variables

Genau richtig, sie haben die gleiche Form. Der Block „Eine Funktion mit Ausgabe aufrufen“ lässt sich überall dort einfügen, wo auch eine Variable eingesetzt werden könnte. Im Grunde kann man die Funktionen mit Ausgabe als Variablen ansehen. Kurz vor dem Öffnen und somit bevor wir uns den Inhalt der Schachtel ansehen können spielen sich in ihr Dinge ab.

Lasst uns mal sehen, ob ihr das alles richtig verstanden habt:

Beispiel mit den Funktions-Blöcken mit Ausgabe

Wir erstellen ein Programm, das eine Funktion verwendet und den Mini-Servo mithilfe des Potentiometers bewegt

Ejemplo funciones con retorno

Könnt ihr euch erinnern, wie der Block to map (umwandeln) funktionierte? Seht euch das Beispiel unter dem Link an. Es wird euch helfen, die Funktionsweise des Beispiels besser zu verstehen.

Wie ihr sehen könnt haben wir erneut zwei Spalten mit Blöcken: Links haben wir das Hauptprogramm und rechts die Funktion „Wert_des_Potentiometers_erhalten“. Ihre Funktion besteht darin, genau das zu tun, was ihr Name besagt. Wenn wir sie aufrufen (mit dem Block des Hauptprogramms „Funktion mit Ausgabe aufrufen“), erstellt sie eine Variable, in der sie den aktuellen Wert des Potentiometers speichert. Anschließend erstellt sie eine weitere Variable, um den Wert der Umwandlung der Variable des Potentiometers zwischen 0 und 180 (dem Drehwinkel des Mini-Servos entsprechend) zu speichern. Als Letztes haben wir sie angewiesen, dass sie uns diesen Wert der Variablen ausgibt. Auf diese Art und Weise wird die Funktion, wenn wir im Hauptprogramm den Block „Wert_des_Potentiometers_erhalten“ verwenden, in einem Schnelldurchlauf von oben nach unten ausgeführt. Den Wert der Umwandlung geben wir in die Lücke des Servos bei „Grad (0-180)“ ein.

Der Block „Wenn … ausgeben … “

Was wäre, wenn wir zum Beispiel erreichen wollten, dass eine Funktion, je nach Lichtintensität im Raum oder je nachdem ob wir den Schalter gedrückt haben oder nicht, verschiedene Werte ausgibt? Genauso wie beim Steuerblock „Wenn … ausführen“ können wir hier einen Block einsetzen, um unsere Funktionen mit mehr Entscheidungskapazität auszustatten, damit sie eine Aktion in Abhängigkeit einer anderen ausführen. Das ist der Block „Wenn…ausgeben“.

Diwo - Bloque Si-Devuelve

Dieser Block kann nur innerhalb einer Funktion mit Ausgabe eingesetzt werden (keine Sorge, bitbloq erinnert dich daran falls du es vergisst). In die erste Lücke muss ein logischer Ausdruck eingesetzt werden (aus den Logik-Blöcken). Wenn dieser zutrifft wird die Funktion nicht weiter durchlaufen und gibt den Wert aus, den du in den zweiten Block in Form einer Variablen, einer Zahl oder eines Textes eingesetzt hast.

Dieser Block hat sehr viele Anwendungsmöglichkeiten, weshalb ich die numerischen Zeichen und den Text erwähnt habe. Wenn ihr mit dem folgenden Beispiel weitermacht lernt ihr noch eine weitere kennen, die sehr nützlich ist.

Beispiel mit dem Block „Wenn…ausgeben“

Bevor wir das Beispiel analysieren werde ich euch erklären, warum das Programm so interessant ist. Gehen wir einmal davon aus, dass wir einen Lichtsensor verwenden, bei dem es sich nicht um den des „Mi primer Kit de Robótica“ handelt (da wir bereits wissen, dass dieser je nachdem wie viel Licht auf den Sensor fällt Werte zwischen 0 und 500 ausgibt). Was passiert wenn wir diesen Wert nicht kennen? Nehmen wir an, dass du dich irrst und der Wert über 500 liegt. In diesem Fall würde es bei deinem Servo zu einem Kurzschluss kommen und du müsstest dich leider von deinem lieben Servo verabschieden. Meint ihr nicht auch, dass es besser wäre, eine Funktion zu erstellen, die diesen Wert vor der Verwendung des Servos überprüft? Wir werden uns ein Beispiel ansehen, das wir bereits in der Lektion über den Mini-Servo verwendet haben.

Programm mit dem Lichtsensor und Fehlerprüfung

Diwo - Ejemplo funciones error

Beginnen wir damit, uns die kleine Funktion unten rechts anzusehen. Sie ist sehr einfach, stimmt´s? Wenn der Lichtsensor einen Wert ausgibt der größer oder gleich 500 ist, gibt die Funktion „FEHLER“ aus. Ist dies nicht der Fall, wird der Block „Wenn … ausgeben“ nicht ausgeführt und im nächsten Schritt wird automatisch „KORREKT“ ausgegeben. Des Weiteren können wir sehen, dass das Hauptprogramm nur aus einem „Wenn … ausführen … ansonsten, falls … ausführen“ besteht. In den Überprüfungen der Logik-Blöcke wird die Funktion „Überprüfung_Lichtwert“ aufgerufen. Wenn das Programm zu diesem Block gelangt, wird die Funktion ausgeführt und gibt entweder „RICHTIG“ oder „FEHLER“ aus und tritt so in die Schleife ein, die uns interessiert: Bei richtig wird der Servo bewegt, wenn nicht avisiert er mit dem Summer. Da ich davon ausgehe, dass ihr einen tollen Lichtsensor aus unserem Robotik-Bausatz besitzt, werden wir für dieses Beispiel das Potentiometer verwenden (das uns Werte zwischen 0 und 1023 ausgibt).

Der Block „Ausgeben … “

bloque devuelve

Dieser Block hat dieselbe Funktion wie der vorige. Allerdings besitzt er etwas mehr Flexibilität, da der logische Ausdruck nicht enthalten ist. Auf diese Weise können wir den Block in eine Bedingung „Wenn … ausführen“ integrieren, aber noch mehr Aktionen durchführen, bevor der für uns wichtige Wert ausgegeben wird. Wir sehen uns ein Beispiel mit einer Funktion an, die uns sagt, ob sich ein Objekt in der Nähe, in einiger Entfernung oder weit vom Ultraschallsensor entfernt befindet.

Programm zum Avisieren beim Rückwärtsfahren von Autos

Diwo ejemplo bloque devuelve

Für dieses Beispiel haben wir eine Funktion mit Ausgabe erstellt, die zunächst die Entfernung des Ultraschallsensors ausliest und diesen Wert dann in einer Variablen speichert. Anschließend tritt sie in den Block „Wenn … ausführen“ ein. Ist die in der Variablen enthaltene Entfernung gering, schaltet sich eine LED ein, ist die Distanz groß, schaltet sie sich aus. Außerdem gibt sie das Wort „Nah“ aus wenn die Entfernung gering ist und „Mittel“ bei mittlerer Entfernung. Ist die Distanz groß, tritt sie nicht in die Bedingung ein und gibt am Ende der Funktion „Fern“ aus.

Im Hauptprogramm haben wir es nur mit dem Block Summer zu tun. Dieser erklingt mit einer gewissen zeitlichen Unterbrechung immer und immer wieder. Dieses Zeitintervall hängt von dem Wort ab, das uns die vorige Funktion ausgibt.

Die Funktionen verbessern: Funktionen mit Eingabeparametern

Diwo - Bloques funcion con parametros

Ich bin mir sicher, dass euch irgendwann dieses Sternchen aufgefallen ist, das sich bei den Blöcken „Funktion mit Ausgabe“ und „Funktion ohne Ausgabe“ befindet. Wie auch bei den Steuerblöcken ist es nicht nur zur Zierde da. Mit dem Sternchen können wir die Funktionsblöcke verbessern damit sie noch mehr Möglichkeiten erhalten. Mit ihm können wir … Eingabeparameter hinzufügen!

-Wovon sprichst du? Was sind denn Eingabeparameter? Das klingt ja nach schwarzer Magie! -Immer mit der Ruhe, das hört sich nur so kompliziert an. In Wirklichkeit ist es das gar nicht wie wir gleich sehen werden.
Ein Eingabeparameter ist eine Variable unseres Hauptprogramms, die unsere Funktion nutzen kann. So ist es möglich, eine sehr intelligente und wiederverwendbare Funktion zu erstellen. Wir können beispielsweise eine Funktion erstellen, die ausgehend von zwei Werten, die wir ihr als Eingabeparameter zuweisen, verschiedene mathematische Operationen durchführt. Oder eine Funktion, die eine LED dreimal blinken lässt wenn wir ihr als Eingabeparameter eine 3 geben. Wenn wir einen Eingabeparameter in dem Block „Funktion mit Ausgabe“ oder „Funktion ohne Ausgabe“ erstellen, erscheint gleichzeitig in dem Block „Die Funktion aufrufen … “ (des entsprechenden Typs) eine Lücke. In diese können wir eine Variable oder eine Zahl einsetzen, die dann wiederum in der Funktion eingesetzt und verwendet wird. Gleichzeitig wird eine mit dem Eingabeparameter assoziierte Variable erstellt, die den gleichen Wert hat wie das Element in der Lücke über das wir gerade gesprochen haben. Es ist wichtig zu wissen, dass diese Variablen, die mit den Eingabeparameter erstellt wurden, nur innerhalb der Funktion verwendet werden können.

Beim Erstellen eines Eingabeparameters sollten wir diesem einen Namen geben, der mit seiner Aufgabe in der Funktion zu tun hat. Außerdem müssen wir angeben, ob der Eingabeparameter eine Zahl (int) oder ein Text (string) sein wird.

Beispiel mit Funktionen mit Eingabeparametern

Wir erstellen ein Programm, das Operationen mit zwei Eingabeparametern ausführt und das Ergebnis auf der LCD-Anzeige wiedergibt

Diwo - Funciones con parametros

Bei diesem Beispiel können wir sehen wie eine Funktion mit Ausgabe mit zwei Eingabeparametern erstellt wurde. Die Eingabeparameter sind „Eingabe_1“ und „Eingabe_2“ und in die Lücken wurden zwei Variablen eingefügt: „Info 1“ und „Info 2“. „Eingabe_1“ hat den gleichen Wert wie „Info 1“ und „Eingabe_2“ den gleichen Wert wie „Info 2“. Jetzt können wir „Eingabe_1“ und „Eingabe_2“ in die Funktion einsetzen, um mathematische Operationen mit ihnen durchzuführen.

Am Ende gibt die Funktion einen Endwert der Operation für das Hauptprogramm aus, der auf die LCD gedruckt wird (um zu sehen wie diese funktioniert, klicke hier)

Jetzt kennst du schon die ganze Theorie und wir müssen nur noch etwas üben, damit du sie vollständig beherrscht. Versuche die Funktionen so oft wie möglich einzusetzen, damit du siehst was für eine große Hilfe sie darstellen.