Magic Disk 64

home to index to html: MD8902-KURS-BASIC_KURS_TEIL_2-1_:_VON_ADAM_UND_EVA...(TEIL_2)-7.1.html
                  Basic-Kurs Teil 2                  
                  ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾                  
Lieber  Leser. Nachdem wir uns das letzte Mal ja aus-
giebig um die Variablen und den  PRINT-Befehl  geküm-
mert  haben, möchten wir uns diesen Monat nun endlich
dem Programmeschreiben, also der wirklichen  Program-
merung, von BASIC befassen.                          
Letzte  Ausgabe  hatten wir unsere Befehle und Anwei-
sungen ja immer direkt auf den Bildschrirm  geschrie-
ben,  und der Computer hat sie dann auch immer, nach-
dem wir die Taste RETURN gedrückt hatten, sofort aus-
geführt,  insofern  er nichts an der Syntax der Zeile
auszusetzen hatte. Nun müssen Sie allerdings zugeben,
daß unsere kleinen PRINT-Anweisungen sich als relativ
umständlich und sinnlos erwiesen, zumal man, um einen
Text auf den Bildschirm zu drucken, ja mehr  Schreib-
arbeit   hatte,  als  wenn man ihn einfach "von Hand"
auf den Bildschirm geschrieben hätte.  Man  hatte  ja
noch zusätzlich den PRINT-Befehl zu schreiben und die
Anführungszeichen, die den Text einschlossen.        
Nun,  all  dies  hat  natürlich  einen Sinn, denn der
PRINT-Befehl ist, ebenso wie die meisten anderen  BA-
SIC-Befehle,  nicht  dafür  geschaffen worden, direkt
Texte auszugeben, sondern um in Programmen zu  arbei-
ten,  wo  die  Textausgabe zur Kommentierung des Pro-
gramms absolut unerläßlich ist, zumal dann ein völlig
ahnungsloser Benutzer auch dann mit dem Programm  et-
was  anfangen  kann,  wenn er es sich  zum ersten Mal
ansieht. Doch wie sag ichs meinem Computer?  Wie  ma-
chen wir denn unserem C64  klar, daß wir die eingege-
ben Zeile nicht jetzt, sondern irgendwann später aus-
geführt haben wollen, und daß er sich diese Zeile für
jenen späteren Zeitpunkt merken soll?  Nun, geben Sie
doch einfach einmal folgende Zeile ein :             
10 print"Das ist ein Programm !"                     
Sie sehen, daß Sie nichts sehen. Denn sobald Sie  die
RETURN-Taste drücken, druckt Ihnen Ihr 64er nicht den
Text "Das ist ein Programm !" aus sondern springt mit
dem Cursor (das ist das kleine hellblaue Viereck, das
immer  so  blinkt, und Ihnen Ihre Schreibposition an-
gibt) einfach in die nächste Bildschirmzeile und war-
tet  nun  wiederum  auf  eine Eingabe. Noch nicht mal
eine Fehlermeldung ist zu  sehen.  Eine   Riesensaue-
rei!!!                                               
Doch  keine Panik ! Ihr C64 ist nicht etwa beleidigt,
oder kaputt, sondern er hat sich soeben  gerade  eine
Programmzeile gemerkt. Doch was heißt das eigentlich?
Nun,  wie  Ihnen  bestimmt aufgefallen ist, haben wir
vor unsre PRINT-Anweisung noch eine Zahl geschrieben.
Dies ist die sogenannte  Zeilennummer.  Ihr  Computer
merkt  sich Ihre Eingaben intern nämlich mit Nummern,
die er nach ihrer Größe ordnet. Das  heißt,  daß  Sie
mit dieser Zahl auch immer wieder auf eben jene Zeile
zurückgreifen  können.  Sie ist sozusagen das "Erken-
nungszeichen" einer Programmzeile. Was das genau  be-
deutet,  möchte  ich Ihnen mit einem kleinen Beispiel
noch ein wenig näher bringen. Geben Sie  doch  einmal
ein:                                                 
list                                                 
Sie sehen nun folgendes:                             
10 print"Das ist ein Programm !"                     
ready.                                               
Nach Eingabe des BASIC-Befehls LIST hat uns  der  C64
die  eben  eingegebene  Programmzeile wieder aufgeLI-
STet; so, wie wir sie eingegeben hatten, nämlich  mit
ihrer  Zeilennummer  vorangestellt. Er hat sich diese
Zeile also gemerkt. Sie können gerne einmal probieren
ob es  auch  funktioniert  wenn  Sie  den  Bildschirm
gelöscht  haben  (dies tun Sie mit der Tastenkombina-
tion SHIFT und CLR/HOME), auch  nun  wird  Ihnen  der
Text  noch  haargenauso angezeigt, wie Sie ihn einga-
ben, es hat also nichts damit zu tun, daß unsere Zei-
le  noch  auf  dem Bildschirm stand. Das ist auch gut
so, denn der C64  merkt sich solche Programmzeilen in
seinem Programmspeicher (ebenso  wie  die  Variablen)
von wo er sie auch wieder auf dem Bildschirm anzeigen
kann, halt mit eben jenem Befehl LIST.               
Auch für Zeilennummern müssen  Sie  bestimmte  Regeln
einhalten, damit Ihnen keine Fehler angezeigt werden.
Hier eine Zusammenfassung dieser Regeln :            
1.) Sie können alle Zahlen von 0 bis 63999  für  eine
    Zeilennummer  benutzen.  Dabei sollten Sie jedoch
    die Zeilennummern immer in 10er-Schritten   (also
    10,20,30,40,etc.)  vergeben,  warum dies von Vor-
    teil ist, werde ich Ihnen später erklären.       
