LOGO 3. Teil - oder eine Einführung in Turtle-Geometrie


In der letzten Folge unseres LOGO-Kurses haben wir die elementaren Graphik-Befehle sowie mathematische und logische Funktionen kennengelernt. Wir haben auch Variabeln verwendet, sind dann aber nicht weiter auf sie eingegangen.

In dieser Folge werden wir uns, unter anderem, mit den Möglichkeiten der Verwaltung von Variabeln bei LOGO beschäftigen.

Globale, lokale Variabeln und Listen

Wenn wir den ganzen Speicherbereich unseres Computers mit einem riesigen Schrank voller Schubladen vergleichen, die aufwärts durchnummeriert sind, dann ist eine Variabel nichts anderes als eine Schublade und deren Inhalt der momentane Wert, den wir ihr zugewiesen haben. Wir kennen von unserer allerersten Prozedur eine Variabelart, die wir Parameter genannt haben.

TO DREIECK : SEITE
	REPEAT 3 (FD :SEITE RT 120)
	END

In diesem Beispiel ist SEITE ein Parameter, das veschiedene Werte annehmen kann. Dieser Wert beschränkt sich nicht auf diese Prozedur, sondern kann auch auf eine andere übertragen werden. Wir stellen eine andere Prozedur her:

TO QUADRAT :SEITE
	repeat 4 (FD SEITE RT 90) 
END

Und jetzt tippen Sie ein:

TO HAUPT :SEITE 
	DREIECK :SEITE 
	QUADRAT :SEITE 
END

In Direkt-Modus geben Sie ein:

HAUPT 50

Wie Sie sehen, dient das gleiche Parameter für beide Programme. Auf diese Art und Weise Zahlen einzugeben, ist durchaus komfortabel und sicher eines der wichtigsten Merkmale von LOGO. Natürlich kennt unsere Igel-Sprache andere Arten von Variabeln, und im Vergleich dazu sind andere Sprchen sehr arm dran. Wir kennen von BASIC einen anderen Weg, eine Variabel zu definieren:

A = 15
A$ = "ST-COMPUTER”

Das erste Beispiel stellt eine numerische Variabel dar und die zweite eine sogenannte STRIGS Variabel. Je nach den verschiedenen BASIC-Dialekten wird die Länge eines „Variabel-Na-mens“ bestimmt. In LOGO geschieht dies alles etwas anders.

LOGO besitzt zur Definition einfacher, globaler Variabeln zwei Arten, oder besser gesagt zwei verschiedene Befehle:

NAME inhalt "Variabel Name”
NAME 12 "JAHR

oder

NAME 'JANUAR 'ERSTER MONAT

Genauso kann man durch den Befehl MAKE Variabeln definieren.

MAKE "JAHR 12

oder

MAKE "JANUAR "ERSTER MONAT

LOGO ist gegenüber BASIC in der Lage, jegliche Länge von Variabeln zu akzeptieren und kann zwischen zwei Variabeln in voller Länge unterscheiden. Damit ist "COOOMPUTER” und ” COOOOOMPUTER” nicht identisch, wie das z. B. bei anderen Programmiersprachen der Fall ist.

Genauso, wie eine Variabel einen Wert zugewiesen bekommen kann, ist auch die Möglichkeit gegeben, daß sie ihn selbst ausrechnet. In dem nächsten Beispiel wird eine Variabel ZAHL immer inkrementiert und angezeigt, bis sie ihren Endwert (der von dem Anwender eingegeben wird) erreicht hat.

Zum Programm ist nicht viel zu sagen. Zuerst wird eine Zahl angefordert, die der Variabel ZAHL zugewiesen wird. Dann wird die Lauf-Variabel „L“ mit dem Wert 0 initialisiert. In der übernächsten Zeile wird der laufende Wert von „L“ angezeigt und dann in Eins (1) inkrementiert. Wenn „L“ den Wert von ZAHL noch nicht erreicht hat, wird auf die Zeile, die mit dem Label SCHLEIFE versehen ist, zurückgekehrt. Der gleiche Vorgang wiederholt sich, bis der Endwert erreicht ist.


