Kapitel 4: Bildschirmausgabe

Inhaltsverzeichnis

Kapitel 6: Variablen und Konstanten

5. Tastatureingabe

Wenn Sie nur Daten verarbeitet könnten, die beim Schreiben des Programmes bereits feststehen, wäre das ziemlich eintönig. In der Regel erhalten die Programme Daten von außen, etwa über eine externe Datei, die Tastatur und andere Steuergeräte wie Maus oder Joystick, und passen den Programmablauf an diese Daten an. Wir werden später im Buch auf das Einlesen von Dateien und auf die Mausabfrage zu sprechen kommen. Als Eingabemedium verwenden wir zunächst nur die Tastatur.

5.1 Der INPUT-Befehl

INPUT ist eine recht einfache Art, Tastatureingaben einzulesen. Der Befehl liest so lange von der Tastatur, bis ein Zeilenumbruch (Return-Taste) erfolgt, und speichert die eingegebenen Zeichen in einer Variablen. Diese Variable muss dem Programm zuvor bekannt sein, also mit DIM deklariert worden sein. Im weiteren Programmablauf kann der Variablenwert dann z. B mit PRINT wieder ausgegeben werden.

DIM AS INTEGER alter
INPUT alter

Um zu kennzeichnen, dass eine Eingabe erwartet wird, gibt das Programm ein Fragezeichen an der Stelle aus, an der die Eingabe stattfinden wird. Da dies nicht immer gewünscht ist, kann der Programmierer stattdessen einen selbst gewählten Text anzeigen lassen. Dieser wird als String vor die Speichervariable gesetzt:

DIM AS INTEGER alter
INPUT "Gib dein Alter ein: ", alter

So weit, so gut — beim INPUT-Befehl steckt der Teufel jedoch im Detail: Es ist nämlich möglich, mit einem einzigen INPUT-Befehl mehrere Variablen abzufragen. Diese werden im Befehl, durch jeweils ein Komma getrennt, hintereinander angegeben. In der Eingabe dient dann ebenfalls das Komma zum Trennen der einzelnen Daten.

DIM AS STRING vorname, nachname
INPUT "Gib, durch Komma getrennt, deinen Vor- und deinen Nachnamen ein: ", _
      vorname, nachname
PRINT "Hallo "; vorname; " "; nachname
SLEEP

Zur Erinnerung: Die Zeilen 2 und 3 werden wegen des Unterstrichs wie eine einzige Zeile behandelt. Die Trennung in zwei Zeilen erfolgt hier nur aus Platzgründen.

Die Möglichkeit der Mehrfacheingabe bedeutet natürlich, dass die eingegebenen Daten selbst kein Komma enthalten dürfen, da sie ja sonst bei diesem Komma abgeschnitten würden. Dennoch hält FreeBASIC eine Möglichkeit bereit, auch Kommata einzugeben. Dazu muss der Benutzer den komplette Wert in Anführungszeichen setzen.

Des Weiteren darf es sich bei der ausgegebenen Meldung wirklich nur um einen String handeln und nicht etwa um eine Variable, die einen String enthält. Nehmen wir folgendes Beispiel:

DIM AS INTEGER alter
DIM AS STRING frage = "Gib dein Alter ein: "
INPUT frage, alter                            ' tut nicht das Erwuenschte

Das Programm denkt nun, dass zwei Werte eingelesen werden sollen, und zwar in die beiden Variablen frage und alter. Außerdem darf die Meldung nicht durch Stringkonkatenation (dazu später mehr) zusammengesetzt worden sein — es muss sich um einen einzelnen String handeln, der mit Anführungszeichen beginnt und mit Anführungszeichen endet.

INPUT hält noch eine weitere Besonderheit parat: Die Trennung zwischen der Meldung und der ersten Variablen kann statt durch ein Komma auch durch einen Strichpunkt erfolgen. In diesem Fall wird dann zusätzlich zur Meldung auch noch ein Fragezeichen ausgegeben — etwa wie in folgendem Fall:

DIM AS INTEGER alter
INPUT "Wie alt bist du"; alter

Inwieweit diese Schreibweise der Lesbarkeit des Quelltextes dient, mag der Leser selbst entscheiden.

Was tut man nun aber, wenn in der Frage der Wert einer Variablen einbunden werden soll? Nehmen wir an, Sie wollen die Frage nach dem Alter etwas persönlicher gestalten und den Benutzer mit seinem (zuvor eingegebenen) Namen ansprechen. Das lässt sich ganz leicht bewerkstelligen: Geben Sie die Frage einfach zuerst mit PRINT aus und hängen Sie dann mit INPUT die Abfrage an.

