Von Kai Schnieder
Überarbeitung und PDF-Konvertierung von Thomas Antoni -
www.antonis.de
Zweite Auflage, 1.12.2002 - 30.5.2003
Inhaltsverzeichnis:
In dem QBasic Lernkurs „QBasic in 12h“
lernen Sie innerhalb 12 Stunden schnell und bequem die wichtigsten QBasic Befehle.
Nach einem halben Tag werden Sie sich bereits zu einem fortgeschrittenen
Programmierer weiterentwickelt haben! Im Folgenden erfahren
Sie, ...
·
was QBasic ist,
·
was man mit QBasic alles machen kann,
·
wo die Grenzen von QBasic liegen
·
und wie sie die wichtigsten QBasic-Befehle
anwenden.
Dabei halten wir
uns nicht lange mit trockener Theorie auf. Programmieren soll ja schließlich
Spaß bringen. Wir steigen sofort in die Praxis ein, und Sie machen sich
anhand vieler kleiner Beispielprogramme und Übungsaufgaben spielerisch
mit den Lerninhalten vertraut. Die Lösungen zu den Übungsaufgaben finden
Sie in Anhang B. Alle Beispielprogramme und Lösungen sind im Download-Paket
von "QBasic in 12h" als .BAS-Quellsprachedateien enthalten. Das komplette
Download-Paket steht auf www.qbasic.de
in der QBasic-Tutorial-Rubrik zum Herunterladen bereit.
Was ist neu in der zweiten Auflage?
Den ersten Kapiteln wurden FAQs hinzugefügt.
Außerdem wurden viele Dinge geändert, ergänzt und verbessert.
Über den Autor
Der 13-jährige Kai Schnieder (N-Fighter) ist
der Autor zahlreicher Kurse und Programme rund um den PC.
Um ihm Fragen zu stellen, schreiben Sie an
KaiSchnieder@gmx.de . Er wird sich bemühen,
diese zu beantworten.
Bevor man Programme in einer Programmiersprache
schreibt, sollte man die Programmiersprache genauer kennen.
QBasic ist eine für DOS entwickelte
Programmiersprache. Sie ist sehr einfach und hervorragend für
Programmier-Anfänger geeignet. Kleine Projekte lassen sich mit QBasic
erstaunlich schnell umsetzen. Aber sehen Sie am Besten selber – in den
folgenden 60 Minuten lernen Sie ihr erstes eigenes Programm zu schreiben.
Woher bekomme ich QBasic?
Bevor sie aber mit QBasic programmieren können,
benötigen Sie die QBasic-Entwicklungsumgebung, bestehend aus einen Text-Editor
und dem Interpreter. Im Editor tippen Sie ihre QBasic-Befehle ein. Der Interpreter sorgt
für die Abarbeitung dieser Befehle. Später können Sie Ihre Programmme auch zu
eigenständigen EXE-Programmen kompilieren, wozu Sie den "echten" Compiler QuickBasic 4.5
benötigen; mehr dazu in Anhang A. Doch vorerst wollen wir beim Interpreter QBasic 1.1 bleiben.
Der reicht für die Beispiele in diesem Kurs vollkommen aus.
QBasic gibt es kostenlos im Internet, z.B. auf
www.qbasic.de unter "Download - Compiler". Auch auf
den älteren Installations-CD’s von Microsoft Windows war QBasic dabei. QBasic besteht
aus den beiden Dateien QBASIC.EXE und QBASIC.HLP.
Hinweis: Ein
Interpreter ist ein Programm, welches ihre QBasic-Befehle aus der Entwicklungsumgebung heraus
sofort ausführt - sie werden Schritt für Schritt in Maschinensprache übersetzt und ausgeführt.
Anders als der Compiler erstellt der Interpreter keine direkt ausführbaren EXE-Dateien. Hinweis: Die
Maschinensprache ist die Sprache ihres Computers. Sie besteht aus Einsen und
Nullen. Ich gehe jetzt davon aus, dass Sie eine Version
von QBasic besitzen. Besonders empfehlen kann ich QBasic 1.1, und da
besonders die deutsche Version. Da QBasic ein DOS-Programm ist, hat es manchmal gewisse
"Macken" unter dem Betriebssystem Microsoft Windows, welches auf fast jedem Heim-PC installiert
ist. Unter Windows 2000 und XP kann es am ehesten Probleme geben. Aber was soll man machen?
Alle Probleme sind irgendwie umschiffbar. Es geht, und das ist die Hauptsache. Sollten Sie Ihr QBasic nicht mit der Maus
bedienen können, geht das auch sehr bequem über die Tastatur.
Mit der ALT-Taste aktivieren Sie das Menü, mit den Pfeil-Tasten können Sie sich
durch alle Menüs und Untermenüs hangeln. Hinweis: MS-DOS ist ein
Betriebssystem, welches man als Vorgänger von Microsoft-Windows bezeichnen
kann. Die ersten Windows-Versionen wurden über MS-DOS gestartet. Ab Windows NT/XP ist
MS-DOS nur noch simuliert und wird von Windows nicht mehr gebraucht. Tippen Sie nun den folgenden Code in ihrer QBasic -
Entwicklungsumgebung ein: Programm 1: CLS PRINT
"Hello World!" SLEEP 2 Ausgabe: --- Hello World! --- (so sollte es Aussehen) Erklärungen: Der erste Befehl (cls) erstellt einen leeren
Bildschirm. Mit dem zweiten Befehl (print) wird der Text
"Hello World!" ausgegeben. Der dritte Befehl (sleep 2) hält das Programm
für zwei Sekunden an. Der vierte Befehl schließlich beendet das
Programm (end). Sie sehen: Mit ein paar Englisch-Kenntnissen
ist dieses Programm leicht zu verstehen. Sollten Sie über solche Kenntnisse nicht
verfügen, müssen Sie sich leider so durchbeißen ;-). Das Programm können Sie nun über "Ausführen | Start"
oder mit der Taste F5 ausführen. Ihr Interpreter übersetzt es nun Zeile für Zeile in Aktionen und
führt es aus. Hinweis: QBasic
schreibt alle ihre Befehle - solange sie zum QBasic-Wortschatz gehören -
automatisch groß. Tippen Sie zum Beispiel "cls" ein, wird
"cls" nach dem Verlassen der Zeile zu "CLS".
Damit erhalten Sie immer sofort eine Rückmeldung darüber, ob Sie einen Befehl
richtig geschrieben haben - für Einsteiger eine höchst praktische Sache! Hinweis: Sie können
mehrere Qasic-Befehle können auch in einer Zeile schreiben, wenn Sie diese durch
einen Doppelpunkt voneinander trennen (Beispiel: CLS: A = 5: PRINT A).
Außerdem müssen Sie auch nicht stur am Rand stehen. Rücken Sie ihre QBasic-Befehle
so ein, wie es ihnen passt. Damit ist die erste Lern-Stunde fast beendet.
Im Folgenden noch ein paar kleine Aufgaben: Aufgaben: a) Schreiben Sie ein Programm, welches die Worte "Ich bin ein
QBasic-Programmierer" ausgibt. b) Schreiben Sie ein Programm, welches von dem Sleep-Befehl drei
Sekunden lang angehalten wird. Um diese Frage zu beantworten sollten Sie wissen, dass
Microsoft MS-DOS nicht mehr unterstützt und Windows-basierte Compiler für
Visual-C++ und VisualBasic anbietet. VisualBasic ist praktisch die Aufsteiger-Sprache
für QBasic-Programmierer. Von daher gibt es schon eine Art Upgrade für die beliebte
Basic-Sprache. Nachdem Sie nun ihre ersten QBasic-Programme
schreiben können, werde ich ihnen beibringen, wie Sie ihren Quellcode
kommentieren. Hinweis: Kommentare
sind erklärende Worte oder Sätze des Programmierers im Quellcode seines Programms. Bei der
Ausführung des Programms merkt der User nichts von den Kommentaren. Ein kleines
Beispiel dazu: Programm 2: 'dies ist die erste Art für Kommentare, man
kann sie auch CLS 'direkt hinter einen Befehl setzen REM Dies ist die zweite Art für Kommentare PRINT
"Kommentare..." SLEEP END Ausgabe: --- Kommentare... --- Wie sie jetzt sehen, haben die Kommentare
keinerlei Wirkung auf ihr Programm bzw. auf die Ausgabe des Programms. Ich will
ihnen jedoch nicht verheimlichen, dass zu viele Kommentare ein größeres Programm
etwas bremsen können. Kurz möchte ich noch sagen, wann und wie Sie Kommentare verwenden sollten
und dieses Thema damit abschließen. Im Folgenden werde ich ihnen die Arbeit mit
Variablen nahe legen. Eine Variable ist eine Speicherzelle im RAM, die über
einen Namen ansprechbar ist, den Sie selber wählen können und in der sich
ein Zahlenwert speichern lässt. Hierzu gehe ich gleich in die Praxis über: CLS LET a = 1
'erstellt die Variable a und weist ihr den Wert 1 zu PRINT "Wert von a: "; a 'gibt die Variable a aus PRINT
'Leerzeile... INPUT a
'schreibt eine Anwendereingabe in die Variable a PRINT
PRINT "Neuer Wert von a: "; a 'gibt a erneut aus SLEEP
'Warte auf Tastendruck (ohne bestimmte Wartezeit) Ausgabe: --- Wert von a: 1 ? 10 Neuer Wert von a: 10 --- Nun analysieren wir das Ganze. Ich habe die
neuen Befehle im Quellcode zwar schon kurz erklärt, aber jetzt noch einmal
ausführlich: LET a = 1 – erstellt eine
Variable mit dem Namen a und weist ihr den Wert 1 zu. Anstatt a könnte auch Zahl oder Wert
verwendet werden. Benutzen Sie für ihre Programme einfach aussagekräftige
Variablen-Namen. Das LET ist ein Überbleibsel aus älteren BASIC-Sprachen. Sie
können es unbesorgt weglassen und stattdessen a = 1 schreiben. PRINT – erstellt eine
Leerzeile INPUT a – mit INPUT können
Sie den Programm-User auffordern, einen Text oder einen Zahlenwert einzugeben.
Die Eingabe wird in die angegebene Variable, in diesem Falle a eingetragen.
Diese lässt sich jederzeit wieder aufrufen. Die QBasic-Online-Hilfe
Aufgaben: a) Schreiben Sie ein Programm, in welchem der Variablen Variable der
Wert 10 zugewiesen wird. Danach soll der User in die Variable schreiben
können. Geben Sie den neuen Wert erneut aus. Versuchen Sie einmal ihren Namen in einer
Variable zu speichern. Dies ist mit Ihrem bisher erworbenem Wissen
unmöglich. Um Zeichen zu speichern, benötigen Sie Strings.
Eine Stringvariable kennzeichnet man in deren Namen mit einem
nachgestellten Dollar-Zeichen ($). Programm 4: Name$ =
"N-Fighter" Alter = 13 CLS PRINT PRINT "Name : "; Name$ PRINT PRINT "Alter: "; Alter PRINT SLEEP 2 END Ausgabe: --- Name: N-Fighter Alter: 13 --- Die Stringvariable in diesem Programm ist
"Name$". Ihr wird der Text "N-Fighter" zugewiesen. Eine
String-Variable wird prinzipiell genauso behandelt wie eine numerische Variable.
Beispiele für die Verwendung von Stringvariablen:
QBasic bedienen
Das erste QBasic-Programm
ENDFAQ
QBasic wird von Microsoft nicht mehr
weitergeführt – warum?
Stunde 2: Kommentare, Variablen und Strings
Variablen
Programm 3:
PRINT "Wert von a: "; a – diese Zeile ist ein wenig schwer zu erklären. Ich könnte sie vielleicht
mit einem Merksatz erklären: Alles was zwischen den Rufzeichen steht, wird
so ausgegeben, wie es ist. Alles was bei dem Print-Befehl nicht zwischen den
Rufzeichen steht, wird als Variable ausgegeben. Sollten Sie einer Variable
keinen Wert zuweisen, ist diese automatisch 0.
QBasic hat eine hervorragende Online-Hilfe, die glatt ein Handbuch mit vielen 100
Seiten ersetzt. Die Hilfe arbeitet "kontext-sensitiv": Wenn Sie mit der rechten Maustaste
auf ein Befehls-Schlüsselwort klicken, z.B. auf BEEP, erhalten Sie eine detaillierte
Hilfe zu genau diesem Befehl. Statt der rechten Maustaste können Sie auch die F1-Taste
verwenden. Über den Menüpunkt <Hilfe - Index> erhalten Sie eine alfabetisch
sortierte Liste sämtlicher QBasic-Befehle; ein Doppelklick auf einen Befehl öffnet dessen
Hilfetext. Mit Esc verlassen Sie die Online-Hilfe. Machen Sie ausgiebig Gebrauch von
der mit vielen kleinen Programmbeispielen gespickten Online-Hilfe, um Ihre Kenntnisse
zu vertiefen.Strings
Durch ein Plus-Zeichen "+" können Texte aneinandergehängt werden.
' Anwendereingabe in die String-Variable Name$
' kombiniert mit einem Aufforderungstext
Sie können die Namen von numerischen Variablen und String-Variablen
auch wie folgt auf den Bildschirm ausgeben:
PRINT name$ ;"ist "; alter;
"Jahre alt."
Wie ich in meinem Merksatz bereits gesagt habe:
die Namen von numerischen Variablen und String-Variablen werden nicht in Rufzeichen
geschrieben bzw. nicht in die Rufzeichen ihres Textes
(Wie z.B. "Hello World").
Variablen können addiert, subtrahiert etc. werden:
A = A + 1
A = A – 1
A = A * 1 ' Multiplikation
A = A / 1 ' Division
A = A ^ 2 ' Quadrieren
A = SQR(2) ' Wurzel aus 2 ("Square Root")
A = SIN (45 * 2 * 3.142 / 360) ' sin (45°) mit Vorgabe des Winkels im Bogenmaß
A = A + A
A = A – A
A = A * A
A = A / A
A = A ^ B ' A hoch B
A = SQR(A) ' Wurzel aus A
PRINT A ;”+”; A ;”=”;
A+A
Experimentieren Sie noch ein wenig mit
Variablen & Co. herum.
Aufgaben:
b) Schreiben Sie ein Programm, bei dem der User seinen Namen und sein
Alter angegeben kann, welches dann wieder ausgegeben wird.
Welchen Wert hat eine Variable, wenn ihr kein
Wert zugewiesen wird?
Wenn man eine numerische Variable erstellt und ihr keinen Wert zuweist, hat sie den Wert 0; Stringvariablen sind auf den Leerstring "" vorbesetzt.
Wenn ich keine Text-Zeichen in numerischen Variablen speichern kann,
kann ich dann auch keine Zahlen in String-Variablen speichern?
Sie können in Strings auch Zahlenwerte speichern. Diese werden
allerdings in Textform abgelegt. Probieren Sie mal das folgende Programm:
INPUT "gib eine Zahl ein: "; t$
PRINT t$
Ebenfalls können Sie als Programmierer die
Schriftfarbe in der Bildschirmanzeige verändern:
COLOR 2
Dieser Befehl ändert die Schriftfarbe ihres
Programms auf die Farbe grün.
Nun ein Programm, bei dem alle möglichen Farben
in QBasic ausgegeben werden:
Programm 5:
CLS
COLOR 0, 15
PRINT "Dies ist die Vordergrundfarbe 0 (Schwarz)."
COLOR 1
PRINT "Dies ist die Vordergrundfarbe 1 (Blau)."
COLOR 2
PRINT "Dies ist die Vordergrundfarbe 2 (Gruen)."
COLOR 3
PRINT "Dies ist die Vordergrundfarbe 3 (Helltuerkisblau)."
COLOR 4
PRINT "Dies ist die Vordergrundfarbe 4 (Rot)."
COLOR 5
PRINT "Dies ist die Vordergrundfarbe 5 (Violett)."
COLOR 6
PRINT "Dies ist die Vordergrundfarbe 6 (Braun)."
COLOR 7, 0
PRINT "Dies ist die Vordergrundfarbe 7 (Hellgrau)."
COLOR 8
PRINT "Dies ist die Vordergrundfarbe 8 (Grau)."
COLOR 9
PRINT "Dies ist die Vordergrundfarbe 9 (Hellblau)."
COLOR 10
PRINT "Dies ist die Vordergrundfarbe 10 (Hellgruen)."
COLOR 11
PRINT "Dies ist die Vordergrundfarbe 11 (Sehr helles Tuerkisblau)."
COLOR 12
PRINT "Dies ist die Vordergrundfarbe 12 (Hellrot)."
COLOR 13
PRINT "Dies ist die Vordergrundfarbe 13 (Rosa)."
COLOR 14
PRINT "Dies ist die Vordergrundfarbe 14 (Gelb)."
COLOR 15
PRINT "Dies ist die Vordergrundfarbe 15 (Weiss)."
SLEEP
END
Ausgabe: Schreiben Sie
dieses Programm doch selber einmal, und starten Sie es, um den Ausgabebildschirm
zu betrachten.
In diesem Beispiel sehen Sie alle möglichen
Farben im Text-Modus. Die hier nicht dargestellten Farbcodes 16-31 erzeugen noch
einmal dieselben Farben, jodoch als blinkenden Text. Das funktioniert jedoch
nur unter reinem DOS, nicht unter Windows.
Hinweis: Der Text-Modus
ist eine Bildschirmauflösung, bei der man nur Text-Zeichen verwenden kann. Jede
Verwendung von Grafiken in diesem Modus ist nicht möglich.
Nun können Sie die Schriftfarbe ihres Programms
verändern. Doch wissen Sie immer noch nicht, wie Sie die Hintergrundfarbe
beeinflussen. Schauen Sie mal im obigen Programm auf die Zeilen COLOR 0, 15
und COLOR 7, 0. Da wird der Schrifthintergrund für die nachfolgenden
Bildschirmausgaben durch ", 15"auf weiß bzw. durch ", 0" auf schwarz gesetzt.
Dazu nun ein weiteres Beispiel:
COLOR 14, 1
CLS
PRINT "Gelb auf Blau"
Die "1" ändert die Hintergrundfarbe
auf Blau. Das CLS sorgt dafür, dass der gesamte Bildschirm mit
der Hintergrundfarbe eingefärbt wird.
Hinweis: Die Farbcodes für die
Hintergrund- und die Schriftfarben sind bis auf kleinere Ausnahmen identisch.
Sie können alle 15 Standard-Farben als Hintergrundfarbe verwenden, wobei
die Codes 8-15 allerdings dieselben Farben erzeugen wie die Codes 0-7.
Und was passiert, wenn Sie das CLS weglassen? Das sehen
Sie, wenn Sie die folgende Befehlsfolge ausprobieren:
COLOR 14,4
PRINT "Gelb auf Rot"
Der COLOR-Befehl ändert die Hintergrundfarbe
nur für die tatsächlich angezeigten Schriftzeichen. Der restliche Bildschirm
behält die ursprüngliche Hintergrundfarbe bei. Es sei denn nach dem COLOR-Befehl
folgt ein CLS-Befehl, der den ganzen Bildschirm bleibend einfärbt.
Experimentieren Sie einfach ein wenig mit diesem Befehl.
Ein Tipp von mir: Wählen Sie eine auch bei abgedunkeltem Bildschirm gut lesbare
Kombination von Schriftfarbe und Hintergrundfarbe. Nicht alle Anwender reißen den
Helligkeitsregler ihres Monitors grundsätzlich voll auf.
Kann ich einer Variable einen Wert zuweisen und diese Variable anstatt einer Zahl hinter den Color-Befehl setzen?
Ja, das können Sie. QBasic wird keine Fehlermeldung erzeugen (es sei denn, der Wert der Variable gehört nicht zu den Farbcodes von QBasic ;-)).
Stunde 4: Labels und Verzweigungen
Ein Label ist eine Sprungmarke. Man kann mit
dem GOTO-Befehl zu jeder beliebigen Stelle im Programm springen, welche mit eine Sprungmarke
gekennzeichnet ist.
GOTO-Befehle sind jedoch – was ich ihnen nicht verheimlichen möchten – schon
früh in die Kritik der Programmierer geraten. Da man mit GOTOs an jede
beliebige Stelle des Programms springen kann, wird der Quellcode ihres
Programms bald sehr unübersichtlich, da man die verschiedenen Sprungmarken
immer erst suchen muss. Ein Quellcode mit vielen GOTO-Befehlen wird daher
auch Spagetti-Code genannt.
Genug der Theorie. Nun ein Beispiel:
Programm 6:
CLS
PRINT "Wohin wollen Sie springen? "
PRINT
PRINT " (1) Sprungmarke 1"
PRINT " (2) Sprungmarke 2"
PRINT " (3) Beenden"
INPUT men
IF men = 1 THEN
GOTO 10
IF men = 2 THEN
GOTO Textmarke
IF men = 3 THEN
END ELSE BEEP: END
10 CLS
PRINT
"Sprungmarke in Form einer Zahl."
SLEEP
END
Textmarke:
CLS
PRINT "Sprungmarke mit dem Namen
»Testmarke«“
SLEEP
END
Ausgabe:
---
Wohin wollen Sie springen?
(1)
Sprungmarke 1
(2)
Sprungmarke 2
(3)
Beenden
? 1
Sprungmarke in Form einer Zahl.
---
In diesem Programm waren eine ganze Menge neuer
Befehle. Der erste neue Befehl war
Dieser Befehl prüft die Variable men.
Wenn men = 1 ist, gehe zu 10.
10 ist die Sprungmarke.
Dasselbe geschieht mit IF men = 2 THEN GOTO
sprungmarke.
Die Sprungmarke Sprungmarke endet mit
einem Doppelpunkt.
Hinweis: Ein
QBasic-Befehlswort ("Schlüsselwort") darf nicht als Sprungmarke oder als Variablennname
verwendet werden. Auch Umlaute wie ä, ö oder ü dürfen in Sprungmarken und
Variablennamen nicht vorkommen. Außerdem dürfen Sprungmarken sich nicht
wiederholen.
Neu ist ebenfalls die Zeile
IF men = 3 THEN
END ELSE BEEP: END
Wenn die Variable men = 3 ist, wird das
Programm beendet. Wenn men etwas außer 1,2 oder 3
ist, gibt der Computer einen Piepston aus (BEEP).
Danach wird das Programm ebenfalls beendet.
Der Else-Befehl muss immer hinter der letzten
If-Anweisung stehen.
Aufgabe:
a)
Schreiben Sie ein kleines Quiz
Dies dürfte zu dem Thema Sprungmarken und Verzweigungen
fürs Erste reichen. Eine Sache wäre aber noch: Wenn Sie eine Stringvariable auf ihren Inhalt testen
möchten, müssen Sie dies wie folgt tun:
Der String muss wieder zwischen Rufzeichen
stehen.
Es gibt übrigens auch Mehrfachverzweigungen,
die Sie mit dem Befehl SELECT CASE variable
realisieren können. Dabei hängt das Sprungziel vom Inhalt der variable ab. Diese
Verzweigungsart wollen wir aber hier nicht weiter vertiefen. Wenn Sie mehr darüber wissen wollen,
geben Sie einfach in der QBasic-Entwicklungsumgebung "select" ein und starten
sofort anschließend die kontextsensitive Online-Hilfe mit der F1-Taste.
Dies lässt sich dadurch erklären, dass die Sprungmarken im ganzen Programm verteilt sind. Mal springt das Programm zu einer, und mal zu einer anderen Stelle. Und beim Ändern und Erweitern von Befehlsfolgen muss man sich immer darüber im Klaren sein, von welchen anderen Programmstellen aus mit GOTO dorthin gesprungen wird. Dadurch verliert man oft schnell den Überblick.
Stunde 5: Schleifen
Eine Schleife ist eine Folge von Befehlen,
welche so oft durchlaufen wird, bis die Abbruchbedingung erfüllt ist.
Hier einmal ein Beispiel:
Programm 7:
CLS
INPUT "Bitte geben Sie eine Zahl ein:
", anzahl
DO
x = x + 1
PRINT
"Hallo ("; x; ")"
LOOP UNTIL x =
anzahl
SLEEP
END
Ausgabe:
---
Bitte geben Sie eine Zahl ein: 6
Hallo ( 1 )
Hallo ( 2 )
Hallo ( 3 )
Hallo ( 4 )
Hallo ( 5 )
Hallo ( 6 )
---
In diesem Programm gibt es schon wieder eine
Menge neuer Befehle. Zuerst erhält der User die Aufforderung, eine Zahl
einzugeben, die in die Variable anzahl eingetragen wird.
Vor der Eingabe steht der Aufforderungs-Text Bitte geben
Sie eine Zahl ein. An dieser Stelle funktioniert der Input-Befehl
wie der Print-Befehl,nur dass mit PRINT keine Eingaben erfolgen
können.
Dann beginnt die Do...Loop Until-Schleife.
Sie wird so oft durchlaufen, bis x den
Wert von anzahl hat. Probieren Sie mit diesem Programm einfach selber
ein wenig.
Eine weitere Schleife ist die For...Next-Schleife.
Wie Programm 8 zeigt, funktioniert sie ganz
ähnlich wie die Do...Loop...Until-Schleife.
Programm 8:
CLS
INPUT "Bitte geben Sie eine Zahl ein:
", anzahl
FOR x = 1 to
anzahl
PRINT
"Hallo ("; x; ")"
NEXT
SLEEP
END
Ausgabe:
---
Bitte geben Sie eine Zahl ein: 6
Hallo ( 1 )
Hallo ( 2 )
Hallo ( 3 )
Hallo ( 4 )
Hallo ( 5 )
Hallo ( 6 )
---
Diese Schleife ist für dieses Beispiel um
einiges einfacher zu verstehen.
Sie wird so lange durchlaufen, bis x
dieselbe Größe wie anzahl hat
(FOR x = 1 to
anzahl). Die Schleife endet mit next.
In QBasic gibt es noch eine dritte Schleife,
die While...Wend-Schleife.
Sie funktioniert ähnlich wie die For...Next-Schleife.
Ich möchte sie aber an dieser Stelle nicht
weiter besprechen.
Anfänger bevorzugen GOTO. Schleifen werden von ihnen wenig verwendet. Doch später kommt man kaum noch um sie herum. Warten Sie einfach ab und denken Sie an meine Worte.
Sie haben in QBasic die Möglichkeit, Bildschirmanzeigen an beliebige
Stellen auf dem Bildschirm zu platzieren. Dieses geschieht mit Hilfe des LOCATE-Befehls wie folgt:
CLS
LOCATE 3, 2
PRINT
"Zeile 3, Spalte 2"
SLEEP
END
Der Befehl Locate gibt die Zeile und die
Spalte an.
Bringen wir nun unser altes Wissen mit hinein:
Programm 9:
CLS
FOR a = 1 to 10
LOCATE a, a
PRINT "Zeile
"; a ; ", Spalte "; a; "
NEXT
SLEEP
END
Ausgabe:
---
Zeile 1, Spalte 1
Zeile
2, Spalte 2
Zeile
3, Spalte 3
Zeile
4, Spalte 4
Zeile 5, Spalte 5
Zeile 6, Spalte 6
Zeile 7, Spalte 7
Zeile 8, Spalte 8
Zeile 9, Spalte 9
Zeile 10, Spalte 10
---
Die Schleife wird so oft durchlaufen, bis der Wert der Variablen a = 10 ist. Der Locate-Befehl bekommt immer den jeweiligen Wert von a sowohl als Zeilen- als auch als Spaltennummer übergeben.
Wenn die Schleife also zwei Mal durchlaufen wurde, ist der Wert von a = 2 und die Anzeige erfolgt in Zeile 2, Spalte 2.
Spielen Sie noch ein wenig mit dem
Locate-Befehl herum.
Damit endet diese Stunde schon. Sie haben jetzt einen Viertel-Tag
mit QBasic gearbeitet. Testen sie noch einmal alle Befehle, bevor es mit der Stunde sieben
losgeht.
Sie können in QBasic ihre eigenen Grafiken
erstellen. Dazu müssen Sie zuerst in einen Grafik-Modus schalten. Das geht mit
dem SCREEN-Befehl.
Bisher haben wir es ausschließlich mit dem Textbildschirm SCREEN 0 zu tun gehabt,
den QBasic standardmäßig beim Programmstart aktiviert. Hierbei hat man keinen
direkten Zugriff auf die einzelnen Bildschirmpunkte, sondern kann nur Textzeichen
zur Anzeige bringen.
Für Grafikanzeigen verwenden QBasic-Programmierer am
häufigsten SCREEN 9 und SCREEN 12.
Mit dem PSET-Befehl können Sie Punkte
zeichnen. Beispiel:
PSET (20, 20), 15
SLEEP
END
Es wird ein Punkt wird an die X-Koordinate 20 und die
Y-Koordinate 20 gezeichnet. Die Farbe ist hellweiß (15).
Screen 9 hat übrigens eine Auflösung von 640 * 350
und Screen 12 von 640 * 480 Bildschirmpunkten. Der Koordinatenursprung befindet sich
in der linken oberen Bildschirmecke
Ein weiterer QBasic-Grafikbefehl ist der CIRCLE.
Damit können Sie Kreise zeichnen.
SCREEN 9
CIRCLE (20, 20),
15, 15
SLEEP
END
Hierdurch wird der Mittelpunkt des Kreises an der
X-Koordinate 20 und der Y-Koordinate 20 gezeichnet. Der Radius beträgt 15 Bildschirm-Punkte.
Die Farbe ist hellweiß (15). Nun wollen wir diesen Kreis innen mit
einer Farbe ausfüllen. Dazu verwendet man den Paint-Befehl :
SCREEN 9
CIRCLE (20, 20),
15, 15
PAINT (20, 20),
15
SLEEP
END
Auch der LINE-Befehl wird häufig
verwendet, um Linien zu zeichnen:
SCREEN 9
LINE (20,20) –
(20, 30)
SLEEP
END
Die Linie wird zwischen die X-Koordinate (20)
und die Y-Koordinate (20) bis hin zur zweiten
X-Koordinate (20) und Y-Koordinate (30)
gezeichnet. In diesem Falle ist die Linie senkrecht.
Hinweis: Auch wenn die
QBasic-Grafiken auf ihrem Bildschirm gut aussehen, vielleicht sehen Sie auf
anderen
Bildschirmen weniger gut aus. Vermeiden Sie
also Grafiken in QBasic oder testen Sie sie auf mehren Bildschirmen.
In den Text-Modus kann man wieder mit SCREEN
0 schalten.
Aufgaben:
a) Schreiben Sie ein Programm, bei dem alle Grafik-Befehle,
die Sie nun kennen, vorkommen.
In QBasic haben Sie die Möglichkeit
Zufallszahlen zu erzeugen.
Hierzu muss mit RANDOMIZE TIMER der
Zufallsgenerator aktiviert werden.
Eine Zufalls-Zahl zwischen 1 und 10 erstellt
man wie folgt:
RANDOMIZE TIMER
zufall = INT(RND * 10) + 1
PRINT zufall
Nachdem der Zufallsgenerator aktiviert wurde,
erzeugt RND eine Zufallszahl zwischen 0 und 0.9999999. Das "INT(RND * 10)"
bildet hieraus eine ganze Zahl zwischen 0 und 9. Das "+1" bewirkt, dass
der Variablen zufall ein ganzzahliger Zufallswert zwischen 1 und 10
zugewiesen wird.
Nutzen wir dieses Beispiel einmal für ein
größeres Programm:
Programm 10:
SCREEN 12
CLS
RANDOMIZE TIMER
FOR a = 1 TO 400
variable1 =
INT(RND * 640) + 1
variable2 =
INT(RND * 480) + 1
PSET (variable1,
variable2), 15
NEXT
SLEEP
END
(Die Ausgabe ist eine grafische und zufällige
Ausgabe, testen Sie sie doch bitte selber.)
Zeile 1 aktiviert den Grafikmodus (640*480
Punkte). Nun beginnt eine For...Next-Schleife.
Wenn die Variable a von 1 den Wert 400 erreicht
hat, endet das Programm. Variable1 hat
einen Wert zwischen 1 und 640, Variable2
zwischen 1 und 480.
Nun werden die Variablen dem Pset-Befehl
als X- und als Y-Koordinate zugewiesen.
Schließlich endet das Programm. Es ist übrigens
ein Sternenhimmel mit 400 nach dem Zufallspinzip über den Bildschirm verteilten
Bildpunkten.
Aufgabe:
a) Schreiben Sie unter Verwendung des Zufallsgenerators ein kleines
Zahlenraten. Verzweifeln Sie jedoch nicht, wenn Sie es nicht schaffen. Schauen
Sie sich dann einfach schon jetzt die Lösung in Anhang B an. Aber versuchen Sie es
zumindest.
Damit endet diese Stunde.
Studieren Sie den Inhalt dieses Kapitels gegebenenfalls noch mal, denn
Zufallszahlen braucht man sehr häufig.
Stunde 9: Töne
In QBasic können Sie über den PC-Speaker ihre
eigenen Töne ausgeben, ein kleiner Vorgeschmack war der Beep-Befehl.
In QBasic gibt es zwei Befehle zum Ausgeben von
Tönen. Den Play- und den Sound-Befehl. Wir verwenden den Play-Befehl.
Für die Töne der Tonleiter gelten in QBasic die gewohnten
Buchstaben, nur der Ton "h" wird davon abweichend durch den Buchstaben "b" dargestellt:
PLAY "cdefgab" ' Tonleiter c-d-e-f-g-a-h
Nun lässt sich in QBasic nicht nur die
Tonleiter abspielen, sondern auch die Länge der Töne und die Oktave angeben:
PLAY "O0 L8
cdefgab" ' Alle Töne der Oktave 0 mit der Länge 8 spielen
Die Oktave 4 ist die Standard-Oktave.
Die Oktaven gehen von 0 (tiefste) bis 8 (höchste). Die
Standard-Länge der Töne ist 8. L50 ist der längste Ton, L1 der Kürzeste.
Natürlich müssen nicht alle Töne die gleiche
Länge haben:
PLAY "o0 a10
o1 a10 o2 a10 o3 a10 o4 a10"
Auch wenn man es nicht für möglich hält: Man
kann sogar eine Oper mit QBasic zu Gehör bringen:
Programm 11:
REM Der erste Satz aus Beethovens fünfter
Symphonie
REM (Du weisst schon - das beruehmte
TaTaTaTaaaa):
PLAY "T180 o2 P2 P8 L8 GGG L2 E- P24 P8 L8
FFF L2 D"
Ausgabe: (Tonbasierend)
Testen Sie den Play-Befehl auch eigenständig
ein wenig.
Aufgabe:
a) Erstellen Sie ein Programm, das "Alle meine Entchen abspielt".
Eine SUB ist eine "Subroutine", also eine Art Unterprogramm,
in das man häufig benötigte Befehlssequenzen sehr elegant auslagern kann. Man
erstellt SUBs wie folgt:
SUB test
Nun öffnet QBasic den folgenden Bildschirm:
SUB test
END SUB
Tragen Sie nun Ihre Befehle ein. Zu ihren
Hauptprogramm gelangen Sie wieder mit der Taste F2:
(Die Sub Test wurde erstellt, nun
gehe ich mit F2 wieder in das bisher noch "unbenannte" Hauptprogramm).
Wenn Sie nun ein solchen Unterprogramm erstellt
haben, können Sie es im Hauptprogramm
mit
CALL subname aufrufen.
Aufgabe:
a) Erstellen Sie ein Programm mit einer SUB, welche Sie aufrufen. Die Lösung finden Sie
wie gewohnt in Anhang B.
Hinweis 1: Sie können
auch SUBs innerhalb von SUBs erstellen. Diese SUBs nennt man auch verschachtelte SUBs.
Hinweis 2: In einer
nachfolgenden Klammer können Sie vom Hauptprogramm aus Variablen an die SUB
übergeben - siehe das Beispiel 10a) in Anhang B
FUNCTIONs sind SUBs, die einen Wert an das aufrufende
Programm zurückliefern. Das folgende Programm zeigt ein Beispiel für eine Funktion
"Quadrat", die den übergebenen Zahlenwert "i" quadriert und zurückliefert. Mit
Hilfe dieser Funktion werden die Quadrate der Zahlen 1 bis 10 berechnet und auf
dem Bildschirm angezeigt.
Programm 12:
' Hauptprogramm In diesem Kapitel möchte ich kurz
Befehle ansprechen, welche in die anderen Kapitel nicht so recht hineingepasst
haben. In QBasic können Sie auch DOS-Befehle
aufrufen. Dies geschieht über den SHELL-Befehl. Beispiele: SHELL "CLS" Löscht den Bildschirm. SHELL "DIR" Zeigt den Inhalt des aktuellen Ordners an. ASCII-Codes sind Zeichen-Codes, mit denen man die
auf der Tastatur und dem Bildschirm erscheinenden Schriftzeichen intern im Computer
ablegt. Je Zeichen werden dafür 8 Bits = 1 Byte benutzt. In QBasic kann man die
ASCII-Zeichen über CHR$(ascii-code) aufrufen. Sie können die ASCII-Codes der einzelnen Zeichen
in der QBasic-Online-Hilfe unter "Inhalt | ASCI-Zeichencodes" nachschlagen Der Backslash "\" hat z.B. den ASCII-Code 92. Sie können ihn
aufrufen, indem Sie die Alt-Taste gedrückt halten und währenddessen die Zahlen 9 und 2
auf dem rechten Nummern-Tastenfeld eintippen. In QBasic kann man den Backslash und andere Zeichen
wie folgt aufrufen: PRINT CHR$(92) - zeigt den Backslash an PRINT CHR$(1) - zeigt einen Smiley an PRINT CHR$(2) - zeigt einen weiteren Smiley an Das folgende Programm zeigt zu einem ASCII-Code (zahla)
das dazugehörige Textzeichen an: Programm 13: DO
DO
INPUT "Bitte geben Sie einen ASCII-Code ein (1...255): ", zahla LOOP WHILE zahla < 1 OR zahla > 255 PRINT
"Dem ASCII-Code ist das folgende Textzeichen zugeordnet: "; CHR$(zahla) PRINT 'Leerzeile PRINT "Wiederholen...[Beliebige Taste]
Abbruch...[Esc]" DO: taste$ = INKEY$: LOOP WHILE taste$ = "" ' Warten auf Tastenbetätigung IF taste$ = CHR$(27) THEN END
' Abbruch mit Esc (ASCII-Code 27) PRINT LOOP 'Wiederholen mit beliebiger Taste Der User muss eine Zahl eingeben. Wenn Sie
unter eins liegt (< 1) oder über 255 (OR zahla > 255), d.h. wenn es sich
nicht um einen gültigen ASCII-Code handel, wird der User
aufgefordert die Zahl erneut einzutippen (obere DO...LOOP-Schleife). Anschließend wird
das dem eingegebenen ASCII-Code zugeordnete Textzeichen angezeigt.
Schnellmenüs: Bisher kennen Sie nur die Eingabemethode mit INPUT,
bei der der User die Enter- oder Eingabetaste drücken muss bevor seine Eingabe akzeptiert wird.
Das ist etwas lästig, wenn nur ein einziges Zeichen eingegeben werden soll, z.B. bei
Menü-Dialogen. Mit Hilfe des INKEY$-Befehls kann man das lästige Enter vermeiden.
wie das folgende Programmbeispiel zeigt: Programm 14: 10 PRINT "(1) Neustart" PRINT "(2) Ende" DO 20 Taste$ = INKEY$ LOOP WHILE
Taste$ = "" IF Taste$ =
"1" THEN GOTO 10 IF Taste$ =
"2" THEN END ELSE GOTO 20 INKEY$ liefert das der gedrückten Taste zugeordnete
ACII-Zeichen und trägt es in die String-Variable Taste$ ein.
INKEY liefert den den leeren String "" zurück, solange keine Taste betätigt wird.
Taste$ wird in einer Do...Loop-Schleife abgefragt. Die Schleife
wird so lange wiederholt, bis der User eine Taste
drückt. Der Rest dürfte ihnen bekannt sein. Bisher kennen Sie den Print-Befehl nur
so, dass er eine ganze Zeile beansprucht und zur nächsten Zeile fortschaltet.
Dieser Zeilenvorschub kann jedoch durch ein Semikolon ab Ende der Rufzeichen
unterdrückt werden: PRINT "Zeile 1"; PRINT "Immer noch Zeile 1 ?! " Stunde 12: Ihre weiteren Schritte Nun haben Sie sich bereits 11 Stunden mit QBasic
beschäftigt - fast einen halben Tag. Sie haben bereits viel über QBasic gelernt. Sie
kennen nun eine ganze Menge Befehle und sind mittlerweile schon ein recht guter
QBasic-Programmierer. Das sollten Sie tun, um sich in Sachen QBasic
zu perfektionieren: ·
Schreiben Sie alle Beispiel-Programme dieses
Kurses selber erneut. ·
Schließen Sie sich einem QBasic-Forum an, am
ehesten zu empfehlen ist das Forum unter www.QBasic.de/forum. Dort finden Sie eine lebendige,
freundliche und sehr hilfsbereite Community von QBasic-Fans. ·
Lesen Sie noch mehr Tutorials, ein Einsteigerkurs wie dieser kann
ihnen nicht alles erläutern. Sehr empfehlenswert sind das ausführliche deutsche
QBasic-Tutorial "Adok's Way to QBasic" und das "QBasic-Kochbuch", eine komlette,
nach Funktionen gegliederte Befehlsreferenz. Diese beiden Tutorials stehen
auf www.qbasic.de
in der QBasic-Tutorial-Rubrik zum Herunterladen bereit. ·
Bei fast allen Einsteigerfragen hilft Ihnen
die "QB-MonsterFAQ" weiter, die über www.qbasic.de
erreichbar ist. Sie werden feststellen, dass es kaum eine Frage gibt, die nicht
irgendjemand vor Ihnen bereits gestellt hat und deren Antwort nicht bereits in diese
gigantische FAQ eingefügt wurde (FAQ = Frequently Asked Questions = Sammlung häufig gestellter
Fragen und der dazugehörigen Antworten). ·
Schreiben Sie eigene Programme und Spiele und
experimentieren Sie selber mit den bereits gelernten QBasic-Befehlen herum. ·
Kaufen Sie sich Bücher über
QBasic. Es gibt noch einige im Buchhandel. Und bei eBay finden Sie eine Riesenauswahl
guter QBasic-Bücher, die Sie günstig ersteigern können. ·
Vielleicht kennen Sie ja auch einen anderen QBasic-Programmierer.
Tauschen Sie sich mit ihm aus. Was hat QBasic noch zu bieten? Wenn Sie
weiterlernen, werden Sie u.a. die folgenden
fortgeschrittenen QBasic-Funktionen entdecken, die wir in diesem Einsteigerkurs der
Einfachheit halber bewusst weggelassen haben: ·
Numerische Datentypen (Gleitpunkt und Festpunkt) und Konstanten
·
Mehrdimensionale Datenfelder
·
Wartezeiten erzeugen, Datum und Uhrzeit
·
Dateibearbeitung - Dateien schreiben und lesen
·
Joystick, serielle und parallele Schnittstelle ansprechen
Sie können zwar eine Zeit lang weiter in QBasic
programmieren erstellen, aber um ein professioneller Programmierer zu werden,
sollten Sie später auch Programmiersprachen wie Delphi, Java, VisualBasic C++
oder C# erlernen. Um aus Ihren BAS-Dateien direkt ausführbare
EXE-Dateien zu erzeugen, benötigen Sie einen "echten Compiler", am besten
QuickBasic 4.5. Dieser Compiler steht z.B. auf www.qbasic.de
unter "Download Compiler" zum Herunterladen bereit.
Gehen Sie wie folgt vor, um eine EXE-Datei zu erstellen: -
Aktivieren Sie das Menü, -
klicken Sie auf Ausführen, -
klicken Sie auf Exe Datei erstellen..., -
wählen Sie Selbständige EXE-Datei
und -
bestätigen Sie mit EXE erstellen.
Hier finden Sie die Lösungen zu den verschieden
Aufgaben, welche Sie während des Kurses lösen sollten: 1a) Schreiben Sie ein Programm, welches die Worte "Ich bin ein QBasic-Programmierer"
ausgibt. PRINT "Ich bin ein
QBasic-Programmierer" 1b) Schreiben Sie ein Programm, welches von dem Sleep-Befehl drei
Sekunden lang angehalten wird. PRINT
"Programm..." SLEEP 3 2a) Schreiben Sie ein Programm, in welchem der Variablen Variable
der Wert 10 zugewiesen wird. Danach soll der User den Wert der Variablen verändern können.
Geben Sie den neuen Wert ebenfalls aus. Variable = 10 PRINT Variable INPUT Variable PRINT Variable 2b) Schreiben Sie ein Programm, bei dem der User seinen Namen und sein
Alter angegeben kann, welches dann wieder ausgegeben wird. INPUT "Wie heisst du "; name$ INPUT "wie alt bist DU?"; alter PRINT "Du heisst "; name$; " und bist"; alter; "Jahre alt" 4a)
Schreiben Sie ein kleines Quiz 10 PRINT "Dieser Kurs heißt ?" PRINT " (1)
QBasic in 12h" PRINT " (2) Anders INPUT frage1 IF frage1 = 1 THEN PRINT "Richtig! " ELSE IF frage1 = 2 THEN PRINT "Falsch! "
ELSE BEEP: GOTO 10 END IF END 7a) Schreiben Sie ein Programm, bei dem alle Grafik-Befehle, die
Sie nun kennen, vorkommen. SCREEN 9 PSET (10, 10),
15 LINE (20, 20) -
(20, 30) CIRCLE (60, 60) , 15, 15 PAINT (60, 60), 15 8a) Schreiben Sie unter Verwendung des Zufallsgenerators ein kleines
Zahlenraten. RANDOMIZE TIMER Zufall = INT(RND * 20) + 1 'Zufallszahl 1...20 10 PRINT "Welche Zahl vermuten Sie (1...20) ? " INPUT frage IF frage < Zufall THEN PRINT "Zu niedrig! ": SLEEP:
GOTO 10 IF frage > Zufall THEN PRINT "Zu hoch! ": SLEEP: GOTO
10 PRINT "Gewonnen!!!" SLEEP END 9a) Schreiben Sie ein Programm, das "Alle meine Entchen" abspielt. 'Alle meine Entchen abspielen PLAY "MFT160O3L8cdefL4ggL8aaaaL2gL8aaaaL2gL8ffffL4eeL8ggggL4c" 10a) Erstellen Sie ein Programm mit einer SUB, welches sie aufrufen.
Dieses Beispiel zeigt, wie man an eine SUB zwei Variablen, nämlich t$ und i,
als Parameter übergeben kann Hauptprogramm: t$ = "Hello World" FOR i = 1 TO 10 CALL test(t$, i) NEXT i SLEEP
Unterprogramm: SUB test(t$, i) PRINT t$; i; ". Ausgabe" END SUB Copyright © 2002-2003
by Kai Schnieder ( KaiSchnieder@gmx.de )
und Thomas Antoni ( www.antonis.de )
FOR i = 1 TO 10
PRINT Quadrat(i)
NEXT
'Funktion "Quadrat" zum Quadrieren
FUNCTION Quadrat (i)
a = i ^ 2 'a = i hoch 2
Quadrat = a 'diesen Wert gibt die Funktion ans Hauptprogramm zurück
END FUNCTION
Stunde 11: DOS-Befehle, Ascii-Codes, "Schnell-Menüs" und
Sonstiges
DOS-Befehle
ASCII-Codes
Nun kommt eine für viele Programme sehr nützliche Funktion, nämlich ein
Wiederholen-Abbruch-Dialog: Die einzeilige DO...LOOP-Schleife
wartet auf eine beliebige Tastenbetätigung. Der ASCII-Code der betätigten Taste
wird in taste$ hinterlegt. Hierfür greifen wir etwas vor und verwenden den
INKEY$-Befehl, der eigentlich erst im folgenden Abschnitt durchgenommen wird.
Handelt es sich um die Esc-Taste CHR$(27), die
den ASCII-Code 27 hat, dann wird das Programm mit END abgebrochen. Ansonsten
erfolgt ein Neudurchlauf durch die äußerste DO...LOOP-Schleife.
Dieses Listing zeigt übrigens, wie Sie durch Einrückungen der Schleifen die Lesbarkeit
Ihres Programm erheblich verbessern können.
Feinheiten des Print-Befehls
Die nächste Programmiersprache
Anhang A: So erstellen Sie eine Exe-Datei
Anhang B: Lösungen