Wie Sie sicher bemerkt haben, weicht die Handhabung von numerischen Variabeln in LOGO nicht so gravierend ab, wie das in BASIC der Fall wäre.

Dort, wo sie sich stark differenzieren, besteht die Möglichkeit, in LOGO auf eine einfache Art und Weise zu manipulieren. Löschen, einfügen, zusammenfassen usw.: für alle diese Manipulationen besitzt LOGO einen Befehl. Hier ist eine Aufstellung dieser Befehle:

ERN Variabelname

Löscht den Inhalt dieser Variabel oder mehrerer, wenn das Argument aus mehreren Variabeln besteht.

MAKE "BEISPIEL 10 
	ERN (Beispiel)

Wenn Sie jetzt versuchen, nach dem Inhalt von BEISPIEL zu fragen, meldet sich LOGO mit einer Fehlermeldung.

ERALL

Löscht alle Variabeln. Wenn man die Wirkung dieser Befehle nur auf eine bestimmte Prozedur beschränken möchte, muß der Name dieser Prozedur als Argument versehen werden.

ERALL "TEST

Löscht alle Variabeln der TEST-Prozedur

SENTENCE VARIABEL VARIABEL

SENTENCE ist ein Befehl, der aus zwei Variabeln eine Liste erzeugt. Und hier sind wir bei einer anderen Art von Variabeln, die sehr charakteristisch für LOGO sind. Listen sind geordnete Mengen von Objekten, im Grund eine Folge. Diese Objekte nenne man Elemente dieser Liste. Die Elemente können Worte, Zahlen oder eine Mischung von beiden sein. Ein Beispiel einer solchen Liste sind alle natürlichen Zahlen. Eine Liste kann eine andere Liste als untergeordnete Elemente enthalten. Zum Beispiel:

		WISSENSCHAFT
MATHEMATIK   PHYSIK     CHEMIE
                 ORGANISCHE ANORGANISCHE

Als Liste sieht dies so aus:

WISSENSCHAFT (MATHEMATIK PHYSIK CHEMIE (ORGANISCHE ANORGANISCHE)...)

So eine Liste nennt man Liste zweiter Ordnung. Würde die untergeordnete Liste noch eine Liste beinhalten, wäre das eine Liste dritter Ordnung.

Bei der Datenverarbeitung ist diese Möglichkeit strukturierter Elemente von großer Bedeutung. Denken Sie an eine Datenverwaltung, in der unter einem Namen eine Menge von „untergeordneten“ Elementen stecken können. Eine Liste wird nicht nur in LOGO durch SENTENCE erzeugt, sondern

TO ZAHL
CT
PRINT [BITTE EINE BELIEBIGE ZAHL (GROESSER NULL) EINGEBEN]
MAKE "ZAHL RQ
MAKE "L O
LABEL "SCHLEIFE
PRINT :L
MAKE "L :L + 1
IF :L < :ZAHL [GO ‘SCHLEIFE]
END

auch durch den Befehl MAKE, wobei die Befehle innerhalb eckiger Klammern stehen müssen

MAKE "TIERE (HAUSTIERE (HUND KATZE) 
			WILDTIERE (LOEWE WOLF)

Mit Hilfe eines graphischen Beispiels werden wir die Wirkung von SEN-TENCE verdeutlichen. Das setzt voraus, daß wir einiges mehr über den Aufbau des Graphik-Windows wissen müssen. Der Graphik-Bildschirm bei LOGO besteht bei einem Schwarz-Weiß-Monitor aus 640 Pixels in der Horizontalen und 400 in der Vertikalen. Die Anfangskoordinate befindet sich in der Mitte und beträgt die 0,0.

Rechts von dem Nullpunkt wachsen die Schritte ins Positive, links davon ins Negative. Ebenso verläuft dies in die obige Richtung und umgekehrt nach unten.

Um die Schildkröte in die X-Achse zu verlagern, geben Sie ein:

SETX -300

Jetzt steht das Zeichensymbol links auf dem Bildschirm

