Basic lernen (Einleitung, Vorbereitungen, Kapitel 1, 2, 3, 4, 5, 6)

Ein- u. Ausgabe, Variablen u. Zuweisungen, Kommentare, Einfache math. Berechnungen

Dieses Kapitel handelt hauptsächlich von der Ein- und Ausgabe. Zwar ebenso wichtig, aber weniger kompliziert sind Kommentare und Zuweisungen. Einfache mathematische Berechnungen fallen unter die Ein- und Ausgabe. Genauer gesagt, ist die Behandlung der einfachen math. Berechnungen lediglich ein Vorgriff auf ein späteres Kapitel und zwar das der Operatoren.

1.1; Ein- und Ausgabe:

Um dem Benutzer zu zeigen, was das Programm gerade macht, ist die Ausgabe wichtig. Der Benutzer soll allerdings nicht nur über die Vorgänge informiert werden, die gerade ablaufen, sondern er soll auch dazu aufgefordert werden, Eingaben zu machen. Beispielsweise fordert ihn eine Meldung am Bildschirm dazu auf, seinen Namen einzugeben. Ein anderer Anwendungszweck wäre beispielsweise ein Programm, das Dateien löscht. Dieses zeigt dem Benutzer laufend an, welche Datei gerade gelöscht wird. (Voraussetzung: Der Benutzer hat mehrere Dateien zum Löschen "freigegeben") Das letzte Beispiel hat einfach nur Informationscharakter, denn dieses Programm funktioniert auch ohne Bildschirmausgabe. Das erste Beispiel jedoch höchstwahrscheinlich nicht. Würde das Programm dem Benutzer nicht sagen, was er eingeben soll, würde dieser entweder etwas Unpassendes eingeben oder würde - im schlimmsten Fall - das Programm beenden.

Um wieder zur Bildschirmausgabe zurückzukommen. Der wichtigste Befehl, den Sie diesbezüglich kennen lernen werden, ist PRINT. PRINT gibt einen Text auf den Bildschirm aus, LPRINT hingegen schickt einen Text an den Drucker. Daher bietet LPRINT die Möglichkeit, etwas auszudrucken.

PRINT im einfachsten Fall:

PRINT "Text"

Beachten Sie, dass der Text, der ausgegeben werden soll, in Anführungzeichen stehen muss. Würde man die Anführungszeichen weglassen, so nimmt der Compiler (Interpreter) an, dass man den Inhalt einer Variablen ausgeben will. Mehr dazu jedoch erst später.

Dieselbe Syntax (Grammatik) gilt für PRINT:

LPRINT "Text"

Wissen Sie eigentlich, wofür die Abkürzung BASIC steht? Nein? Das nächste Beispiel verrät's...

CLS
PRINT "Die Abkürzung BASIC steht für: (B)eginners (A)ll Purpose (S)ymbolic (I)nstruction (C)ode"
PRINT "Taste drücken um das Programm zu beenden..."

Wie bereits bei den Vorbereitungen erklärt, löscht CLS den Bildschirminhalt. Der Aufruf von CLS ist einfach:

CLS

Haben Sie eigentlich schon mal versucht, mehrere Anweisungen in eine Zeile zu schreiben? Versuchen Sie es einmal und starten Sie das Programm. QBasic "bedankt" sich mit einer Fehlermeldung, denn es darf immer nur eine Anweisung in einer Zeile stehen. Doch man kann sich auch Abhilfe schaffen, indem man an das Ende der einen Zeile einen Doppelpunkt anhängt. Gleich nach dem Doppelpunkt kann die nächste Anweisung folgen - in der selben Zeile! Soll eine weitere Anweisung folgen, muss diese entweder in die nächste Zeile geschrieben werden oder nach der letzten Anweisung muss ein Doppelpunkt folgen. Das Ganze noch einmal schön dargestellt:

Anweisung1: Anweisung2: Anweisung3 ...

Anstelle von AnweisungX (X steht für die entsprechende Zahl nach der oberen Darstellungsart) soll natürlich irgendeine Anweisung eingesetzt werden.

Einen kleinen Tipp habe ich noch für alle Tippfaulen: Anstelle von PRINT kann man auch nur ein Fragezeichen verwenden!

? "Text"

