![]() |
Die Programmiersprache BASIC wurde Mitte der 60'er Jahre als Lehrsprache
entwickelt und hatte in den 80'er Jahre, mit Aufkommen der Homecomputer
ihren Höhepunkt. Ende der 80'er wurde BASIC von
mehreren Anbietern modernisiert und erhielt Elemente, aus den damals Modernen
Sprachen wie Pascal und Comal. QBASIC ist einer dieser weiterentwickelten BASIC
Derivaten und bildet eine Brücke vom Ur-BASIC zum heute noch salonfähigem VisualBASIC.
Wer im ersten Schritt keine größeren Ziele verfolgt, der findet mit QBasic einen
sehr leichten Einstieg ins Programmieren. Wobei schon ein Hang zur Nostalgie
vorhanden sein sollte, wenn man
sich an QBASIC zu schaffen macht. Und wenn, dann bitteschön in einer
stilvollen Entwicklungsumgebung, wie beispielsweise dem QBASIC- bzw. besser gleich
dem QuickBASIC-Editor von Microsoft. Im Gegensatz zu QBASIC (reiner
Interpreter) kann man mit QuickBASIC seine Programme auch in eine EXE kompilieren.
![]() |
Wer noch eine alte Win95/98 Installations-CD in der Schublade rumliegen
hat, findet darauf in einem Ordner namens "Old_MS-DOS" die beiden Dateien QBASIC.EXE und QBASIC.HLP.
Hierbei handelt es sich um den QBASIC-Editor V1.1 (Interpreter) und dessen Hilfe.
Wie bereits weiter oben erwähnt bevorzuge ich den QuickBASIC-Editor V4.5, da
dieser mit einem Compiler daher kommt und man somit in der Lage ist ausführbare
Anwendungen (EXE) zu erstellen. Diesen kann man z.B.
hier
oder auch
hier herunterladen. Darüber hinaus gibt es noch QuickBASIC V7.1 (QBX) mit
einem erweiterten Befehlssatz für Datenbankapplikationen und auch VisualBasic
für DOS.
Im Grunde braucht man eigentlich auch nicht mehr, wäre da nicht die Problematik, dass alte 16Bit Programme nicht
mehr unter Win10 64Bit
ausführbar sind. Aber hierzu gibt es ebenfalls einen Blumenstrauß an Lösung - eine
davon wäre
DOSBox-Mini.
Um es an
dieser Stelle ganz einfach zu machen, stelle ich hier mal eine DOSBox-Mini inkl.
QuickBasic v4.5 zum Download bereit. Dann auch bitte auch unbedingt mal
hier vorbeischauen.
DOSBox-Mini mit QuickBasic
v4.5 (3.2 MB)
Wer den obigen Download nutz braucht nur das Zip-Archiv zu entpacken, eine
der drei Batchdateien "StartMich-xxx" auszuführen und "qb" einzugeben, und schon
kann's los gehen.
Ansonsten wird QuickBasic über die Anwendung QB.EXE im
Installationsverzeichnis gestartet. Wer lieber 50 statt 25 Zeilen auf einmal
sehen möchte, der kann auch die Startoption "H" (QB.EXE /H) verwenden , dadurch
wird die komplette Ansicht der etwas gestaucht.
Besonderheit bei
der Verwendung der DOSBox
Laufendes Programm
anhalten bzw. abbrechen: Während ein laufendes Programm in einer echten
DOS-Umgebung (Physikalischer Rechner) mittels [Strg] + [Pause] angehalten werden
kann, zeigt dies in der DOSBox keine Wirkung. In vielen Foren wurde das Thema in
den letzten Jahren unzählige male angesprochen, aber nirgends kommt einer auf
den Punkt. Hier muss man [Strg] + [Pause] gefolgt von [Strg] + [Rollen]
drücken. Im VMWare-Player reicht übrigens [Strg] + [Rollen], [Strg] +
[Pause] zeigt hier keine Wirkung.
![]() |
Möchte man seine Programme (.BAS) auf einem modernen Windows-PC bearbeiten
oder einsehen, so bekommt man mit dem Windows eigenen Notepad Sonderzeichen wie z.B.
Umlaute nicht richtig dargestellt. Gleiches gilt für den Weg zurück, vom Windoof-
zum DOS-Rechner. Der Grund liegt darin, dass DOS die Zeichenkodierung
OEM-Codepage (850 für W-EU, 437 US) nutzt, während Notepad, je nach
Windowsversion ANSI bzw. UTF-xxx nutzt. In Notepad++ hat man jedoch die
Möglichkeit auf OEM 850 umzustellen. Die Einstellung erfolgt über das Hauptmenü:
Codierung/Weitere/Westeuropäisch/OEM 850
Dies muss leider bei jedem Neuladen der Datei aufs neue eingestellt werden :-/
Auch wenn QBasic eine recht einfache Sprache ist, so hat man den Syntax doch
rasch vergessen, wenn man nur alle Jubeljahre mal eine Kleinigkeit
zusammenklickert. Darum hier mal eine ganz ganz grobe Übersicht zum Auffrischen
und Reinkommen,
falls die letzte Programmierung mal wieder einige Monate oder gar Jahre zurück
liegt... Für den Einstieg gibt es diverse Tutorials, welche z.B. auf
www.antonis.de
zu finden sind.
Code kommentieren mittels REM oder Hochkomma (‘)
Variable | Können, müssen aber nicht über DIM deklariert werden. Es reicht sie
an einer beliebigen Stelle direkt zu nutzen. Globale Variablen hingegen schon, sie werden im Hauptcode mittels DIM SHARED VaiableName deklariert. DIM Str AS STRING oder Str$ = “String“: PRINT“Ich bin ein “; Str$ DIM Intr AS INTEGER oder Intr% = 12345: PRINT“Integer mit Wert: “; Intr% DIM lon AS LONG oder Lon& = 123456789: PRINT“Long mit Wert: “; Lon& DIM Sing AS SINGLE oder Sing! = 2.12345: PRINT“Single mit Wert: “; Sing% DIM Doub AS DOUBLE oder Doub# = 123456.123456789#: PRINT“Double mit Wert: “; Doub Bei Zahlen kann das Typ-Zeichen („!“, „%“) weggelassen werden. |
||||||||||||||||||||||||||||||||
Feldvariable | DIM MeinArray (10) AS INTEGER DIM MeinArray (10, 5) AS INTEGER |
||||||||||||||||||||||||||||||||
UBOUND FeldName | Größe einer Feldvariable (Anz. Felder) ermitteln | ||||||||||||||||||||||||||||||||
Typ wandeln | nach Integer CINT(Vari) nach Long CLNG(Vari) nach Double CDBL(Vari) nachString STR$(Vari) | ||||||||||||||||||||||||||||||||
ABS(Zahl) | Absolutbetrag ermitteln: ABS(70,5 – 100!) -> 29,5 | ||||||||||||||||||||||||||||||||
INT(X) | Abrunden auf Ganzzahl (Nicht Kaufmännisch! - alles was nach
dem Komma steht wird gestrichen) Abunden auf eine Nachkommastelle: INT(123,456 *10) /10 |
||||||||||||||||||||||||||||||||
RANDOMIZE + RND | Zufallszahl – Beispiel Zahl 0-9: RANDOMIZE TIMER: PRINT INT(10 * RND) | ||||||||||||||||||||||||||||||||
SGN (Zahl) | Vorzeichen einer Zahl ermitteln: xy = 1, -xy = -1, 0 = 0 | ||||||||||||||||||||||||||||||||
SQR (Zahl) | Quatratwurzel | ||||||||||||||||||||||||||||||||
SIN(), COS(), TAN() | Winkelfunktionen | ||||||||||||||||||||||||||||||||
Ausgabe von festem Text und Variable – siehe Variablen | |||||||||||||||||||||||||||||||||
CLS | löscht den ganzen Bildschirm | ||||||||||||||||||||||||||||||||
SPC (Anzahl) | Leerzeichen ausgeben (direkte Bildschirmausgabe) | ||||||||||||||||||||||||||||||||
SPACE$ (Anzahl) | Leerzeichenkette bilden | ||||||||||||||||||||||||||||||||
STRINGS (Anzahl, Zeichen) | Zeichenkette aus Zeichen bilden | ||||||||||||||||||||||||||||||||
COLOR Schrift, Hintergrund |
|
||||||||||||||||||||||||||||||||
LOCATE Zeile, Spalte |
Cursor für Ausgabe positionieren (max. 23 Zeilen ohne dass
gescrollt wird) |
||||||||||||||||||||||||||||||||
CSRLIN | Aktuelle Cursor-Zeile ermitteln | ||||||||||||||||||||||||||||||||
POS (0) | Aktuelle Cursor-Spalte ermitteln | ||||||||||||||||||||||||||||||||
INPUT Variable | INPUT “Gieb was ein?“; s$: PRINT“Die Eingabe war: “; s$ | ||||||||||||||||||||||||||||||||
INKEY$ | Aktuell gedrückte Taste abfragen | ||||||||||||||||||||||||||||||||
Beispiel1: | DO SELECT CASE s$ CASE “a”: GOTO… CASE “b”: GOTO… END SELECT LOOP |
||||||||||||||||||||||||||||||||
Beispiel2: | CLS i = 0 DO I = I +1 LOCATE 1, 1 PRINT i LOOP UNTIL INKEY$ = “s“ |
||||||||||||||||||||||||||||||||
IF… THEN | IF x = 5 THEN PRINT“X ist fünf“ IF x <> 5 THEN PRINT“X ist…“ PRINT“nicht fünf“ END IF IF x > 5 THEN PRINT“X ist größer fünf“ ELSEIF x < 5 THEN PRINT“X ist kleiner fünf“ ELSE PRINT“X muss dann wohl genau 5 sein“ END IF IF NOT x > 5 THEN PRINT“X ist nicht größer als fünf“ IF x > 5 AND x < 20 THEN PRINT”X liegt zwischen 5 und 20” |
||||||||||||||||||||||||||||||||
CHR$ (Zahl) | Zeichen über ASCII-Wert – ASCII-Wert von einem Zeichen: ASC (Zeichen) | ||||||||||||||||||||||||||||||||
INSTR (String, SuchString) | Zeichen oder Zeichenkette in String suchen. Nicht enthalten = 0 | ||||||||||||||||||||||||||||||||
LEN (String) | Länge eines Strings (Anzahl Zeichen) | ||||||||||||||||||||||||||||||||
LEFT$ (String, Anzahl) | String schneiden. Alles nach der Anzahl der Zeichen von links wird abgeschnitten. | ||||||||||||||||||||||||||||||||
RIGHT$ (String, Anzahl) | String schneiden. Alles vor der Anzahl der Zeichen von rechts wird abgeschnitten. | ||||||||||||||||||||||||||||||||
LTRIM$ (String) | Erstes Zeichen wird abgeschnitten | ||||||||||||||||||||||||||||||||
RTRIM$ (String) | Letztes Zeichen wird abgeschnitten | ||||||||||||||||||||||||||||||||
UCASE$ (String) | Alles in Großbuchstaben wandeln. Umgekehrt: LCASE$ (String) | ||||||||||||||||||||||||||||||||
SLEEP | Wartet bis eine Beliebige Taste gedrückt wird |
||||||||||||||||||||||||||||||||
GOTO | Springe zu einer Programmzeile (wenn Zeilennummern vorhanden) oder
zu einer Sprungmarke. Marker setzen: Eine Sprungmarke ist eine Zeichenfolge welche mit einem Doppelpunkt abgeschlossen wird z.B. HierHin: - Der Sprung wir dann mit GOTO HierHin ausgeführt |
||||||||||||||||||||||||||||||||
GOSUB und RETURN | Führt gleich wie GOTO einen Sprung aus, erwartet jedoch den Befehl RETURN, der wieder einen Sprung zurück zum GOSUB veranlasst und dort mit der nächsten Zeile das Programm fortlaufen lässt. Man kann dies als Urform einer Subroutine sehen, folglich muss der Hauptprogrammteil mit END abgeschlossen sein. Ansonsten bekommt man die Fehlermeldung: “RETURN ohne GOSUB“ | ||||||||||||||||||||||||||||||||
DO... LOOP | zwischen DO und LOPP stehender Programmteil wird immer wiederholt, auch zeilenübergreifend | ||||||||||||||||||||||||||||||||
DO... LOOP UNTIL | Wiederhole bis eine Bedingung erfüllt ist | ||||||||||||||||||||||||||||||||
SUB - Subroutine | Eine Subroutine wird beim Erstellen in ein eigenes „Fenster“
verschoben. Mit der Tastenkombination [Umschalt] + [F2]
kann zwischen den Fenstern hin- und hergesprungen werden. Die
Deklaration im Hauptteil geschieht automatisch. SUB Subi (a$) PRINT“Hallo “; a$ END SUB Der Aufruf erfolgt mittels dem CALL Befehl aus dem Hauptprogramm heraus. CALL Subi (“Welt“) |
||||||||||||||||||||||||||||||||
FUNCTION | Eine Function ist eine Subroutine mit Rückgabewert FUNCTION Funci$ (x$) PRINT“Ich sehe: “; x$ Funci = “Hier die Rückgabe“ END FUNCTION |
||||||||||||||||||||||||||||||||
Aufruf: |
s$ = “Hallo Welt“ PRINT Funci(s&) |
||||||||||||||||||||||||||||||||
INP (Adresse) | siehe Ansteuern von
![]() ![]() |
||||||||||||||||||||||||||||||||
OUT (Adresse) | siehe Ansteuern von
![]() ![]() |
||||||||||||||||||||||||||||||||
SHELL ”Anweisung” | Mit Shell kann man DOS Anweisungen aus einem Laufenden Qbasic-Programm
heraus ausführen. Prinzipiell ist alles möglich was im DOS-Prompt auch
eingegeben werden kann. |
||||||||||||||||||||||||||||||||
Beispiele: | SHELL “edit“ oder SHELL “cd c:\“ | ||||||||||||||||||||||||||||||||
SOUND Hz, Dauer | Beispiel: SOUND 300,6 spielt einen Pipston mit 3 kHz für 6 x 55 ms = 330 ms | ||||||||||||||||||||||||||||||||
TIME$ | Aktuelle Uhrzeit ermitteln | ||||||||||||||||||||||||||||||||
TIMER | Gibt die System-Uhrzeit in Sekunden zurück. Genauigkeit ~ 0,056 Sek. | ||||||||||||||||||||||||||||||||
Programmpause (Sleep) für ca. 1/10-Sekunden mittels TIMER
SUB Pause (zeit!)
t = TIMER
DO
x =
TIMER –t
LOOP UNTIL x > zeit
END SUB
Programmpause (Sleep) für Millisekunden
SUB Pause (Ticks)
'1 Ticks = 0,00022 Sek. (0,21455 ms), max. 32767 = '70,3016 Sekunden
'1 Sekunde ~ 4661 Ticks.
OUT (&H61), INP(&H61) OR 1
OUT
(&H43), 164
OUT (&H42), 255
OUT (&H42), 255
Hi =
Ticks \ 256
Lo = 255 - (Ticks MOD 256)
DO
x = INP(&H42)
IF x > y THEN z = z + 1
y = x
LOOP UNTIL (z > Hi) AND (x <= Lo)
END SUB
Daten in Datei schreiben
CLS
OPEN "c:\tmp.dat" FOR OUTPUT AS #1
FOR i% = 1 TO 2
PRINT "Eingabe des Datensatzes "; i%
INPUT
"Gib den Namen ein "; name$
INPUT "Gib das Alter ein "; alter%
PRINT
WRITE #1, name$
WRITE #1, alter%
NEXT
Daten aus Datei lesen
CLS
CLOSE #1
OPEN "c:\tmp.dat" FOR INPUT AS #1
FOR i% = 1 TO 2
INPUT #1, name$
INPUT #1, alter%
PRINT i%, name$, alter%
NEXT
CLOSE #1
SLEEP
END
Das Ganze gibt es auch auf vier DIN-A4 Seiten verteilt
zum Ausdrucken:
QBASIC „Quick and Dirty“ Befehlsübersicht - PDF