SETY 150

Versetzt unseren Freund um 150 Schritte nach oben.

SETPOS X Y

ist eine Zusammenfassung beider obengenannten Positionierungsbefehle.

Alle drei Befehle sind nicht nur im Direkt-Modus erreichbar, sondern werden auch in Programme eingebaut. Damit ist die Richtung der Schildkröte ständig einfach zu finden. Solche Probleme treten bei der Darstellung von Funktionen immer wieder auf. Durch Eingabe veränderlicher Variabeln erreichen wir eine Steuerung in alle möglichen Richtungen. Verdeutlichen wir es uns zuerst an einem einfachen Beispiel:

TO POSITIONIERUNG 
MAKE” X 0 
MAKE ”Y 0 
LABEL ”LOOP 
SETX :X
SETY :Y
MAKE ”X :X + 1
MAKE ”Y :Y + .5
IF :Y 100 (GO ”LOOP)
END

Die Schildkröte wird erst durch beide Befehle SETX,SETY auf den Punkt 0 gesetzt. Dann werden beide Werte inkrementiert, solange Y nicht den Wert 100 erreicht hat. Durch die Schleife wird das Symbol immer auf eine neue Stelle positioniert. Natürlich werden Sie sich überlegen, warum man den Befehl SETPOS nicht benutzt. Das hätte das ganze nur erleichtert.

Ersetzen Sie die beiden SET-Befehle durch

SETPOS :X :Y

Jetzt lassen Sie das Programm neu laufen. LOGO erkennt beide Parameter nicht und meldet sich mit einer Fehlermeldung.

Damit nicht alles im Gebiet der „grauen“ Theorie bleibt, werden wir ein Programm eintippen, das die Darstellung einer Sinuskurve ermöglicht, die aus lauter Ellipsen besteht. Ebenfalls werden wir sehen, daß sich durch kleine Änderungen auch andere Formen von Kurven bilden lassen.

Das Programm besteht aus vier kleinen Routinen. POSITION setzt die Schildkröte an den Ausgangspunkt, der sich ganz links auf dem Bildschirm befindet. Dann werden einige Variabeln definiert

”M” ist ein Faktor, der für die Schritte auf der X-Achse verantwortlich ist
”F2” ist der Wert für die Sinusberechnung
”CX” ist der x-Radius der Ellipse
”CY” ist der y-Radius der Ellipse

Der Befehl MAKE ”CC SE :CX :CY erzeugt, wie bekannt, aus zwei Variabeln eine Liste mit dem Namen CC, deren Elemente CX und CY sind. Die zweite Prozedur errechnet für Y den Sinuswert, der den Verlauf der Kurve beeinflussen wird. X wird gradlinig berechnet und strebt von dem Punkt -300 zu +300. LAUF ist die Variabel, die die zwei errechneten Werte für den Anfang X sowie Y umfaßt. Wie Sie sehen, handelt es sich auch hier um eine Liste mit den folgenden Variabeln (XY).

PLOT ist die Routine, die das Zeichen bewerkstelligt. Zuerst wird die Schidl-kröte gemäß der Variabel LAUF auf die Position gesetzt, von der aus sie zu zeichnen beginnt. Dann wird CP definiert. CP ist eine Liste zweiter Ordnung mit folgenden Elementen:

CP (LAUF (X Y) CC (CX CY))

Das ist in diesem Falle nötig, weil die Ellipse vier ARgumente braucht.

Ellipse X Koordinate Y Koordinate 
		X Radius Y Radius

Die HAUPT-Routine ist die Prozedur, mit der das Programm aufgerufen wird. Am Anfang wird POSITION ausgeführt, dann LABEL für die nötige Schleife angebracht. Die beiden Routinen RECHNUNG und PLOT werden solange ausgeführt, bis T den Wert von 55 erreicht hat.

Jetzt vergrößern Sie den Graphik-Bildschirm und geben im Direkt-Modus ein:

HAUPT