Es wird Zeit, Daten von der Tastatur entgegenzunehmen. Es ist an der Zeit, dass der Benutzer etwas eingibt. Vorhin stellt sich jedoch die Frage, wohin mit den eingegebenen Daten? Auf der Festplatte abspeichern wäre eine Idee, doch eine einzelne Zahl, ein Wort oder ähnliches abzuspeichern wäre Speicherplatzverschwendung. Außerdem wäre es umständlich und momentan zu schwierig. Mit dem Lesen uns Speichern von Dateien beschäftigen wir uns erst in Kapitel 6. Um es nicht allzu spannend zu machen, wir werden die Daten im RAM - dem Arbeitsspeicher - ablegen. Bevor man dort etwas speichern kann, muss man erst einmal festlegen wieviel (die Datenmenge) man speichern will und von welchem Typ die abgelegten Daten sein sollen. Typen wären beispielsweise Ganzzahlen-, Fließkommazahlen- oder String-Typen. (String bezeichnet eine Zeichenkette, daher eine eingegebene Zeichenkette wie ein Wort oder einen Satz)

Im Zusammenhang mit der Dateneingabe werden Sie zwei Befehle kennen lernen: INPUT und LINE INPUT. Will man Strings einlesen, benötigt man LINE INPUT, anderenfalls muss INPUT verwendet werden. Verwenden Sie INPUT, zeigt lästigerweise QBasic vor der Stelle, an der der eingegebene Text angezeigt werden soll, ein Fragezeichen an. Nützen Sie die Möglichkeit und verwenden Sie INPUT wie unten gezeigt auch zur Textausgabe. In einem solchen Fall wird das Fragezeichen nicht angezeigt. INPUT hat folgende Syntax:

INPUT "Evtl. Text, der z.B. zur Eingabe auffordert", Variable

Am besten verstehen kann man dies, wenn man ein Beispiel vor sich hat.

CLS
PRINT "Dieses Beispielprogramm demonstriert die Verwendung von INPUT."
INPUT "Geben Sie eine Zahl ein: ", Variable
PRINT "Die eingegebene Zahl war: ", Variable

Zunächst wird der Bildschirminhalt mit CLS gelöscht und danach wird der Text "Dieses Beispielprogramm demonstriert die Verwendung von INPUT." auf dem Bildschirm angezeigt. Nun folgt der interessante Teil des Beispielprogrammes. Quasi den ersten Teil der Anweisung: "Geben Sie eine Zahl ein", hätte man problemlos weglassen können. Stattdessen hätte man auch einfach eine PRINT-Anweisung verwenden können. Dieselbe Wirkung hat folgendes Beispiel:

CLS
PRINT "Dieses Beispielprogramm demonstriert die Verwendung von INPUT."
PRINT "Geben Sie eine Zahl ein: "
INPUT Variable
PRINT "Die eingegebene Zahl war: ", Variable

Um wieder zum Eigentlichen zurück zu kommen, INPUT liest eine Zahl von der Tastatur ein und speichert sie in der Variable mit dem Namen Variable. Sie könnten auch jeden anderen Namen für die Variable nehmen, sofern dabei einige Regeln beachtet werden. Mehr dazu weiter unten. Wichtig ist, dass Sie nur eine Ganzzahl oder eine Fließkommazahl eingeben. Geben Sie nämlich irgendeine Zeichenkette (selbst ein Buchstabe wäre ausreichend) so wird in der Variable 0 abgespeichert. (bzw. nichts wird abgespeichert) Nach der Eingabe wird PRINT verwendet, um den Wert der Variable wieder auszugeben.

Aber auch die Eingabe von Zeichenketten (Strings) ist möglich. Probieren Sie das nächste Beispiel einfach aus.

CLS
LINE INPUT "Geben Sie einen String ein: ", Variable$
PRINT "Der eingegebene String war: ", Variable$

Zunächst einmal nutzen wir - wie oben beschrieben - LINE INPUT gleich dazu aus, um den Text "Geben Sie einen String ein: " anzeigen zu lassen. Außerdem hat LINE INPUT die Aufgabe, eine String in die Variable Variable$ einzulesen. Bei genauerem Hinsehen fällt das Dollarzeichen auf, das dem Namen angehängt wurde. Dieses gibt der Variable einen Typ. (in dem Fall String) Das Dollarzeichen wird ebenso angegeben, wenn es um die Ausgabe geht.

1.2; Variablen und Zuweisungen:

Höchstwahrscheinlich sind Ihnen Variablen aus der Mathematik bekannt. Sie drückt einen Wert aus oder ist undefiniert. Ist sie undefiniert, so kann man sie als Platzhalter ansehen. Platzhalter ist auch gleich eine schöne Bezeichnung für die Variablen, mit denen wir es hier zu tun haben. Diese reservieren nämlich einen Bereich im Arbeitsspeicher. Wie groß der Bereich ist, hängt vom Typ der Variable ab. Um Ihnen keine falsche Größenvorstellung zu geben, hierbei handelt es sich um Größenordnungen von einem Byte (8 Bit) angefangen bis hin zu einigen Bytes. In den Kilobyte-Bereich gehen "normale" Variablen nie. Eine Zuweisung dient dazu, um einer Variable einen Wert zu geben, dh. um ihr diesen zuzuweisen.

Um eine Variable zu verwenden, kann man diese einfach verwenden. Dem Compiler bekannt geben (Deklarieren) muss man diese nicht. (im Gegensatz zu vielen anderen Programmiersprachen; C, C++, Pascal, Delphi um nur einige Beispiele zu nennen) Im Beispielprogramm zu INPUT wurde die Variable mit dem Namen "Variable" einfach ohne Deklaration zurecht verwendet. INPUT wies ihr einen Wert zu und zwar den, den der Benutzer eingegeben hat. Was aber, wenn man nicht eine Ganzzahl, sondern eine Fließkommazahl oder gar einen String eingegeben hat? Wenn Sie es noch nicht ausprobiert haben, dann tun Sie es einfach mal. Wichtig ist jedoch, dass Ihr Programm den Wert der Variable später wieder ausgibt. Wenn Sie im Moment noch nicht genau wissen, wie Sie die Sache angehen sollen, können Sie das Beispielprogramm zu INPUT als Vorlage nehmen. Geben Sie anstelle einer Ganzzahl beispielsweise eine Fließkommazahl ein, so ist der später ausgegebene Wert 0. (das ist der Wert, mit dem die Variable vom Compiler initialisiert wurde; Ich gehe noch genauer auf die Frage ein, wozu überhaupt eine Initialisierung notwendig ist) Wie war das jedoch bei unserem letzten Beispiel. Hier wurde der Benutzer aufgefordert, einen String einzugeben und dieser wurde später wieder korrekt ausgegeben. Der Grund, weshalb dieses Beispiel korrekt läuft, liegt am Dollarzeichen $, das der Variable angehängt wurde, der der Wert der Eingabe mit INPUT zugewiesen wurde.

Das Dollarzeichen zeichnete die Variable als String-Variable aus. Neben dem Dollarzeichen $ existieren noch die Zeichen % ! # und &. Also 5 Zeichen, jedes steht für einen Typ in Basic, denn in Basic existieren nur 5 Typen. Das hat wiederum seine guten und schlechten Seiten, aber darauf will ich besser nicht eingehen. Wir hätten der Variable Variable im Beispiel zu INPUT auch das Zeichen % anhängen können, denn dieses steht für Integer, den Ganzzahlen-Typ in Basic.

Im Folgenden werden die einzelnen Typen aufgezählt:

Typ Zeichen Größe Wertbereich
Integer % (keine Pflichtangabe)) 2 Byte -32768 bis 32767
Long & 4 Byte -214783648 bis 214748647
String $ bis 255 Byte max. 255 Zeichen Länge
Single ! (keine Pflichtangabe) 4 Byte -2,802597 * 10^-45 bis 3,402823 * 10^38
Double # 8 Byte -4,446590812571219 * 10^-323 bis 1,79769313486231 * 10^308

Die ersten 2 Typen (Integer und Long) sind Ganzzahlentypen. Dem Typ Integer muss das Zeichen % nicht explizit angehängt werden, der Compiler nimmt immer an, dass eine Ganzzahl vom Typ Integer ist, wenn kein Zeichen angehängt wird. Variablen vom Typ Integer verbrauchen lediglich 2 Byte im Arbeitsspeicher. Der zulässige Wertbereich reicht von -32768 bis 32767. Eine Zahl, die korrekt abgespeichert werden soll, muss sich in diesem Bereich befinden.

