Magic Disk 64

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



Valid HTML 4.0 Transitional Valid CSS!