Die Größe der einzelnen Ellipsen läßt sich durch Änderungen von CX und CY bestimmen, die Dichte der Kurve durch Änderung der Schrittweite bei „T“. Anstelle von Ellipsen besteht auch die Möglichkeit, die Kurve durch Kreise darzustellen. Ersetzen Sie bei der Prozedur PLOT den Befehl ELLIPSE durch CIRCLE und lassen Sie das Programm erneut laufen. Um eine einfache, aus Punkten bestehende Sinuskurve zu zeichnen, entfernen Sie die beiden Variabeln CX und CY aus der Prozedur POSITION.

PLOT muß nun wie folgt aussehen:

TO PLOT 
SETPOS : Lauf 
END

Wenn Sie jetzt das Programm laufen lassen, werden Sie eine einfache Sinuskurve sehen, die sich von der linken Seite des Bildschirms zur rechten erstreckt.

Eindrucksvoller ist unser Programm durch die Darstellung sogenannter Lisajour-Figuren zu gestalten. Damit sind einige Änderungen notwendig. Die Prozedur POSITION wird jetzt so aussehen:

TO POSITION
CS
PU
SETX -100 
PD
MAKE "M 20 
MAKE "F2 4 
MAKE "F1 5 
MAKE "T 0 
END

RECHNUNG muß auch einige Änderungen in Kauf nehmen.

TO RECHNUNG
MAKE "Y 50 * SIN (:F2 * :T)
MAKE "XX 80 * COS (:F1 * :T)
MAKE "X -100 + :XX 
MAKE "RY 20 - :Y 
MAKE "LAUF SE :X ;RY 
MAKE "T :T + 1 
END

Die PLOT-Routine bleibt, wie bei der einfachen Darstellung der obengenannten Sinuskurve. Die Variabl „T“ wird in dem Programm HAUPT mit der Zahl 500 verglichen.

Andere Kurven lassen sich genauso einfach darstellen. Mit ein wenig Phantasie kann man diese Programme in eine universelle Plotter-Routine für mathematische Funktionen gestalten.

TO POSITION CS PU SETX -300 PD MAKE "M 10 MAKE "F2 20 MAKE "T 1 MAKE "CX 40 MAKE "CY 20 MAKE "CC SE :CX :CY END

TO RECHNUNG MAKE "Y 150 * SIN (:F2 * :T) MAKE "X :T * :M MAKE "X -300 + : X MAKE "RY :Y MAKE "LAUF SE :X :RY MAKE "T :T + 0.15 END

TO PLOT PU SETPOS :LAUF MAKE "CP SE :LAUF :CC PD ELLIPSE :CP END

TO HAUPT POSITION LABEL "HIER RECHNUNG PLOT IF :T < 55 [GO "HIER] END

Alle bisher genannten Variabeln haben eines gemeinsam: sie gehören zu dem Typ der Global-Variabeln. Einmal definiert, wirken sie in allen Prozeduren, in denen sie wieder auftauchen.

LOGO kennt einen anderen Typ von Variabeln, die nur auf bestimmte Prozeduren beschränkt sind; diese Varia-blart nennt man Lokalvariabeln.

LOCAL Variabelname

Wenn mehrere Variabeln als Local definiert werden, muß der Befehl in Klammern stehen:

(LOCAL Variabl Variabl Variabel...) LOCAL ”ST

MAKE ”ST "REDAKTION

Lokal-Variabeln werden wie normale Variabeln behandelt, nur mit der Einschränkung, daß sie sich auf die Prozedur beschränken, die sie beinhalten. Andererseits sind sie insofern wichtig, daß sie Platz sparen.

LOGO und die STRINGS

Wie schon früher erwähnt wurde, kann LOGO auch Strings verarbeiten, und das alles schneller als in BASIC. Durch eine Anzahl von Befehlen ist LOGO in der Lage Strings zu isolieren, teilen, tauschen usw.. Folgend eine Zusammenfassung der Befehle zur Stringverwaltung:

COUNT "COMPUTER ergibt 8 
COUNT (1 3 5)	ergibt	3

COUNT ermittelt die Anzahl von Buchstaben eines Wortes oder die Anzahl von Elementen einer Liste.