2.) Egal in welcher Reihenfolge Sie die Zeilen einge-
    ben, der C64 ordnet diese immmer wieder neu  nach
    der Größe ihrer Zahlen ein. Sollten Sie also ein-
    mal folgende Zeilen  in  der  hier  dargestellten
    Reihenfolge eingeben:                            
    30 print"Zeile 30"                               
    10 print"Zeile 10"                               
    20 print"Zeile 20"                               
    40 print"Zeile 40"                               
    So wird Ihnen Ihr C64  nach der Eingabe von  LIST
    immer wieder folgendes Bild liefern :            
    10 print"Zeile 10"                               
    20 print"Zeile 20"                               
    30 print"Zeile 30"                               
    40 print"Zeile 40"                               
3.) Sollten Sie eine Zeile eingeben, die eine Zeilen-
    nummer hat, die schon im Speicher existiert, dann
    wird  die  alte  Zeile im Speicher durch die neue
    ersetzt. Sollten Sie also bei obigem Programm (so
    können wir es jetzt nennen) die Zeile:           
    30 print"Aetsch! Das is jetzt anders."           
    eingeben, dann wird das  Programm  beim  nächsten
    Listen so aussehen :                             
    10 print"Zeile 10"                               
    20 print"Zeile 20"                               
    30 print"Aetsch! Das is jetzt anders."           
    40 print"Zeile 40"                               
4.) Sollten Sie eine Zeile eingeben, die nur aus  ei-
    ner  Zeilennummer besteht OHNE darauffolgende Be-
    fehle, so wird die entspechende Zeile mit  dieser
    Nummer,  sollte  sie im Speicher stehen, gelöscht
    werden. Würden Sie also:                         
    30                                               
    eingeben, dann würde Zeile 30  aus  unserem  Pro-
    gramm oben gelöscht werden.                      