DIM AS STRING vorname, meinung
PRINT "Willkommen bei meinem Programm!"
INPUT "Gib zuerst deinen Vornamen ein: ", vorname
PRINT "Hallo "; vorname; ". Wie findest du FreeBASIC? ";
INPUT meinung
PRINT "Vielen Dank. Mit einem Tastendruck beendest du das Programm."
SLEEP

Sieht schon recht gut aus — allerdings gibt INPUT ein zusätzliches Fragezeichen aus, das sich hier störend auswirkt. Mit einer kleinen Änderung ist auch dieses Problem behoben:

Quelltext 5.1: Benutzereingabe mit INPUT
DIM AS STRING vorname, meinung
PRINT "Willkommen bei meinem Programm!"
INPUT "Gib zuerst deinen Vornamen ein: ", vorname
PRINT "Hallo "; vorname; ". Wie findest du FreeBASIC? ";
INPUT "", meinung
PRINT "Vielen Dank. Mit einem Tastendruck beendest du das Programm."
SLEEP
Ausgabe:
Willkommen bei meinem Programm!
Gib zuerst deinen Vornamen ein: Rose
Hallo Rose. Wie findest du FreeBASIC? Echt cool!
Vielen Dank. Mit einem Tastendruck beendest du das Programm.

Um dem Benutzer zu ermöglichen, eine komplette Eingabezeile ohne Rücksicht auf mögliche Kommatas einzugeben, können Sie LINE INPUT verwenden. Dieser Befehl liest immer bis zum Ende der Zeile, also bis zu einem Zeilenumbruch. Dementsprechend darf für die Eingabe auch nur eine einzige Variable angegeben werden — der Benutzer kann ja auch nur einen einzigen Wert übermitteln. Diese muss jetzt aber eine STRING-Variable sein. Da auf der anderen Seite die Meldung und die Eingabevariable klar voneinander getrennt werden können, erlaubt LINE INPUT für die Meldung auch Variablen und zusammengesetzte Strings. Ansonsten ist LINE INPUT genauso aufgebaut wie INPUT.

DIM AS STRING benutzername, eingabe
LINE INPUT "Gib deinen Namen ein: ", benutzername
LINE INPUT "Hallo " & benutzername & ". Willst du noch etwas sagen"; eingabe
Ausgabe:
Gib deinen Namen ein: Jack, König der Welt
Hallo Jack, König der Welt. Willst du noch etwas sagen? Ja, klar.

Dieser Quelltext verwendet bereits das Zusammensetzen mehrerer Ausdrücke zu einem String. Die dazu verwendete Stringkonkatenation wird in Kapitel 6.3.2 besprochen.

Kurz zusammengefasst:

Mit INPUT werden Werte von der Tastatur in Variablen eingelesen. Zuerst kann ein String angegeben werden, der vor der Eingabe angezeigt wird. Es darf sich dabei weder um eine Variable noch um einen zusammengesetzten String handeln. Wird kein solcher String angegeben oder folgt dem String ein Strichpunkt statt eines Kommas, dann wird vor der Eingabe (ggf. zusätzlich) ein Fragezeichen angezeigt.

Anschließend folgen, durch Komma getrennt, die Namen der einzulesenden Variablen. Die einzelnen Werte werden vom Benutzer ebenfalls durch Komma getrennt eingegeben.

LINE INPUT erlaubt nur eine Eingabevariable, die ein STRING sein muss, dafür aber auch das Einlesen einer kompletten Zeile einschließlich Kommata ermöglicht.

5.2 Eingabe einzelner Zeichen

5.2.1 INPUT() als Funktion

Manchmal ist eine so freie Eingabe, wie sie durch die Anweisung INPUT ermöglicht wird, nicht gewünscht. Stattdessen wollen Sie vielleicht gezielt angeben, wie viele Zeichen eingegeben werden sollen. Dazu kann INPUT als Funktion eingesetzt werden. Eine Funktion ist weitgehend dasselbe wie eine Anweisung, nur dass eine Funktion einen Rückgabewert liefert. Einige FreeBASIC-Befehle, wie z. B. INPUT, existieren als Anweisung und als Funktion. Um beide voneinander zu unterscheiden, werden wir in diesem Buch alle Funktionen mit anschließenden runden Klammern benennen, also in diesem Fall INPUT(). Der Hintergrund für diese Schreibweise ist, dass die Parameter, die einer Funktion mitgegeben werden, stets mit runden Klammern umschlossen sein müssen. Eine Funktion ohne Parameter benötigt keine Klammern, weshalb diese dann im Quelltext in der Regel weggelassen werden (hier wird der Funktionen-Charakters durch die verwendete Zuweisung deutlich). Wenn jedoch im laufenden Text von einer Funktion gesprochen wird, werden wir zur Verdeutlichung die Klammern schreiben.