Will man größere Ganzzahlen abspeichern (größer heißt auch, weiter in den negativen Bereich), benötigt man den Typ Long. Dieser Typ verbraucht bereits 4 Byte im Arbeitsspeicher, kann jedoch Zahlen abspeichern, die im Bereich von -214783648 bis 214783647 liegen. Das Zeichen & muss explizit angegeben werden, will man eine solche Variable verwenden.

Übrigens müssen Bezeichner wie % ! & # $ immer mit angegeben werden, daher bei jeder Verwendung der Variable!

Bei ganzzahligen Variablentypen kann man den unteren- und den oberen Bereich des Wertbereichs ganz einfach berechnen, wenn man weiß wieviel Bytes Speicherplatz der betreffende Typ belegt.

Unterer Bereich 2^(Speicherplatz-1) * (-1)
Oberer Bereich 2^(Speicherplatz-1) -1

Sieht komplizierter aus, als es eigentlich ist. Um den unteren Bereich zu berechnen, nimmt man Basis des Binärsystems (2) hoch dem Speicherplatzverbrauch der Variable in Bit minus 1. Minus 1 deswegen, da das am höchstwertigste Bit zur Darstellung des Vorzeichens benutzt wird. (Vorzeichenbit) (Das Binärsystem wird übrigens auf der Seite Einführung ausführlich erklärt) Da wir einen negativen Bereich benötigen muss das Ergebnis mit -1 multipliziert werden. (Die Klammer ist übrigens nicht unbedingt notwendig) Um den oberen Bereich zu berechnen, muss man wieder die Basis 2 hoch dem Speicherplatz -1 nehmen und von diesem Ergebnis noch einmal -1 subtrahieren.

Um wieder von der ziemlich faden Theorie zur Praxis zurück zu kommen. Das nächste Beispiel demonstriert die Verwendung der unterschiedlichen Datentypen. (vorhin immer als Variablentyp bezeichnet)

CLS
int1% = -24300
long1& = 344353452
str1$ = "Gespeicherter String"
single1! = 34.43424
double1# = 342834.3452524234924#
PRINT "Nun werden die Werte der einzelnen Variablen der Reihe nach ausgegeben:"
PRINT "Integer-Variable: ", int1%
PRINT "Long-Variable: ", long1&
PRINT "String-Variable: ", str1$
PRINT "Single-Variable: ", single1!
PRINT "Double-Variable: ", double1#

Eine Besonderheit gäbe es noch zum obigen Beispiel zu sagen. Weist man einer Double-Variable einen Wert zu, so hängt man üblicherweise auch dem Wert das Zeichen # an. Vergisst man das Anhängen des Zeichens, ist es auch nicht weiter tragisch, da QBasic (zumindest) dieses automatisch hinzufügt. Sicher wird es Ihnen aufgefallen sein, dass QBasic den Quellcode optisch einigermaßen anpasst. Schreibt man Befehle klein (z.B. "print"), so wandelt QBasic diese automatisch in Großbuchstaben um. (z.B. "PRINT")

Gleich vorweg: Natürlich ist es egal, welche Zahlen Sie verwenden und welche Namen Sie den Variablen geben. Zum Verständnis ist es nicht unbedingt erforderlich, die Beispiele 1:1 abzutippen. Wichtig ist jedoch, dass man das Gelernte gleich ausprobiert, da man es sonst bereits nach kurzer Zeit wieder vergessen hat. Der Sinn der Beispiele entscheidet also und nicht der Inhalt.

Vielleicht erkennen Sie bereits, was in den Zeilen 2 bis 6 geschieht. Hier werden den Variablen die Werte zugewiesen. Der Operator = erledigt dies. Die Zuweisung erfolgt von rechts nach links. Das bedeutet, dass in Zeile 2 der Wert -24300 in die Variable int1 übertragen wird. (die Zuweisung erfolgt von rechts nach links!)

-24300 = int1

..wäre falsch, denn hier versucht man den Wert aus int1 an eine Zahl zu übergeben, dh. man versucht einer Zahl den Wert einer Variable zuzuweisen. Ja, totaler Blödsinn.

Wie Sie wahrscheinlich erahnt haben, kann man einer Variable nicht nur einen konstanten Wert (damit sind jetzt Angaben als Zahlen wie 234 gemeint) sondern auch den einer Variable zuweisen. Das heißt auch Anweisungen wie:

a = b

