Tech-Ecke / DOS / QBASIC

QBASIC

Diese Seite beinhaltet


Ein paar Worte vorweg

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.






Bezugsquelle und Download

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)


Installation und Starten

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.


Programmieren in Notepad++ unter Windows

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 :-/


Einige Befehle in der Übersicht

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
   
PRINT  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
0 schwarz 4 rot 8 grau 12 hellrot
1 blau 5 violet 9 hellblau 13 rosa
2 grün 6 braun 10 hellgrün 14 gelb
3 helltürkis 7 hellgrau 11 hellzyan 15 weiß
   
LOCATE Zeile, Spalte

 Cursor für Ausgabe positionieren (max. 23 Zeilen ohne dass gescrollt wird)
LOCATE 10, 10: PRINT“Huhu“

   
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 COM und LPT-Port
OUT (Adresse) siehe Ansteuern von COM und LPT-Port
   
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


Links zu QBASIC

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !
[letzte Aktualisierung 30.12.2014]