BASIC-Kurs : "Von Adam und Eva..." (Teil 3)
Auf in die dritte Runde in unserem Basickurs. Diesen
Monat wollen wir endlich unser Zylinderberechnungsprogramm zu Ende abhandeln, um uns anschließend noch
ein paar kleine, nichtsdestotrotz ebenso wichtige
Befehle anzuschauen.
So. Nun also weiter. Nachdem Sie die Fülle an Informationen letzten Monats hoffentlich verarbeitet haben, möchten wir uns nun gleich frisch ans Werk machen und den Rest unseres Zylinderberechnungsprogramms abhandeln. Erinnern wir uns:
Wir hatten uns die ersten 40 Zeilen angeschaut und
dabei den INPUT-Befehl kennengelernt, sowie die CHR$- und die ASC-Funktion. Außerdem hatten wir uns noch
ein wenig mit den Steuercodes befaßt, und ich hoffe, daß Sie mit dem ASCII-Druck- Programm auf der Rückseite ebenfalls etwas anzufangen wußten, hier gab es
nämlich auch noch eine Menge weiterer Steuerfunktionen zu finden, die wir im einzelnen im Laufe des Kurses noch kennenlernen werden.
Doch nun weiter im Text, sprich im Listing ( so nennt
man die vom Computer geordnete Liste der einzelnen
Programmzeilen) unseres kleinen Programms, machen wir
weiter ab Zeile 50, also LIST 50-( Sie wissen doch
wohl hoffentlich noch, was dies bewirkt ? ! ?) :
50 o=2*r*π*(r+h) 60 print"[2 DOWN]Die Oberflaeche eines Zylinders mit" 70 print"der Hoehe"h"und dem Radius"r 80 print"betraegt";o 90 input"[2 DOWN]Noch eine Berechnung (J/N)";a$ 100 if a$="j"then run 110 end
Zeile 50 kennen wir ja noch von unseren Versuchen im
Direktmodus. Mit ihr können wir die Berechnung unseres Zylinders durchführen, und das allgemeingültig, denn wir können für Radius ( r) und Höhe ( h) beliebige
Werte angeben. Diese müssen halt nur vorher festgelegt werden. Wie Sie sich erinnern, hatten wir dies
in den Zeilen 30 und 40 erledigt, wo wir die zwei
INPUT-Befehle untergebracht hatten, die diese beiden
Variablen einlesen sollten. Also wird in dieser Zeile nun die eigentliche Berechnung durchgeführt, anschließend steht dann in der Variablen " o" die
Oberfläche des verlangten Zylinders. Bitte verwechseln Sie nie den Buchstaben o mit der Zahl 0 !
Die Zeilen 60-80 sind jetzt nur noch für die korrekte, beziehungsweise formatierte Ausgabe des Ergebnisses der Rechnung verantwortlich. Damit das alles
ein weing besser aussieht ( denn darauf sollte man als
Programmierer ebenfalls achten, daß die Nachrichten, die ein solches Programm ausgibt auch leichtverständlich und ansprechend lebendig sind), habe ich das
Ergebnis in einen kleinen Satz eingebunden. Zunächst
wird einmal Platz geschaffen, indem die Textausgabe 2 Zeilen tiefer geschoben wird ( das Steuerzeichen DOWN
dürften Sie ja noch aus der letzten Ausgabe kennen), jetzt haben wir das ganze schön abgesetzt von den
anderen Buchstaben auf dem Bildschirm plaziert. Nun
druckt Zeile 60 den Text " Die Oberflaeche eines Zylinders mit" aus. In der nächsten Zeile geht es dann
weiter mit " der Hoehe" und nun sehen Sie nach den
Anführungsstrichen den Buchstaben " h" eingefügt. Da
sich dieser außerhalb der " Gänsefüßchen" befindet, wird er auch nicht als Text, sondern, wie wir es bei vorherigen PRINT-Anweisungen ja schon gesehen haben, als Variablenname interpretiert. Deshalb wird jetzt
nicht ein " h" ausgedrucht sondern ganz einfach der
Wert der Variablen h. Ebenso geht es dann bei dem
anschliessenden Text, der direkt nach unserer Variablen wieder in Anführungszeichen folgt. Auch hier
wird am Ende dann der Wert der Variablen " r" ausgedruckt.
Interessant wird es dann wieder in Zeile 80, hier ist
eine weitere Funktion des PRINT-Befehls enthalten, die Ihnen vielleicht aufgefallen ist:
Nach dem Text " betraegt" folgt ein Semikolon ( oder
Strichpunkt) wie bei INPUT und anschließend der
Name der Variablen, die hier folgen soll (" o") . Ich
muß gleich zugeben, daß der Strichpunkt an dieser
Stelle eigentlich total überflüssig ist und daß man
ihn auch genausogut weglassen könnte, nur paßt er
gerade gut in den Stoff, weshalb ich Ihnen seine
Funktion nicht vorenthalten möchte.
Wie Ihnen vielleicht aufgefallen ist, arbeitet jeder
PRINT-Befehl so, daß er nachdem er einen Text ausgegeben hat in eine neue Zeile springt, wo der nächste
PRINT-Befehl dann wieder seine Arbeit fortseten kann.
Ersichtlich wird das in folgendem kleinen Programm:
10 PRINT"DAS IST IN EINER " 20 PRINT"ZEILE !!!"
Starten Sie es, so sehen Sie folgendes auf dem Bildschirm :
DAS IST IN EINER ZEILE !!!
Was zum ausgegebenen Text wohl total im Gegensatz
steht. Doch PRINT hat hier genau das getan, was er
sollte. Nach Zeile 10 hat er den Cursor an den Anfang
der nächsten Zeile gesetzt und dann den Text aus Zeile 20 ausgedruckt ( durch einen erneuten PRINT-Aufruf) .
Doch was hat das alles mit unserem Semikolon zu tun ?
Nun, das Semikolon am Ende eines PRINT-Befehls bewirkt, daß das eben beschriebene Springen in die
nächste Zeile unterdrückt wird. Ändern Sie doch einmal unser Programm folgendermaßen ab:
10 PRINT"DAS IST IN EINER "; 20 PRINT"ZEILE !!!"
Starten Sie es jetzt so sehen Sie:
DAS IST IN EINER ZEILE !!!
Womit diesmal tatsächlich alles " in einer Zeile ist" .
In unserem Zylinderberechnungsprogramm hat das eigentlich keinen Zweck, denn das, was nach dem Semikolon ausgedruckt wird, würde sowieso schon direkt folgen, da das Drucken der Variablen " o" ja noch zum
selben PRINT-Befehl gehört. Doch wäre durchaus auch
so etwas denkbar:
80 PRINT "betraegt"; 85 PRINT o
Würden Sie diese beiden Zeilen in unser Programm
einfügen, so kämen Sie ebenfalls zum selben Ergebnis.
Nun weiter in den folgenden Zeilen, von 90-110 . Hier
gibt es nämlich wieder etwas neues zu lernen: der
IF-THEN- Befehl. Ich liste Ihnen diese Zeilen hier
noch einmal auf, damit Sie sich das ein wenig genauer
ansehen können:
90 input"[2 DOWN]Noch eine Berechnung (J/N)";a$ 100 if a$="j"then run 110 end
Zunächst einmal Zeile 90 . Hier fragen wir, nachdem
wir die Augabe um 2 Zeilen nach unten geschoben haben, um dem ganzen einen besseren Eindruck zu verleihen zunächst einmal, ob der Benutzer noch eine weitere Zylinderberechnung verlangt. Das heißt, ob er den
Rechenvorgang eventuell wiederholen möchte oder
nicht.
Hier kann er, wie vom Text vorgeschlagen, mit J für
JA, oder mit N für NEIN antworten. Die Antwort, zu
der er sich entscheidet, wird dann in der String-Variablen " a$" abgespeichert.
Nun das neue: in Zeile 100 sehen wir die sogenannte
IF-THEN- Klammer. Übersetzen wir doch erst eimal wieder aus dem Englischen : WENN-DANN. Wie Sie vielleicht erraten, ist dieser Befehl dazu gedacht bestimmte Abrfragen auf ihren Wahrheitsgehalt zu prüfen, um anschliessend entsprechend im Programm zu
verzweigen. Ich kann gleich anmerken, daß dies wohl
einer der wichtigsten Befehle für Programme ist, da
Sie ohne ihn kaum komplexere Dinge schreiben könnten, als unsere einfache Zylinderberechnung. Hier benutze
ich ihn eigentlich nur, um das Programm ein klein
wenig komfortabler zu machen, und um außerdem diesen
äußerst wichtigen Befehl einzuführen. Was geschieht
nun in Zeile 100 ?
Ganz einfach :
1 .) Der IF-Befehl prüft, ob die ihm folgende Bedingung erfüllt ist, das heißt, ob in der Variablen
" a$" der Buchstabe " j" enthalten ist.
2 .) Sollte diese Bedingung " wahr" sein, so wird der
Computer ganau das ausführen, was hinter dem
THEN-Wort folgt. In unserem Fall würde er den
RUN-Befehl aufrufen, der unser kleines Programm
wieder von vorne ablaufen lassen würde. Aber
jetzt kommt der Clou:
3 .) Sollte die Bedingungen " unwahr" sein, oder ganz
einfach " falsch", dann wird der Teil hinter THEN
ignoriert und einfach in der Zeile hinter der
IF-THEN- Klammer weitergemacht. In unserem Fall
steht hier der Basic-Befehl END, den wir noch
nicht kennen, den ich Ihnen später jedoch genauer
erläutern werde. Erst einmal zu IF-THEN :
Sie sehen also, hier wurde ganz einwandfrei eine Entscheidung vom Computer getroffen. Aufgrund einer Eingabe des Benutzers wurde eine bestimmte Reaktion veranlasst. Wenn Sie " j" eingaben, dann startete das
Programm wieder von vorne, wie es ja auch sein sollte, wenn man " noch eine Berechnung" wünscht, andern- falls wurde das Programm beENDet ( nichts anderes tut
der END-Befehl, doch ist trotzdem noch mehr zu ihm zu
sagen) .
Um den IF-THEN- Befehl ( es ist nur ein Befehl, da
die beiden Teilworte alleine keinen Sinn ergeben und
vom Computer auch mit einem ERROR quittiert werden) zu benutzen brauchen wir also zum einen eine Bedingung, nach der unterschieden werden soll und zum anderen einen oder mehrere Befehle, die beim Zutreffen
der gestellten Bedingung ausgeführt werden sollen.
Als Bedingungen können Sie hier mit allen Variablen
" spielen" die unser Computer kennt, oder Sie können
auch einfach nur Argumente angeben, wobei dies nicht
unbedingt sinnvoll ist, da eine folgende Bedingung ja
immer wahr wäre, und man somit sich die Abfrage sparen könnte:
IF 3=3 THEN PRINT"3 ist gleich 3 ."
Dies allerdings nur einmal als kleines Beispiel, damit Sie auch verstehen, was mit " Bedingung" gemeint
ist. Weitaus sinnvoller als Abfrage wäre schon eher
so etwas:
IF A= B THEN PRINT" A und B sind gleich."
Hier könnten die beiden Variablen tatsächlich einmal
verschieden von einander und einmal gleich sein.
Bei den Bedingungen, die Sie angeben können, müssen
Sie, wie Ihnen vielleicht aufgefallen ist, immer einen sogenannten " Vergleichsoperator" angeben. Dies
ist ein Operator, mit dem wir dem Computer klar machen, in welcher Weise nun verglichen werden soll, denn man kann die einzelnen Vergleichsargumente auch
relativ aufeinander beziehen. So wären zum Beispiel
die folgenden Ausdrücke vollkommen identisch :
IF A>B THEN PRINT"A ist groesser B." IF B<A THEN PRINT"A ist groesser B."
Zumal ja automatisch mit der Bedingung, daß " A" kleiner als " B" ist, auch gesagt ist, daß " B" größer als" A" ist. Hier werden natürlich die Variablenwerte
verglichen. Wie wir ja gelernt haben müßte das bei
Strings ja dann in Gänsefüßchen stehen. Sie können
übrigens problemlos auch ganze Wörter vergleichen:
IF a$="BASIC" THEN PRINT "BASIC find ich auch super!"
Doch nun wieder zu den Vergleichsoperatoren. Hier
können Sie mehrere Arten verwenden, die ich Ihnen
hier einmal auflisten möchte:
a=b A gleich B a<>b A ungleich B (entweder größer oder kleiner) a>b A größer B a<b A kleiner B a>=b A größer oder gleich B a<=b A kleiner oder gleich B
Zu den beiden letzten Punkten sei noch zu sagen, daß
sie ebenso auch folgendermaßen lauten könnten :
a=>b A gleich oder größer B a=<b A gleich oder kleiner B
Hierbei bewirken beide Schreibarten dasselbe.
Es gibt übrigens noch 3 weitere Vergleichsoperatoren, die wir aber hier vorläufig übergehen wollen, da zu
deren Verständnis weitere Grundkenntnisse vorausgesetzt sein müssen. Nun noch zu END:
Wie bereits erwähnt sorgt dieser Befehl dafür, daß
ein Basicprogramm beENDet wird. Der Computer bricht
an dieser Stelle ganz einfach ab und meldet sich im
Direktmodus mit " READY." wieder zurück. Auch dieser
Befehl ist an der Stelle im Programm eigentlich ganz
überflüssig, denn sollte Ihr C64 irgendwann einmal am
Ende eines Listings, also in der letzten Zeile des
Programms, daß er zu diesem Zeitpunkt gerade abarbeitet angelangt sein, so wird er es sowieso beenden und
in den Direktmodus zurückspringen. Ich habe diesen
Befehl eigentlich auch nur deshalb benutzt, weil ich
ihn Ihnen halt vorstellen wollte. Ich hätte Ihn besser anders benutzt, dann wäre er sinnvoller gewesen.
Sie können ja die Zeilen 100 und 110 unseres Programms einmal folgendermaßen abändern:
100 IF a$="n" THEN END 110 RUN
Dies hat den selben Effekt, nur daß Sie nun den Sinn
des END-Befehls sehen. Hier ist es unbedingt nötig
das Programm abzubrechen, und da es dies nicht von
selbst tut, da es ja noch eine Zeile hat die es
ausführen könnte, müssen wir dieses Beenden sozusagen
" künstlich" erzwingen. . .
Wie Ihnen womöglich auffiel, hatte ich vorhin übrigens von mehreren Befehlen ( also Plural) gesprochen, die nach dem THEN ausgeführt werden können.
Doch wie? Hierzu kennt BASIC das Befehlstrennzeichen
" :" . Ja, ein ganz schlichter Doppelpunkt, mit ihm
können Sie dann 2 Befehle in einer Zeile voneinander
trennen, ohne einen SYNTAX ERROR zu erhalten, bei
IF-THEN sähe das so aus :
IF a$=" n" THEN PRINT" Tschuess dann, bis zum naechsten
Mal. . ." : END
Sie sehen, hier haben wir zunächst einen PRINTund
dann den END-Befehl, beide getrennt durch einen Doppelpunkt. Diesen Trick können Sie auch so in einer
normalen Zeile ( also in einer solchen, in der KEIN
IF-THEN steht) anwenden. Etwa so:
10 PRINT" Das ist eine Endlosschleife mit viel Gedrukke! ! !" ; : GOTO 10
Probieren Sie es, nun haben wir unsere Endlosschleife
vom letzten Mal in nur EINE Zeile gepackt, und sie
funktioniert genauso zuverlässig. Wie man sie jetzt
auch wieder " endlich" macht wissen Sie ja mittlerweile - einfach RUN/ STOP drücken.
Die einzige Grenze für Zeilen mit Doppelpunkten
stellt die maximale Länge einer BASIC-Programm- Zeile
dar. Grundsätzlich darf eine Programmzeile nämlich
nie mehr als 80 Zeichen lang sein ( also 2 Bildschirmzeilen) . Dies ist eine computerinterne Regel, die
etwas mit der Art und Weise zu tun hat, mit der eine
Zeile im Speicher des Computers abgespeichert wird.
Alles, was Sie mehr eingeben, wird radikal vom Compu- ter abgeschnitten, er akzeptiert also nur maximal 80 Zeichen.
Ich kann Ihnen übrigens gleich verraten, daß der Doppelpunkt auch seine Nachteile hat.
Vorteilhaft ist, daß der Computer Programme mit vielen Doppelpunkten, wo die einzelnen Befehle also in
lange Zeilen zusammengefasst sind, grundsätzlich
schneller abarbeitet, als die gleiche Befehlsfolge in
mehreren Zeilen. Dies hat ebenfalls etwas mit internen Vorgängen zu tun, nämlich ganz einfach damit, daß
der Computer einen Doppelpunkt schneller erkennt, als
eine neue Programmzeile, beziehungsweise ist er gezwungen, beim Abarbeiten einer jeden neuen Zeile ein
paar Arbeitsvorgänge mehr ablaufen zu lassen. Deshalb
also ein ( ganz, ganz) geringer Zeitgewinn bei der Benutzung des Doppelpunkts.
Ebenso vorteilhaft ist auch, daß durch die Benutzung
des Doppelpunkts Speicherplatz gespart wird. Die
Speicherung einer neuen Programmzeile kostet mehr
Platz im Hauptspeicher des C64 als ein einzelner Doppelpunkt.
Doch nun der große Nachteil, weshalb ich Ihnen auch
sehr von der Benutzung des Doppelpunkts außerhalb von
IF-THEN- Klammern abrate. Dadurch, daß alles so durcheinander über 2 Bildschirmzeilen verteilt steht, entsteht ein wahres Chaos auf dem Bildschirm, wenn
Sie Ihr Programm einmal listen sollten. Es wird durch
den Doppelpunkt sehr, sehr unübersichtlich, was eine
Tücke von BASIC ist, die einem als Anfänger häufig
Schwierigkeiten macht. Ich empfehle Ihnen also, den
Doppelpunkt nur dann zu benutzen, wenn nicht sehr
viel Unheil durch ihn im Gesamtbild des Listings auf
dem Bildschirm entsteht ( also nur, wenn alle durch
ihn getrennten Befehle noch in EINE Bildschirmzeile - das sind 40 Zeichen - passen) . Und in IF-THEN- Klammern, wo es manchmal unerläßlich ist, mehrere Befehle auszuführen, bevor BASIC dann in der IF-THEN
folgendenden Zeile mit seiner Arbeit fortfährt.
Hier gibt es übrigens auch eine Alternative mit der
Sie auch bei IF-THEN keine Probleme bekommen sollten, was die Formatierung des Programmtextes angeht, denn
nichtsdestotrotz wird eine " Doppelpunkt-IF- THEN-Zeile" ebenso unübersichtlich wie eine normale 80- Zeichen-Zeile. Hierbei hilft uns eine kleine Eigenart des THEN-Befehls. Sie könnten nämlich eine längere
Befehlsfolge ebensogut auch in mehreren Zeilen unterbringen, die Sie, von ihren Zahlennummern her gesehen, ein wenig vom Hauptprogramm absetzen, und diese
dann mit ihrer Zeilennummer DIREKT anspringen. Denkbar wäre folgendes :
10 INPUT"[CLR]WOLLEN SIE TEXT SEHEN (J/N) ";a$ 20 IF a$="J" THEN 200 30 PRINT"DANN NICHT...":END 40 : 200 PRINT"DAS IST IHR GEWUENSCHTER TEXT..." 210 PRINT"UND HIER NOCH EINE KLEINE ZUGABE AN" 220 PRINT"TEXT, DAMIT SIE SICH NICHT VERAEPPELT" 230 PRINT"FUEHLEN, UND DAMIT HIER AUCH NOCH MEHR" 240 PRINT"ZEILEN GEFUELLT WERDEN."
Zuerst haben wir in Zeile 10 die Abfrage, ob die Einsicht vom Benutzer in den Text überhaupt erwünscht
ist. Die Antwort, wieder ein J oder ein N, wird in
der Variablen a$ gespeichert. Dann folgt eine IF-THEN- Abfrage, ob die Anwort ein " J" war. Wenn nicht, dann wird der Text " DANN NICHT. . ." ausgedruckt und
das Programm wird beendet.
Sollte die Antwort allerdings tatsächlich " J" gewesen
sein, traf unsere Bedingung also zu, so springt der
Computer gleich weiter zu Zeile 200, wo er dann den
gewünschten Text ausdruckt, der hier getrennt in 5 eigenen Zeilen abgelegt wurde. Bestimmt ist Ihnen
aufgefallen, daß merkwürdigerweise nur die Zeilennummer unserer gewünschten Zeile hinter dem THEN folgt.
Dies ist eben jene Eigenart des THEN-Befehls, von der
ich eben sprach. Er interpretiert Zahlen, die direkt
nach ihm folgen grundsätzlich immer als eine Zeilennummer, auf die er springen soll. Er führt sozusagen
den Befehl GOTO 200( oder GOTO xxxx) aus. Ändern Sie
Zeile 20 doch einmal folgendermaßen um:
20 IF a$=" J" THEN GOTO 200
Sie werden feststellen, daß Sie hiermit genau dasselbe erreichen wie vorher, allerdings mit dem Unterschied, daß diese Zeile langsamer abgearbeitet wird, da der GOTO-Befehl ja noch erkannt werden muß, und
daß sie außerdem auch noch mehr Speicherplatz verbraucht. Die Kurzschreibweise ist also nur von Vorteil und sollte eigentlich immer verwandt werden.
Auf diese Weise können Sie übrigens auch Programmzeilen überspringen, etwa so:
10 INPUT"[CLR]WUENSCHEN SIE TEXT (J/N) ";a$ 20 IF a$="N" THEN 40 30 PRINT"HIER IST TEXT FUER SIE..." 35 END 40 PRINT"NIX TEXT!"
Die ersten 2 Zeilen sind ja mittlerweile ein " alter
Hut" für uns. In Zeile 20 sehen Sie, daß bei der Antwort " N" ganz einfach der Teil, der bei " J" gekommen
wäre ( bzw. auch bei jedem anderen Zeichen, das ungleich " N" gewesen wäre, wie auch in den Beispielen
zuvor, ich hatte es dort allerdings nie erwähnt, die
Zeilen 30 und 35 ausgeführt werden. Sie können es
gerne einmal ausprobieren und mit " Y" oder " Z" antworten. . .) übersprungen wird. Wenn nicht, dann wird
der folgende Teil ausgeführt. Von hier können Sie
entweder gleich mit END aufhören, oder Sie springen
dann von dort wieder mit GOTO hinter die Zeilen, die
bei " N" ausgeführt worden wären. Dies sähe dann so
aus:
10 INPUT"[CLR]WUENSCHEN SIE TEXT (J/N) ";a$ 20 IF a$="N" THEN 40 30 PRINT"HIER IST TEXT FUER SIE..." 35 GOTO 50 40 PRINT"NIX TEXT!" 50 END
Ich hoffe Ihnen nun klar und deutlichst die Benutzung
und vor allen Dingen den Sinn von IF-THEN dargelegt
zu haben und möchte mich nun einmal der übersichtlichen Programmierung zuwenden. In diesem Zusammenhang
wollen wir dann auch noch 2 neue Befehle kennenlernen.
Doch zunächst möchte ich schnell noch etwas nachholen. Ich habe nämlich - ich muß es gestehen - einen
äußerst wichtigen Befehl vergessen, als ich Ihnen
letzten Monat erläuterte, wie man Programme
schreibt: den NEW-Befehl.
Dieser Befehl braucht keinerlei Parameter, und ist
daher auch ganz schnell und einfach abgehandelt. Er
dient dazu, ein Programm aus dem Programmspeicher Ihres C64 wieder zu löschen. Dies ist insofern wichtig, da Sie ab jetzt wohl häufiger Programme schreiben werden, und Sie diese nun ganz einfach mit NEW
wieder löschen können, falls Sie ein neues eingeben
möchten, und nicht mehr immer gleich den ganzen Computer ausschalten müssen, beziehungsweise alle vorkommenden Zeilennummern eines Programms einzeln eintippen müssen, um diesen Effekt zu erzielen.
Außer den gesamten Programmspeicher zu löschen, löscht NEW auch alle sich zu diesem Zeitpunkt sich im
Speicher befindlichen Variablen! Wundern Sie sich
also nicht, wenn manche vorher von Ihnen definierte
Variablen plötzlich leer sind.
Den gleichen Effekt, nämlich daß alle Variablen im
Speicher gelöscht werden können Sie ebenso mit dem
Befehl CLR ( für CLEAR = löschen) erzielen. Mit dem
einzigen Unterschied zu NEW, daß Ihr geschriebenes
Programm noch im Speicher steht, die Variablen allerdings gelöscht sind. Dieser Befehl wird eigentlich
kaum benutzt, allerdings ist es gut, ihn zu kennen, da es auch hier und da mal Gelegenheiten geben wird, wo er ganz angebracht ist. Sie werden schon sehen. . .
Dies also zu NEW und CLR, die übrigens beide keine
Parameter brauchen - leider, da es manchmal ganz angebracht wäre, wenn man einfach nur einen bestimmten
Bereich eines Programms löschen könnte, doch leider
ist dies nicht möglich und wirklich nur so zu realisieren, indem man halt sämtliche Zeilennummern dieses
Bereichs durch einzelnes Eintippen löscht.
Wenden wir uns nun einmal dem übersichtlichen, der
formatierten Programmierung zu, wie ich es weiter
oben schon angekündigt hatte.
Vielleicht haben Sie sich unser kleines Textausgabeprogramm von vorhin einmal genauer angeschaut und
sicher sind Ihnen daran auch mindestens eine Sache, wenn nicht sogar 2, aufgefallen. Wie? Nein? Na dann
schauen Sie doch einfach nochmal rein:
10 INPUT"[CLR]WOLLEN SIE TEXT SEHEN (J/N) ";a$ 20 IF a$="J" THEN 200 30 PRINT"DANN NICHT...":END 40 : 200 PRINT"DAS IST IHR GEWUENSCHTER TEXT..." 210 PRINT"UND HIER NOCH EINE KLEINE ZUGABE AN" 220 PRINT"TEXT, DAMIT SIE SICH NICHT VERAEPPELT" 230 PRINT"FUEHLEN, UND DAMIT HIER AUCH NOCH MEHR" 240 PRINT"ZEILEN GEFUELLT WERDEN."
Na? Klingelt es bei Ihnen? Genau - die eine Sache
liegt ja wohl auf der Hand. Zeile 40 ist ja wohl total überflüssig! Nicht nur, daß sie niemals abgearbeitet wird, da das Programm ja vorher in Zeile 40 schon mit END beendet wurde, sie ist außerdem auch
von ihrem Aussehen etwas merkwürdig, zumal KEINE Anweisungen in ihr vorkommen, und sie einfach nur aus
einem Doppelpunkt besteht. Warum also überhaupt eine
solche Zeile? Na wie Sie sich schon denken können, da es hier ja um die Formatierung des Programmtextes
geht, hat das ganze etwas mit eben jenem zu tun.
Ich habe diese Zeile ganz einfach deshalb eingefügt, um die vorherige Abfrage und den anschließenden Text
ein wenig voneinander abzusetzen. Damit man, sollte
man sich dieses Listing zu einem späteren Zeitpunkt
nocheinmal ansehen, sofort erkennt, daß die beiden
Programmteile verschiedene Aufgaben haben und nicht
zusammengehören und hintereinander abgearbeitet werden. Zugegeben - bei einem solch kleinen Programm wie
diesem hätte ich diese Feststellung wahrscheinlich
auch so noch hingekriegt, doch stellen Sie sich einmal vor, Sie hätten ein etwas längeres Listing vor
sich mit ca.10000 Zeilen ( natürlich in 10 er Schritten gerechnet)- Sie müssen zugeben, daß es hier
nicht mehr ganz so einfach wäre das Ganze zu überschauen.
Benutzen Sie also, um einzelne Programmteile, sogenannte Module, optisch voneinander abzusetzen immer
eine oder mehr Doppelpunktzeilen, damit Sie sich später wieder in Ihrem eigenen Programm zurechtfinden.
" Wieso soll ich mich denn nicht mehr in meinem eigenen Programm zurechtfinden können, zumal ich es doch
selbst geschrieben habe?" werden Sie sich jetzt
vielleicht fragen, doch glauben Sie mir, denn ich
speche aus Erfahrung, wenn Sie nach einiger Zeit mal
wieder in ein altes Programm reinschauen, um es vielleicht zu verbessern, dann wissen Sie manchmal selbst
nicht mehr, was Sie da eigentlich bewirken wollten
und es passiert dann schnell, daß man dann einfach
die Lust verliert, an so einem Anweisungschaos weiterzuarbeiten. Das ist wohl auch eine der Hauptschwächen von BASIC, die dem Anfänger anfangs das Programmieren sehr erschwert. Also immer die einzelnen Module eines Programms gut sichtbar voneinander absetzen, das kostet zwar ein kleines bißchen Speicherplatz, aber es lohnt sich wirklich !
Übrigens: wir hatten zwar festgestellt, daß die Doppelpunktzeile 40 in unserem Programm nicht abgearbeitet wird, da dieses vorher ja mit END beendet wird, aber es sei hier auch noch gesagt, daß der Computer
sie auch ruhig hätte ausführen können - sie hätte
keine Fehlermeldung bewirkt, sondern wäre sozusagen
ganz einfach " übergangen" worden, obwohl dies nicht der richtige Ausdruck hierfür ist. Sie wird nämlich wie eine normale Programmzeile behandelt.
Der Grund, warum nichts passiert, wenn der Computer
eine solche Zeile durchläuft ist ganz einfach der, daß der Doppelpunkt, wie wir ja gelernt haben, als
Trennzeichen zweier Befehle dient. In unserer Zeile
trennt er ganz einfach den " Befehl" NICHTS von dem
" Befehl" NICHTS, wird also als gültiges Trennzeichen
erkannt; daß diesem gar kein Befehl folgt, steht auf
einem anderen Blatt. Der Computer " übersieht" das
sozusagen. Er erkennt nur, daß dann die Programmzeile
endet, und daß er die nächste abzuarbeiten hat, was
er auch prompt tut. Daß wir ihm soeben eine völlig
hirnund sinnlose Zeile vorgesetzt hatten ist ihm
egal, solange er nichts an dieser auszusetzen hatte, was ja nicht der Fall war. Sie könnten also ebenso
einzelne Funktionsmodule im Programmfluß voneinander
trennen:
10 input"Bitte geben Sie einen Text ein ";a$ 20 a$="Das ist Ihr Text : "+a$ 30 : 40 PRINT 50 PRINT a$
Sie sehen, in Zeile 10 wird ein Text in die Variable
a$ eingelesen, und in Zeile 20 wird vor diesen Text
noch der Prefix " Das ist Ihr Text :" gehängt. Die
Variablenzuweisung dürfte Ihnen ja bekannt sein, hier
wird a$ ganz einfach das zugeordnet, was auf der
rechten Seite steht. Hierbei gilt natürlich noch der
alte Inhalt der Variablen a$- genau also wie bei dem
Ausdruck I= I+1 . Sie müßten das noch von dem letzten
Kurs her kennen. . .
Hier sieht man übrigens auch sehr schön, wie man
Strings aneinanderhängen kann, nämlich ganz einfach, indem man sie wie Zahlen mit dem Pluszeichen addiert
( ACHTUNG! In umgekehrter Richtung, also mit Minus ist
nichts zu machen! Wie das geht kommt später. . .)
In Zeile 30 wird nun das Modul, das für die Vorbereitung des auszudruckenden Textes zuständig ist, mit
einem Doppelpunkt von einem zweiten Modul, nämlich
das, das den Text dann ausgibt, getrennt. Der Computer arbeitet also auch diese Zeile ab, sie hat allerdings keinerlei Einwirkung auf den Programmablauf
ansich, außer daß dieser vielleicht um wenige Mikrosekunden verlangsamt wird.
Vielleicht ist Ihnen in Zeile 40 auch das einsame
PRINT aufgefallen, das, ganz im Gegensatz zu unseren
PRINTs, keinen Text oder gar eine Variable hinter
sich stehen hat. Dieses PRINT, ohne Parameter also, tut nichts anderes, als den Cursor an den Anfang der
nächsten Zeile zu setzen. Hiermit haben wir also wieder ein absetzen der Ausgabe vom bisherigen Text erreicht. Genausogut hätte ich in Zeile 40 schreiben
können :
40 PRINT "[ DOWN]" ;
Also einfach einmal " Cursor runter", allerdings dürfen Sie hier das Semikolon ( ;) nicht vergessen, da
sonst 2( !) Zeilen freigelassen werden. Da PRINT ja
nach jeder Ausgabe den Cursor in die nächste Zeile
vorschiebt, und wir dies mit dem Semikolon unterbinden können. Hier sehen Sie auch warum PRINT alleine
einfach nur eine Zeile weitergeht - nachdem es den
Text ausdruckte, den es ja leider bei dieser alleinigen Anweisung nicht gibt, warum auch nichts ausgegeben wird, rückt es eine Zeile weiter. . .
Als letztes möchte ich jetzt noch den REM-Befehl
einführen. REM steht für REMark, was so viel heißt
wie " Anmerkung", womit schon wieder alles gesagt ist.
REM wird nämlich dazu benutzt, kleine Anmerkungen in
Programmen unterzubringen, die später dem Programmierer erklärend wieder Anzeigen sollen, was dieser an
bestimmten Stellen mit seinen Programmierkünsten bewirken wollte.
REM wird folgendermaßen angewandt :
10 REM DAS IST EIN KOMMENTAR
Hinter dem eigentlich Befehlswort REM folgt ganz einfach ein beliebiger Text, der Hinweise auf etwas geben kann. Hier können Sie grundsätzlich alle Zeichen
verwenden, die auf Ihrer Tastatur vorkommen, allerdings sollten Sie von den Grafikzeichen absehen, da
diese interne Probleme verursachen könnten. Im allgemeinen sollte man allerdings mit den Buchstaben und
Zahlen auskommen.
Was genau passiert jetzt bei REM im innern unseres
64 ers? Nun, sobald dieser erkannt hat, daß er hier
einen REM-Befehl vor sich hat, springt er sofort in
die nächste Programmzeile, um diese abzuarbeiten, und
ignoriert ganz einfach den Text der hinter REM kommt.
Somit kann dann natürlich auch keine Fehlermeldung
entstehen, von dem was da steht, zumal die meisten
Computersprachen mehr auf Englisch ansprechen ( wie
wir ja mittlerweile oft genug gemerkt haben) als auf
Deutsch, und somit unser C64 wohl nicht mehr als einen SYNTAX ERROR in solchen Fällen auf Lager hätte.
Versuchen Sie es doch einmal so :
10 DAS IST EIN KOMMENTAR
Sie werden sich denken können, was passiert. . .
Was jetzt noch erwähnenswert wäre, ist, daß bei REM
grundsätzlich ALLES, was in dieser Zeile noch folgt, übersprungen wird. Also auch Befehle, oder Anweisungen, die hier stehen könnten. Eine solche Zeile wäre
also ein fataler Fehler:
10 PRINT"ERST DAS.":REM AUSDRUCK 1:PRINT"DANN DAS."
Der Ausdruck, den Sie jetzt sähen, wäre folgender:
ERST DAS.
Die zweite PRINT-Anweisung, wäre übergangen worden, da grundsätzlich alles ignoriert wird, also auch die
PRINT-Anweisung, was hinter dem Befehlswort REM
steht. Dies sollten Sie sich einprägen !
Der Vorteil von REM liegt mittlerweile ja dann auch
auf der Hand. Mit diesem Befehl kann man seine Programme auf sehr einfache Art und Weise sehr übersichtlich gestalten. Natürlich gibt es auch Nachteile, nämlich wieder die selben, wie beim Doppelpunkt - REM verbraucht Speicherplatz und verlangsamt das Programm um wenige Mikrosekunden, doch ist es immer besser ein gut formatiertes Listing zu haben, als einen
Haufen Spaghetti-Code durch den man selbst nicht mehr
durchsteigt. Wen es wurmt, daß sein Programm dadurch
langsamer und Speicherintensiver wird, der kann ja, nachdem er eine Kopie von der kommentierten Version
angefertigt hat, die überflüssigen Zeilen löschen und
es in dieser endgültigen Version dann benutzen, so
hat man dann immer noch eine kommentierte Kopie, an
der man leicht wieder kleine Veränderungen machen
kann.
Hiermit möchte ich dann wieder schließen und mich bis April von Ihnen verabschieden, wo wir uns dann
noch zwei wichtige Befehle zur formatierten Programmierung ansehen werden, und anschließend endlich
die schon letzten Monat versprochenen Schleifen anschauen werden. Bis dahin Servus,
Ihr Uli Basters