Logo-Kurs Teil 3 - oder die Schildkröte wird erwachsen

center
Bild 2. Mit der Wiederholungs-Funktion zu einer Kreis-Komposition

Im dritten Teil des Logo-Kurses lernt die Schildkröte mit Variablen umzugehen und zu rechnen. Außerdem stellt sich eine neue Marotte ein: Die Schildkröte wird bequem und der Programmierer spart sich dadurch viel Arbeit.

In der letzten Folge brachten wir die Schildkröte dazu, ein Haus zu zeichnen. Der Befehl, den wir dazu definierten, hieß »ALLES«. Wollten wir dieses Haus nun an einen bestimmten Ort auf dem Bildschirm zeichnen, so müßten wir zunächst den Befehl »SETXY« geben, um die Schildkröte auf den Punkt zu bewegen, an dem das Haus gezeichnet werden soll. Es empfiehlt sich außerdem, mit »PU« den Zeichenstift anzuheben, bevor die Schildkröte mit »SETXY« positioniert wird. Um ein Haus an der Position X = 30, Y= 50 zu zeichnen, müssen also die folgenden Befehle gegeben werden: »PU SETXY 30 50 ALLES«. Will man das gleiche Haus an einer anderen Stelle des Bildschirms zeichnen, so muß man dieselbe Befehlsfolge mit anderen Werten für X und Y eingeben, zum Beispiel »PU SETXY 45 67 ALLES«. Insgesamt sind das, wenn man nachzählt, drei Worte und zwei Zahlen, die jedesmal einzugeben sind, wenn man sein Haus zeichnen möchte. Nun sind Programmierer aber im allgemeinen schlechte und obendrein faule Schreibmaschinenschreiber, die jede Gelegenheit wahrnehmen, sich das Leben durch Programme zu erleichtern. Ein Programmierer wird sich also sofort überlegen, wie er die Befehlsfolge »PU SETXY X Y ALLES« verkürzen oder am besten gleich in einen Befehl zusammenfassen kann. Es wäre doch viel einfacher, müßte man nur »ZHAUS 30 50« eingeben, um ein Haus an die Stelle X = 30 Y=50 zu zeichnen. Wie, so fragt sich unser bequemer Programmierer, kann ich das bewerkstelligen?

Tips für den faulen Programmierer

Wir wissen bereits, daß man sich mit »TO« einen Befehl selbst definieren kann. »TO ZHAUS« wird also einen Befehl »ZHAUS« definieren. Wir können außerdem annehmen, daß die Befehle »PU«, »SETXY« und »ALLES« eine gewisse Rolle in unserem Vorhaben spielen werden. »PU« wird gebraucht, um den Zeichenstift anzuheben, »SETXY« um die Schildkröte an eine bestimmte Position zu setzen und »ALLES« schließlich zeichnet das Haus. Die Schwierigkeit besteht nun darin, dem Befehl »SETXY« Zahlen folgen zu lassen, die wir erst dann wissen, wenn wir den Befehl »ZHAUS« anwenden. Wir wollen also Logo begreiflich machen, daß es zwar den Befehl »ZHAUS« definieren soll, die Zahlen, die dem Befehl »SETXY« folgen, zunächst aber offen läßt. Geben wir den Befehl »ZHAUS 30 50«, muß Logo also die Befehlsfolge »PU SETXY 30 50 ALLES« ausführen. Die erste Zahl, die nach »ZHAUS« angegeben wird, ist die X-Koordinate von »SETXY« die zweite Zahl nach »ZHAUS« die Y-Koordinate. Wichtig dabei ist aber: In dem Moment, in dem wir den Befehl »ZHAUS« definieren, wissen wir zwar, daß Logo nach »SETXY« zwei Zahlen einsetzen soll, wir wissen aber deren Wert noch nicht. Die Werte der Zahlen, nennen wir sie »ZAHL1« und »ZAHL2«, sind also unbekannt. Nach längerer Überlegung ist das auch unserem bequemen Programmierer klar geworden. Er weiß nun, daß in der Definition folgendes vorkommen wird: »PU SETXY :ZAHL1 :ZAHL2 ALLES«. Was ist nun der Unterschied dieser Befehlsfolge zu der Befehlsfolge »PU SETXY 20 60 ALLES«? Hinter »SETXY« stehen im zweiten Fall die Zahlen 20 und 60. Die Zahl 20 wird immer und bis in alle Ewigkeit den Wert 20 besitzen, die Zahl 60 wird immer den Wert 60 besitzen. Die Zahlen 20 und 60 haben also konstante Werte. Man nennt sie daher auch Konstanten. Das ist bei den Zahlen »:ZAHL1« und »:ZAHL2« ganz anders. Von ihnen wissen wir nur, daß sie Zahlen sind. Wir wissen nicht, ob sie den Wert 20, 40, 56, 6,543 oder vielleicht —657654,987 haben. Während wir sicher wissen, daß 20 nie denselben Wert wie 60 haben wird, kann es durchaus sein, daß »:ZAHL1« denselben Wert wie »:ZAHL2« hat. Die Werte von »:ZAHL1« und »:ZAHL2« sind variabel. Stellen Sie sich eine Variable als eine Schachtel vor, in die Sie etwas hineintun können. Was Sie hineintun, bleibt dabei ganz Ihnen überlassen. Wenn Sie in die Schachtel die Zahl 20 hineintun, hat die Variable den Wert 20. Wenn Sie die Zahl 34.87 hineinlegen, hat dieselbe Variable den Wert 34,87. Man weist der Variablen einen Wert zu.