ITEM Position Wort oder Liste

Gibt die Buchstaben eines Wortes oder die Elemente einer Liste auf die Position zurück.

ITEM 3 "COMPUTER ergibt M
PIECE VON BIS Wort oder Liste

PIECE schneidet ein Wort oder eine Liste von dem ersten Argument bis zum zweiten

PIECE 1 3 "ATARI	ergibt	ATA

WORD Wort 1 Wort 2 

Setzt zwei Worte zusammen.

WORD ”ST- "COMPUTER ergibt ST-Computer

FIRST Wortliste

Gibt die ersten Buchstaben oder Elemente einer Liste zurück.

FIRST "ATARI	ergibt	A
FIRST (10 20 30)	ergibt	10

LAST WORT,Liste

Gibt den letzten Buchstaben eines Wortes oder das letzte Element einer Liste zurück

LAST "ATARI	ergibt I
LAST (10 20 30)	ergibt 30

BUTFIRST Wort,Liste

Ergibt alle Buchstaben eines Wortes oder alle Elemente einer Liste bis auf den ersten wieder

BUTFIRST “COMPUTER ergibt OMPUTER
BUTLAST WORT,Liste

ist das Gegenstück von BUTFIRST. Es werden alle Buchstaben eines Wortes sowie alle Elemente einer Liste zurückgegeben, mit Ausnahme des letzten

FPUT Wort, Zahl oder Liste Wort, Zahl oder Liste

Setzt zwei Ausdrücke zu einem zusammen, mit dem ersten Argument vorne.

FPUT (10 20 30) (40 50 60) ergibt (10 20 30 40 50 60)

LPUT Wort,Zahl oder Liste Wort, Zahl oder Liste

Setzt zwei Ausdrücke zu einem zusammen, mit dem ersten Argument hinter dem zweiten.

LPUT "RI "ATA ergibt ATARI

.REPLACE Position Liste oder Variabel Liste

-REPLACE ersetzt ab der angegebenen Position das zutreffende Element einer Liste durch einen Variabel-Inhalt oder eine Liste

MAKE "COMPUTER (HARDWARE SOFTWARE LEBENSMITTEL) 
.REPLACE 3 :COMPUTER (LOGIK)

ergibt

?:COMPUTER
(HARDWARE	SOFTWARE (LOGIK))

.REPTAIL Position Liste oder Variabel Liste

.REPTAIL fügt den Inhalt einer Liste, einer Variabel, aber der angegebenen Positon in eine zweite Liste und löscht die übrigen Elemente dieser zweiten

MAKE "ZAHL (1 2 3 4 8 9 0) 
.REPTAIL 5 :ZAFFL (5 6 7)

Ergibt

?:ZAHL 
(1 2 3 4 5 6 7)

SORT (Liste)

LOGO kann ohne großen Aufwand Elemente einer Liste sortieren. Die Sortierung geschieht nach der Größe von ASCII Code in steigender Form

SORT (Z C W A) ergibt (A C W Z)

SHUFFLE (Liste)

Eine nach ASCII geordnete Liste wird wieder durcheinander gebracht.

EQUALP Wort, Zahl oder Liste Wort, Zahl oder Liste

Ergibt TRUE, wenn die zwei zu vergleichenden Worte, Zahlen oder Listen gleich sind.

EQUALP "COMPUTER "COMPUTER ergibt TRUE

dagegen

EQUALP "COMPUTER "COM ergibt FALSE

Unser nächstes Beispiel veranschaulicht uns die Handhabung von Strings Variabeln sowie Listen mit Strings. Es handelt sich um ein einfaches Dateiprogramm, das jedoch einige Wünsche offen läßt. LOGO besitzt nicht viele Möglichkeiten, Daten auf einem externen Massenspeicher zu verwalten; Daten und Programme werden zusammen auf Diskette abgespeichert. Insofern sit diese Art mit einer sequentiellen Datei zu vergleichen. Das hat den Nachteil, daß man verschiedene Versionen des gleichen Programms auf der Diskette hat. Die einzige Lösung ist, ältere Versionen zu löschen.

