BASIC-Kurs : "Von Adam und Eva..." (Teil 3) ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Auf in die dritte Runde in unserem Basickurs. Diesen Monat wollen wir endlich unser Zylinderberechnungs- programm 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 Infor- mationen letzten Monats hoffentlich verarbeitet ha- ben, möchten wir uns nun gleich frisch ans Werk ma- chen und den Rest unseres Zylinderberechnungspro- gramms 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ücksei- te ebenfalls etwas anzufangen wußten, hier gab es nämlich auch noch eine Menge weiterer Steuerfunktio- nen zu finden, die wir im einzelnen im Laufe des Kur- ses 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 unse- res 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 festge- legt 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, an- schließend steht dann in der Variablen "o" die Oberfläche des verlangten Zylinders. Bitte verwech- seln Sie nie den Buchstaben o mit der Zahl 0! Die Zeilen 60-80 sind jetzt nur noch für die korrek- te, beziehungsweise formatierte Ausgabe des Ergeb- nisses 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änd- lich 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 Zy- linders 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 Varia- blen wieder in Anführungszeichen folgt. Auch hier wird am Ende dann der Wert der Variablen "r" ausge- druckt. 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 ausge- geben 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 Bild- schirm :
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 Zei- le 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 be- wirkt, daß das eben beschriebene Springen in die nächste Zeile unterdrückt wird. Ändern Sie doch ein- mal 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 ei- gentlich keinen Zweck, denn das, was nach dem Semiko- lon ausgedruckt wird, würde sowieso schon direkt fol- gen, 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 ha- ben, um dem ganzen einen besseren Eindruck zu verlei- hen zunächst einmal, ob der Benutzer noch eine weite- re 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 wie- der aus dem Englischen : WENN-DANN. Wie Sie viel- leicht erraten, ist dieser Befehl dazu gedacht be- stimmte 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 Bedin- gung 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 Ent- scheidung vom Computer getroffen. Aufgrund einer Ein- gabe des Benutzers wurde eine bestimmte Reaktion ver- anlasst. Wenn Sie "j" eingaben, dann startete das Programm wieder von vorne, wie es ja auch sein soll- te, 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 Bedin- gung, nach der unterschieden werden soll und zum an- deren 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 spa- ren könnte: IF 3=3 THEN PRINT"3 ist gleich 3." Dies allerdings nur einmal als kleines Beispiel, da- mit 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 ei- nen sogenannten "Vergleichsoperator" angeben. Dies ist ein Operator, mit dem wir dem Computer klar ma- chen, 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" klei- ner 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 vorausge- setzt 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 abarbei- tet 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 bes- ser anders benutzt, dann wäre er sinnvoller gewesen. Sie können ja die Zeilen 100 und 110 unseres Pro- gramms 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 übri- gens 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 PRINT- und dann den END-Befehl, beide getrennt durch einen Dop- pelpunkt. 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 Gedruk- ke!!!";: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 mittlerwei- le - 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 Bildschirm- zeilen). 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 Dop- pelpunkt auch seine Nachteile hat. Vorteilhaft ist, daß der Computer Programme mit vie- len 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 inter- nen Vorgängen zu tun, nämlich ganz einfach damit, daß der Computer einen Doppelpunkt schneller erkennt, als eine neue Programmzeile, beziehungsweise ist er ge- zwungen, beim Abarbeiten einer jeden neuen Zeile ein paar Arbeitsvorgänge mehr ablaufen zu lassen. Deshalb also ein (ganz,ganz) geringer Zeitgewinn bei der Be- nutzung 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 Dop- pelpunkt. 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 dur- cheinander ü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 Be- fehle 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 unter- bringen, die Sie, von ihren Zahlennummern her gese- hen, ein wenig vom Hauptprogramm absetzen, und diese dann mit ihrer Zeilennummer DIREKT anspringen. Denk- bar 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 Ein- sicht 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 Zeilennum- mer 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 Zeilen- nummer, 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 dassel- be erreichen wie vorher, allerdings mit dem Unter- schied, daß diese Zeile langsamer abgearbeitet wird, da der GOTO-Befehl ja noch erkannt werden muß, und daß sie außerdem auch noch mehr Speicherplatz ver- braucht. Die Kurzschreibweise ist also nur von Vor- teil und sollte eigentlich immer verwandt werden. Auf diese Weise können Sie übrigens auch Programmzei- len ü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 Ant- wort "N" ganz einfach der Teil, der bei "J" gekommen wäre (bzw. auch bei jedem anderen Zeichen, das un- gleich "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" ant- worten...) ü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 übersichtli- chen Programmierung zuwenden. In diesem Zusammenhang wollen wir dann auch noch 2 neue Befehle kennenler- nen. Doch zunächst möchte ich schnell noch etwas nachho- len. 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 wich- tig, da Sie ab jetzt wohl häufiger Programme schrei- ben 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 Com- puter ausschalten müssen, beziehungsweise alle vor- kommenden Zeilennummern eines Programms einzeln ein- tippen 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 aller- dings 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 an- gebracht 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 reali- sieren, 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 Textausgabe- programm 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 to- tal überflüssig! Nicht nur, daß sie niemals abgear- beitet 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 An- weisungen 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 wer- den. Zugegeben - bei einem solch kleinen Programm wie diesem hätte ich diese Feststellung wahrscheinlich auch so noch hingekriegt, doch stellen Sie sich ein- mal vor, Sie hätten ein etwas längeres Listing vor sich mit ca. 10000 Zeilen (natürlich in 10er Schrit- ten gerechnet) - Sie müssen zugeben, daß es hier nicht mehr ganz so einfach wäre das Ganze zu über- schauen. Benutzen Sie also, um einzelne Programmteile, soge- nannte 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 eige- nen 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 viel- leicht 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 wei- terzuarbeiten. Das ist wohl auch eine der Hauptschwä- chen von BASIC, die dem Anfänger anfangs das Program- mieren sehr erschwert. Also immer die einzelnen Mo- dule eines Programms gut sichtbar voneinander abset- zen, das kostet zwar ein kleines bißchen Speicher- platz, aber es lohnt sich wirklich ! Übrigens: wir hatten zwar festgestellt, daß die Dop- pelpunktzeile 40 in unserem Programm nicht abgearbei- tet 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 hirn- und 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 Vorberei- tung des auszudruckenden Textes zuständig ist, mit einem Doppelpunkt von einem zweiten Modul, nämlich das, das den Text dann ausgibt, getrennt. Der Compu- ter arbeitet also auch diese Zeile ab, sie hat aller- dings keinerlei Einwirkung auf den Programmablauf ansich, außer daß dieser vielleicht um wenige Mikro- sekunden 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 wie- der ein absetzen der Ausgabe vom bisherigen Text er- reicht. Genausogut hätte ich in Zeile 40 schreiben können : 40 PRINT "[DOWN]"; Also einfach einmal "Cursor runter", allerdings dür- fen 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 unterbin- den 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 alleini- gen Anweisung nicht gibt, warum auch nichts ausgege- ben 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 Programmie- rer erklärend wieder Anzeigen sollen, was dieser an bestimmten Stellen mit seinen Programmierkünsten be- wirken wollte. REM wird folgendermaßen angewandt :
10 REM DAS IST EIN KOMMENTAR
Hinter dem eigentlich Befehlswort REM folgt ganz ein- fach ein beliebiger Text, der Hinweise auf etwas ge- ben kann. Hier können Sie grundsätzlich alle Zeichen verwenden, die auf Ihrer Tastatur vorkommen, aller- dings sollten Sie von den Grafikzeichen absehen, da diese interne Probleme verursachen könnten. Im allge- meinen sollte man allerdings mit den Buchstaben und Zahlen auskommen. Was genau passiert jetzt bei REM im innern unseres 64ers? 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 ei- nen 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 Anweisun- gen, 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 Pro- gramme auf sehr einfache Art und Weise sehr über- sichtlich gestalten. Natürlich gibt es auch Nachtei- le, nämlich wieder die selben, wie beim Doppelpunkt - REM verbraucht Speicherplatz und verlangsamt das Pro- gramm um wenige Mikrosekunden, doch ist es immer bes- ser 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 Pro- grammierung ansehen werden, und anschließend endlich die schon letzten Monat versprochenen Schleifen an- schauen werden. Bis dahin Servus,
Ihr Uli Basters