Zahlen in Schachteln

Bei Computern haben die Variablenschachteln den Nachteil, daß man sie nicht sieht und daher nicht unterscheiden kann. Man kann ihnen aber Namen geben. Programmiersprachen verlangen meistens, daß man sich bei derartigen Taufaktionen an bestimmte Regeln hält. Logo möchte zum Beispiel, daß Variablennamen immer mit einem Doppelpunkt beginnen. Die Variablenschachtel der X-Koordinate heißt daher zum Beispiel »:ZAHL1«, die der Y-Koordinate »:ZAHL2«. Sie könnten aber auch »:ASTERIX« und »:OBELIX« heißen.

Wir sind unserem Ziel, dem Befehl »ZHAUS«, ein ganzes Stück nähergekommen. Es bleibt aber noch ein Problem zu lösen: Wie kann man die zwei Zahlen, die wir hinter »ZHAUS« angeben wollen und die die Koordinaten angeben, an denen unser Haus gezeichnet werden soll, in die Variablenschachteln namens »:ZAHL1« und »:ZAHL2« plazieren? In anderen Worten, wie können wir den Variablen »:ZAHL1« und »:ZAHL2« nachträglich Werte zuweisen?

Die Antwort ist erstens LOGisch und zweitens einfach. Man sagt Logo, daß nach dem Befehl »ZHAUS« noch zwei Zahlen zu erwarten sind und daß diese Zahlen den Variablen »:ZAHL1« und »:ZAHL2« zugewiesen werden sollen. Dazu gibt man die Variablennamen in der Definition (das heißt in »TO ZHAUS«) nach dem Wort »ZHAUS« in der Reihenfolge an, in der man sie eingeben möchte. Man definiert also »TO ZHAUS :ZAHL1 :ZAHL2«.

Jetzt muß man Logo nur noch sagen, was mit den Werten geschehen soll, die man eingibt. Das geschieht durch die Definition »PU SETXY :ZAHL1 :ZAHL2 ALLES«. Sie sagt aus, daß »:ZAHL1« und »:ZAHL2« als Eingaben für den Befehl »SETXY« verwendet werden sollen. Zusammengenommen ist die Definition von »ZHAUS« nun die folgende: TO ZHAUS :ZAHL1 :ZAHL2 PU SETXY :ZAHL1 :ZAHL2 ALLES

Wir können den Befehl jetzt so verwenden, wie wir es geplant haben. Bild 1 zeigt, was dabei passiert. Der Befehl dazu lautet »ZHAUS 50 30«. In dem Moment, in dem die RETURN-Taste gedrückt wird, werden den Variablen »:ZAHL1« und »:ZAHL2« die Werte 50 und 30 zugewiesen. Als nächstes wird der Befehl »PU« ausgeführt, der Stift also angehoben. »SETXY« nimmt nun wieder Bezug auf die Variablen, Logo wird also angewiesen, die Argumente für »SETXY« in den Variablenschachteln »:ZAHL1« und »:ZAHL2« zu suchen.

Die Schildkröte protestiert

Logo weiß übrigens durch die Definition »TO ZHAUS :ZAHL1 :ZAHL2«, daß der Befehl »ZHAUS« immer mehrere Eingaben verlangt und protestiert lauthals, wenn wir sie einmal vergessen sollten. Probieren Sie, ein Haus mit dem Befehl »ZHAUS« ohne weitere Eingaben zu zeichnen. Logo tut nichts, außer sich mit den Worten »ZHAUS NEEDS MORE INPUTS« oder »ZHAUS BRAUCHT MEHR EINGABEN« über unsere Nachlässigkeit zu beschweren. Sie erinnern sich, daß der Befehl »PC« die Farbe des Zeichenstiftes ändern kann. Es ist klar, daß man auch das Argument dieses Befehls, das heißt die Farbkennzahl, über eine Variable in ein Programm eingeben kann. Schreiben Sie das Programm »ZHAUS« so um, daß man neben der Position, an der das Haus gezeichnet werden soll, auch noch seine Farbe wählen kann. So soll dann zum Beispiel der Befehl »ZHAUS 30 10 2« ein rotes Haus an der Stelle X = 30 Y= 10 zeichnen.

