Basic-Kurs Teil 2 ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Lieber Leser. Nachdem wir uns das letzte Mal ja aus- giebig um die Variablen und den PRINT-Befehl geküm- mert haben, möchten wir uns diesen Monat nun endlich dem Programmeschreiben, also der wirklichen Program- merung, von BASIC befassen. Letzte Ausgabe hatten wir unsere Befehle und Anwei- sungen ja immer direkt auf den Bildschrirm geschrie- ben, und der Computer hat sie dann auch immer, nach- dem wir die Taste RETURN gedrückt hatten, sofort aus- gefü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 Schreib- arbeit 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 arbei- ten, wo die Textausgabe zur Kommentierung des Pro- gramms absolut unerläßlich ist, zumal dann ein völlig ahnungsloser Benutzer auch dann mit dem Programm et- was anfangen kann, wenn er es sich zum ersten Mal ansieht. Doch wie sag ichs meinem Computer? Wie ma- chen wir denn unserem C64 klar, daß wir die eingege- ben Zeile nicht jetzt, sondern irgendwann später aus- gefü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 64er 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 an- gibt) einfach in die nächste Bildschirmzeile und war- tet nun wiederum auf eine Eingabe. Noch nicht mal eine Fehlermeldung ist zu sehen. Eine Riesensaue- rei!!! 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 "Erken- nungszeichen" einer Programmzeile. Was das genau be- deutet, 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 Tastenkombina- tion SHIFT und CLR/HOME), auch nun wird Ihnen der Text noch haargenauso angezeigt, wie Sie ihn einga- ben, es hat also nichts damit zu tun, daß unsere Zei- le 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 10er-Schritten (also 10,20,30,40,etc.) vergeben, warum dies von Vor- teil ist, werde ich Ihnen später erklären. 2.) Egal in welcher Reihenfolge Sie die Zeilen einge- ben, der C64 ordnet diese immmer wieder neu nach der Größe ihrer Zahlen ein. Sollten Sie also ein- mal 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 Zeilen- nummer 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 ei- ner Zeilennummer besteht OHNE darauffolgende Be- fehle, 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 Pro- gramm 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 spezi- fischer 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, wa- rum 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 die- se 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 ange- gebenen Zeile bis zur letzten Zeile gelistet. Probie- ren 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 10er-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 1er-Schritten die Programmzeilen eingeben, so müßten Sie erst ein- mal Platz schaffen, indem Sie alle der einzufügenden Zeile folgenden Zeilen nochmals neu einzutippen hät- ten, 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 10er 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 Pro- gramm 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 lan- ge, lange Texte eingeben, die dann dem Benutzer wäh- rend des Ablaufs eines Programms wertvolle Meldungen und Hinweise geben können. Der RUN-Befehl kann übrigens ähnlich wie LIST ange- wandt 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 Zeilennum- mer 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 Varia- blen im Speicher befinden, wenn Sie eine neue Pro- grammzeile eingegeben haben, so werden diese nach dem drücken der RETURN-Taste restlos gelöscht. Das liegt daran, daß der 64er zum Eingliedern der neuen Zeile in die richtige Zahlenreihenfolge den gesamten Pro- grammspeicher hin- und herschieben muß und daß bei dieser Schieberei sehr leicht der Inhalt einer Varia- blen zerstört werden kann. Deshalb werden alle Varia- blen vorher gelöscht, damit später kein Mist im Pro- grammtext stehen kann, und falsche Variablenwerte zu falschen Programmreaktionen führen können. Ebenfalls aus letztem Grund heraus werden grundsätz- lich vor der Ausführung eines RUN-Befehls alle Varia- blen vom Computer gelöscht, da so ebenfalls ungewoll- te 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 ge- nauer 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 In- halt 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 Variablen- werte nicht vorher löscht, und zum anderen genau hin- ter 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 Pro- gramm 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 Unend- liche. Pausenlos wird der Text ausgedruckt, und unser 64er 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 Pro- grammabschnitt, der mindestens zweimal durchlaufen wird. Um nicht den ganzen Programmteil nochmals ein- geben 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 abge- brochen haben. Auf alle Fälle sind Sie nun unserer Endlosschleife entkommen und können wieder an Ihrem Programm weiterarbeiten. Sollten Sie allerdings wie- der den Wunsch hegen, schöne Zeichenketten auf dem Bildschirm "runterlaufen" zu sehen, dann können Sie jetzt ganz einfach wieder mit CONT das Programm fort- fahren lassen (CONT von engl.: to continue = fortset- zen, 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 lau- fen 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 welt- bewegende Programme können wir noch nicht so ganz schreiben, da wir eigentlich nur einen einzigen Be- fehl kennengelernt haben, mit dem sich innerhalb von Programmen etwas anfangen läßt, den PRINT-Befehl. Die anderen sind mehr oder weniger ausschließlich außer- halb 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 ei- nem 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 berech- net. 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 voran- gehenden Zeile mit den entspechenden Werten versor- gen. Doch wir machen es uns noch komfortabler, wir benutzen den INPUT-Befehl, der für Eingaben vom Be- nutzer aus sehr empfänglich ist (im wahrsten Sinne des Wortes, denn INPUT bedeutet nichts anderes als "EINGABE"). Mit ihm wird es uns gestattet, eine Ab- frage zu machen, auf die der Benutzer mit einer Ein- gabe 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 Variablenna- men 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 Anweisun- gen. 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 dar- stellt. Dies ist die CHR$-Funktion. ACHTUNG! Ich be- tone das Wort FUNKTION! Es handelt sich hierbei wohl- gemerkt 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 Variablen- zuweisung 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 be- nutzt um einzelne Zeichen spezifiziert aufrufen zu können. Jedes Zeichen auf Ihrer Tastatur besitzt ei- nen eigenen Zahlencode. Geben Sie der CHR$-Funktion nun diesen Zahlcode eines Zeichen in Klammern an, dann steht die ganze Funktion für eben dieses Zei- chen. In unserem Beispiel von eben haben wir der Va- riable a$ den Zeichencode 65 zugeordnet. Anschließend wurde die Variable a$, in der ja nun dieser Zeichen- code als Buchstabe dargestellt war, auf dem Bild- schirm ausgegeben. Dieses Zeichen, das zu dem Code 65 gehört, ist das kleine "a". Somit ist unsere Variab- lendefinition gleich der Definition: a$="a" mit der ja auch der Buchstabe "a" dem String a$ zu- geordet 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, aller- dings nicht mehr über den Umweg mit der Stringvaria- ble. Hier sei auch noch gesagt, daß das Ergebnis der CHR$-Funktion immer einer Stringvariablen zugeordnet wird, nicht also einer Float- oder Integervariable, da diese Variablentypen ja keine Zeichen darstellen können. Allerdings können Sie problemlos auch Anwei- sungen 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 Zei- chencode des Zahlwerts von a zu. Auf der Rückseite dieser Magic Disk finden Sie diesmal auch ein klei- nes 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 al- les 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 Zei- chen in Anführungsstrichen in die Klammer einsetzen müssen. Die Anführungsstriche deshalb, weil Sie hier auch Strings als sogenanntes Funktionsargument ver- wenden dürfen, diese dann allerdings OHNE Anführungs- striche. Also:
a$="a" print asc(a$)
hätte die selbe Wirkung wie die oben aufgezeigte Zei- le. Sie können sich so also alle CHR$-Codes, bzw. ASCII-Codes ausgeben lassen, und dann bei Bedarf ver- wenden. 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" ge- speichert 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 Zylinderbe- rechnung widmen. Wir sind ja gerade dadurch auf die- ses Thema gekommen... In Zeile 10 stand der Befehl PRINT CHR$(14). Es wur- de also ein ASCII-Zeichen ausgegeben, mit dem Zei- chencode 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 Zeichen- satz von Groß- auf Kleinschrift umgeschaltet wird. Er hat also die selbe Wirkung wie das gleichzeitige Drücken der SHIFT- und 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 ausge- geben wird, was leicht passieren kann, zumal die Großschrift doch direkt nach dem Einschalten des 64ers 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 wer- den 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 die- ses 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 sol- len 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ük- ken, und schon wird unser Steuerzeichen mit einem inversgedruckten Zeichen dargestellt. Von nun an wis- sen Sie, daß an dieser Stelle dann ein Steuerzeichen gedruckt wird. Die Steuerzeichen können Sie ebenso wie normale Buchstaben überall innerhalb der Anfüh- rungsstriche einfügen. Mit der Zeit werden Sie dann auch lernen, diese an Ihren Reverszeichen zu erken- nen. Inverszeichen wurden deshalb gewählt, da man sie in- nerhalb 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 be- nutzt. Die Zeichen zwischen diesen Steuerzeichen wer- den 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 nach- her 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 an- fangs 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 Bei- spiel, 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üh- rungsstrichen erkennen können, kann man auch bei IN- PUT einen Text angeben, der vor Ausführung der ei- gentlichen 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 Feh- lern 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 Be- fehls 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 die- se 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 soe- ben taten. Na ist ja entzückend - würde Kojak, lolli- lutschend, jetzt sagen. Merken Sie was INPUT tat? Es hat Ihre Eingabe gleich einer Variablenwertzuwei- sung, der Variable "r" zugeordnet und in ihr gespei- chert! Dies geht sogar noch weiter! Sie dürfen sogar Strings und Integers benutzen, um Eingaben in Varia- blen 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 Kon- text 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 un- terdrü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 gleichzei- tig 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 De- zimalkomma bei Floatvariablen immer einem Punkt ent- spricht. Die Eingabe müßte dann so aussehen: Koordinaten (X/Y) ? 22.3,10 Den Variablen x und y wären dann folgende Werte zu- geordnet worden:
x=22.3 y=10
Leider muß ich nun an dieser Stelle abbrechen, um keinen Informationsstau bei Ihnen hervorzurufen. Ver- suchen Sie erst einmal die eben erkannten neuen Be- fehle kennenzulernen. Sie können sich ja auch einmal das gesamte Zylinderberechnungsprogramm auf der Rück- seite dieser Magic Disk 64 ansehen. Nächsten Monat werde ich es dann auf jeden Fall zu Ende kommentie- ren. Des weiteren wollen wir uns dann mit der Schlei- fenprogrammierung und den Entscheidungsbefehlen (und -operatoren) widmen. Bis dahin wünsche ich Ihnen weiterhin ein allzeit "Gut Hack",
Ihr Uli Basters G