Jetzt  möchte  ich  Ihnen die Syntax des LIST-Befehls
erst einmal noch etwas genauer  erklären,  bevor  ich
weitergehe  und  Ihnen  zeige,  wie Sie unser kleines
Progrämmchen zum Ablauf bringen.                     
Sie  können dem LIST-Befehl nämlich sogar noch spezi-
fischer sagen, in  welche  Programmzeilen  Sie  einen
Einblick  wünschen. Hierzu müssen Sie dem Befehlswort
LIST ganz einfach die Zeilenummer der Zeile, die  Sie
sich ansehen wollen hinterherstellen. Der Befehl:    
list 20                                              
bewirkt also, daß Ihnen anstatt des ganzen  Programms
nur  die  Zeile  20  angezeigt wird. Ich glaube jetzt
wird es Ihnen hoffentlich auch etwas deutlicher,  wa-
rum  eine  Zeile  eine Nummer braucht. Durch sie kann
man jede einzelne Zeile ansprechen  wie  man  möchte,
der  Computer  versteht also sofort, welche Zeile Sie
von ihm sehen wollen.                                
Doch  die  Anwendung  von  LIST geht noch weiter. Sie
können sich ebenso auch einen ganz bestimmten Bereich
aus Ihrem Programm ansehen, geben Sie etwa  folgendes
ein:                                                 
list 20-30                                           
so werden die Zeilen 20 und  30  auf  dem  Bildschirm
gelistet.  Sie geben also einfach eine obere und eine
untere Grenze an, und LIST wird seine Arbeit auf die-
se Zeilengrenzen beschränken. Ebenso können Sie diese
Schranke  nach oben und unten offen lassen. Dann wird
dementsprechend einfach von der ersten Zeile  bis  zu
der  angegebenen Zeile, beziehungsweise von der ange-
gebenen Zeile bis zur letzten Zeile gelistet. Probie-
ren  Sie  doch  einfach  einmal folgendes mit unserem
kleinen Beispielprogramm im Speicher. Geben Sie ein: 
list -30                                             
Nun werden die Zeilen 10,20 und 30 gelistet, weil das
Programm ab Zeile 10 anfängt.                        
Bei dem Befehl:                                      
list 20-                                             
werden  die  Zeilen  20,30  und 40 gelistet. Der  C64
fängt bei der von Ihnen angegebenen Zeile an und hört
erst am Ende des Programms auf.                      
Wie der LIST-Befehl funktioniert wissen Sie jetzt ja,
klären  wir also schnell noch die Frage, warum man im
Allgemeinen besser  Zeilennummern  in  10er-Schritten
verteilt.  Nun,  dies  liegt einfach darin begründet,
daß Sie, wie jeder Mensch auch, nicht unfehlbar sind,
und daß es Ihnen durchaus einmal passieren kann,  daß
Sie,  aufgrund  eines  Fehlers im Programm, noch eine
Zeile einfügen müssen. Würden  Sie  in  1er-Schritten
die  Programmzeilen eingeben, so müßten Sie erst ein-
mal Platz schaffen, indem Sie alle der  einzufügenden
Zeile  folgenden Zeilen nochmals neu einzutippen hät-
ten, da diese ja im Speicher stehen bleiben  sollten,
aber  zwischen  den  Zeilen 33 und 34 kein Platz mehr
für eine weitere Zeile  wäre.  Deshalb  benutzen  Sie
besser  10er  Zahlen, so, daß Sie bequem zwischen die
Zeilen 20 und 30 beispielsweise eine  weitere  Zeile,
vielleicht mit der Zeilennummer 25, einfügen könnten.
Gewöhnen  Sie sich diese Programmierweise also gleich
an, Sie werden sehen, es lohnt sich ganz bestimmt.   
Doch  widmen  wir uns nun unserem Problem, unser Pro-
gramm auch zum Ablaufen zu bringen. Auch hierfür gibt
es einen Befehl: den RUN-Befehl  (von engl.: to run =
laufen). Haben Sie unser  kleines  Programm  noch  im
Speicher? Gut. Dann geben Sie doch einmal ein:       
run                                                  
Und  nun,  siehe  da,  werden unsere ersehnten PRINT-
Zeilen endlich aktiv, denn Sie  sehen  nun  folgendes
auf dem Bildschirm :                                 
Zeile 10                                             
Zeile 20                                             
Aetsch! Das is jetzt anders.                         
Zeile 40                                             
ready.                                               
Und nun sehen Sie auch den Vorteil des PRINT-Befehls.
Sie können nämlich so auf einfache Art und Weise lan-
ge, lange Texte eingeben, die dann dem Benutzer  wäh-
rend  des Ablaufs eines Programms wertvolle Meldungen
und Hinweise geben können.                           
Der  RUN-Befehl  kann übrigens ähnlich wie LIST ange-
wandt werden. Sie können Ihm nämlich auch  sagen,  wo
genau  er  beginnen  soll, ein Programm abzuarbeiten.
Nämlich indem Sie ihm, wie bei LIST, eine  Zeilennum-
mer nachstellen, ab der er beginnen wird das Programm
abzuarbeiten. Gäben Sie also :                       
run 30                                               
ein, so würde Sie folgendes Bild auf  dem  Bildschirm
anstrahlen :                                         
Aetsch! Das is jetzt anders.                         
Zeile 40                                             
ready.                                               
Eines  sollte  noch gesagt sein:  sollten sich Varia-
blen im Speicher befinden, wenn Sie  eine  neue  Pro-
grammzeile eingegeben haben, so werden diese nach dem
drücken  der RETURN-Taste restlos gelöscht. Das liegt
daran, daß der 64er zum Eingliedern der  neuen  Zeile
in  die  richtige Zahlenreihenfolge den gesamten Pro-
grammspeicher hin- und herschieben muß  und  daß  bei
dieser Schieberei sehr leicht der Inhalt einer Varia-
blen zerstört werden kann. Deshalb werden alle Varia-
blen  vorher gelöscht, damit später kein Mist im Pro-
grammtext stehen kann, und falsche Variablenwerte  zu
falschen Programmreaktionen führen können.           
Ebenfalls aus letztem Grund heraus  werden grundsätz-
lich vor der Ausführung eines RUN-Befehls alle Varia-
blen vom Computer gelöscht, da so ebenfalls ungewoll-
te Veränderungen der Variablen entstehen könnten.    
Außerdem  kann  für  die  beiden Befehle LIST und RUN
gesagt werden, daß sie durch  das  Drücken  der  RUN/
STOP-Taste wieder angehalten werden können.          
Das heißt also, wenn LIST Ihnen gerade  ein  Programm
auflisten  sollte,  und Sie sich einen Teil etwas ge-
nauer ansehen wollten, Sie dadurch  den  Vorgang  des
Listens unterbrechen könnten.                        
Ebenso bei RUN. Möchten Sie aus irgendeinem Grund Ihr
Programm anhalten, vielleicht weil es nicht das  tut,
was  Sie von Ihm wollen, dann können Sie es ebenfalls
auf diese Weise unterbrechen.  Sollten  Sie  es  dann
allerdings  doch  an der Stelle fortsetzen wollen, an
der Sie es angehalten haben, allerdings ohne den  In-
halt  aller  Variablen zu zuerstören, dann können Sie
den Befehl CONT benutzen.  Er  hat  haargenau  selben
Effekt  wie RUN, nur, daß er zum einen die Variablen-
werte nicht vorher löscht, und zum anderen genau hin-
ter  dem  Befehl weiterarbeitet, bei dem das Programm
vorher abgebrochen  wurde,  vorrausgesetzt  es  wurde
zwischendurch  nicht  verändert.  Am besten zeige ich
Ihnen noch einen weiteren Befehl, damit Sie hier auch
ein wenig experimenieren können: der GOTO-Befehl.    
Übersetzen  wir  GOTO  aus dem Englischen, wissen wir
auch schon gleich, was wir mit diesem Befehl anfangen
können.  GEHE  ZU  einer Zeilennummer und arbeite das
Programm von dort aus weiter ab. Hinter GOTO muß also
noch eine Zeilennummer  folgen.  Probieren  wir  also
wieder an unserem kleinen Progrämmchen etwas aus.    
Geben Sie doch zusätzlich noch folgende Zeile ein:   
50 goto 10                                           
Starten  Sie  nun das Programm mit RUN. Sie sehen nun
immer wieder  unseren  Demotext  auf  dem  Bildschirm
"runterlaufen", also etwa folgendes Bild :           
...                                                  
Zeile 40                                             
Zeile 10                                             
Zeile 20                                             
Aetsch! Das ist jetzt anders.                        
Zeile 40                                             
Zeile 10                                             
...                                                  
Verfolgen  wir  einmal  unseren C64, wie er sein Pro-
gramm abarbeitet. Zuerst werden die Zeilen 10-40  wie
gewohnt  durchlaufen.  Der  Text  in den PRINT-Zeilen
erscheint  also  auf  dem  Bildschirm.   Anschließend
trifft  der Computer in Zeile 50 auf den GOTO Befehl,
der besagt, daß er bei Zeile 10 weiterarbeiten  soll.
Er  führt  diesen  Befehl aus, und beginnt wieder von
vorne bei 10. Dies wiederholt sich nun bis ins Unend-
liche. Pausenlos wird der Text ausgedruckt, und unser
64er  würde  dies Jahre lang machen, vorrausgestzt es
gäbe keinen Stromausfall. Er befindet sich  in  einer
sogenannten "Endlosschleife" eine Schleife, die immer
wieder  durchlaufen  wird, ohne daß Sie zu einem Ende
kommt. Eine Schleife ist  also  ein  bestimmter  Pro-
grammabschnitt, der mindestens  zweimal   durchlaufen
wird. Um nicht den ganzen Programmteil nochmals  ein-
geben und somit das Programm  unnötig  verlängern  zu
müssen verwendet man also den GOTO-Befehl. Nun  kommt
der Auftritt für die RUN/STOP-Taste. Drücken Sie  sie
einmal. Es erscheint nun:                            
break in  xx                                         
ready.                                               
Der  Computer  meldet  Ihnen also, daß Sie soeben das
laufende Programm in Zeile xx abgebrochen haben.  Für
"xx"  können alle Zeilennummern des Programms stehen,
da es Zufall ist, in welcher Zeile Sie  gerade  abge-
brochen  haben.  Auf  alle Fälle sind Sie nun unserer
Endlosschleife entkommen und können wieder  an  Ihrem
Programm  weiterarbeiten. Sollten Sie allerdings wie-
der den Wunsch hegen, schöne  Zeichenketten  auf  dem
Bildschirm  "runterlaufen"  zu sehen, dann können Sie
jetzt ganz einfach wieder mit CONT das Programm fort-
fahren lassen (CONT von engl.: to continue = fortset-
zen, fortfahren).                                    
Fassen wir doch einmal zusammen, wie weit  wir  schon
fortgeschritten  sind. Wir können mittlerweile kleine
Programme schreiben, die  etwas  auf  dem  Bildschirm
ausgeben, wir können rechnen, Programme mit Hilfe von
LIST editieren und kennen auch RUN, um diese zum lau-
fen zu bringen. Außerdem kennen wir uns mit den Namen
und Typen von Variablen aus. Nunja,  auf  den  ersten
Blick  erscheint dies ja sehr viel, doch direkt welt-
bewegende Programme können wir  noch  nicht  so  ganz
schreiben,  da  wir eigentlich nur einen einzigen Be-
fehl kennengelernt haben, mit dem sich innerhalb  von
Programmen etwas anfangen läßt, den PRINT-Befehl. Die
anderen  sind mehr oder weniger ausschließlich außer-
halb von  Programmen,  im  sogenannten  "Direktmodus"
nützlich, obwohl sie ebenso in Programmen funktionie-
ren würden. Wollen wir also nun unser  Befehlsspektum
noch  ein wenig mehr erweitern und wenden wir uns ei-
nem sehr mächtigen Befehl zu,  mit  dem  schon  etwas
mehr zu machen ist.                                  
Erinnern wir uns doch einmal an  unser  Beispiel  vom
letzten  Monat mit der Coladose. Wir hatten mit Hilfe
von Variablen die Oberfläche einer  Coladose  berech-
net. Diese Dose hatte eine Höhe von 11.5 cm und einen
Deckelradius  von  3.25  cm.  Mit  Hilfe  der  Formel
o=2*r*π*(r+h) sind wir dann zu dem Ergebnis 301.2 qcm
gekommen. Bedenkt man nun, daß durch  den  Trend  zum
Umweltschutz  es  heutzutage  durchaus  möglich  sein
könnte, daß man ein anderes Material für  Einwegdosen
erfinden  wird,  und  daß  man deshalb vielleicht ein
anderes Dosenformat wählen muß, so wäre unsere schöne
mühselige Rechnung nur noch Müll, da unbrauchbar. Man
müßte die ganze Prozedur nochmals mit den Werten  der
neuen   Dosen   durchführen.  Eine  mehr  oder  wenig
umständliche Sache also. Doch wozu können  wir  jetzt
Programme  schreiben,  wir hatten ja gelernt, daß die
Formel für die Zylinderoberfläche, wie ich  sie  oben
schon  aufgeführt  hatte,  ja allgemeingültig ist und
somit mit allen nur erdenklichen Werten für r  und  h
einen  richtigen  Wert liefert. Im Prinzip könnte man
nun ein Programm schreiben, daß diese Formel benutzt,
und würde dann hierfür die Variablen in einer  voran-
gehenden  Zeile  mit den entspechenden Werten versor-
gen. Doch wir machen es uns  noch  komfortabler,  wir
benutzen  den  INPUT-Befehl, der für Eingaben vom Be-
nutzer aus sehr empfänglich ist  (im  wahrsten  Sinne
des Wortes, denn INPUT bedeutet  nichts  anderes  als
"EINGABE"). Mit ihm wird es uns gestattet,  eine  Ab-
frage zu machen, auf die der Benutzer mit einer  Ein-
gabe antworten kann, und dies alles sogar  mitten  im
im Programm!!!                                       
Wir benötigen also Werte für  Radius  und  Höhe.  Wie
beim  letzten Mal wollen wir hierfür die Variablenna-
men r und h wählen. Sehen wir uns nun doch einmal die
ersten Zeilen unseres Programms an :                 
10 print chr$(14);                                   
20 print"[CLR,4 SPACE]Zylinderoberflaechenberechnung"
30 input"[2 DOWN]Radius ";r                          
40 input"Hoehe ";h                                   
Da haben wir ja schon eine ganze Menge neue Anweisun-
gen. Fangen wir einmal in Zeile 10 an. Sie sehen hier
einen PRINT-Befehl, doch was dieser Befehl ausdruckt,
können Sie nicht wissen. Eine String-Variable ist das
nicht (obwohl es fast so aussieht),  ich  kann  Ihnen
allerdings  versichern,  daß  es etwas ähnliches dar-
stellt. Dies ist die CHR$-Funktion. ACHTUNG! Ich  be-
tone das Wort FUNKTION! Es handelt sich hierbei wohl-
gemerkt NICHT um einen Befehl,  das  dürfen  Sie  nie
verwechseln.  Eine Funktion wird zwar ebenfalls durch
ein BASIC-Schlüsselwort  dargestellt,  doch  sie  ist
ohne einen verknüpfenden Befehl, oder eine Variablen-
zuweisung nicht ausführbar, da der Computer in diesem
Fall  nicht  spezifisch weiß, was er mit ihr anfangen
soll. Das heißt also, daß Sie  Funktionen  immer  mit
PRINT ausgeben, oder einer Variablen zuweisen können.
Zum Beispiel so:                                     
a$=chr$(65)                                          
print a$                                             
Es gibt übrigens  noch  mehr  Anwendungsmöglichkeiten
für Funktionen, doch werden wir hierzu später kommen,
da  Sie  die  entprechenden Befehle hierzu noch nicht
kennen.                                              
Was  bewirkt  die CHR$-Funktion?  Nun, CHR$, wird be-
nutzt um einzelne Zeichen  spezifiziert  aufrufen  zu
können.  Jedes Zeichen auf Ihrer Tastatur besitzt ei-
nen eigenen Zahlencode. Geben Sie  der  CHR$-Funktion
nun  diesen  Zahlcode  eines  Zeichen in Klammern an,
dann steht die ganze Funktion für  eben  dieses  Zei-
chen. In unserem  Beispiel von eben haben wir der Va-
riable a$ den Zeichencode 65 zugeordnet. Anschließend
wurde die Variable a$, in der ja nun dieser  Zeichen-
code  als  Buchstabe  dargestellt  war, auf dem Bild-
schirm ausgegeben. Dieses Zeichen, das zu dem Code 65
gehört, ist das kleine "a". Somit ist unsere  Variab-
lendefinition gleich der Definition:                 
a$="a"                                               
mit  der  ja auch der Buchstabe "a" dem String a$ zu-
geordet wird. Ich hoffe Sie  haben  dies  verstanden.
Somit  hat der folgende PRINT-Befehl auch das "a" auf
dem Bildschirm ausgedruckt. Genauso hätten  Sie  auch
schreiben können:                                    
print chr$(65)                                       
womit  Sie  das selbe Ergebnis erzielt hätten, aller-
dings nicht mehr über den Umweg mit der  Stringvaria-
ble.  Hier sei auch noch gesagt, daß das Ergebnis der
CHR$-Funktion immer einer Stringvariablen  zugeordnet
wird,  nicht  also einer Float- oder Integervariable,
da diese Variablentypen ja keine  Zeichen  darstellen
können.  Allerdings können Sie problemlos auch Anwei-
sungen von dieser Art vergeben:                      
a=65                                                 
a$=chr$(a)                                           
Hier  haben  wir  nicht den Zeichencode 65 in "a" ge-
speichert, sondern einfach nur den Zahlwert  65  (bei
"PRINT a" kriegen Sie wie  erwartet  "nur"  die  Zahl
65  auf  den  Bildschirm  gedruckt).  Sie dürfen also
Floats und Intergers benutzen,  um  den  Zahlwert  in
Klammern (von CHR$) anzugeben, dies führt also zu dem
selben  Ergebnis,  CHR$  holt sich den Wert von a aus
dem Speicher und ordnet dann dem String a$  den  Zei-
chencode  des  Zahlwerts  von a zu. Auf der Rückseite
dieser Magic Disk  finden  Sie diesmal auch ein klei-
nes  Programm  namens ASCII-Code. Es zeigt Ihnen alle
möglichen ASCII-Codes (das sind eben jene  Codes  der
Zeichen) des C64 an.                                 
Wollen wir in diesem  Zusammenhang  gerade  noch  die
Umkehrfunktion von CHR$ betrachten, die ASC-Funktion,
mit  der  Sie  sich beispielsweise den ASCII-Wert (so
nenne ich ab jetzt diesen Zeichencode, ASCII ist  ein
internationaler  Standard,  an  den  sich die meisten
Computerhersteller halten, die Zeichen haben also auf
den meisten Computern die selben  Codes.  Leider  ist
dies  beim  C64  aus unerfindlichen Gründen nicht der
Fall, trozdem wird auch hier  von  ASCII  gesprochen)
eines  Zeichens ausgeben lassen können. Hier geht al-
les genau umgekehrt, hier geben Sie ein  Zeichen  an,
und  es  kommt  ein  Zahlwert heraus. Dies müssen Sie
also  auch  bei  Variablenzuweisungen  beachten.  Die
ASC-Funktion sieht so aus:                           
print asc("a")                                       
Wie chr$, nur daß Sie jetzt das zu untersuchende Zei-
chen in Anführungsstrichen in die  Klammer  einsetzen
müssen.  Die Anführungsstriche deshalb, weil Sie hier
auch Strings als sogenanntes  Funktionsargument  ver-
wenden dürfen, diese dann allerdings OHNE Anführungs-
striche. Also:                                       
a$="a"                                               
print asc(a$)                                        
hätte die selbe Wirkung wie die oben aufgezeigte Zei-
le. Sie können sich so  also  alle  CHR$-Codes,  bzw.
ASCII-Codes ausgeben lassen, und dann bei Bedarf ver-
wenden. Auch ASC-Funktionswerte  kann  man  Variablen
zuweisen :                                           
a$="x"                                               
a=asc("x")                                           
a%=asc(a$)                                           
Die beiden letzten Zeilen führen zum selben Ergebnis,
nur daß der eine Wert in der  Floatvariable  "a"  ge-
speichert ist  und der andere in der Integervariablen
"a%".  Außerdem  ist  der  Weg, mit dem die Ergebnise
erreicht werden jeweils ein anderer, doch das dürften
Sie mittlerweile ja kennen.                          
Doch wollen wir uns nun, nach  unsrem  langen  langen
Ausflug zu den ASCII-Codes wieder unserer Zylinderbe-
rechnung widmen. Wir sind ja gerade dadurch auf  die-
ses Thema gekommen...                                
In Zeile 10 stand der Befehl PRINT CHR$(14).  Es wur-
de also ein ASCII-Zeichen ausgegeben,  mit  dem  Zei-
chencode  14.  Dieser  Code steht für eine sogenannte
"Steuerfunktion". Mit einer Steuerfunktion können Sie
ein Zeichen ausgeben, das nicht direkt als  Buchstabe
auf  dem Bildschirm sichtbar wird,  sondern eher eine
"unsichtbare" Funktion ausübt, wie zum  Beispiel  den
Bildschirm  zu  löschen,  den Cursor eine Zeile höher
oder tiefer rücken zu lassen, oder  die  Zeichenfarbe
zu verändern. Unser Code 14 bewirkt, daß der Zeichen-
satz von Groß- auf Kleinschrift umgeschaltet wird. Er
hat also die  selbe  Wirkung  wie  das  gleichzeitige
Drücken  der  SHIFT- und der Commodoretaste. Dies ist
deshalb notwendig, damit beim späteren  Ausdruck  von
"Zylinderoberflächenberechnung"   in  Zeile  20,  der
Großbuchstabe "Z" nicht etwa als Grafikzeichen ausge-
geben  wird,  was  leicht  passieren  kann, zumal die
Großschrift doch  direkt  nach  dem  Einschalten  des
64ers vorhanden ist.                                 
Sicher ist Ihnen der Text in den    eckigen  Klammern
- [ ] - aufgefallen, dies ist  kein  Programmtext  im
allgemeinen,  hiermit  habe  ich ebenfalls angegeben,
welche Steuerzeichen an dieser Stelle eingefügt  wer-
den  müssen. Sie wissen ja, unsere Zeichen, die keine
sind, sondern etwas bestimmtes  ausführen.  Man  kann
Sie  nämlich  auch  direkt  in  die   PRINT-Anweisung
einfügen, zumal das auch einfacher und platzsparender
ist. Ich tat dies bei CHR$(14) bewußt  nicht, da  Sie
so  bei  der  Gelegenheit  einmal  die CHR$- und ASC-
Funktion kennenlernen konnten, und weil außerdem die-
ses  Steuerzeichen  nicht als solches in einer PRINT-
Anweisung darstellbar ist (es gibt zwar  schon  einen
Weg,  doch das wäre jetzt hier zuviel). Doch wie sol-
len Sie denn überhaupt  diese  Steuerzeichen  in  die
PRINT-Anweisung  hereibringen?  Die Lösung ist ebenso
einfach wie genial. Sie müssen lediglich, NACHDEM Sie
den auszugebenden Text  mit  einem  Anführungszeichen
schon angekündigt haben, die entspechende Taste drük-
ken, und schon wird unser  Steuerzeichen   mit  einem
inversgedruckten Zeichen dargestellt. Von nun an wis-
sen Sie, daß an dieser Stelle dann ein  Steuerzeichen
gedruckt  wird.  Die  Steuerzeichen können Sie ebenso
wie normale Buchstaben überall innerhalb  der  Anfüh-
rungsstriche  einfügen.  Mit der Zeit werden Sie dann
auch lernen, diese an Ihren Reverszeichen  zu  erken-
nen.                                                 
Inverszeichen  wurden deshalb gewählt, da man sie in-
nerhalb einer PRINT-Klammer nicht verwenden kann, man
kann trotzdem aber inverse Texte ausgeben, indem  man
einfach  die Steuerzeichen für RVS ON und RVS OFF be-
nutzt. Die Zeichen zwischen diesen Steuerzeichen wer-
den dann auch invers gedruckt.                       
In  unserem  Fall  müssten  Sie  also  ein CLR (CLEAR
(dtsch.: lösche) =  SHIFT +  CLR/HOME-Taste)   einfü-
gen.  Ich  werde in Zukunft bei solchen Steuerzeichen
bestimmte  Ausdrücke  in  eckigen  Klammern  angeben.
Damit Sie wissen welche Zeichen nun gemeint sind. Die
Programme, die sich ja auf der  Rückseite  der  Magic
Disk befinden, werden dann natürlich immer schon  die
entspechenenden  Steuerzeichen  in  Reversdarstellung
enthalten, da wir ja keine "geschweiften" Texte nach-
her auf dem Bildschirm haben wollen. Diese Ausdrücke,
die ich verwenden werde,  werde  ich  Ihnen  dann  im
nachfolgenden Text immer noch  erläutern,  damit  Sie
wissen, was gemeint war.                             
Nachdem wir uns jetzt wohl zur Genüge in den ersten 2
Zeilen  unseres  Programms verrannt haben, wollen wir
uns nun endlich dem Befehl widmen, von  dem  ich  an-
fangs  gesprochen  hatte. Sie werden ihn schon in den
Zeilen 30 und 40 bemerkt haben.  Es  ist  der  INPUT-
Befehl. Übersetzen wir doch einmal:                  
INPUT = engl. EINGEBEN, EINGABE                      
Na wunderar, wir können also etwas eingeben. Und  das
auch noch wahnsinnig komfortabel, denn  Sie  brauchen
lediglich dem INPUT-Befehl eine Variable zu geben, in
der  er die Eingabe ablegen soll und schon weiß unser
Programm genauer, was sein  Benutzer  von  ihm  will.
Sehen wir uns die Syntax einmal genauer an:          
30 INPUT"Radius ";r                                  
Ich muß hier noch anmerken, daß ich bei  diesem  Bei-
spiel,  die  im  Programm  vorkommenden Steuerzeichen
weggelassen habe. Es ist dort von [2 DOWN] die  Rede,
womit  Sie aufgefordert sind, 2 mal die Taste "Cursor
runter" zu drücken.                                  
Wie  Sie  an den Steuerzeichen und auch an den Anfüh-
rungsstrichen erkennen können, kann man auch bei  IN-
PUT  einen  Text  angeben, der vor Ausführung der ei-
gentlichen Eingabe  ausgegeben  werden  soll.  Hinter
einem  Semikolon  (oder  Strichpunkt  -  ;) wird dann
noch der Name einer Variablen angehängt,  in  unserem
Fall  "r"  für  den Radius. Probieren Sie doch einmal
obige Zeile als Programm aus.                        
Sie  MÜSSEN  übrigens  unbedingt  den INPUT-Befehl im
Programm verwenden, da es vom Direktmodus aus zu Feh-
lern  kommen kann, da der INPUT-Befehl im Direktmodus
keinen Sinn hat. Deshalb haben die Programmierer  von
BASIC  2.0  sich gesagt, daß die Benutzung dieses Be-
fehls im Direktmodus nicht erlaubt sein darf und des-
halb mit einer Fehlermeldung quittiert wird.         
Sie  sehen,  wenn Sie alles richtig eingegeben haben,
nun folgendes auf dem Bildschirm :                   
Radius ?                                             
und einem blinkenden Cursor hinter dem  Fragezeichen.
Sie  sind  nun  dazu  aufgefordert einen Wert für den
Radius einzugeben. Tun Sie dies also. Geben Sie  doch
beispielsweise einmal 3.25 ein:                      
Radius ? 3.25                                        
und  drücken Sie die Return-Taste. Das Programm endet
nun, vorausgesetzt, Sie hatten auch wirklich nur die-
se  eine  Zeile  im  Speicher  stehen. Geben Sie doch
jetzt einmal im Direktmodus:                         
print r                                              
ein. Was sehen Sie?  Es erscheint der  Zahlwert  3.25
auf  dem Bildschirm! Genau Ihre Eingabe, die Sie soe-
ben taten. Na ist ja entzückend - würde Kojak, lolli-
lutschend, jetzt sagen. Merken Sie was INPUT tat?  Es
hat  Ihre  Eingabe  gleich  einer Variablenwertzuwei-
sung, der Variable "r" zugeordnet und in ihr  gespei-
chert!  Dies geht sogar noch weiter! Sie dürfen sogar
Strings  und Integers benutzen, um Eingaben in Varia-
blen ablegen zu können.  Ein  solches  Programm  wäre
also auch denkbar:                                   
10 input"Wie heissen Sie bitte ";n$                  
20 input"Und wie alt sind Sie ";a%                   
30 print"Sie heissen ";n$;"und sind "a%" Jahre alt." 
Sie  sehen,  hier  benutzen  wir einen String n$ (für
Name) und eine Integervariable a%  (für  Alter).  Den
Integer  können wir bedenkenlos anwenden, da ja Alter
im allgemeinen  mit  ganzen  Zahlen  angegeben  wird.
Vielleicht ist Ihnen allerdings etwas aufgefallen:   
Obwohl wir KEIN Fragezeichen in unserem  Text  stehen
hatten,  erschien  doch  eins auf dem Bildschirm. Wie
denn das?  Nun, INPUT druckt grundsätzlich immer  ein
Fragezeichen  am  Ende  seines Textes aus, da ja nach
etwas gefragt wird,  und  somit  dieses  Fragezeichen
auch  berechtigt ist. Es wird vielleicht Fälle geben,
in denen es Sie stören wird, da es nicht in den  Kon-
text  der  Frage passt, doch werden wir später einmal
behandeln, wie man es abschalten kann.               
Im  Übrigen  brauchen  Sie auch nicht unbedingt einen
Text mit INPUT auszugeben, Sie können dies  auch  un-
terdrücken, indem  Sie  die Anführungsstriche und das
Semikolon einfach weglassen  und  den  Variablennamen
einfach anhängen. Also so beispielsweise:            
10 input a$                                          
20 input a                                           
30 input xx%                                         
Ebenfalls ist es möglich, mehrere Eingaben gleichzei-
tig aufzunehmen. Ich finde diese  Methode  allerdings
sehr  unbequem,  und außerdem gefällt es mir getrennt
besser, doch möglich wäre auch dies:                 
10 input "Koordinaten (X/Y) ";x,y                    
Sie können hier also gleich mehrere  Werte  abfragen,
die  allerdings  mit einem Komma voneinander getrennt
sein sollten. Jetzt wissen Sie auch, wofür das  Komma
reserviert  ist, da wir ja gesagt hatten, daß das De-
zimalkomma bei Floatvariablen immer einem Punkt  ent-
spricht. Die Eingabe müßte dann so aussehen:         
Koordinaten (X/Y) ? 22.3,10                          
Den  Variablen  x und y wären dann folgende Werte zu-
geordnet worden:                                     
x=22.3                                               
y=10                                                 
Leider  muß  ich  nun  an dieser Stelle abbrechen, um
keinen Informationsstau bei Ihnen hervorzurufen. Ver-
suchen  Sie  erst einmal die eben erkannten neuen Be-
fehle kennenzulernen. Sie können sich ja auch  einmal
das gesamte Zylinderberechnungsprogramm auf der Rück-
seite dieser Magic Disk 64  ansehen.  Nächsten  Monat
werde  ich  es dann auf jeden Fall zu Ende kommentie-
ren. Des weiteren wollen wir uns dann mit der Schlei-
fenprogrammierung  und den Entscheidungsbefehlen (und
-operatoren) widmen.                                 
Bis  dahin  wünsche  ich  Ihnen weiterhin ein allzeit
"Gut Hack",                                          
                                      Ihr Uli Basters
G                                                    



Valid HTML 4.0 Transitional Valid CSS!