BASIC-Tutorial (Vorwort, Installation, Kapitel 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)

Cursor, Wartezeiten, Zufallszahlen

5.1. Cursor positionieren

Wie Sie höchstwahrscheinlich bereits festgestellt haben, wird unter DOS im Textmodus (in dem wir im Moment noch arbeiten) eine nicht-proportionale Schrift verwendet. Das heißt, dass jedes Zeichen gleich viel Platz einnimmt. In Textverarbeitungsprogrammen (wie Word oder OpenOffice Writer) ist Ihnen sicher schon aufgefallen, dass man mehr i als w in eine Zeile bekommt. Das i nimmt einfach weniger Platz ein - klar. Wenn Sie das nächste Beispiel ausprobieren, sehen Sie, dass genau 80 Zeichen in jede Zeile passen. Egal welche Zeichen dargestellt werden.

CLS
PRINT "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
PRINT "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww"

Mit einer Schleife lassen sich derart viele Zeichen hintereinander auch auf eine viel (!) leichtere Art ausgeben. Mehr dazu aber im Kapitel über Kontrollstrukturen. Genau 80 Zeichen passen in eine Zeile, 25 Zeilen lassen sich am Bildschirm im Textmodus insgesamt darstellen, also 80x25 (= 2000) Zeichen.

Das ist wichtig zu wissen, denn nun wollen wir den Cursor positionieren. Um das zu können, muss die genaue Zeile und Spalte (Wichtig: Eine Spalte ist genau 1 Zeichen breit; es gibt also 80 Spalten) bekannt sein. Beispielsweise: Positioniere den Cursor in Zeile 3, Spalte 4.

Eine Frage, die bisher noch nicht geklärt wurde: Wozu eigentlich den Cursor positionieren? Grund: An der Stelle, an der der Cursor steht, wird auch der Text ausgegeben! Positioniert man den Cursor in Zeile 5, Spalte 7, dann wird auch ab dort der danach folgende Text angezeigt. Den bisherigen Text beeinflusst das natürlich nicht.

Positioniert wird der Cursor mit LOCATE. Aufruf:

LOCATE Zeile, Spalte

Will man den Cursor nur in eine andere Zeile positionieren, kann der letzte Wert (Spalte) weggelassen werden, wenn stattdessen ein Beistrich geschrieben wird.

Will man den Cursor nur in eine andere Spaltenposition bringen (gleich Zeile!), so funktioniert auch folgendes:

PRINT TAB(Spalte);

Beachten Sie das Semikolon am Ende der Zeile!

5.2. Wartezeiten

Manchmal während des Programmablaufs ist es einfach nötig, eine Wartezeit - für den Benutzer - einzubauen. Angenommen, ein Programm verlangt nach der Eingabe eines Passworts. Wird das Passwort falsch eingegeben, so könnte das Programm die Zeit bis zur nächstmöglichen Passworteingabe beispielsweise um 5 Sekunden verzögern. So kann man verhindern, dass Benutzer innerhalb kurzer Zeit eine große Anzahl an Passwörtern versucht.

Um Wartezeiten zu erzeugen, gibt es den Befehl SLEEP. Wichtig ist, dass als Parameter die Wartezeit in Sekunden übergeben wird. Parameter sind die Werte, die an eine Funktion bzw. an einen SUB (Erklärung folgt später) übergeben werden. Ich habe bisher immer von Befehlen bzw. Anweisungen gesprochen, und werde es der Einfachheit halber - in den meisten Fällen - auch weiterhin tun. Beispiel: PRINT "Hallo" . Hier gibt es einen Parameter: "Hallo". Hallo steht unter Anführungszeichen (weil ein String) und wird an PRINT übergeben.

SLEEP Wartezeit

Programmierbeispiel:

CLS
PRINT "In 10 Sekunden beendet sich das Programm automatisch ..."
SLEEP 10	' 10 Sekunden warten
PRINT "Ende"

5.3. Zufallszahlen erzeugen

In QBasic lassen sich auf einfache Weise Zufallszahlen erzeugen. Dabei handelt es sich, wie in vielen Programmiersprachen (genauer: deren Libraries) üblich, aber um Pseudo-Zufallszahlen. Echte Zufallszahlen sind vollkommen unabhängig von vorherigen Ergebnissen und nicht vorhersehbar. Uns soll das aber hier nicht weiter kümmern.

Zunächst einmal muss der Zufallszahlengenerator initialisiert werden. Wir initialisieren den Zufallsgenerator mit der Systemzeit. TIMER liefert dazu die Anzahl der Sekunden zurück, die seit Mitternacht vergangen sind.

RANDOMIZE TIMER

Nun kann mit RND (Abk. für engl. random = zufällig) eine Zufallszahl erzeugt werden. RND liefert die Zufallszahl als Rückgabewert zurück. In diesem Fall wird sie in der Variable Zufallszahl gespeichert.

Zufallszahl = RND

Das nächste Beispiel demonstriert gleich die Verwendung:

CLS
RANDOMIZE TIMER		' Initialisieren
PRINT RND	' Zufallszahl zurueckliefern lassen und anzeigen

Wie üblich ist das Beispiel so kurz und knapp wie möglich gehalten, um keine unnötige Verwirrung hervorzurufen. Es beschränkt sich rein auf die wesentlichen Elemente (von CLS aus optischen Gründen einmal abgesehen). Zunächst wird der Zufallsgenerator initalisiert (Zeile 2) und dann liefert RND eine Zufallszahl als dessen Rückgabewert zurück. Wir könnten diesen Wert auch in einer Variable abspeichern, wie wir es oben in Zufallszahl getan haben.

Glücklich macht das angezeigte Ergebnis wahrscheinlich noch nicht. RND liefert nämlich nur Fließkommazahlen vom Datentyp Single zwischen 0 und 1 zurück, also z.B. 0.9920465. Das folgende Beispiel liefert Zahlen zwischen 0 und 99 zurück, indem die erzeugte Zahl mit 100 multipliziert wird und die Nachkommastellen abgeschnitten werden.

CLS
RANDOMIZE TIMER         ' Initialisieren
Zufallszahl = FIX(RND * 100)    ' FIX schneidet Nachkommastellen des Ergebnisses ab
PRINT "Erzeugte Zufallszahl: "; zufallszahl

Neu ist hierbei FIX. Die Funktion (mehr zu Funktionen später) FIX schneidet die Nachkommastellen einer Fließkommazahl ab. Zunächst liefert jedoch RND eine Zahl zurück, dann wird sie mit 100 multipliziert und das Ergebnis des Klammerausdrucks wird an FIX übergeben.

Vorheriges Kapitel Nächstes Kapitel