Das Programm besteht aus fünf kleinen Routinen, die nacheinander nach Bedarf aufgerufen werden können. Die VOR-Routine initialisiert die Zähl-Variabeln und ruft das Subroutine-Menü auf. MENÜ bringt auf dem Bildschirm die verschiedenen Möglichkeiten, die dem Anwender zur Verfügung stehen und ermöglicht eine Wahl über die Tastatur. Je nach Auswahl werden die anderen Prozeduren aufgerufen. EINGEBEN ist verantwortlich für die Aufnahme von Daten. Die Suche und Ausgabe von Daten wird durch die Prozedur AUSGABE verrichtet. Erfaßte Daten werden durch die Unter-Routine ABSPEICHER auf die Diskette samt Programm gespeichert.

Damit ist unser LOGO-Kurs zu einem Ende gekommen. Wir hoffen, daß diese Folge eine Anregung ist, in dieser Sprache zu programmieren. Wir würden uns freuen, Ihre Meinung darüber zu erfahren. In Zukunft werden wir weitere kleine Programme veröffentlichen, die das Arbeiten in dieser Sprache verdeutlichen.

TO MENU
TYPE [* * * * * * ADRES BUCH * * * * *]
REPEAT 4 [PR "]
PR	[- 1 - EINGABE]
PR	[- 2 - AUSGABE]
PR	[- 3 - ABSPEICHER]
PR	[- 4 - END]
REPEAT 4 [PR "]
TYPE [BITTE WAEHLEN ]
MAKE "WA FIRST RL
IF :WA = 1 [EINGEBEN]
IF :WA = 2 [AUSGABE]
IF :WA = 3 [ABSPEICHER]
IF :WA = 4 [STOP]
MENU 
END


TO EINGEBEN 
MAKE " ZL : ZL +1
CT

PR [* * * * * * ADRESS BUCH * * * * *]
REPEAT 4 [PR "]
TYPE [NAME ? ]
MAKE "NA WORD "NAME :ZL
MAKE "NAM RL
PPROP :NA "NAME :NAM
TYPE [ADRESSE ? ]
MAKE "AD WORD "ADRESS : ZL
MAKE "ADR RL
PPROP :AD "ADRESS :ADR
TYPE [TELEFON ? ]
MAKE “TE WORD "TELE : ZL
MAKE "TEL RL
PPROP :TE "TELE : TEL
END

TO AUSGABE 
MAKE "Z2 O
CT
PR [* * * * * * ADRESS BUCH * * * * *]
TYPE [BITTE GEBEN SIE EINER NAME EIN ] 
MAKE "SN RL
LABEL "SCHLEIF
MAKE "Z2 :Z2 + 1
MAKE "NA WORD "NAME :Z2
IF GPROP :NA "NAME = :SN [GO "AUS]
IF :Z2 < 100 [GO "SCHLEIF]
GO " NG 
LABEL "AUS
TYPE [NAME ] PR GPROP :NA "NAME
MAKE "NA WORD "ADRESS : Z2
TYPE [ADRRESSE ] PR GPROP :NA "ADRESS
MAKE "NA WORD "TELE :Z2
TYPE [TELEFON ] PR GPROP :NA "TELE
MAKE "WART RC
IF :WART = "M [MENU]
LABEL "NG
PR [LEIDER IST NAME NICHT VORHANDE]
TYPE [IRGENDWELCHE TASTE ZUM MENU]]
IF : TAS = "M [MENU]
END

TO VOR
MAKE "ZL O
MENU 
END

TO ABSPEICHER 
CT
PR [* * * * * * ADRESS BUCH * * * * *]
REPEAT 4 [PR "]
PR [BITTE NAME DER DATEI EINGEBEN]
PR [NAME :	]
MAKE "DN FIRST RL
SAVE :DN
MENU
END


Viel Spaß beim Programmieren in LOGO. (MM)



Aus: ST-Computer 03 / 1986, Seite 71

Links

Copyright-Bestimmungen: siehe Über diese Seite