..sind gültig. Eine Voraussetzung ist hier jedoch, dass die Variable b bereits einen Wert enthält. Daher musste der Variable b zuvor ein Wert mittels Zuweisung oder INPUT zugewiesen worden sein. Übrigens macht INPUT auch nichts anderes, als eine Zuweisung durchführen. Zugewiesen wird das, was mittels Tastatur eingegeben wurde.

Nun möchte ich noch eine kleine Ergänzung zu Variablennamen (Bezeichnern) bringen. Bei der Wahl des Bezeichners müssen einige Kriterien beachtet werden. Ein Bezeichner darf max. 40 Zeichen lang sein und darf nur Buchstaben sowie die Zahlen 0 bis 9 und den Unterstrich _ enthalten. Sonderzeichen wie !"§$%&/()=? sind daher nicht zulässig. Ebenso die Umlaute ä ö ü sowie ß. Verwenden Sie am besten "sprechende" Bezeichner, daher aus dem Bezeichner der Variable soll hervorgehen, wozu diese verwendet wird. Es ist besser zaehler als Bezeichner zu verwenden als variable.

Übrigens: Früher hat man jede Zuweisung mit dem Befehl LET eingeleitet.

LET a = b

1.3; Kommentare:

Einen Quellcode zu schreiben ist oftmals leichter als einen zu lesen, den man nicht selbst geschrieben hat. Dasselbe gilt, wenn man einen Quellcode lesen (und vor allem verstehen) will, den man vor langer Zeit geschrieben hat. Zwar versteht man, was jede Zeile Quellcode für sich macht, jedoch versteht man nicht, wozu sie gut ist. Gegen dieses Verständnisproblem kann man jedoch etwas machen:

  1. "Sprechende" Bezeichner verwenden
  2. Den Quellcode so gut wie möglich auskommentieren

Um Kommentare geht es hier. Kommentare sind nichts weiter als Text, der dem Quellcode hinzugefügt wird. Dieser Text wird einfach vom Compiler ignoriert, ob er da ist oder nicht ist dem Compiler gleichgültig.

Kommentare werden mit dem Hochstrich ' eingeleitet. Alternativ kann man auch REM verwenden.

' Hier steht ein Kommentar

REM Hier steht ein Kommentar

Ein Kommentar erstreckt sich immer nur über eine Zeile. Ein paar kleine Tipps habe ich noch. In anderen Programmiersprachen ist es üblich, einen Kommentar direkt neben die Programmierzeile zu schreiben. Verwendet man REM um einen Kommentar einzuleiten, so muss die vorherige Programmierzeile mit : abgeschlossen werden. Verwendet man den Hochstrich ', muss die vorherige Programmierzeile NICHT explizit mit : abgeschlossen werden sondern es kann direkt der Kommentar nach dem Hochstrich folgen. Die nächsten 2 Beispiele demonstrieren das.

PRINT "Ein Text wird ausgegeben.." ' und ein Kommentar folgt

PRINT "Ein Text wird ausgegeben..": REM und ein Kommentar folgt

1.4; Einfache math. Berechnungen:

Bei der Ausgabe oder Zuweisung können auch gleich math. Berechnungen durchgeführt werden. Einige Beispiele:

PRINT 300/3

PRINT 300*3

PRINT 300+3

PRINT 300-3

Dasselbe funktioniert natürlich auch bei der Zuweisung.

a = 300/3

a = 300*3

a = 300+3

a = 300-3

Nur wird jetzt nicht der Wert der Rechenoperation ausgegeben, sondern der Variable a zugewiesen. 2 praktische Beispiele (Euro-Umrechner) schließen dieses Kapitel ab:

Umrechnung Schilling-Euro:
CLS
PRINT "Umrechnung ATS-Euro"
INPUT "Eingabe ATS: ", ats
ergebnis# = ats / 13.7603       ' ** Kurs: 1 Euro = 13.7603 ATS **
PRINT ats, " Schilling sind ", ergebnis#, " Euro."

Umrechnung DM-Euro:
CLS
PRINT "Umrechnung DM-Euro"
INPUT "Eingabe DM: ", dm
ergebnis# = dm / 1.95583       ' ** Kurs: 1 Euro = 1.95583 DM **
PRINT dm, " DM sind ", ergebnis#, " Euro."

Übrigens demonstriert dieses Beispiel wieder einmal schön, dass man mehrere Ausgaben mit PRINT durch Beistriche trennen muss.


Vorheriges Kapitel Nächstes Kapitel