Bild 2 besteht aus nichts weiter als aus Rechtecken. Logo sollte hier nur Rechtecke verschiedener Größe sehr oft in verschiedenen Positioner, zeichnen. Es ist klar, daß es sehr viel Schreibarbeit erfordern würde wollte man die Rechtecke in ihrer. Positionen einzeln programmieren Man bedient sich daher in Logo eines Befehls, der es ermöglicht, einen (oder mehrere) Befehle mehrfach auszuführen. Der Befehl heißt »REPEAT«, das englische Wort für »WIEDERHOLE«. Man muß Logo nun nur noch sagen, wie oft wiederholt werden soll.

Erinnern wir uns an das Programm, das ein Rechteck zeichnet:

TOECK
FD 40 RT 90 FD 60 RT 90 FD 40 RT 90
FD 60 RT 90

Wir wollen Logo jetzt dazu bringen, dieses Rechteck versetzt zehnmal zu zeichnen.

Bekanntlich fängt Logo immer dort an zu zeichnen, wo sich gerade die Schildkröte befindet. Wollen wir also ein Bild zeichnen, wie es Bild 3 zeigt, müssen wir nicht nur das Rechteck zehnmal zeichnen lassen, sondern Logo auch jedesmal, wenn das Rechteck fertig gezeichnet worden ist, die nächste Anfangsposition anfahren lassen. Logo muß daher hintereinander folgende Befehlsfolge ausführen (und das zehnmal):

  1. Ein Rechteck zeichnen
  2. »PENUP«
  3. 5 Vorwärts
  4. Drehung 90° rechts
  5. Vorwärts
  6. Drehung 90° links
  7. »PENDOWN«

Die dazugehörige Befehlsfolge ist »ECK PU FD 5 RT 90 FD 5 LT 90 PD«. Der Trick ist nun der, diese Befehle zehn Mal ausführen zu lassen, und zwar unter Verwendung des Befehls »REPEAT«. Dem Wort »REPEAT« folgt die Anzahl der gewünschten Wiederholungen, die Befehle, die wiederholt werden sollen, stehen dann in eckigen Klammern. Wir können also folgendes Programm schreiben:

TO ECKEN
REPEAT 10 [ECK PU FD 5 RT 90 FD 5 LT 90 PD]

Das Ergebnis sieht dann aus wie in Bild 3.

Das Programm zu der Grafik in Bild 2 ist fast so einfach wie die verschobenen Rechtecke. Anstatt die Rechtecke nur zu verschieben, muß man sie nun verschieben und drehen. Um einen Vollkreis zu bekommen, werden die Rechtecke 36mal um je zehn Grad gedreht. Vor jeder Drehung findet eine Verschiebung statt. Geben Sie folgendes Programm ein:

TO EKREIS
PU SETXY (-100) O PD
REPEAT 36 [ECK FD 20 RT 10]

Das Ergebnis sieht der Abbildung schon recht ähnlich. Um das Bild zu vervollständigen, bewegt man den Zeichenstift neuerlich auf X = —100, Y=0, setzt die Richtung mit »SETH« auf 0 und läßt wieder einen Rechteckkreis zeichnen, nur daß diesmal die Verschiebung 17 statt 20 beträgt. Das Ganze wird noch einmal mit einer Verschiebung von 14 wiederholt. Strategisch günstig plazierte »PC«-Anweisungen machen die Zeichnung dann auch noch bunt. Das Programm lautet zu guter Letzt:

TO EKREIS
PC 14 PU SETXY (-100) 0 PD
REPEAT 36 [ ECK FD 20 RT 10 ]
PC 7 PU SETXY (-100) 0 SETH 0 PD
REPEAT 36 [ ECK FD 17 RT 10 ]
PC 5 PU SETXY (-100) 0 SETH 0 PD
REPEAT 36 [ ECK FD 14 RT 10 ]

Mit Logo rechnen

Logo ist nicht nur fähig, schöne Bilder zu malen. Man kann es auch dazu verwenden, mathematische Formeln auszurechnen und, wie wir noch sehen werden, mathematische Funktionen zu zeichnen. Machen wir einige Versuche!