Beachten Sie unbedingt den Datentyp des Rückgabewertes! Im Falle von INPUT() ist der Rückgabewert immer und ausschließlich ein STRING. Wenn Sie ihn also in einer Variablen speichern wollen (siehe Quelltext 5.2), muss es sich dabei um eine Stringvariable handeln.

Note Hinweis:
Viele FreeBASIC-Funktionen können genauso wie eine Anweisung verwendet werden, indem man einfach den Rückgabewert auslässt (INPUT() gehört allerdings nicht dazu).
Quelltext 5.2: Einzelzeichen mit INPUT()
DIM AS STRING taste
PRINT "Druecke eine beliebige Taste."
taste = INPUT(1)
PRINT "Du hast '"; taste; "' gedrueckt."
SLEEP

INPUT(1) bedeutet, dass auf die Eingabe genau eines Zeichens gewartet wird, oder genauer gesagt: Die Funktion holt genau ein Zeichen aus dem Tastaturpuffer. Immer, wenn Sie eine Taste drücken, wird der dieser Taste zugeordnete Wert in den Tastaturpuffer gelegt. Von dort aus kann er, z. B. mit INPUT(), ausgelesen werden. Ist der Puffer leer, dann wartet INPUT() so lange, bis eine Taste gedrückt wird. Wollen Sie mehrere Zeichen auslesen, müssen Sie nur den Parameter entsprechend anpassen. INPUT(3) beispielsweise wartet auf drei Zeichen.

Warning Achtung:
Sondertasten wie z. B. die Funktions- oder Pfeiltasten belegen zwei Zeichen im Puffer, weil ihnen eine Kombination aus zwei Werte zugeordnet sind! In Kapitel 13.5 finden Sie dazu eine Übungsaufgabe, die aber zum jetzigen Zeitpunkt noch einiges an Vorwissen benötigt.

5.2.2 INKEY()

Die Funktion INKEY() erfüllt einen ähnlichen Zweck wie INPUT(). Es gibt jedoch zwei entscheidende Unterschiede: Erstens erwartet INKEY() keine Parameter; es wird immer genau eine Taste eingelesen. Bei einer solchen leeren Parameterliste können die Klammern auch weggelassen werden. Zweitens wartet die Funktion nicht auf einen Tastendruck. Ist der Tastaturpuffer leer, wird ein Leerstring zurückgegeben. INKEY() bietet sich damit auch an, um den Puffer zu leeren (etwa um weitere Abfragen nicht mit „Altlasten“ aus einem bereits gefüllten Tastaturpuffer zu beginnen).

INKEY() besitzt den Vorteil, dass Sonderzeichen komplett übergeben werden. Beispielsweise ist der Rückgabewert bei einem Druck auf eine Pfeiltaste zwei Zeichen lang. Allerdings werden wir im Augenblick noch nicht viel mit der Funktion anfangen können, da unsere Programme viel zu schnell vorbei sind, um rechtzeitig eine Taste zu drücken. INKEY() wird erst dann interessant, wenn in das Programm Schleifen eingebaut werden — aber dazu kommen wir erst später. INKEY() wird beispielsweise in Quelltext 11.9 eingesetzt.

Der Vollständigkeit halber werden noch zwei weitere Befehle zur Tastaturabfrage genannt: GETKEY() wird vorwiegend verwendet, um auf einen Tastendruck zu warten, liefert jedoch ebenfalls einen Rückgabewert. Allerdings wird ein INTEGER zurückgegeben. Es handelt sich dabei um den ASCII-Wert des Zeichens bzw. bei Sondertasten um einen kombinierten Wert.
Wenn weniger der Tastaturpuffer als vielmehr der Status einer Taste — gedrückt oder nicht gedrückt — interessiert, bietet sich MULTIKEY() an. Der Name dieser Funktion deutet bereits an, dass damit mehrere Tasten gleichzeitig überprüft werden können. Auf beide Befehle wird später genauer eingegangen.

5.3 Fragen zum Kapitel

Das Kapitel beschäftigte sich mit der Eingabe über die Tastatur. Dazu einige Fragen:

  1. Welche Bedeutung hat bei der Anweisung INPUT der Strichpunkt, welche Bedeutung hat das Komma?

  2. Was ist der Unterschied zwischen der Anweisung INPUT und der Funktion INPUT()?

  3. Worin liegt der Unterschied zwischen INPUT() und INKEY()?

  4. Und noch eine Programmieraufgabe: Schreiben Sie ein kleines Rechenprogramm. Es soll den Benutzer zwei Zahlen eingeben lassen und anschließend die Summe beider Zahlen berechnen und ausgeben.


Kapitel 4: Bildschirmausgabe

Inhaltsverzeichnis

Kapitel 6: Variablen und Konstanten