Basic-Kurs Teil 2
Lieber Leser. Nachdem wir uns das letzte Mal ja ausgiebig um die Variablen und den PRINT-Befehl gekümmert haben, möchten wir uns diesen Monat nun endlich
dem Programmeschreiben, also der wirklichen Programmerung, von BASIC befassen.
Letzte Ausgabe hatten wir unsere Befehle und Anweisungen ja immer direkt auf den Bildschrirm geschrieben, und der Computer hat sie dann auch immer, nachdem wir die Taste RETURN gedrückt hatten, sofort ausgeführt, insofern er nichts an der Syntax der Zeile
auszusetzen hatte. Nun müssen Sie allerdings zugeben, daß unsere kleinen PRINT-Anweisungen sich als relativ
umständlich und sinnlos erwiesen, zumal man, um einen
Text auf den Bildschirm zu drucken, ja mehr Schreibarbeit hatte, als wenn man ihn einfach " von Hand" auf den Bildschirm geschrieben hätte. Man hatte ja
noch zusätzlich den PRINT-Befehl zu schreiben und die
Anführungszeichen, die den Text einschlossen.
Nun, all dies hat natürlich einen Sinn, denn der
PRINT-Befehl ist, ebenso wie die meisten anderen BA-SIC- Befehle, nicht dafür geschaffen worden, direkt
Texte auszugeben, sondern um in Programmen zu arbeiten, wo die Textausgabe zur Kommentierung des Programms absolut unerläßlich ist, zumal dann ein völlig
ahnungsloser Benutzer auch dann mit dem Programm etwas anfangen kann, wenn er es sich zum ersten Mal
ansieht. Doch wie sag ichs meinem Computer? Wie machen wir denn unserem C64 klar, daß wir die eingegeben Zeile nicht jetzt, sondern irgendwann später ausgeführt haben wollen, und daß er sich diese Zeile für
jenen späteren Zeitpunkt merken soll? Nun, geben Sie
doch einfach einmal folgende Zeile ein :
10 print" Das ist ein Programm !"
Sie sehen, daß Sie nichts sehen. Denn sobald Sie die
RETURN-Taste drücken, druckt Ihnen Ihr 64 er nicht den
Text " Das ist ein Programm !" aus sondern springt mit
dem Cursor ( das ist das kleine hellblaue Viereck, das
immer so blinkt, und Ihnen Ihre Schreibposition angibt) einfach in die nächste Bildschirmzeile und war- tet nun wiederum auf eine Eingabe. Noch nicht mal
eine Fehlermeldung ist zu sehen. Eine Riesensauerei! ! !
Doch keine Panik ! Ihr C64 ist nicht etwa beleidigt, oder kaputt, sondern er hat sich soeben gerade eine
Programmzeile gemerkt. Doch was heißt das eigentlich?
Nun, wie Ihnen bestimmt aufgefallen ist, haben wir
vor unsre PRINT-Anweisung noch eine Zahl geschrieben.
Dies ist die sogenannte Zeilennummer. Ihr Computer
merkt sich Ihre Eingaben intern nämlich mit Nummern, die er nach ihrer Größe ordnet. Das heißt, daß Sie
mit dieser Zahl auch immer wieder auf eben jene Zeile
zurückgreifen können. Sie ist sozusagen das " Erkennungszeichen" einer Programmzeile. Was das genau bedeutet, möchte ich Ihnen mit einem kleinen Beispiel
noch ein wenig näher bringen. Geben Sie doch einmal
ein:
list
Sie sehen nun folgendes:
10 print"Das ist ein Programm !" ready.
Nach Eingabe des BASIC-Befehls LIST hat uns der C64 die eben eingegebene Programmzeile wieder aufgeLI-STet; so, wie wir sie eingegeben hatten, nämlich mit
ihrer Zeilennummer vorangestellt. Er hat sich diese
Zeile also gemerkt. Sie können gerne einmal probieren
ob es auch funktioniert wenn Sie den Bildschirm
gelöscht haben ( dies tun Sie mit der Tastenkombination SHIFT und CLR/ HOME), auch nun wird Ihnen der
Text noch haargenauso angezeigt, wie Sie ihn eingaben, es hat also nichts damit zu tun, daß unsere Zeile noch auf dem Bildschirm stand. Das ist auch gut
so, denn der C64 merkt sich solche Programmzeilen in
seinem Programmspeicher ( ebenso wie die Variablen) von wo er sie auch wieder auf dem Bildschirm anzeigen
kann, halt mit eben jenem Befehl LIST.
Auch für Zeilennummern müssen Sie bestimmte Regeln
einhalten, damit Ihnen keine Fehler angezeigt werden.
Hier eine Zusammenfassung dieser Regeln :
1 .) Sie können alle Zahlen von 0 bis 63999 für eine
Zeilennummer benutzen. Dabei sollten Sie jedoch
die Zeilennummern immer in 10 er-Schritten ( also
10,20,30,40, etc.) vergeben, warum dies von Vorteil ist, werde ich Ihnen später erklären.
2 .) Egal in welcher Reihenfolge Sie die Zeilen eingeben, der C64 ordnet diese immmer wieder neu nach
der Größe ihrer Zahlen ein. Sollten Sie also einmal folgende Zeilen in der hier dargestellten
Reihenfolge eingeben:
30 print"Zeile 30" 10 print"Zeile 10" 20 print"Zeile 20" 40 print"Zeile 40"
So wird Ihnen Ihr C64 nach der Eingabe von LIST
immer wieder folgendes Bild liefern :
10 print"Zeile 10" 20 print"Zeile 20" 30 print"Zeile 30" 40 print"Zeile 40"
3 .) Sollten Sie eine Zeile eingeben, die eine Zeilennummer hat, die schon im Speicher existiert, dann
wird die alte Zeile im Speicher durch die neue
ersetzt. Sollten Sie also bei obigem Programm ( so
können wir es jetzt nennen) die Zeile:
30 print" Aetsch! Das is jetzt anders."
eingeben, dann wird das Programm beim nächsten
Listen so aussehen :
10 print"Zeile 10" 20 print"Zeile 20" 30 print"Aetsch! Das is jetzt anders." 40 print"Zeile 40"
4 .) Sollten Sie eine Zeile eingeben, die nur aus einer Zeilennummer besteht OHNE darauffolgende Befehle, so wird die entspechende Zeile mit dieser
Nummer, sollte sie im Speicher stehen, gelöscht
werden. Würden Sie also:
30
eingeben, dann würde Zeile 30 aus unserem Programm oben gelöscht werden.
Jetzt möchte ich Ihnen die Syntax des LIST-Befehls
erst einmal noch etwas genauer erklären, bevor ich
weitergehe und Ihnen zeige, wie Sie unser kleines
Progrämmchen zum Ablauf bringen.
Sie können dem LIST-Befehl nämlich sogar noch spezifischer sagen, in welche Programmzeilen Sie einen
Einblick wünschen. Hierzu müssen Sie dem Befehlswort
LIST ganz einfach die Zeilenummer der Zeile, die Sie
sich ansehen wollen hinterherstellen. Der Befehl:
list 20
bewirkt also, daß Ihnen anstatt des ganzen Programms
nur die Zeile 20 angezeigt wird. Ich glaube jetzt
wird es Ihnen hoffentlich auch etwas deutlicher, warum eine Zeile eine Nummer braucht. Durch sie kann
man jede einzelne Zeile ansprechen wie man möchte, der Computer versteht also sofort, welche Zeile Sie
von ihm sehen wollen.
Doch die Anwendung von LIST geht noch weiter. Sie
können sich ebenso auch einen ganz bestimmten Bereich
aus Ihrem Programm ansehen, geben Sie etwa folgendes
ein:
list 20-30
so werden die Zeilen 20 und 30 auf dem Bildschirm
gelistet. Sie geben also einfach eine obere und eine
untere Grenze an, und LIST wird seine Arbeit auf diese Zeilengrenzen beschränken. Ebenso können Sie diese
Schranke nach oben und unten offen lassen. Dann wird
dementsprechend einfach von der ersten Zeile bis zu
der angegebenen Zeile, beziehungsweise von der angegebenen Zeile bis zur letzten Zeile gelistet. Probieren Sie doch einfach einmal folgendes mit unserem
kleinen Beispielprogramm im Speicher. Geben Sie ein:
list -30
Nun werden die Zeilen 10,20 und 30 gelistet, weil das
Programm ab Zeile 10 anfängt.
Bei dem Befehl:
list 20-
werden die Zeilen 20,30 und 40 gelistet. Der C64 fängt bei der von Ihnen angegebenen Zeile an und hört
erst am Ende des Programms auf.
Wie der LIST-Befehl funktioniert wissen Sie jetzt ja, klären wir also schnell noch die Frage, warum man im
Allgemeinen besser Zeilennummern in 10 er-Schritten
verteilt. Nun, dies liegt einfach darin begründet, daß Sie, wie jeder Mensch auch, nicht unfehlbar sind, und daß es Ihnen durchaus einmal passieren kann, daß
Sie, aufgrund eines Fehlers im Programm, noch eine
Zeile einfügen müssen. Würden Sie in 1 er-Schritten
die Programmzeilen eingeben, so müßten Sie erst einmal Platz schaffen, indem Sie alle der einzufügenden
Zeile folgenden Zeilen nochmals neu einzutippen hätten, da diese ja im Speicher stehen bleiben sollten, aber zwischen den Zeilen 33 und 34 kein Platz mehr
für eine weitere Zeile wäre. Deshalb benutzen Sie
besser 10 er Zahlen, so, daß Sie bequem zwischen die Zeilen 20 und 30 beispielsweise eine weitere Zeile, vielleicht mit der Zeilennummer 25, einfügen könnten.
Gewöhnen Sie sich diese Programmierweise also gleich
an, Sie werden sehen, es lohnt sich ganz bestimmt.
Doch widmen wir uns nun unserem Problem, unser Programm auch zum Ablaufen zu bringen. Auch hierfür gibt
es einen Befehl: den RUN-Befehl ( von engl. : to run = laufen) . Haben Sie unser kleines Programm noch im
Speicher? Gut. Dann geben Sie doch einmal ein:
run
Und nun, siehe da, werden unsere ersehnten PRINT-Zeilen endlich aktiv, denn Sie sehen nun folgendes
auf dem Bildschirm :
Zeile 10 Zeile 20 Aetsch! Das is jetzt anders. Zeile 40 ready.
Und nun sehen Sie auch den Vorteil des PRINT-Befehls.
Sie können nämlich so auf einfache Art und Weise lange, lange Texte eingeben, die dann dem Benutzer während des Ablaufs eines Programms wertvolle Meldungen
und Hinweise geben können.
Der RUN-Befehl kann übrigens ähnlich wie LIST angewandt werden. Sie können Ihm nämlich auch sagen, wo
genau er beginnen soll, ein Programm abzuarbeiten.
Nämlich indem Sie ihm, wie bei LIST, eine Zeilennummer nachstellen, ab der er beginnen wird das Programm
abzuarbeiten. Gäben Sie also :
run 30
ein, so würde Sie folgendes Bild auf dem Bildschirm
anstrahlen :
Aetsch! Das is jetzt anders. Zeile 40 ready.
Eines sollte noch gesagt sein: sollten sich Variablen im Speicher befinden, wenn Sie eine neue Programmzeile eingegeben haben, so werden diese nach dem
drücken der RETURN-Taste restlos gelöscht. Das liegt
daran, daß der 64 er zum Eingliedern der neuen Zeile
in die richtige Zahlenreihenfolge den gesamten Programmspeicher hinund herschieben muß und daß bei
dieser Schieberei sehr leicht der Inhalt einer Variablen zerstört werden kann. Deshalb werden alle Variablen vorher gelöscht, damit später kein Mist im Programmtext stehen kann, und falsche Variablenwerte zu
falschen Programmreaktionen führen können.
Ebenfalls aus letztem Grund heraus werden grundsätzlich vor der Ausführung eines RUN-Befehls alle Variablen vom Computer gelöscht, da so ebenfalls ungewollte Veränderungen der Variablen entstehen könnten.
Außerdem kann für die beiden Befehle LIST und RUN
gesagt werden, daß sie durch das Drücken der RUN/ STOP-Taste wieder angehalten werden können.
Das heißt also, wenn LIST Ihnen gerade ein Programm
auflisten sollte, und Sie sich einen Teil etwas genauer ansehen wollten, Sie dadurch den Vorgang des
Listens unterbrechen könnten.
Ebenso bei RUN. Möchten Sie aus irgendeinem Grund Ihr
Programm anhalten, vielleicht weil es nicht das tut, was Sie von Ihm wollen, dann können Sie es ebenfalls
auf diese Weise unterbrechen. Sollten Sie es dann
allerdings doch an der Stelle fortsetzen wollen, an
der Sie es angehalten haben, allerdings ohne den Inhalt aller Variablen zu zuerstören, dann können Sie
den Befehl CONT benutzen. Er hat haargenau selben
Effekt wie RUN, nur, daß er zum einen die Variablenwerte nicht vorher löscht, und zum anderen genau hinter dem Befehl weiterarbeitet, bei dem das Programm
vorher abgebrochen wurde, vorrausgesetzt es wurde
zwischendurch nicht verändert. Am besten zeige ich
Ihnen noch einen weiteren Befehl, damit Sie hier auch
ein wenig experimenieren können: der GOTO-Befehl.
Übersetzen wir GOTO aus dem Englischen, wissen wir
auch schon gleich, was wir mit diesem Befehl anfangen
können. GEHE ZU einer Zeilennummer und arbeite das
Programm von dort aus weiter ab. Hinter GOTO muß also
noch eine Zeilennummer folgen. Probieren wir also
wieder an unserem kleinen Progrämmchen etwas aus.
Geben Sie doch zusätzlich noch folgende Zeile ein:
50 goto 10
Starten Sie nun das Programm mit RUN. Sie sehen nun
immer wieder unseren Demotext auf dem Bildschirm
" runterlaufen", also etwa folgendes Bild :
... Zeile 40 Zeile 10 Zeile 20 Aetsch! Das ist jetzt anders. Zeile 40 Zeile 10
. . .
Verfolgen wir einmal unseren C64, wie er sein Programm abarbeitet. Zuerst werden die Zeilen 10-40 wie
gewohnt durchlaufen. Der Text in den PRINT-Zeilen
erscheint also auf dem Bildschirm. Anschließend
trifft der Computer in Zeile 50 auf den GOTO Befehl, der besagt, daß er bei Zeile 10 weiterarbeiten soll.
Er führt diesen Befehl aus, und beginnt wieder von
vorne bei 10 . Dies wiederholt sich nun bis ins Unendliche. Pausenlos wird der Text ausgedruckt, und unser
64 er würde dies Jahre lang machen, vorrausgestzt es
gäbe keinen Stromausfall. Er befindet sich in einer
sogenannten " Endlosschleife" eine Schleife, die immer
wieder durchlaufen wird, ohne daß Sie zu einem Ende
kommt. Eine Schleife ist also ein bestimmter Programmabschnitt, der mindestens zweimal durchlaufen
wird. Um nicht den ganzen Programmteil nochmals eingeben und somit das Programm unnötig verlängern zu
müssen verwendet man also den GOTO-Befehl. Nun kommt
der Auftritt für die RUN/ STOP-Taste. Drücken Sie sie
einmal. Es erscheint nun:
break in xx ready.
Der Computer meldet Ihnen also, daß Sie soeben das
laufende Programm in Zeile xx abgebrochen haben. Für
" xx" können alle Zeilennummern des Programms stehen, da es Zufall ist, in welcher Zeile Sie gerade abgebrochen haben. Auf alle Fälle sind Sie nun unserer Endlosschleife entkommen und können wieder an Ihrem
Programm weiterarbeiten. Sollten Sie allerdings wieder den Wunsch hegen, schöne Zeichenketten auf dem
Bildschirm " runterlaufen" zu sehen, dann können Sie
jetzt ganz einfach wieder mit CONT das Programm fortfahren lassen ( CONT von engl. : to continue = fortsetzen, fortfahren) .
Fassen wir doch einmal zusammen, wie weit wir schon
fortgeschritten sind. Wir können mittlerweile kleine
Programme schreiben, die etwas auf dem Bildschirm
ausgeben, wir können rechnen, Programme mit Hilfe von
LIST editieren und kennen auch RUN, um diese zum laufen zu bringen. Außerdem kennen wir uns mit den Namen
und Typen von Variablen aus. Nunja, auf den ersten
Blick erscheint dies ja sehr viel, doch direkt weltbewegende Programme können wir noch nicht so ganz
schreiben, da wir eigentlich nur einen einzigen Befehl kennengelernt haben, mit dem sich innerhalb von
Programmen etwas anfangen läßt, den PRINT-Befehl. Die
anderen sind mehr oder weniger ausschließlich außerhalb von Programmen, im sogenannten " Direktmodus" nützlich, obwohl sie ebenso in Programmen funktionie- ren würden. Wollen wir also nun unser Befehlsspektum
noch ein wenig mehr erweitern und wenden wir uns einem sehr mächtigen Befehl zu, mit dem schon etwas
mehr zu machen ist.
Erinnern wir uns doch einmal an unser Beispiel vom
letzten Monat mit der Coladose. Wir hatten mit Hilfe
von Variablen die Oberfläche einer Coladose berechnet. Diese Dose hatte eine Höhe von 11 .5 cm und einen
Deckelradius von 3 .25 cm. Mit Hilfe der Formel
o=2* r*π*( r+ h) sind wir dann zu dem Ergebnis 301 .2 qcm
gekommen. Bedenkt man nun, daß durch den Trend zum
Umweltschutz es heutzutage durchaus möglich sein
könnte, daß man ein anderes Material für Einwegdosen
erfinden wird, und daß man deshalb vielleicht ein
anderes Dosenformat wählen muß, so wäre unsere schöne
mühselige Rechnung nur noch Müll, da unbrauchbar. Man
müßte die ganze Prozedur nochmals mit den Werten der
neuen Dosen durchführen. Eine mehr oder wenig
umständliche Sache also. Doch wozu können wir jetzt
Programme schreiben, wir hatten ja gelernt, daß die
Formel für die Zylinderoberfläche, wie ich sie oben
schon aufgeführt hatte, ja allgemeingültig ist und somit mit allen nur erdenklichen Werten für r und h
einen richtigen Wert liefert. Im Prinzip könnte man
nun ein Programm schreiben, daß diese Formel benutzt, und würde dann hierfür die Variablen in einer vorangehenden Zeile mit den entspechenden Werten versorgen. Doch wir machen es uns noch komfortabler, wir
benutzen den INPUT-Befehl, der für Eingaben vom Benutzer aus sehr empfänglich ist ( im wahrsten Sinne
des Wortes, denn INPUT bedeutet nichts anderes als
" EINGABE") . Mit ihm wird es uns gestattet, eine Abfrage zu machen, auf die der Benutzer mit einer Eingabe antworten kann, und dies alles sogar mitten im
im Programm! ! !
Wir benötigen also Werte für Radius und Höhe. Wie
beim letzten Mal wollen wir hierfür die Variablennamen r und h wählen. Sehen wir uns nun doch einmal die
ersten Zeilen unseres Programms an :
10 print chr$(14) ;
20 print"[ CLR,4 SPACE] Zylinderoberflaechenberechnung"30 input"[2 DOWN] Radius " ; r 40 input" Hoehe " ; h
Da haben wir ja schon eine ganze Menge neue Anweisungen. Fangen wir einmal in Zeile 10 an. Sie sehen hier
einen PRINT-Befehl, doch was dieser Befehl ausdruckt, können Sie nicht wissen. Eine String-Variable ist das
nicht ( obwohl es fast so aussieht), ich kann Ihnen
allerdings versichern, daß es etwas ähnliches darstellt. Dies ist die CHR$- Funktion. ACHTUNG! Ich betone das Wort FUNKTION! Es handelt sich hierbei wohlgemerkt NICHT um einen Befehl, das dürfen Sie nie
verwechseln. Eine Funktion wird zwar ebenfalls durch
ein BASIC-Schlüsselwort dargestellt, doch sie ist
ohne einen verknüpfenden Befehl, oder eine Variablenzuweisung nicht ausführbar, da der Computer in diesem
Fall nicht spezifisch weiß, was er mit ihr anfangen
soll. Das heißt also, daß Sie Funktionen immer mit
PRINT ausgeben, oder einer Variablen zuweisen können.
Zum Beispiel so:
a$=chr$(65) print a$
Es gibt übrigens noch mehr Anwendungsmöglichkeiten
für Funktionen, doch werden wir hierzu später kommen, da Sie die entprechenden Befehle hierzu noch nicht
kennen.
Was bewirkt die CHR$- Funktion? Nun, CHR$, wird benutzt um einzelne Zeichen spezifiziert aufrufen zu
können. Jedes Zeichen auf Ihrer Tastatur besitzt einen eigenen Zahlencode. Geben Sie der CHR$- Funktion
nun diesen Zahlcode eines Zeichen in Klammern an, dann steht die ganze Funktion für eben dieses Zeichen. In unserem Beispiel von eben haben wir der Variable a$ den Zeichencode 65 zugeordnet. Anschließend
wurde die Variable a$, in der ja nun dieser Zeichencode als Buchstabe dargestellt war, auf dem Bildschirm ausgegeben. Dieses Zeichen, das zu dem Code 65 gehört, ist das kleine " a" . Somit ist unsere Variablendefinition gleich der Definition:
a$=" a"
mit der ja auch der Buchstabe " a" dem String a$ zugeordet wird. Ich hoffe Sie haben dies verstanden.
Somit hat der folgende PRINT-Befehl auch das " a" auf
dem Bildschirm ausgedruckt. Genauso hätten Sie auch
schreiben können:
print chr$(65)
womit Sie das selbe Ergebnis erzielt hätten, allerdings nicht mehr über den Umweg mit der Stringvariable. Hier sei auch noch gesagt, daß das Ergebnis der
CHR$- Funktion immer einer Stringvariablen zugeordnet
wird, nicht also einer Floatoder Integervariable, da diese Variablentypen ja keine Zeichen darstellen
können. Allerdings können Sie problemlos auch Anweisungen von dieser Art vergeben:
a=65 a$=chr$(a) Hier haben wir nicht den Zeichencode 65 in "a" ge- speichert, sondern einfach nur den Zahlwert 65 (bei "PRINT a" kriegen Sie wie erwartet "nur" die Zahl 65 auf den Bildschirm gedruckt). Sie dürfen also
Floats und Intergers benutzen, um den Zahlwert in
Klammern ( von CHR$) anzugeben, dies führt also zu dem
selben Ergebnis, CHR$ holt sich den Wert von a aus
dem Speicher und ordnet dann dem String a$ den Zeichencode des Zahlwerts von a zu. Auf der Rückseite
dieser Magic Disk finden Sie diesmal auch ein kleines Programm namens ASCII-Code. Es zeigt Ihnen alle
möglichen ASCII-Codes ( das sind eben jene Codes der
Zeichen) des C64 an.
Wollen wir in diesem Zusammenhang gerade noch die
Umkehrfunktion von CHR$ betrachten, die ASC-Funktion, mit der Sie sich beispielsweise den ASCII-Wert ( so
nenne ich ab jetzt diesen Zeichencode, ASCII ist ein
internationaler Standard, an den sich die meisten
Computerhersteller halten, die Zeichen haben also auf
den meisten Computern die selben Codes. Leider ist
dies beim C64 aus unerfindlichen Gründen nicht der
Fall, trozdem wird auch hier von ASCII gesprochen) eines Zeichens ausgeben lassen können. Hier geht alles genau umgekehrt, hier geben Sie ein Zeichen an, und es kommt ein Zahlwert heraus. Dies müssen Sie
also auch bei Variablenzuweisungen beachten. Die
ASC-Funktion sieht so aus:
print asc(" a")
Wie chr$, nur daß Sie jetzt das zu untersuchende Zeichen in Anführungsstrichen in die Klammer einsetzen
müssen. Die Anführungsstriche deshalb, weil Sie hier
auch Strings als sogenanntes Funktionsargument verwenden dürfen, diese dann allerdings OHNE Anführungsstriche. Also:
a$="a" print asc(a$)
hätte die selbe Wirkung wie die oben aufgezeigte Zeile. Sie können sich so also alle CHR$- Codes, bzw.
ASCII-Codes ausgeben lassen, und dann bei Bedarf verwenden. Auch ASC-Funktionswerte kann man Variablen
zuweisen :
a$="x" a=asc("x") a%=asc(a$)
Die beiden letzten Zeilen führen zum selben Ergebnis, nur daß der eine Wert in der Floatvariable " a" gespeichert ist und der andere in der Integervariablen
" a%" . Außerdem ist der Weg, mit dem die Ergebnise
erreicht werden jeweils ein anderer, doch das dürften
Sie mittlerweile ja kennen.
Doch wollen wir uns nun, nach unsrem langen langen
Ausflug zu den ASCII-Codes wieder unserer Zylinderberechnung widmen. Wir sind ja gerade dadurch auf dieses Thema gekommen. . .
In Zeile 10 stand der Befehl PRINT CHR$(14) . Es wurde also ein ASCII-Zeichen ausgegeben, mit dem Zeichencode 14 . Dieser Code steht für eine sogenannte
" Steuerfunktion" . Mit einer Steuerfunktion können Sie
ein Zeichen ausgeben, das nicht direkt als Buchstabe
auf dem Bildschirm sichtbar wird, sondern eher eine
" unsichtbare" Funktion ausübt, wie zum Beispiel den
Bildschirm zu löschen, den Cursor eine Zeile höher
oder tiefer rücken zu lassen, oder die Zeichenfarbe
zu verändern. Unser Code 14 bewirkt, daß der Zeichensatz von Großauf Kleinschrift umgeschaltet wird. Er hat also die selbe Wirkung wie das gleichzeitige
Drücken der SHIFTund der Commodoretaste. Dies ist
deshalb notwendig, damit beim späteren Ausdruck von
" Zylinderoberflächenberechnung" in Zeile 20, der
Großbuchstabe " Z" nicht etwa als Grafikzeichen ausgegeben wird, was leicht passieren kann, zumal die
Großschrift doch direkt nach dem Einschalten des
64 ers vorhanden ist.
Sicher ist Ihnen der Text in den eckigen Klammern
-[]- aufgefallen, dies ist kein Programmtext im
allgemeinen, hiermit habe ich ebenfalls angegeben, welche Steuerzeichen an dieser Stelle eingefügt werden müssen. Sie wissen ja, unsere Zeichen, die keine
sind, sondern etwas bestimmtes ausführen. Man kann
Sie nämlich auch direkt in die PRINT-Anweisung
einfügen, zumal das auch einfacher und platzsparender
ist. Ich tat dies bei CHR$(14) bewußt nicht, da Sie
so bei der Gelegenheit einmal die CHR$- und ASC-Funktion kennenlernen konnten, und weil außerdem dieses Steuerzeichen nicht als solches in einer PRINT-Anweisung darstellbar ist ( es gibt zwar schon einen
Weg, doch das wäre jetzt hier zuviel) . Doch wie sollen Sie denn überhaupt diese Steuerzeichen in die PRINT-Anweisung hereibringen? Die Lösung ist ebenso
einfach wie genial. Sie müssen lediglich, NACHDEM Sie
den auszugebenden Text mit einem Anführungszeichen
schon angekündigt haben, die entspechende Taste drükken, und schon wird unser Steuerzeichen mit einem
inversgedruckten Zeichen dargestellt. Von nun an wissen Sie, daß an dieser Stelle dann ein Steuerzeichen
gedruckt wird. Die Steuerzeichen können Sie ebenso
wie normale Buchstaben überall innerhalb der Anführungsstriche einfügen. Mit der Zeit werden Sie dann
auch lernen, diese an Ihren Reverszeichen zu erkennen.
Inverszeichen wurden deshalb gewählt, da man sie innerhalb einer PRINT-Klammer nicht verwenden kann, man
kann trotzdem aber inverse Texte ausgeben, indem man
einfach die Steuerzeichen für RVS ON und RVS OFF benutzt. Die Zeichen zwischen diesen Steuerzeichen werden dann auch invers gedruckt.
In unserem Fall müssten Sie also ein CLR ( CLEAR
( dtsch. : lösche)= SHIFT + CLR/ HOME-Taste) einfügen. Ich werde in Zukunft bei solchen Steuerzeichen
bestimmte Ausdrücke in eckigen Klammern angeben.
Damit Sie wissen welche Zeichen nun gemeint sind. Die Programme, die sich ja auf der Rückseite der Magic
Disk befinden, werden dann natürlich immer schon die
entspechenenden Steuerzeichen in Reversdarstellung
enthalten, da wir ja keine " geschweiften" Texte nachher auf dem Bildschirm haben wollen. Diese Ausdrücke, die ich verwenden werde, werde ich Ihnen dann im
nachfolgenden Text immer noch erläutern, damit Sie
wissen, was gemeint war.
Nachdem wir uns jetzt wohl zur Genüge in den ersten 2 Zeilen unseres Programms verrannt haben, wollen wir
uns nun endlich dem Befehl widmen, von dem ich anfangs gesprochen hatte. Sie werden ihn schon in den
Zeilen 30 und 40 bemerkt haben. Es ist der INPUT-Befehl. Übersetzen wir doch einmal:
INPUT = engl. EINGEBEN, EINGABE
Na wunderar, wir können also etwas eingeben. Und das
auch noch wahnsinnig komfortabel, denn Sie brauchen
lediglich dem INPUT-Befehl eine Variable zu geben, in
der er die Eingabe ablegen soll und schon weiß unser
Programm genauer, was sein Benutzer von ihm will.
Sehen wir uns die Syntax einmal genauer an:
30 INPUT" Radius " ; r
Ich muß hier noch anmerken, daß ich bei diesem Beispiel, die im Programm vorkommenden Steuerzeichen
weggelassen habe. Es ist dort von [2 DOWN] die Rede, womit Sie aufgefordert sind,2 mal die Taste " Cursor
runter" zu drücken.
Wie Sie an den Steuerzeichen und auch an den Anführungsstrichen erkennen können, kann man auch bei IN-PUT einen Text angeben, der vor Ausführung der eigentlichen Eingabe ausgegeben werden soll. Hinter
einem Semikolon ( oder Strichpunkt - ;) wird dann
noch der Name einer Variablen angehängt, in unserem
Fall " r" für den Radius. Probieren Sie doch einmal
obige Zeile als Programm aus.
Sie MÜSSEN übrigens unbedingt den INPUT-Befehl im
Programm verwenden, da es vom Direktmodus aus zu Fehlern kommen kann, da der INPUT-Befehl im Direktmodus
keinen Sinn hat. Deshalb haben die Programmierer von
BASIC 2 .0 sich gesagt, daß die Benutzung dieses Befehls im Direktmodus nicht erlaubt sein darf und des- halb mit einer Fehlermeldung quittiert wird.
Sie sehen, wenn Sie alles richtig eingegeben haben, nun folgendes auf dem Bildschirm :
Radius ?
und einem blinkenden Cursor hinter dem Fragezeichen.
Sie sind nun dazu aufgefordert einen Wert für den
Radius einzugeben. Tun Sie dies also. Geben Sie doch
beispielsweise einmal 3 .25 ein:
Radius ?3 .25
und drücken Sie die Return-Taste. Das Programm endet
nun, vorausgesetzt, Sie hatten auch wirklich nur diese eine Zeile im Speicher stehen. Geben Sie doch
jetzt einmal im Direktmodus:
print r
ein. Was sehen Sie? Es erscheint der Zahlwert 3 .25 auf dem Bildschirm! Genau Ihre Eingabe, die Sie soeben taten. Na ist ja entzückend - würde Kojak, lollilutschend, jetzt sagen. Merken Sie was INPUT tat? Es
hat Ihre Eingabe gleich einer Variablenwertzuweisung, der Variable " r" zugeordnet und in ihr gespeichert! Dies geht sogar noch weiter! Sie dürfen sogar
Strings und Integers benutzen, um Eingaben in Variablen ablegen zu können. Ein solches Programm wäre
also auch denkbar:
10 input" Wie heissen Sie bitte " ; n$20 input" Und wie alt sind Sie " ; a%30 print" Sie heissen " ; n$ ;" und sind " a%" Jahre alt."
Sie sehen, hier benutzen wir einen String n$( für
Name) und eine Integervariable a%( für Alter) . Den
Integer können wir bedenkenlos anwenden, da ja Alter
im allgemeinen mit ganzen Zahlen angegeben wird.
Vielleicht ist Ihnen allerdings etwas aufgefallen:
Obwohl wir KEIN Fragezeichen in unserem Text stehen
hatten, erschien doch eins auf dem Bildschirm. Wie
denn das? Nun, INPUT druckt grundsätzlich immer ein
Fragezeichen am Ende seines Textes aus, da ja nach
etwas gefragt wird, und somit dieses Fragezeichen
auch berechtigt ist. Es wird vielleicht Fälle geben, in denen es Sie stören wird, da es nicht in den Kontext der Frage passt, doch werden wir später einmal
behandeln, wie man es abschalten kann.
Im Übrigen brauchen Sie auch nicht unbedingt einen
Text mit INPUT auszugeben, Sie können dies auch unterdrücken, indem Sie die Anführungsstriche und das
Semikolon einfach weglassen und den Variablennamen
einfach anhängen. Also so beispielsweise:
10 input a$ 20 input a 30 input xx%
Ebenfalls ist es möglich, mehrere Eingaben gleichzeitig aufzunehmen. Ich finde diese Methode allerdings
sehr unbequem, und außerdem gefällt es mir getrennt
besser, doch möglich wäre auch dies:
10 input " Koordinaten ( X/ Y)" ; x, y
Sie können hier also gleich mehrere Werte abfragen, die allerdings mit einem Komma voneinander getrennt
sein sollten. Jetzt wissen Sie auch, wofür das Komma
reserviert ist, da wir ja gesagt hatten, daß das Dezimalkomma bei Floatvariablen immer einem Punkt entspricht. Die Eingabe müßte dann so aussehen:
Koordinaten ( X/ Y) ?22 .3,10
Den Variablen x und y wären dann folgende Werte zugeordnet worden:
x=22.3 y=10
Leider muß ich nun an dieser Stelle abbrechen, um
keinen Informationsstau bei Ihnen hervorzurufen. Versuchen Sie erst einmal die eben erkannten neuen Befehle kennenzulernen. Sie können sich ja auch einmal
das gesamte Zylinderberechnungsprogramm auf der Rückseite dieser Magic Disk 64 ansehen. Nächsten Monat werde ich es dann auf jeden Fall zu Ende kommentieren. Des weiteren wollen wir uns dann mit der Schleifenprogrammierung und den Entscheidungsbefehlen ( und
- operatoren) widmen.
Bis dahin wünsche ich Ihnen weiterhin ein allzeit
" Gut Hack",
Ihr Uli Basters G