Magic Disk 64

home to index to text: MD8903-KURS-BASIC_KURS_TEIL_3-1_:_VON_ADAM_UND_EVA...(TEIL_3)-7.1.txt
     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           

Valid HTML 4.0 Transitional Valid CSS!