Die Eingabe »4 + 5« veranlaßt den Computer zu sagen »RESULT: 9« was absolut richtig ist, da das RESULTat der Addition 4 + 5 ja tatsächlich 9 ist. Entsprechend stellt Logo zu der Eingabe »5876« fest: »RESULT: 4830«. Womit wir bereits zwei der in Logo gültigen mathematischen Operationen oder Rechenzeichen kennen. Das » + « steht für die Addition, (das »—« natürlich für die Subtraktion), die Multiplikation wird durch ein Sternchen, das »« repräsentiert. Dividiert wird mit dem Schrägstrich. Man schreibt also 6/7 und nicht 6:7. Man kann diese Befehle beliebig kombinieren. So ist zum Beispiel 56*87 - 87/6 + 65 RESULT: 4922.5

In Logo gelten die in der Mathematik üblichen Klammerregeln, -das heißt, das was in einer Klammer steht, wird zuerst berechnet. Dementsprechend gilt: 56*(67-6)/45 RESULT: 75.9111 aber:

56*67-6/45
RESULT: 3751.86

Ein ziemlicher Unterschied, oder? Und alles nur wegen zwei Klammern mehr oder weniger.

Logo kann leider nicht potenzieren. Es gibt keinen Befehl, der ohne weiteres das Ergebnis von S.7665 ausrechnet. Als Programmierer braucht uns das jedoch nicht weiter zu stören. Was ist Potenzieren denn anderes als eine mehrfache Multiplikation. Es wäre sicher einfach, folgendes Programm zu schreiben:

TO HOCH :ZAHL
PRINT :ZAHL*:ZAHL*:ZAHL*
:ZAHL*:ZAHL

das die Potenz einer Zahl mit dem Exponenten 5 errechnet und ausdruckt. Hier wurde Ihnen übrigens ein neues Logo Kommando untergejubelt.

Der Befehl »PRINT« oder »DRUCKE« ist ein Befehl, der nichts mit Grafik zu tun hat. Er hat die Aufgabe, etwas auf dem Textbildschirm darzustellen oder zu schreiben. Im Falle des Beispielprogramms ist das die fünfte Potenz der Variablen »:ZAHL«. »HOCH 4.55« hat die Ausgabe »1950.09« zur Folge. Das Programm weist allerdings einen Nachteil auf. Es errechnet immer nur die fünfte Potenz und nicht auch die dritte, sechste oder zweite. Es wäre doch viel praktischer, könnte man sich eine Funktion definieren, die statt einer zwei Eingaben akzeptiert, die Zahl und den Exponenten mit dem man potenzieren möchte. Da eine Potenzierung, wie schon früher gesagt, eine mehrfache Multiplikation ist, fällt uns natürlich gleich wieder der Befehl »REPEAT« ein, der ja eine Reihe von Befehlen mehrfach ausführen kann. Es wäre doch anzunehmen, daß »REPEAT 3 [PRINT 3*3]« etwas tut, das unserem Ziel nahe kommt. Leider ist das aber nicht der Fall.

Die Antwort liegt wieder einmal im Thema Variablen und Wertezuweisung. Mit der Anweisung »TO HOCH :ZAHL« wird der Variablen »:ZAHL« ein Wert zugewiesen, der so lange konstant bleibt, bis ihr ein neuer Wert zugewiesen wird. Der Befehl »REPEAT 3 [PRINT :ZAHL* :ZAHL]« ändert am Wert der Variablen nichts. »PRINT« ist nämlich keine Zuweisung, sondern nur die Anweisung, etwas auf dem Bildschirm anzuzeigen. Wir brauchen also neben der Zuweisungsinstruktion »TO...VARIABLE« noch eine zweite, die es uns erlaubt, innerhalb eines Programms den Wert einer Variablen zu ändern. Logo stellt ein derartiges Kommando zur Verfügung. Es heißt »MAKE« oder zu Deutsch, »MACHE«. Sein Zweck ist es, den Wert einer Variablen zu einem anderen Wert zu »machen«. Die Regeln zur Verwendung dieses Kommandos sind allerdings etwas eigenartig. Der Name der neuen Variablen muß dabei mit einem einsamen Anführungszeichen beginnen. Danach steht dann der neue Wert der Variablen.

»MAKE "ZAHL 5« weist der Variablen »:ZAHL« den Wert 5 zu. »MAKE "ZAHL :ZAHL*:ZAHL« legt in die Variablenschachteln mit dem Namen »:ZAHL« den Wert hinein, der sich ergibt, wenn man »:ZAHL« mit sich selbst multipliziert, also quadriert. (Herbert W. Neunteufel/wg)



Aus: Happy Computer 05 / 1985, Seite 153

Links

Copyright-Bestimmungen: siehe Über diese Seite